C#-GetComponent函数返回空
作者:互联网
我正在用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组件并执行相同的操作只是为了检查它是否起作用,所以我不知道为什么它不应该找到按钮组件.如果有人可以提供帮助或向我指出我做错了什么,我将不胜感激
编辑:
检查器标签:
控制台标签:
解决方法:
屏幕快照显示您已将LevelLock脚本附加到Button上,这很好.
可能的原因和修复:
1.组件/脚本甚至未附加到GameObject或错误的对象.
在您的代码中,调用GetComponent< Button>();如果没有先找到GameObject,则意味着GetComponent应该查找与此脚本(LevelLock)附加到此GameObject的Button组件.
如果要检索的脚本已附加到另一个GameObject,则可以通过以下方法解决此问题:首先找到与GameObject相连的Button组件所对应的GameObject.Find然后从中检索Button组件/脚本.
更换
lvlBtn = GetComponent<Button> ();
与
GameObject obj = GameObject.Find("lvl 2");
lvlBtn = obj.GetComponent<Button>();
3.脚本被附加到多个对象
GetComponent< Button>()可能返回false的原因之一是因为您错误地将LevelLock脚本附加到另一个GameObject.它可能是一个空的GameObject,但该GameObject没有附加的Button组件.
找到此GameObject并从中删除LevelLock脚本.
为此,请从“项目”选项卡中选择LevelLock脚本,然后转到“资产—>”.在场景中查找参考.从其他GameObjects中删除LevelLock脚本.
这将确保将LevelLock脚本仅附加到“ lvl 2” GameObject
3,名称相同但名称空间不同的多个脚本:
如果您有两个名称相同但名称空间不同的类,并且在尝试通过代码访问另一个类时将一个类附加到GameObject,则该类将为null,因为它们不是相同的.我调查了您的项目,这就是问题所在.
您创建了一个名为“ Button”的脚本,而Unity附带了它自己的内置脚本/组件,该脚本/组件也称为“ Button”,位于UnityEngine.UI命名空间中.
您将Unity的内置“按钮”脚本附加到了GameObject,但是随后您尝试从该脚本访问自己制作的“按钮”脚本.提供名称空间,即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等任何内置组件的名称相同.创建一个类名,并确保它在Unity API中不存在,否则您将继续遇到此类问题,甚至SO上的人也无法为您提供帮助,除非他们有权访问您的项目.
标签:unity3d,monodevelop,c 来源: https://codeday.me/bug/20191109/2011652.html