GetComponent 函数返回 null

F_B*_*ass 3 c# monodevelop unity-game-engine

我正在 Unity 2017 中用 C# 开发一个简单的游戏。

在我的级别菜单中,我有一个文本对象,其中有一个按钮组件,并附加了一个脚本。

这是脚本中当前的内容:

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;
        //}
    }

}
Run Code Online (Sandbox Code Playgroud)

问题是,正在GetComponent<Button>()返回null,这意味着它没有在对象中找到按钮组件。

我尝试添加一个 Animator 组件并执行相同的操作只是为了检查它是否有效,所以我不知道为什么它找不到按钮组件。如果有人可以帮助解决这个问题或向我指出我做错的事情,我将非常感激

编辑

检查器选项卡:

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

控制台选项卡:

检查器选项卡屏幕截图

Pro*_*mer 6

您的屏幕截图显示您已将LevelLock脚本附加到按钮,这很好。

可能的原因和修复

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

在您的代码中,GetComponent<Button>();在没有首先找到 GameObject 的情况下进行调用意味着GetComponent应该查找Button附加到此GameObjectscript( LevelLock) 的组件。

如果您要检索的脚本附加到另一个游戏对象,您可以首先找到该组件Button附加到的游戏对象,GameObject.Find然后从中检索Button组件/脚本来解决此问题。

代替

lvlBtn = GetComponent<Button> ();
Run Code Online (Sandbox Code Playgroud)

GameObject obj = GameObject.Find("lvl 2");
lvlBtn = obj.GetComponent<Button>();
Run Code Online (Sandbox Code Playgroud)

3 .Script附加到多个Object

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

找到这个游戏对象并LevelLock从中删除脚本。

为此,请LevelLock从 Project 选项卡中选择脚本,然后转到Assets ---> Find References In Scene。从其他游戏对象中删除LevelLock脚本。

在此输入图像描述

这将确保LevelLock脚本仅附加到“lvl 2”游戏对象


3.多个同名但不同的脚本namespace

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

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

您将 Unity 的内置“按钮”脚本附加到您的游戏对象,但随后您尝试从该脚本访问您自己制作的“按钮”脚本。提供命名空间,UnityEngine.UI以便 Unity 知道您想要使用ButtonUnity 附带的组件。

改变:

vlBtn = GetComponent<Button> ();
Run Code Online (Sandbox Code Playgroud)

lvlBtn = GetComponent<UnityEngine.UI.Button>();
Run Code Online (Sandbox Code Playgroud)

还改变:

private Button lvlBtn;
Run Code Online (Sandbox Code Playgroud)

private UnityEngine.UI.Button lvlBtn;
Run Code Online (Sandbox Code Playgroud)

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

  • 好的。请参阅我的编辑中的#3。这就是问题所在。如果不访问您的项目,这几乎是不可能解决的。您无法通过删除上面的评论来删除您项目的链接。 (2认同)