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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

3518閲覧

UnityでGameObjectがnullの時に条件分岐したいです。

land25

総合スコア7

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2020/04/28 23:07

編集2020/04/28 23:40

前提・実現したいこと

unityで物体Aが物体Bに衝突した時、物体Bが何か判定し条件分岐するプログラムを作成しています。

物体BをhostSeeingObjとして、hostSeeingObj.nameがCubeA,SphereAか、またはhostSeeingObjがnullかどうかで単純にif分で条件分岐させました。

発生している問題・エラーメッセージ

hostSeeingObjがCubeA,SphereAになっているときは問題ないですが、 hostSeeingObjがnullの時に「NullReferenceException: Object reference not set to an instance of an object」が発生し、if分の内容が実行されません。 実際にhostSeeingObjがnullなのでこのエラー内容自体は理解できますが、このままでは動作を実現できないため困っています。

該当のソースコード

void updateEye() { //ホスト視線移動後の位置 Transform GazeTargetTransform = hostGazeTarget.transform; Vector3 GazeTargetPos = GazeTargetTransform.localPosition; GameObject hostSeeingObj = trackingManager_host.getSeeingObject(); //物体Bを取得 //物体BがCubeA,SphereAか、nullかで条件分岐 if (hostSeeingObj.name=="CubeA") { GameObject target = hostSeeingObj.transform.GetChild(0).gameObject; Transform targetTransform = target.transform; Vector3 targetPos = targetTransform.position; Transform myTransform = clientGazeTarget.transform; myTransform.position = targetPos; Debug.Log(target.name); } else if (hostSeeingObj.name == "SphereA") { GameObject target = hostSeeingObj.transform.GetChild(0).gameObject; Transform targetTransform = target.transform; Vector3 targetPos = targetTransform.position; Transform myTransform = clientGazeTarget.transform; myTransform.position = targetPos; Debug.Log(target.name); } else if(hostSeeingObj == null) { Debug.Log("null"); //動作確認用 //移動座標 float x = GazeTargetPos.x - myHostGazeTargetPos.x; float y = GazeTargetPos.y - myHostGazeTargetPos.y; float z = GazeTargetPos.z - myHostGazeTargetPos.z; //クライアント位置移動 Transform myTransform = clientGazeTarget.transform; Vector3 pos = myClientGazeTargetPos; pos.x += x; pos.y += y; pos.z += z; myTransform.localPosition = pos; } }

補足情報(FW/ツールのバージョンなど)

Unity 2018.2.18f1

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

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

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

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

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

guest

回答1

0

ベストアンサー

//物体BがCubeA,SphereAか、nullかで条件分岐

の所でnull判定を一番先にしてみてください。

投稿2020/04/28 23:49

takabosoft

総合スコア8356

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

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

land25

2020/04/29 00:07

おかげで上手くいきました。ありがとうございました。 参考までに、何故null判定の順番によって変わるのか教えていただいてもよろしいでしょうか?
takabosoft

2020/04/29 00:58

if 文は上から順番に実行されます。 つまり、 if (hostSeeingObj.name=="CubeA") を評価してから、条件式が「偽」になった場合に次のelse ifに流れていきます。 で、hostSeeingObj.name=="CubeA" この評価式はhostSeeingObjのnameプロパティにアクセスしているので、hostSeeingObjがnullだとNullReferenceExceptionが発生します。 なので、最初にhostSeeingObjがnullでないことを確認してから、プロパティへアクセスする、という順番を守る必要があります。
land25

2020/04/29 02:49

nullのnameへアクセスしてしまったことによるエラーだったんですね。 大変分かりやすかったです。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問