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

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

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

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

Unity

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

Q&A

解決済

1回答

2063閲覧

UnityでUI制御の際、オブジェクトのインスタンスにアクセスできる時とできない時がある。

cushionA

総合スコア90

C#

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

Unity

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

0グッド

0クリップ

投稿2020/05/28 14:28

編集2020/05/28 14:31

前提・実現したいこと

現在一人のNPCと洞窟を旅するようなゲームを作っているのですが、相棒の魔法を選択するメニューのUIに不具合が起きています。
具体的には、魔法選択画面のUIをキーボードから制御する際に不可解な問題を抱えています。
実際の開発画面
このように左には前の魔法にシフトするボタンと右には次の魔法にシフトするボタンを二つ並べていて(選択中のボタンは赤くなるようにしています)、右のボタンを選択中に右キーを押すと右ボタンが押されるようにし、左も同じようにしています。
そしてそのためにイベントシステムのインスタンスにアクセスして現在選択中のボタンを取得しているのですが、これが成功するときと失敗するときがあるのです。

上の画像は成功した時で、失敗すると選択できずエラーメッセージが出ます。

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

NullReferenceException: Object reference not set to an instance of an object SisUI.Update () (at Assets/testAsset/Scrypt/SisUI.cs:64)

失敗するとこのエラーが出ます。

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.EventSystems; 5using UnityEngine.UI; 6 7public class SisUI : MonoBehaviour 8{ 9 public bool sisMenu; 10 public GameObject sisPanel; 11 12 public GameObject sisr; 13 public GameObject sisl; 14 [SerializeField] EventSystem eventSystem; 15 16 Button bt1; 17 Button bt2; 18 GameObject selectedObj; 19 20 // Start is called before the first frame update 21 void Start() 22 { 23 24 bt1 = sisr.GetComponent<Button>(); 25 bt2 = sisl.GetComponent<Button>(); 26 //ボタンが選択された状態になる 27 bt1.Select(); 28 29 30} 31 32 // Update is called once per frame 33 void Update() 34 { 35 float choice = Input.GetAxisRaw("Horizontal"); 36 37 if (Input.GetButtonDown("SMenu")) 38 { 39 //メニュー展開ボタンを押すとメニューの表示非表示を切り替え 40 if (sisMenu) 41 { 42 43 sisMenu = false; 44 } 45 46 else if (!sisMenu) 47 { 48 sisMenu = true; 49 } 50 } 51 52 //メニュー非展開 53 if (!sisMenu) 54 { 55 Time.timeScale = 1.0f; 56 sisPanel.SetActive(false); 57 58 } 59 //メニュー展開中 60 else if (sisMenu) 61 { 62 Time.timeScale = 0; 63 sisPanel.SetActive(true); 64 65 selectedObj = eventSystem.currentSelectedGameObject.gameObject; 66 67 if (sisr == selectedObj) 68 { 69 //右のボタンが選択中に右キーを押したら 70 if (Input.GetButtonDown("ChoiceR")) 71 { 72 bt1.onClick.Invoke(); 73 } 74 } 75 else if (sisl == selectedObj) 76 { 77 //左のボタンが選択中に左キーを押したら 78 if (Input.GetButtonDown("ChoiceL")) 79 { 80 bt2.onClick.Invoke(); 81 82 } 83 } 84 } 85 } 86 87 public void MenuBreake() 88 { 89 sisMenu = false; 90 91 } 92 93 public void MenuCheck() 94 { 95 //右ボタンに反応するイベント 96 Debug.Log("Left"); 97 98 } 99 public void Check() 100 { 101 102 //左ボタンに反応するイベント 103 Debug.Log("Right"); 104 105 } 106 107} 108

試したこと

ゲームオブジェクトを一度「None」にして設定しなおしたりしました。

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

Unity 2019 3.7f1です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーメッセージを読みましょう。
at Assets/testAsset/Scrypt/SisUI.cs:64
とあるので、64行目付近を見ます。

selectedObj = eventSystem.currentSelectedGameObject.gameObject;
この行、オブジェクトが選択されていない(=currentSelectedGameObjectがnull)場合にエラーになるので、恐らくここが原因です。
(途中でマウスカーソルがずれて選択が外れるとかではないでしょうか)

そもそもeventSystem.currentSelectedGameObjectがGameObjectを取得するので、後ろのgameObjectは不要です。
今回のコードだとselectedObjがnullでも問題無いので、
selectedObj = eventSystem.currentSelectedGameObject;
これで動くのではないかと思います。

投稿2020/05/28 23:49

sakura_hana

総合スコア11427

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

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

cushionA

2020/05/29 00:40

sakura_hana様、迅速で丁寧かつ正確な返信でお助け下さりありがとうございました。 ご教授頂いた通りにしたところ正常に動作するようになりました。 ご助力に心から感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問