代码不允许我从另一个脚本禁用脚本

时间:2015-10-15 11:50:08

标签: c# unity3d runtime-error monodevelop

我遇到了一个问题,我无法从其他脚本中禁用脚本 - 它们都是公共的并且位于同一个包中(我认为)。

以下是我尝试禁用的脚本的代码:

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)

这是一张显示我的场景层次结构和组件的图片: Scene hierarchy

2 个答案:

答案 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。这需要更多代码,但不使用编辑器。)