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

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

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

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

解決済

1回答

3885閲覧

Unityのオブジェクトの表示、非表示についての質問です

drizzing20

総合スコア363

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

0クリップ

投稿2016/10/19 14:40

階層構造です
↓これはカメラにつけたスクリプトなのですが、
やりたいことはカメラのZ座標が300を超えたらSphere100をfalseにしてSphere101を有効にするというスクリプトが書きたいです。

GameObject game_object2 = game_object1.transform.FindChild("Sphere101").gameobject;のところでエラーになってしまいます。
イメージ説明

ヒントになることでもよいので回答お願いします

C#

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

GameObject.Find()では非アクティブなオブジェクトを取得できません。

21:GameObject game_object0 = GameObject.Find("Sphere100");
22:game_object0.SetActive(false);

21行目はまだアクティブなので取得でき、22行目で非アクティブになります。
次のフレームで
GameObject.Find("Sphere100");
を実行しても非アクティブになっているので、nullが返ってくるということだと思います。

速い解決策としてはインスペクタから直接"Sphere100"を変数に入れてやることかと思います。
関数の外で変数を定義してやれば最初に"Sphere100"を取得すればいいだけなので。

インスペクタの操作は他のサイトに書いてあると思います。

下記で実行したらいけるかも...
public class mvcam_new2 : MonoBehaviour
{
public Vector3 pos = new Vector3(-11, 0, 0);
private GameObject game_object0 = null;
private GameObject game_object2 = null;
void Start()
{
game_object0 = GameObject.Find("Sphere100");
game_object2 = GameObject.Find("Box1").transform.FindChild("Sphere101").gameobject;
}
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_object0.SetActive(false);
game_object2.SetActive(true);
}
}
}

投稿2016/10/19 15:31

編集2016/10/19 15:40
sminier

総合スコア25

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問