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

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

新規登録して質問してみよう
ただいま回答率
85.49%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

Q&A

解決済

2回答

13422閲覧

transform.Findでオブジェクトを取得できない

micro_1357

総合スコア7

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

0グッド

0クリップ

投稿2016/10/30 19:44

編集2016/10/31 05:12

私の他の質問と同じ内容に関する内容ですが、問題が絞れてきたので、再度質問させて頂きます。

###発生している問題・エラーメッセージ
カメラに割り当てたスクリプトで、カメラのz座標が300の地点まで達するまでz座標を+30し、300の地点を超えるとオブジェクトAを非アクティブにし、同時に(非アクティブの)オブジェクトBをアクティブにする。
というスクリプトを書きたいのですが、オブジェクトの取得が上手くいきません。

原因を調べてみたところ、startメソッドの時点でオブジェクトBであるBox1/Sphere101の取得ができていないようです。

非アクティブのオブジェクトを参照する為に、親オブジェクトがアクティブであれば参照が可能なtransform.Findを使用して、EmptyなオブジェクトBox1の子階層にSphere101を入れ、参照しています。(画像参照)

###試したこと

  • GameObject.FindでBox1を取得する事が出来たので、オブジェクトの問題ではないように思われます。

  • Box1/Sphere101

から
Box1
と変更し、取得できるか試してみましたが、変更前と同じように取得できませんでした。

###エラー文、参考画像
イメージ説明

イメージ説明
(↑この画像のSphere101は非アクティブ状態です)
###該当のソースコード

C#

1using UnityEngine; 2using System.Collections; 3 4public class mvcam_new3 : MonoBehaviour 5{ 6 public Vector3 pos = new Vector3(-11, 0, 0); 7 private GameObject game_object01 = null; 8 private GameObject game_object02 = null; 9 void Start() 10 { 11 game_object01 = GameObject.Find("Sphere100"); 12 game_object02 = transform.Find("Box1/Sphere101").gameObject; 13 } 14 void Update() 15 { 16 17 if (Input.GetKeyDown(KeyCode.Space) && pos.z < 300) 18 { //spaceキーの入力があり、かつx座標が300以下の場合にという条件文 19 pos.z += 30; //x座標を+30する(移動する) 20 transform.position = pos; //位置更新 21 print(transform.position.z); //コンソールを開くと座標が今どこにいるのかわかるのか書いてくれる 22 } 23 else if (Input.GetKeyDown(KeyCode.Space) && pos.z >= 300) 24 { 25 pos.z = 0; 26 transform.position = pos; 27 print(transform.position.z); 28 game_object01.SetActive(false); 29 game_object02.SetActive(true); 30 } 31 } 32}

このスクリプトではtransform.Findを使用していますが、非アクティブなオブジェクトを参照する事ができれば別の方法でも問題ありません。

どうぞよろしくお願いいたします。

###改変

using UnityEngine; using System.Collections; public class mvcam_new3 : MonoBehaviour { public Vector3 pos = new Vector3(-11, 0, 0); private GameObject game_object01 = null; private GameObject game_object02 = null; public void Start() { game_object01 = GameObject.Find("Sphere100"); GameObject game_object02 = (GameObject)Resources.Load ("Prefabs/Sphere101"); Instantiate (game_object02,transform.position,transform.rotation); } void Update() { if (Input.GetKeyDown(KeyCode.Space) && pos.z < 300) { //spaceキーの入力があり、かつx座標が300以下の場合にという条件文 pos.z += 30; //x座標を+30する(移動する) transform.position = pos; //位置更新 print(transform.position.z); //コンソールを開くと座標が今どこにいるのかわかるのか書いてくれる } else if (Input.GetKeyDown(KeyCode.Space) && pos.z >= 300) { pos.z = 0; transform.position = pos; print(transform.position.z); game_object01.SetActive(false); //game_object02.SetActive(true); game_object02.SetActive(true); //game_object02.transform.gameObject.SetActive(true); } } }

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

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

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

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

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

guest

回答2

0

ベストアンサー

Transform.Findで取得できるのは、アクティブ・非アクティブに関わらず子オブジェクトのみです。
Transform.Find("Child/hoge")でhogeが取得できるのは、自身がChildの親オブジェクトの場合のみです。

GameObject.Findで取得できるオブジェクトは、親子関係などのつながりがなくても取得できますが、アクティブなオブジェクトに限定されます。

game_object02をpublicな変数(あるいは[System.Serializable]属性)にして、インスペクタから対象のGameObjectを設定するか、
プレハブにして、プレハブからインスタンス化して取得したのち、非アクティブ化するのが手っ取り早いのではないでしょうか。

C#

1using UnityEngine; 2using System.Collections; 3 4public class mvcam_new3 : MonoBehaviour 5{ 6 public Vector3 pos = new Vector3(-11, 0, 0); 7 private GameObject game_object01 = null; 8 private GameObject game_object02 = null; 9 public GameObject game_object02_prefab; 10 public void Start() 11 { 12 game_object01 = GameObject.Find("Sphere100"); 13 // プレハブをインスタンス化して、game_object02に代入 14 game_object02 = (GameObject) Instantiate (game_object02_prefab,transform.position,transform.rotation); 15 game_object02.SetActive(false); 16 } 17 void Update() 18 { 19 20 if (Input.GetKeyDown(KeyCode.Space) && pos.z < 300) 21 { //spaceキーの入力があり、かつx座標が300以下の場合にという条件文 22 pos.z += 30; //x座標を+30する(移動する) 23 transform.position = pos; //位置更新 24 print(transform.position.z); //コンソールを開くと座標が今どこにいるのかわかるのか書いてくれる 25 } 26 else if (Input.GetKeyDown(KeyCode.Space) && pos.z >= 300) 27 { 28 pos.z = 0; 29 transform.position = pos; 30 print(transform.position.z); 31 game_object01.SetActive(false); 32 //game_object02.SetActive(true); 33 game_object02.SetActive(true); 34 //game_object02.transform.gameObject.SetActive(true); 35 } 36 } 37}

投稿2016/10/30 21:05

編集2016/10/31 05:53
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

micro_1357

2016/10/31 05:18

ご返答ありがとうございます。 改変後のスクリプトのように、prefabからインスタンス化(インスタンス化をあまり理解していない)し、startメソッドの時点ではSphere101の呼び出しができている事が確認できました。 しかしupdateメソッドでgame_object02.SetActive(true); を実行できず、インスタンスが見つからない状態になってしまいます。 prefabのインスタンス化について知識がないので、文字列の理由も併せて書いてくださると幸いです。
退会済みユーザー

退会済みユーザー

2016/10/31 06:00

スクリプトを追加しました。 インスペクタを利用せず、Resourcesから読み込みしてるのには理由があるのでしょうか? 改変後のスクリプトを見ました。 12行目の GameObject game_object02 = (GameObject)Resources.Load ("Prefabs/Sphere101"); を game_object02 = (GameObject)Resources.Load ("Prefabs/Sphere101"); として下さい。 Start関数内のローカル変数にインスタンス化したGameObjectを代入している状態なので、8行目のメンバ変数game_object02はnullのままです。
micro_1357

2016/10/31 10:32

記載して頂いたスクリプトを適用してみたところ、Sphere101の呼び出しとアクティブ化ができました ありがとうございます。 しかし読み込まれたSphere101のpositionやrotationが違うものになってしまいます。 prefabにあるSphere101を弄ってみても変化がありません。これはInstantiateの呼び出しの過程で問題があるという事なのでしょうか?
退会済みユーザー

退会済みユーザー

2016/10/31 10:41

Object.Instantiate の引数にこのスクリプトをアタッチしたオブジェクトの transform.positionとtransform.rotationを渡しているからです。 詳しくはリファレンスを読んでください。 https://docs.unity3d.com/ja/current/ScriptReference/Object.Instantiate.html プレハブの値をそのまま利用する場合は、引数にプレハブのみを渡してください。 game_object02 = (GameObject) Instantiate (game_object02_prefab);
guest

0

GameObject.Find("Box").transform.Find("Sphere");
とかですかね?

投稿2016/10/30 20:48

livetc

総合スコア86

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問