他のスクリプトからWeaponActiveメソッドを実行すると、その時だけあらゆる変数が0やnullなどになる。
キャラにInstantiateで武器を持たせて(ここではSwordというオブジェクト)キャラにAddComponentでSwordスクリプトをアタッチし、持っている武器をSetActiveで表示非表示を切り替えたいと思い、別のスクリプトからinvokeで呼び出されるWeaponActiveメソッドを作りました。
SwordクラスのStart()から呼び出したWeaponActive(false)は、ちゃんと武器は消えるし、それ以外の変数も問題なく値を保持していました。
しかしTechniquePerformerと言う同じオブジェクトにアタッチした別のスクリプトでボタン入力を検知し、Invokeを利用してWeaponActiveを実行しました。
するとなぜかNullReferenceとなり、武器が表示されませんでした。
調べてみると、swordObというGameObject型で武器を参照している場所がnullでした
public class Sword : MonoBehaviour { CharaData charaData; SwordCol swordCol; GameObject swordOb; public void Start() { charaData = this.GetComponent<CharaData>(); swordOb = this.gameObject.transform.Find("StickHuman/body/R_upperarm/R_forearm/Sword").gameObject; swordCol = swordOb.transform.Find("grip").GetComponent<SwordCol>(); WeaponActive(false); } public void WeaponActive(bool a) { swordOb.SetActive(a); } int count; void FixedUpdate() { Debug.Log(swordOb); count++;//強制的にswordObを表示する if (count == 300) { WeaponActive(true); } } }
試しにFixedUpdateでDebug.Log(swordOb)を実行してみましたが、Startで呼び出された後もオブジェクトの名前を出力し続け、ErrorPauseを無効にしてRullReference後の状況も見てみましたが、FixedUpdateからswordObがnullだと表示されたことは一度もありませんでした。
試しに同じスクリプトからゲームスタート5秒後にWeaponActiveを呼び出させてみましたが、そうすると正常にswordは実行されました。
しかし第三者のスクリプトからinvokeで実行すると、今度はTechniqueの方から呼んだのと同じようにエラーが発生しました。
そしてdebug.logを使っていくうちに分かったことが、他のスクリプトからWeaponActiveを実行した時のみあらゆる変数、更にthis.gameObjectまでもがnullや0となってエラーが発生していると分かりました。
ただしnullなどにならない変数もあって、たとえば宣言と同時に初期化したint型の変数は問題なし。
staticなクラスにjsonで保存していた変数とかも問題なし。しかしstartなどで値を入力したものはnullなどになる。
ちなみに宣言と同時に初期化して、その後startで別の値を入力してみましたが、weaponActiveでは変数の中が宣言時に初期化した値でした。
変数はprivateなので他のスクリプトからは変更できないはずで、Swordスクリプト内でも代入してるのはStart内のみで、他から参照先は変更されていません。
試したこと
Invokeでは無くGetComponentからメソッド実行、しかし同じ結果。
WeaponActiveの引数をなくして返り値からSetActive、返り値もnullだった。
補足情報(FW/ツールのバージョンなど)
WeaponActiveメソッドを使わずに武器を非アクティブ化したりするなど、別の方法を使えばいいような気もしますが、なぜこれでエラーが出るのか分からないので、できればこの方法を使う方針でよろしくお願いします。
unity 2020.3.15f2
NullReferenceException: Object reference not set to an instance of an object Sword.WeaponActive (System.Boolean a) (at Assets/Sclipt/Technique/Sword.cs:23) System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at <695d1cc93cca45069c528c15c9fdd749>:0) Rethrow as TargetInvocationException: Exception has been thrown by the target of an invocation. System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at <695d1cc93cca45069c528c15c9fdd749>:0) System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) (at <695d1cc93cca45069c528c15c9fdd749>:0) TechniquePerformer.CallMethod (System.String className, System.String methodName, System.Object value) (at Assets/Sclipt/CharaCommon/TechniquePerformer.cs:247) TechniquePerformer.Equiped () (at Assets/Sclipt/CharaCommon/TechniquePerformer.cs:119) CharaDataという第三者のスクリプトからWeaponActiveを実行したとき NullReferenceException: Object reference not set to an instance of an object Sword.WeaponActive (System.Boolean a) (at Assets/Sclipt/Technique/Sword.cs:23) System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at <695d1cc93cca45069c528c15c9fdd749>:0) Rethrow as TargetInvocationException: Exception has been thrown by the target of an invocation. System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at <695d1cc93cca45069c528c15c9fdd749>:0) System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) (at <695d1cc93cca45069c528c15c9fdd749>:0) CharaData.CallMethod (System.String className, System.String methodName, System.Object value) (at Assets/Sclipt/CharaCommon/CharaData.cs:254) CharaData.FixedUpdate () (at Assets/Sclipt/CharaCommon/CharaData.cs:238)
回答3件
あなたの回答
tips
プレビュー