代码不允许我从另一个脚本中禁用一个脚本
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)层次结构中最顶层的 transform
是 transform
对象的 "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
。这需要更多代码,但不使用编辑器。)
我遇到了一个问题,我无法从另一个脚本中禁用一个脚本 - 它们都 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)层次结构中最顶层的 transform
是 transform
对象的 "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
。这需要更多代码,但不使用编辑器。)