質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

771閲覧

Unity Instantinateすると子オブジェクトの位置がx:0 y:0に戻ってしまう

silver_night

総合スコア34

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/05/04 13:10

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sakura_hana

2020/05/05 01:02

こちらで確認しましたが正常に動作しました。(Unity2018.2.7f1) HorizontalLayoutGroupの設定を変えてみたり、他のスクリプトが影響していないか等を確認してみてください。
silver_night

2020/05/05 02:17

回答ありがとうございます。 HorizontalLayoutGroupを外したり、新しくCanvasから作ったりしてみたのですが、変わりません。 他のスクリプトからも独立しています。 他に、どんな原因が考えられるでしょうか?
sakura_hana

2020/05/05 05:10

Unityのバグかエディタスクリプトの影響とかですかね……?(そんなことない気もしますが) 一応違うバージョンや、クリーンなプロジェクトで試してみてください。
silver_night

2020/05/06 01:20

おはようございます。 新しいプロジェクトを作って試してみましたが、同じ結果が出ました。 プロジェクトを作ってプラットフォームを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)
silver_night

2020/05/06 11:27 編集

たった今解決(?)しました。 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にアタッチしました。 どうしてこれでうまくいくのでしょうか?
sakura_hana

2020/05/07 00:53

解決して何よりです。何らかの理由でCanvasが更新されず表示上の位置がおかしいのかなと思いましたが、インスペクタの値も0というのは変な話なので原因不明ですね……(anchoredPositionを弄るのが正解ではあるのですがそれにしてもtransform.positionが0のままというのはおかしい)
silver_night

2020/05/07 01:01

Unityの世界は奥が深そうです…(*_*) ありがとうございましたm(_ _)m
guest

回答1

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 21    ↓ここから書き直し 22 float x = sign[0].GetComponent<RectTransform>().anchoredPosition.x; 23 sign[1].GetComponent<RectTransform>().anchoredPosition = new Vector2(x + 36f, 0.0f); 24 sign[1].GetComponent<RectTransform>().anchoredPosition = new Vector2(x - 36f, 0.0f); 25 ↑ここまで。 26 27 Instantiate(combiner, image_stage.transform); 28 } 29

transformではなく、RectTransformのanchoredPositionをいじるのが正解だったようです。

お付き合いくださったsakura_hana様、ありがとうございました。

投稿2020/05/06 11:34

silver_night

総合スコア34

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問