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

Code not allowing letting me disable a script from another script

我遇到了一个问题,我无法从另一个脚本中禁用一个脚本 - 它们都 public 并且在同一个包中(我认为)。

这是我要禁用的脚本的代码:

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)

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

我会说你的 player = transform.root.GetComponent< Player >(); 到达空。 所以你试图禁用不存在的东西。 进入调试模式,看看你的 player 是否为 null。

这里的问题是您尝试从 PauseMenu 中执行 transform.root.GetComponent< Player >();,它位于 "Canvas" 对象上。

问题在于,"Canvas" 对象(transform.root returns)层次结构中最顶层的 transformtransform 对象的 "Canvas" - 这与您尝试访问的 UserInput 脚本没有任何关系。要使此脚本真正起作用,您需要 "Player" 对象的 transform,该对象实际上具有 UserInput 脚本。

我的建议是完全不需要 运行 GetComponent() - 在 PauseMenu [=48= 中创建一个 public UserInput 变量],然后(在编辑器中选择 "Canvas"),将 "Player" 对象拖到该新字段中。这将使您的 "Player" 对象的 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。这需要更多代码,但不使用编辑器。)