私は「攻撃ボタン」と呼ばれるUIボタンを持っています。私は私のGameObjectにHeroBattleControllerというスクリプトを添付しています。私は、シリアル化されたフィールドとして設定された攻撃ボタンを持っており、攻撃ボタンオブジェクトはエディタのスクリプト上にドロップされています。それにアクセスしようとしているユニティオブジェクトリファレンス+シリアライズされたフィールド。私は何が欠けていますか?
[SerializeField]
private Button AttackButton;
public void SetButtonStatus(bool status) {
AttackButton.interactable=status;
}
は私にエラーとNullReferenceExceptionを与える:私はエディタでオブジェクトを置くと思っオブジェクト
のインスタンスに設定されていないオブジェクト参照は、私が「検索しなくても、それにアクセスできるようになります" オブジェクト。誰かが私を正しい方向に向けることができますか?
エラーがライン上にある
AttackButton.interactable=status;
完全HeroBattleControllerスクリプト
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class HeroBattleController: MonoBehaviour {
public static string SelectedHero;
[SerializeField]
private Button AttackButton;
public void SetButtonStatus(bool status) {
AttackButton.interactable=status;
}
public void HeroTouch() {
Debug.Log("Hero was touched: "+this.name);
SetButtonStatus(false);
}
// Use this for initialization
void Start() {
}
// Update is called once per frame
void Update() {
}
}
HeroTouchはheroprefab物体からのonClickを介して呼び出されます。
更新:私はherobattlecontrollerスクリプトを2つのオブジェクト、シーンのルートにあるgameオブジェクトとheroprefabオブジェクトに接続させました。私はそれをゲームオブジェクトから削除し、プレハブ上にのみ持っていました。ただし、攻撃ボタンをプレハブのスクリプトセクションにドラッグすると太字のままになり、ゲームを実行すると攻撃ボタンの参照はなくなります。私は実行中のオブジェクトにボタンをドラッグすることができ、それは私が期待どおりに機能します。私は明らかに、オブジェクト階層とオブジェクトが使用可能な場所との間の接続に何かを見逃しています。主人公の戦闘コントローラのスクリプトをルートのゲームオブジェクトに置くことは、それが太字であり、実行されたときにリンクが欠落していることを意味するのと同じように機能します。 HeroBattleControllerはプレハブにランタイム
** "アクセスしようとすると、エラーNullReferenceExceptionが発生します:オブジェクト参照がオブジェクトのインスタンスに設定されていません"エラーの原因となっているコード行は?コンソールタブからそのエラーをダブルクリックすると、Unityはそのエラーの原因となっている行を表示します。私はあなたの質問のコードに問題があるとは思わない。 – Programmer
エラーはAttackButton.interactable = statusにあります。 – Sym
それはうまくいくはずです。たぶん、リンクエラーがあります。あなたの 'Button'をエディタから' AttackButton'スロットにドラッグし直してください。これを行っても問題が解決しない場合は、 'SetButtonStatus'関数の呼び出し方法を説明してください。あなたの質問を編集し、完全なスクリプトを 'HeroBattleController'に入れてください。また、 'SetButtonStatus'関数を呼び出す場所の完全なスクリプトを記述してください。これは問題を特定するのに役立ちます。 – Programmer