初質問、且つプログラミング初心者です。
至らぬ点が多いかと存じますが、何卒ご容赦いただければと思います。
前提・実現したいこと
C#/unity2020.3.13f1 にて2dゲームを作っています。
体力を管理するスクリプトからUI上のアイコンを切り替えるため、別スクリプトで用意したメソッドを呼び出したのですが、
NullReferenceExceptionのエラーが発生してしまいます。
表示するアイコンには呼び出したいメソッド(アイコン切り替えメソッド)を記したスクリプトをアタッチさせているほか、
同じスクリプト内にスプライト型の配列を用意し、インスペクタ上で2種類のスプライトを登録した上でプレハブ化させてあります。
おそらく、メソッドの方で別スクリプトの参照を行き来するときの基本的な決まり事を抜かしてしまっているのだとは思いますが、
メインのスクリプトから呼び出したときに正常に機能するメソッドになるようにはどのように改めればよいか、ご助言をいただきたいです。
該当のソースコード
↓↓呼び出し側のスクリプト
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5//Script Execution Orderで4番目に実行する 6 7public class LifeManager : MonoBehaviour 8{ 9 public PLParameter p_Parameter;//プレイヤーのステータスを記録する別スクリプト(★) 10 public PL_Life _Life;//アイコンのprefabを入れる 11 12 private int playerMaxHP;//★から体力の最大値を入手 13 private int playerCurrentHP;//★から体力の現在値を入手 14 15 public List<PL_Life> life = new List<PL_Life>();//プレハブの実体を入れるリスト 16 17 // ゲーム起動時に呼び出す体力の初期化 18 void Start() 19 { 20 playerMaxHP = p_Parameter.GetMaxHP; 21 playerCurrentHP = p_Parameter.GetCurrentHP; 22 23 for(var i = 0; i < playerMaxHP; i++) 24 { 25 PL_Life plus = Instantiate(_Life, transform, false); 26 life.Add(plus); 27 life[i].full(); //【ここでNullReferenceExceptionが発生】 28 } 29 }
↓↓UI上のアイコン表示を切り替えるためのスクリプト(呼び出されるスクリプト)
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6//Script Execution Orderで3番目に実行する 7 8public class PL_Life : MonoBehaviour 9{ 10 public Sprite[] _HP = new Sprite[2]; //インスペクタ上で切り替える2種類を登録 11 12 Image img; 13 14 void Start() 15 { 16 img = GetComponent<Image>(); 17 } 18 19 public void less() //ダメージ時のスプライトを登録 20 { 21 img.sprite = _HP[0]; 22 } 23 24 public void full() //ノンダメージ時のスプライトを登録【ここでNullReferenceExceptionが発生】 25 { 26 img.sprite = _HP[1]; 27 } 28}
試したこと
まず、呼び出すスクリプトが参照するメソッドを持つスクリプトの実体がないためにNullが返ってきているのかと思い、
unityの設定からスクリプトの実行順を定め、呼び出すスクリプトより前に呼び出されるスクリプトを読み込むようにしました
解決しなかったので、その後、コメントアウトなどで記述を多少変えて試していたところ、
上述問題とは別の場所ではありますが、呼び出した側と呼び出された側の関連部分でNullReferenceExceptionがいくつか発生しており、
エンジンの仕様や実行順などの込み入ったものではなく、基礎文法で足りないものがあるのではないかと推測しました
それを受け、呼び出されるプレハブ内のメソッドで指定するImageが、存在しない呼び出し側のコンポーネントから取得しようとすることで
Nullが生じているのではないかと考え、呼び出されるスクリプトのStart()内での記述を、
img = this.gamaObject.GetComponent<Image>();
とすることで、このスクリプトが取得するImageはアタッチされているプレハブに限定されるのではないかと考えましたが、
依然としてNullReferenceExceptionのままです
自分でも基礎力の欠如から非常に遠回りしている感が否めませんが、これ以上発想を転換させることが難しい状況です
お力添えのほどよろしくお願いいたします
補足情報(FW/ツールのバージョンなど)
Unity2020.3.13f1
(追記:初心者アイコンを付けました)
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/29 05:29
2021/09/29 05:51