我正在使用C#在Unity 2017中开发一个简单的游戏。
在我的关卡菜单中,我有一个Text对象,其中包含一个按钮组件,并附有一个脚本。
这是目前脚本中的内容:
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组件并执行相同的操作只是为了检查它确实有效,所以我不知道为什么它不应该找到按钮组件。如果有人可以帮忙解决这个问题,或者向我指出我做错了什么,我会非常感激
修改:
检查员标签:
控制台标签:
答案 0 :(得分:3)
您的屏幕截图显示您已将LevelLock
脚本附加到Button,这很好。
可能的原因和解决方法:
1 。组件/脚本甚至没有附加到GameObject或附加到错误的对象。
在您的代码中,调用GetComponent<Button>();
而不首先找到GameObject意味着GetComponent
应该查找附加到此Button
此脚本的GameObject
组件({ {1}})附加到。
如果您要检索的脚本附加到另一个GameObject,您可以先解决这个问题,找到LevelLock
组件附加到的Button
组件然后检索GameObject.Find
来自它的组件/脚本。
替换
Button
与
lvlBtn = GetComponent<Button> ();
3 .Script附加到多个对象
GameObject obj = GameObject.Find("lvl 2");
lvlBtn = obj.GetComponent<Button>();
可能返回GetComponent<Button>()
的原因之一是因为您错误地将false
脚本附加到另一个GameObject。它可能是一个空的GameObject,但GameObject没有附加LevelLock
组件。
找到此GameObject并从中删除Button
脚本。
为此,请从“项目”标签中选择LevelLock
脚本,然后转到资产 ---&gt; 在场景中查找参考。从其他GameObjects中删除LevelLock
脚本。
这将确保LevelLock
脚本仅附加到&#34; lvl 2&#34;游戏对象
3 。具有相同名称但位于不同LevelLock
的多个脚本:
如果您有两个名称相同但位于不同名称空间的类,并且在尝试从代码访问另一个名称时将一个类附加到namespace
,那么它将是GameObject
,因为它们不是相同。我查看了你的项目,这就是问题所在。
您创建了一个名为&#34; Button&#34; 的脚本,而Unity附带了自己的内置脚本/组件,也称为&#34; Button&# 34; 位于null
命名空间中。
您已将Unity的内置&#34;按钮&#34; 脚本附加到您的GameObject,但之后您正尝试访问自己制作的&#34;脚本中的按钮&#34; 脚本。提供名称空间UnityEngine.UI
,以便Unity知道您要使用Unity附带的UnityEngine.UI
组件。
变化:
Button
到
vlBtn = GetComponent<Button> ();
同样改变:
lvlBtn = GetComponent<UnityEngine.UI.Button>();
到
private Button lvlBtn;
最后,不要为您的脚本命名与任何内置组件相同的名称,例如private UnityEngine.UI.Button lvlBtn;
,Button
,Image
,{{1} } 等等。创建一个Text
名称,并确保它与Unity API不存在,否则您将继续遇到此类问题,甚至SO上的人也无法帮助您,除非他们可以访问您的项目。