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

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

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

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

Unity

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

Q&A

解決済

1回答

141閲覧

UnityでNullReferenceExceptionエラーが解決できない

spppttn

総合スコア1

C#

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

Unity

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

0グッド

0クリップ

投稿2024/11/09 09:54

実現したいこと

Unityで2Dゲームを制作しています。
チュートリアル動画( https://youtu.be/vY0Sk93YUhA?si=77TRM4O89HVe_m6E )に従って会話ウィンドウを実装しようとしています。
具体的には、PlayerがNPCに近づくとplaerInRangeというboolがtrueになり、その状態でPlayerInputで設定したinteractキーを押すと会話が始まるという機能を実装したいです。

発生している問題・分からないこと

動画内のTriggering Dialogueチャプターの所までのコードを書き実行したところ、NPCに近づいた瞬間ゲームがエラーを吐き停止してしまいます。検証した結果、

if(InputManager.GetInstance().GetInteractPressed())
{
Debug.Log(inkJSON.text)
}

の部分が問題のようです。
関係があると思われるInputManagerのコードも付しておきます。

エラーメッセージ

error

1NullReferenceException: Object reference not set to an instance of an object 2DialogueTrigger.Update () (at Assets/scripts/Dialogue/DialogueTrigger.cs:26)

該当のソースコード

DialogueTrigger

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class DialogueTrigger : MonoBehaviour 6{ 7 [Header("Visual Cue")] 8 [SerializeField] private GameObject visualCue; 9 10 [Header("Ink JSON")] 11 [SerializeField] private TextAsset inkJSON; 12 13 private bool playerInRange; 14 15 private void Awake() 16 { 17 playerInRange = false; 18 visualCue.SetActive(false); 19 } 20 21 private void Update() 22 { 23 if (playerInRange) 24 { 25 visualCue.SetActive(true); 26 if (InputManager.GetInstance().GetInteractPressed()) 27 { 28 Debug.Log(inkJSON); 29 } 30 } 31 else 32 { 33 visualCue.SetActive(false); 34 } 35 } 36 37 private void OnTriggerEnter2D(Collider2D collider) 38 { 39 if(collider.gameObject.tag == "Player") 40 { 41 playerInRange = true; 42 } 43 } 44 45 private void OnTriggerExit2D(Collider2D collider) 46 { 47 if (collider.gameObject.tag == "Player") 48 { 49 playerInRange = false; 50 } 51 } 52} 53

InputManager

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.InputSystem; 5 6// This script acts as a single point for all other scripts to get 7// the current input from. It uses Unity's new Input System and 8// functions should be mapped to their corresponding controls 9// using a PlayerInput component with Unity Events. 10 11[RequireComponent(typeof(PlayerInput))] 12public class InputManager : MonoBehaviour 13{ 14 private Vector2 moveDirection = Vector2.zero; 15 private bool jumpPressed = false; 16 private bool interactPressed = false; 17 private bool submitPressed = false; 18 19 private static InputManager instance; 20 21 private void Awake() 22 { 23 if (instance != null) 24 { 25 Debug.LogError("Found more than one Input Manager in the scene."); 26 } 27 instance = this; 28 } 29 30 public static InputManager GetInstance() 31 { 32 return instance; 33 } 34 35 public void MovePressed(InputAction.CallbackContext context) 36 { 37 if (context.performed) 38 { 39 moveDirection = context.ReadValue<Vector2>(); 40 } 41 else if (context.canceled) 42 { 43 moveDirection = context.ReadValue<Vector2>(); 44 } 45 } 46 47 public void JumpPressed(InputAction.CallbackContext context) 48 { 49 if (context.performed) 50 { 51 jumpPressed = true; 52 } 53 else if (context.canceled) 54 { 55 jumpPressed = false; 56 } 57 } 58 59 public void InteractButtonPressed(InputAction.CallbackContext context) 60 { 61 if (context.performed) 62 { 63 interactPressed = true; 64 } 65 else if (context.canceled) 66 { 67 interactPressed = false; 68 } 69 } 70 71 public void SubmitPressed(InputAction.CallbackContext context) 72 { 73 if (context.performed) 74 { 75 submitPressed = true; 76 } 77 else if (context.canceled) 78 { 79 submitPressed = false; 80 } 81 } 82 83 public Vector2 GetMoveDirection() 84 { 85 return moveDirection; 86 } 87 88 // for any of the below 'Get' methods, if we're getting it then we're also using it, 89 // which means we should set it to false so that it can't be used again until actually 90 // pressed again. 91 92 public bool GetJumpPressed() 93 { 94 bool result = jumpPressed; 95 jumpPressed = false; 96 return result; 97 } 98 99 public bool GetInteractPressed() 100 { 101 bool result = interactPressed; 102 interactPressed = false; 103 return result; 104 } 105 106 public bool GetSubmitPressed() 107 { 108 bool result = submitPressed; 109 submitPressed = false; 110 return result; 111 } 112 113 public void RegisterSubmitPressed() 114 { 115 submitPressed = false; 116 } 117 118}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

GetInstance()が上手く働いておらず、InputManagerが原因なのではないかという所までは思い至ったのですが、そこから先は分かりませんでした。

補足

Windows 10 Home
Visual Studio 2022
Unity 2022.3.18f1

初めてこういった質問をするので、不足している情報などがあればお申しつけください。

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

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

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

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

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

guest

回答1

0

自己解決

inputManagerのPlayerInputで、Invoke Unity EventをオンにしてEventを正しく設定する必要があったのですが、それができていませんでした。

投稿2024/11/09 12:13

spppttn

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問