繁体   English   中英

GetComponent函数返回null

[英]GetComponent function returning null

我正在使用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组件并执行相同的操作只是为了检查它确实有效,所以我不知道为什么它不应该找到按钮组件。 如果有人可以帮忙解决这个问题,或者向我指出我做错了什么,我会非常感激

编辑

检查员标签:

带按钮组件截图的文本对象

控制台标签:

Inspector标签截图

您的屏幕截图显示您LevelLock脚本附加到Button,这很好。

可能的原因和解决方法

1.组件/脚本甚至没有附加到GameObject或附加到错误的对象。

在你的代码中,调用GetComponent<Button>(); 没有找到游戏对象第一意味着GetComponent应该寻找一个Button ,其安装到该组件GameObject这个脚本( LevelLock )附连到。

如果你想获取脚本,连接到另一个游戏物体,你可以通过先解决这个问题,找到游戏对象的Button组件连接到与GameObject.Find然后检索Button从中组件/脚本。

更换

lvlBtn = GetComponent<Button> ();

GameObject obj = GameObject.Find("lvl 2");
lvlBtn = obj.GetComponent<Button>();

3. .Script附加到多个对象

GetComponent<Button>()可能返回false的原因之一是因为您错误地将LevelLock脚本附加到另一个LevelLock 它可能是一个空的GameObject,但GameObject没有附加Button组件。

找到这个LevelLockLevelLock删除LevelLock脚本。

为此,从“项目”选项卡中选择“ LevelLock脚本,然后转到“ 资源”“在场景中查找引用” 从其他LevelLock删除LevelLock脚本。

在此输入图像描述

这将确保LevelLock脚本仅附加到“lvl 2”GameObject


3.具有相同名称但在不同namespace多个脚本:

如果你有两个具有相同名称但在不同命名空间中的类,并且在尝试从代码访问另一个时将一个类附加到GameObject ,则它将为null因为它们不是相同的。 我查看了你的项目,这就是问题所在。

您创建了一个名为“Button”的脚本,而Unity带有它自己的内置脚本/组件,也称为“Button” ,它位于UnityEngine.UI命名空间中。

您将Unity的内置“Button”脚本附加到GameObject,但之后您尝试从脚本中访问自己创建的“Button”脚本。 提供UnityEngine.UI的命名空间,以便Unity知道您想要使用Unity附带的Button组件。

更改:

vlBtn = GetComponent<Button> ();

lvlBtn = GetComponent<UnityEngine.UI.Button>();

也改变:

private Button lvlBtn;

private UnityEngine.UI.Button lvlBtn;

最后, 不要将脚本命名为与任何内置组件相同的名称,如ButtonImageTextRigidbody等。 创建一个class名,并确保它不存在于Unity API中,否则您将继续遇到此类问题,甚至SO上的人也无法帮助您,除非他们可以访问您的项目。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM