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;

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