GetComponent 函数返回 null
GetComponent function returning null
我正在使用 C# 在 Unity 2017 中开发一个简单的游戏。
在我的关卡菜单中,我有一个文本对象,里面有一个按钮组件,并附有一个脚本。
这是脚本中当前的内容:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class LevelLock : MonoBehaviour {
public bool isLocked = true;
private Button lvlBtn;
// Use this for initialization
void Start () {
lvlBtn = GetComponent<Button> ();
if (lvlBtn != null) {
Debug.Log ("this should be working");
} else {
Debug.Log ("you did something wrong");
}
//if(isLocked){
// lvlBtn.enabled = false;
//}
}
}
问题是,GetComponent<Button>()
正在返回 null
,这意味着它没有在对象中找到按钮组件。
我尝试添加一个 Animator 组件并执行相同的操作只是为了检查它确实有效,所以我不知道为什么它不应该找到按钮组件。如果有人可以帮助解决这个问题或指出我做错了什么,我将不胜感激
编辑:
检查器选项卡:
控制台选项卡:
您的屏幕截图显示您已将 LevelLock
脚本附加到按钮,这没问题。
可能的原因和修正:
1。component/script 甚至没有附加到游戏对象或附加到错误的对象。
在您的代码中,调用 GetComponent<Button>();
而未首先找到游戏对象意味着 GetComponent
应该寻找附加到此 GameObject
此脚本的 Button
组件(LevelLock
)附于.
如果您要检索的脚本附加到另一个 GameObject,您可以通过首先找到 Button
组件附加到 GameObject.Find
的 GameObject 然后检索 Button
component/script 来自它.
替换
lvlBtn = GetComponent<Button> ();
和
GameObject obj = GameObject.Find("lvl 2");
lvlBtn = obj.GetComponent<Button>();
3.脚本附加到多个对象
GetComponent<Button>()
可能 return false
的原因之一是您错误地将 LevelLock
脚本附加到另一个游戏对象。它可能是一个空的游戏对象,但该游戏对象没有附加 Button
组件。
找到这个 GameObject 并从中删除 LevelLock
脚本。
为此,select 来自“项目”选项卡的 LevelLock
脚本,然后转到 Assets ---> Find References在场景。从其他游戏对象中删除 LevelLock
脚本。
这将确保 LevelLock
脚本仅附加到 "lvl 2" GameObject
3.具有相同名称但不同 namespace
:
的多个脚本
如果您有两个 类 具有相同的名称但在不同的命名空间中,并且您在尝试从代码访问另一个时将一个附加到 GameObject
,它将是 null
因为它们不一样。我调查了你的项目,这就是问题所在。
您创建了一个名为 "Button" 的脚本,而 Unity 自带的内置脚本 script/component 也名为 "Button" 位于 UnityEngine.UI
命名空间中。
您将 Unity 的内置 "Button" 脚本附加到您的游戏对象,但随后您试图访问您自己制作的 "Button"脚本来自脚本。提供 UnityEngine.UI
的命名空间,以便 Unity 知道您要使用 Unity 附带的 Button
组件。
变化:
vlBtn = GetComponent<Button> ();
至
lvlBtn = GetComponent<UnityEngine.UI.Button>();
同时更改:
private Button lvlBtn;
至
private UnityEngine.UI.Button lvlBtn;
最后,不要 将您的脚本命名为与 Button
、Image
、Text
等任何内置组件相同的名称, Rigidbody
等等。创建一个 class
名称并确保它不存在于 Unity API 中,否则您将继续 运行 解决此类问题,甚至 SO 上的人也无法提供帮助除非他们有权访问您的项目。
我正在使用 C# 在 Unity 2017 中开发一个简单的游戏。
在我的关卡菜单中,我有一个文本对象,里面有一个按钮组件,并附有一个脚本。
这是脚本中当前的内容:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class LevelLock : MonoBehaviour {
public bool isLocked = true;
private Button lvlBtn;
// Use this for initialization
void Start () {
lvlBtn = GetComponent<Button> ();
if (lvlBtn != null) {
Debug.Log ("this should be working");
} else {
Debug.Log ("you did something wrong");
}
//if(isLocked){
// lvlBtn.enabled = false;
//}
}
}
问题是,GetComponent<Button>()
正在返回 null
,这意味着它没有在对象中找到按钮组件。
我尝试添加一个 Animator 组件并执行相同的操作只是为了检查它确实有效,所以我不知道为什么它不应该找到按钮组件。如果有人可以帮助解决这个问题或指出我做错了什么,我将不胜感激
编辑:
检查器选项卡:
控制台选项卡:
您的屏幕截图显示您已将 LevelLock
脚本附加到按钮,这没问题。
可能的原因和修正:
1。component/script 甚至没有附加到游戏对象或附加到错误的对象。
在您的代码中,调用 GetComponent<Button>();
而未首先找到游戏对象意味着 GetComponent
应该寻找附加到此 GameObject
此脚本的 Button
组件(LevelLock
)附于.
如果您要检索的脚本附加到另一个 GameObject,您可以通过首先找到 Button
组件附加到 GameObject.Find
的 GameObject 然后检索 Button
component/script 来自它.
替换
lvlBtn = GetComponent<Button> ();
和
GameObject obj = GameObject.Find("lvl 2");
lvlBtn = obj.GetComponent<Button>();
3.脚本附加到多个对象
GetComponent<Button>()
可能 return false
的原因之一是您错误地将 LevelLock
脚本附加到另一个游戏对象。它可能是一个空的游戏对象,但该游戏对象没有附加 Button
组件。
找到这个 GameObject 并从中删除 LevelLock
脚本。
为此,select 来自“项目”选项卡的 LevelLock
脚本,然后转到 Assets ---> Find References在场景。从其他游戏对象中删除 LevelLock
脚本。
这将确保 LevelLock
脚本仅附加到 "lvl 2" GameObject
3.具有相同名称但不同 namespace
:
如果您有两个 类 具有相同的名称但在不同的命名空间中,并且您在尝试从代码访问另一个时将一个附加到 GameObject
,它将是 null
因为它们不一样。我调查了你的项目,这就是问题所在。
您创建了一个名为 "Button" 的脚本,而 Unity 自带的内置脚本 script/component 也名为 "Button" 位于 UnityEngine.UI
命名空间中。
您将 Unity 的内置 "Button" 脚本附加到您的游戏对象,但随后您试图访问您自己制作的 "Button"脚本来自脚本。提供 UnityEngine.UI
的命名空间,以便 Unity 知道您要使用 Unity 附带的 Button
组件。
变化:
vlBtn = GetComponent<Button> ();
至
lvlBtn = GetComponent<UnityEngine.UI.Button>();
同时更改:
private Button lvlBtn;
至
private UnityEngine.UI.Button lvlBtn;
最后,不要 将您的脚本命名为与 Button
、Image
、Text
等任何内置组件相同的名称, Rigidbody
等等。创建一个 class
名称并确保它不存在于 Unity API 中,否则您将继续 运行 解决此类问题,甚至 SO 上的人也无法提供帮助除非他们有权访问您的项目。