前提・実現したいこと
Unityでオブジェクトを横に並べるシステムを作っています。
<イメージ>
******
空のオブジェクトcombinerを作り、その子供としてsignを3つ作りスプライトをつけました。signを左右に1.0fずつ移動させ、combinerをinstantinateで増やしてimage_stage上に表示したところ、問題が発生しました。
<hierarchyイメージ>
Canvas
image_stage(HorizontalLayoutGroup)
combiner
sign
sign
sign
発生している問題
元になるオブジェクトは
***
のように表示されたのですが、instanieateしたオブジェクトは
*
のように、3つ重なって表示されます。inspectorを見てみたところ、動かしたsignのx値が2つとも0になっていました。
該当のソースコード
c#
1 //signを作るメソッド 2 void MakeSign1() 3 { 4 //combiner(signをまとめるオブジェクト)を作る 5 GameObject combiner = new GameObject("combiner"); 6 combiner.AddComponent<RectTransform>(); 7 combiner.transform.SetParent(image_stage.transform, false); 8 9 //signを作る 10 GameObject[] sign = new GameObject[3]; 11 12 for(int i= 0; i < 3; i++) 13 { 14 sign[i] = new GameObject("sign"); 15 sign[i].AddComponent<Image>(); 16 sign[i].GetComponent<Image>().sprite = sprite_naga; 17 sign[i].GetComponent<Image>().SetNativeSize(); 18 sign[i].transform.SetParent(combiner.transform, false); 19 } 20 sign[1].transform.Translate(0.5f, 0.0f, 0.0f); 21 sign[2].transform.Translate(-0.5f, 0.0f, 0.0f); 22 23 //combinerのインスタンスを作る 24 GameObject instans = Instantiate(combiner, image_stage.transform); 25 } 26
試したこと
試しにスクリプトからではなく、Unityのほうでオブジェクトを作りinstantiateしてみると、2つとも
***
と表示されました。
どうしたらスクリプトから同じようにできるでしょうか。
補足情報(FW/ツールのバージョンなど)
Unity2018.3.1f1 personal
VisualStudio2017 community
こちらで確認しましたが正常に動作しました。(Unity2018.2.7f1)
HorizontalLayoutGroupの設定を変えてみたり、他のスクリプトが影響していないか等を確認してみてください。
回答ありがとうございます。
HorizontalLayoutGroupを外したり、新しくCanvasから作ったりしてみたのですが、変わりません。
他のスクリプトからも独立しています。
他に、どんな原因が考えられるでしょうか?
Unityのバグかエディタスクリプトの影響とかですかね……?(そんなことない気もしますが)
一応違うバージョンや、クリーンなプロジェクトで試してみてください。
おはようございます。
新しいプロジェクトを作って試してみましたが、同じ結果が出ました。
プロジェクトを作ってプラットフォームをAndroidに変える際、以下のようなエラーメッセージが出たのですが、関係あるのでしょうか?
ググってみたのですが、みなさんよく分からないみたいです。
<エラーメッセージ>
IndexOutOfRangeException: Index was outside the bounds of the array.
UnityEditor.Android.AndroidBuildWindowExtension.GetBuildPlayerWindow () (at <e1c3953b4cf040ddb1400046b1c34897>:0)
UnityEditor.Android.AndroidBuildWindowExtension.RepaintTargetList () (at <e1c3953b4cf040ddb1400046b1c34897>:0)
UnityEditor.EditorApplication.Internal_CallUpdateFunctions () (at C:/buildslave/unity/build/Editor/Mono/EditorApplication.cs:200)
たった今解決(?)しました。
InputFieldを介して数字を渡すとうまくいきました。
具体的には
```
//combinerのインスタンスを作る
GameObject instans = Instantiate(combiner, image_stage.transform);
```
の部分を消して、新しい関数
```
public void IfChangeValueInputField(string value)
{
if (!string.IsNullOrEmpty(value))
{
int number = int.Parse(value);
GameObject combiner = image_stage.transform.GetChild(0).gameObject;
GameObject[] sign = new GameObject[number];
for (int i = 0; i < number; i++)
{
sign[i] = Instantiate(combiner, image_stage.transform);
}
}
}
```
を作り、InputFieldのOnEndEditにアタッチしました。
どうしてこれでうまくいくのでしょうか?
解決して何よりです。何らかの理由でCanvasが更新されず表示上の位置がおかしいのかなと思いましたが、インスペクタの値も0というのは変な話なので原因不明ですね……(anchoredPositionを弄るのが正解ではあるのですがそれにしてもtransform.positionが0のままというのはおかしい)
Unityの世界は奥が深そうです…(*_*)
ありがとうございましたm(_ _)m
回答1件
あなたの回答
tips
プレビュー