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

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

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

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

Unity

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

Q&A

解決済

2回答

952閲覧

NullReferenceExceptionエラーの解決に困っています!

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity

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

0グッド

0クリップ

投稿2019/08/18 14:17

敵を攻撃して体力を減らして敵を倒す
機能を実装中に以下のエラーメッセージが発生しました。

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

NullReferenceException: Object reference not set to an instance of an object MyStatus.GetAttackPower () (at MyStatus.cs:36) AttackSword.OnTriggerEnter (UnityEngine.Collider col) (at AttackSword.cs:19)

該当のソースコード

C#

1using UnityEngine; 2using System.Collections; 3 4public class MyStatus : MonoBehaviour 5{ 6 7[SerializeField] 8 private int hp; 9 // 力 10 private GameObject equip; 11 [SerializeField] 12 private int power; 13 private WeaponStatus weaponStatus; 14 15 public void SetHp(int hp) 16 { 17 this.hp = hp; 18 } 19 20 public int GetHp() 21 { 22 return hp; 23 } 24 public void SetEquip(GameObject weapon) 25 { 26 equip = weapon; 27 weaponStatus = equip.GetComponent<WeaponStatus>(); 28 } 29 public GameObject GetEquip() 30 { 31 return equip; 32 } 33// 自身の力と武器の攻撃力を合わせたダメージ力を返す 34public int GetAttackPower() 35 { 36 return power + weaponStatus.GetAttackPower(); 37 } 38}  39 40using UnityEngine; 41using System.Collections; 42 43public class AttackSword : MonoBehaviour 44{ 45 private MyStatus myStatus; 46 47 private void Start() 48 { 49 myStatus = transform.root.GetComponent<MyStatus>(); 50 } 51 void OnTriggerEnter(Collider col) 52 { 53 if (col.tag == "Enemy") 54 { 55 var enemyScript = col.GetComponent<Enemy>(); 56 if (enemyScript.GetState() != Enemy.EnemyState.Damage && enemyScript.GetState() != Enemy.EnemyState.Dead) 57 { 58 col.GetComponent<Enemy>().TakeDamage(myStatus.GetAttackPower(), col.ClosestPointOnBounds(transform.position)); 59 } 60 } 61 } 62} 63

試したこと

当たり判定やHP出力などに問題はありませんでした。たぶんこのNullReferenceExceptionが問題だと思います。
どうか解決方法をよろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

C#

1using UnityEngine; 2using System.Collections; 3 4public class MyStatus : MonoBehaviour 5{ 6 7 [SerializeField] 8 private int hp; 9 // 力 10 private GameObject equip; 11 [SerializeField] 12 private int power; 13 private WeaponStatus weaponStatus; 14 15 public int Hp { get => hp; set => this.hp = value; } 16 17 public GameObject Equip 18 { 19 get => equip; 20 set 21 { 22 equip = value; 23 weaponStatus = equip.GetComponent<WeaponStatus>(); 24 } 25 } 26 27 /// <summary> 28 /// 自身の力と武器の攻撃力を合わせたダメージ力を返す。武器がない場合は自身の力をそのまま返す。 29 /// </summary> 30 public int AttackPower => power + (weaponStatus?.GetAttackPower() ?? 0); 31}  32

武器情報(weaponStatus)がないのに装備の攻撃力(weaponStatus.GetAttackPower)を参照しようとしているので)Null参照例外が出ています。
Null条件演算子とnull合体演算子を用いて上の例の用にnullの場合の値を設定することができます。
また、C#においてはGetterSetterメソッドよりも上の例のようにプロパティを用いるのが一般的です。

投稿2019/08/18 16:37

Ram.Type-0

総合スコア424

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

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

退会済みユーザー

退会済みユーザー

2019/08/30 16:03

返信が遅れて申し訳ございません。 なんとか解決することができました。
guest

0

weaponStatusがnullなんじゃないですかね?
weaponStatusをセットするSetEquipを呼んでますか?

投稿2019/08/18 14:33

YAmaGNZ

総合スコア10258

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問