GetComponent函数返回null

时间:2018-04-14 02:42:32

标签: c# unity3d monodevelop

我正在使用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

1 个答案:

答案 0 :(得分:3)

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

可能的原因和解决方法

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

在您的代码中,调用GetComponent<Button>();而不首先找到GameObject意味着GetComponent应该查找附加到此Button此脚本的GameObject组件({ {1}})附加到。

如果您要检索的脚本附加到另一个GameObject,您可以先解决这个问题,找到LevelLock组件附加到的Button组件然后检索GameObject.Find来自它的组件/脚本。

替换

Button

lvlBtn = GetComponent<Button> ();

3 .Script附加到多个对象

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

找到此GameObject并从中删除Button脚本。

为此,请从“项目”标签中选择LevelLock脚本,然后转到资产 ---&gt; 在场景中查找参考。从其他GameObjects中删除LevelLock脚本。

enter image description here

这将确保LevelLock脚本仅附加到&#34; lvl 2&#34;游戏对象

3 。具有相同名称但位于不同LevelLock的多个脚本:

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

您创建了一个名为&#34; Button&#34; 的脚本,而Unity附带了自己的内置脚本/组件,也称为&#34; Button&# 34; 位于null命名空间中。

您已将Unity的内置&#34;按钮&#34; 脚本附加到您的GameObject,但之后您正尝试访问自己制作的&#34;脚本中的按钮&#34; 脚本。提供名称空间UnityEngine.UI,以便Unity知道您要使用Unity附带的UnityEngine.UI组件。

变化:

Button

vlBtn = GetComponent<Button> ();

同样改变:

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

private Button lvlBtn;

最后,不要为您的脚本命名与任何内置组件相同的名称,例如private UnityEngine.UI.Button lvlBtn; ButtonImage,{{1} } 等等。创建一个Text名称,并确保它与Unity API不存在,否则您将继续遇到此类问题,甚至SO上的人也无法帮助您,除非他们可以访问您的项目。