Unity の UI で Image を格子状に配置しようとプログラムで行ったときにハマりました。
Imageを配置する親となるImageに、以下のようなコードを記述し、左下を基点にして配置してみました。
//タイルサイズ
private Vector2 column = Vector2.zero;
//タイル間の隙間
private Vector2 margin = Vector2.zero;
[SerializeField, Tooltip("UnityEngine.UI.Imageのプレハブ")]
private GameObject backPrefab = null;
void setupBackground() {
var area = this.gameObject.GetComponent<RectTransform> ().sizeDelta;
var offset = new Vector3 (area.x, area.y, 0.0f) * -0.5f;
var pos = Vector3.zero;
pos.y = this.margin.y + this.column.y * 0.5f;
//左下基点
for (int i = 0; i < Grid.GridSize; i++) {
pos.x = this.margin.x + this.column.x * 0.5f;
for (int j = 0; j < Grid.GridSize; j++) {
var back = Instantiate (this.backPrefab, this.gameObject.transform);
back.gameObject.transform.position = (this.gameObject.transform.position + offset) + pos;
pos.x += (this.margin.x + this.column.x);
}
pos.y += (this.margin.y + this.column.y);
}
}
最初は、うまくいったと思ったが、画面サイズを変更してから実行すると、様子が違う…。
設計時の 320 x 480 画面サイズ 以外は全部だめじゃん…。 ^^;;

原因はScaleが自動的に調整されていたので、localScale を Vector3.one に変更してから位置を指定するようにしました。
しかし、sizeDelta の値が固定で前述のコードではうまく配置できない…どうしたものかと悩んでいたら、InspectorをDebugで見たときに Anchor Position という項目に気づきました。

以上のことから、Instantiate部分を以下のように修正して解決しました。
var back = Instantiate (this.backPrefab, this.gameObject.transform);
{
back.gameObject.transform.localScale = Vector3.one;
back.gameObject.GetComponent<RectTransform>().anchoredPosition = pos;
}
気づけばたいしたことない程度のことですが、手動で仮配置していた時は、Scaleが調整されなかったので、最後の最後まで自分は気づけませんでした…。

One Comment