我遇到了一个问题,我无法从其他脚本中禁用脚本 - 它们都是公共的并且位于同一个包中(我认为)。
以下是我尝试禁用的脚本的代码:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
#if UNITY_EDITOR
using UnityEditor;
#endif
using RTS;
public class PauseMenu : MonoBehaviour {
Canvas canvas;
private Player player;
public Button Button2;
void Start()
{
Debug.Log ("asdf");
player = transform.root.GetComponent< Player >();
canvas = GetComponent<Canvas>();
canvas.enabled = false;
ResourceManager.MenuOpen = false;
Button2.GetComponent<Button>().onClick.AddListener(() => { Resume();});
if(player) player.GetComponent< UserInput >().enabled = false;
}
另一个脚本的代码:
//sets up what resources we are using
using UnityEngine;
using System.Collections;
using RTS;
public class UserInput : MonoBehaviour {
//sets up a private variable for only this class - our player
private Player player;
// Use this for initialization
void Start () {
//this goes to the root of the player ie the object player and allows us to
player = transform.root.GetComponent< Player > ();
}//end Start()
所以不起作用的部分是:
if(player) player.GetComponent< UserInput >().enabled = false;
代码运行然后导致运行时错误:
NullReferenceException: Object reference not set to an instance of an object
PauseMenu.Pause () (at Assets/Menu/PauseMenu.cs:40)
PauseMenu.Update () (at Assets/Menu/PauseMenu.cs:29)
答案 0 :(得分:0)
我会说你的player = transform.root.GetComponent< Player >();
到达为空。
所以你试图禁用不存在的东西。
进入调试模式,查看player
是否为空。
答案 1 :(得分:0)
这里的问题是您尝试从“{0}”内的transform.root.GetComponent< Player >();
执行PauseMenu
。
问题在于,“Canvas”对象(即transform.root
返回的)层次结构中最顶层的transform
是“Canvas”的transform
“对象 - 与您尝试访问的UserInput
脚本无关。要使此脚本实际工作,您需要“Player”对象的transform
,该对象实际上具有UserInput
脚本。
我的建议是根本不需要运行GetComponent()
- 在UserInput
课程中创建公共PauseMenu
变量,然后在编辑器中选择“Canvas”时,将“播放器”对象拖动到该新字段中。这将导致您的“播放器”对象的UserInput
脚本在PauseMenu
内可访问。
因此,您的PauseMenu
脚本可能如下所示:
public class PauseMenu : MonoBehaviour {
Canvas canvas;
public UserInput playerInput; // Drag the Player object into this field in the editor
public Button Button2;
void Start()
{
Debug.Log ("asdf");
canvas = GetComponent<Canvas>();
canvas.enabled = false;
ResourceManager.MenuOpen = false;
Button2.GetComponent<Button>().onClick.AddListener(() => { Resume();});
playerInput.enabled = false;
}
}
希望这有帮助!如果您有任何问题,请告诉我。
(另一种方法是使用GameObject.Find("Player")
获取“Player”的GameObject
。这需要更多代码,但不使用编辑器。)