编程语言
首页 > 编程语言> > C#-GetComponent函数返回空

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组件并执行相同的操作只是为了检查它是否起作用,所以我不知道为什么它不应该找到按钮组件.如果有人可以提供帮助或向我指出我做错了什么,我将不胜感激

编辑:

检查器标签:

Text object with button component screenshot

控制台标签:

Inspector tab screenshot

解决方法:

屏幕快照显示您已将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脚本.

enter image description here

这将确保将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