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

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

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

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

Unity

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

Q&A

解決済

1回答

1273閲覧

Unityで車を一時停止させる

kurira

総合スコア28

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2021/05/02 01:16

現在、Unityで自動運転の車を作成してみているのですが、

Boxが赤になったら走っている車を一時停止させる処理をしたいです。

public class ShingoRed : MonoBehaviour { [SerializeField] Material redMaterial; [SerializeField] Material whiteMaterial; bool White; // Start is called before the first frame update void Start() { GetComponent<Renderer>().material = whiteMaterial; White = false; InvokeRepeating("ChangeMaterial", 3f, 3f); } // Update is called once per frame void Update() { } void ChangeMaterial() { if (White) { GetComponent<Renderer>().material = whiteMaterial; White= false; } else { GetComponent<Renderer>().material = redMaterial; White = true; } } }

Boxの色は上記のようなスクリプトで変化させています。
3秒経ったら車を一時停止、ではなく、Boxが赤になったら車を止めるようにしたいのですが、
車にアタッチするスクリプトがわかりません。
タグから検出する方法でやりたいのですが、ご回答宜しくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ShingoRed.Whiteが取得できれば実現可能
なので以下のコードを描く

c#

1public class ShingoRed : MonoBehaviour 2{ 3 [SerializeField] Material redMaterial; 4 [SerializeField] Material whiteMaterial; 5 6 public bool White {get;private set;}//こうすることでWhiteが取得可能 7 // Start is called before the first frame update 8 void Start() 9 { 10 GetComponent<Renderer>().material = whiteMaterial; 11 12 White = false; 13 14 InvokeRepeating("ChangeMaterial", 3f, 3f); 15 } 16 17 //以下、割愛 18}

C#

1public class CarStopper : MonoBehaviour{ 2 ShingoRed singo; 3 4 void Start(){ 5 //ShingoRedがアタッチされているGameObjectを取得し、GetComponentでShingoRedを取得する。 6 var obj = GameObject.Find("Box"); 7 Debug.Log(obj);//これがnullならObjectを取得できていない。Findの引数を確認する。 8 singo = obj.GetComponent<ShingoRed>(); 9 Debug.Log(singo);//こっちがnullならShigoRedを取得できていない。コンポーネントが、ちゃんとアタッチされているか確認する。 10 } 11 12 void Update(){ 13 if(singo.White){ 14 //白のときの処理 15 }else{ 16 //赤のときの処理 17 } 18 } 19 20}

ShingoRed.Whiteを取得のみ公開し、他スクリプトから読み取り可能にする。
そして、ShingoRedコンポーネントをCarStopperで取得し、Whiteの値を読み取ることで、
信号の状態に応じた処理が可能になる。

5/4 追記
エラーが出ると指摘を頂いたのでNullチェックを追加。
理論上はこのscriptでできるはずなので引数間違いの可能性が高い。

投稿2021/05/02 02:33

編集2021/05/03 23:04
task58

総合スコア24

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

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

kurira

2021/05/02 03:07

ご回答ありがとうございます。 早速いただいたコードを入力して、ShingoRedはBoxに、CarStopperは車にアタッチしました。 実行したところ、Object reference not set to an instance of an objectというエラーが出て、上手くいかないのですがどうすれば良いのでしょうか?
task58

2021/05/02 03:52

エラーはどれの何行目に出ていますか?
task58

2021/05/02 04:03

おそらく、そのエラーは、参照しようとした変数がNullだったことによって起きるエラーです。 このスクリプトでnullになる可能性があるのはGameObject.Findで、指定している文字列の名前のGameObjectが見つから場合。もしくはGetComponentsで「ShingoRed」を取得できなかったかのどちらかです。
task58

2021/05/02 04:05

可能性が高いのは前者なので、Find()の引数が、ShingoRedがアタッチされているGameObjectの名前になっているかどうかを確認してみてください
kurira

2021/05/02 09:31

エラーが出ているのは、singo = GameObject.Find("Box").GetComponent<ShingoRed>();の部分と、if(singo.White)の部分です。Findの引数はShingoRedがアタッチされているGameObjectの名前になっています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問