前提
Unity2Dでアクションパズルゲームを制作しています。
敵のパラメータを取得してプレイヤーの武器が当たった時にHPを減らしたい
です。ですが、敵のパラメータをGetComponentしようとしてもNullエラーが
出てしまいます。
実現したいこと
ゲーム中の敵のパラメータを取得したい。
PlayerというオブジェクトにWeapon.csをつけた
EnemyというオブジェクトにEnemyStatus.csをつけた
Enemyは複数出現させたいためPrefabになっている
EnemyはHP等ステータスの違う個体がある
Prefabにあるスクリプトの関数を別なオブジェクトから呼び出す。
エラーメッセージ NullReferenceException: Object reference not set to an instance of an object Weapon.Update () (at Assets/Scripts/Player/Weapon.cs:61)
該当のソースコード
C#
1using UnityEngine; 2 3public class Weapon : MonoBehaviour 4{ 5 private EnemyStatus enemyStatus; 6 bool Hitflg; 7 private const float RAY_DISPLAY_TIME = 3; //Rayの表示時間 8 public LayerMask m_layerMask; 9 Vector2 StartPosition; 10 Vector2 DirectionPosition; 11 12 public static RaycastHit2D RaycastAndDraw(Vector2 origin, Vector2 direction, float maxDistance, int layerMask) 13 { 14 RaycastHit2D hit = Physics2D.Raycast(origin, direction, maxDistance, layerMask); 15 16 //衝突時のRayを画面に表示 17 if (hit.collider) 18 { 19 Debug.DrawRay(origin, hit.point - origin, Color.blue, RAY_DISPLAY_TIME, false); 20 } 21 //非衝突時のRayを画面に表示 22 else 23 { 24 Debug.DrawRay(origin, direction * maxDistance, Color.green, RAY_DISPLAY_TIME, false); 25 } 26 27 return hit; 28 } 29 30 private void Start() 31 { 32 Hitflg = false; 33 34 StartPosition = transform.position; 35 DirectionPosition = new Vector2(0, -1); 36 } 37 38 private void Update() 39 { 40 //レイヤーマスク作成 41 int layerMask = m_layerMask; 42 //Rayの長さ 43 float maxDistance = 2; 44 RaycastHit2D hit = RaycastAndDraw(StartPosition, DirectionPosition, maxDistance, layerMask); 45 46 if (Input.GetKeyDown(KeyCode.K)) 47 { 48 //なにかと衝突した時だけログに出す 49 if (hit.collider) 50 { 51 Debug.Log("Hit"); 52 53 Hitflg = true; 54 55 56 enemyStatus = hit.collider.GetComponent<EnemyStatus>(); // 追加 57 // 敵が受けるダメージ(プレイヤーの攻撃力/2 - 敵の防御力/4) 58 // 受けるダメージ0より大きい時 59 if ((StaticStatus.GetPlayerATK()/2) - (enemyStatus.GetDEF()/4) > 0) 60 { 61 enemyStatus.SetHp(StaticStatus.GetPlayerATK() - enemyStatus.GetDEF()); 62 } 63 // 0以下なら最低1ダメージ 64 else 65 { 66 enemyStatus.SetHp(1); 67 } 68 } 69 } 70 } 71}
C#
1public class EnemyStatus : MonoBehaviour 2{ 3 // ================================ 4 // 敵の情報を取得してステータス設定 5 // ================================ 6 7 // 敵の情報取得用 8 EnemyInfo enemyinfo; 9 10 // 敵のMaxHP 11 [SerializeField] private int maxHP; 12 13 // 敵の現在のHP 14 [SerializeField] private int curHP; 15 16 // 敵の攻撃力 17 [SerializeField] int ATK; 18 19 [SerializeField] int DEF; 20 21 22 //------------------------------------- 23 24 public void Init() 25 { 26 // 敵のデータからステータスを読み取り設定 27 enemyinfo = GetComponent<EnemyInfo>(); 28 curHP = maxHP = enemyinfo.enemyData.GetHp(); 29 ATK = enemyinfo.enemyData.GetATK(); 30 DEF = enemyinfo.enemyData.GetDEF(); 31 32 } 33 34 public void SetHp(int hp) 35 { 36 if(curHP <= 0) 37 { 38 curHP = 0; 39 } 40 41 this.curHP -= hp; 42 } 43 44 public int GetHp() 45 { 46 return curHP; 47 } 48 49 public int GetMaxhp() 50 { 51 return maxHP; 52 } 53 54 public int GetATK() 55 { 56 return ATK; 57 } 58 59 public int GetDEF() 60 { 61 return DEF; 62 } 63}
C#
1public class StaticStatus : MonoBehaviour 2{ 3 // 体力 4 public static int PlayerHP = 100; 5 6 // 攻撃力 7 public static int PlayerATK = 10; 8 9 // 防御力 10 public static int PlayerDEF = 10; 11 12 // 運 13 public static int PlayerLUCK = 10; 14 15 // 体力取得 16 public static int GetPlayerHP() 17 { 18 return PlayerHP; 19 } 20 21 // 攻撃力取得 22 public static int GetPlayerATK() 23 { 24 return PlayerATK; 25 } 26 27 // 防御力取得 28 public static int GetPlayerDEF() 29 { 30 return PlayerDEF; 31 } 32 33 // 運取得 34 public static int GetPlayerLUCK() 35 { 36 return PlayerLUCK; 37 } 38}
試したこと
シングルトンを利用したところ、Prefabが生成されなくなってしまいました。
他に関数参照の方法が分からなかったため質問させていただきました。
補足情報(FW/ツールのバージョンなど)
VisualStudio2019
Unityのバージョン 2021.2.13f1

回答2件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。