gpt4 book ai didi

c# - GetComponent 函数返回 null

转载 作者:行者123 更新时间:2023-11-30 15:54:42 24 4
gpt4 key购买 nike

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

编辑:

检查器选项卡:

Text object with button component screenshot

控制台选项卡:

Inspector tab screenshot

最佳答案

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

可能的原因和修复:

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

在您的代码中,调用 GetComponent<Button>();没有先找到 GameObject 意味着 GetComponent应该寻找 Button附加到此 GameObject 的组件此脚本 ( LevelLock ) 已附加到。

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

替换

lvlBtn = GetComponent<Button> ();

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

3.脚本附加到多个对象

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

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

为此,选择 LevelLock从“项目”选项卡中选择脚本,然后转到 Assets ---> 在场景中查找引用。删除 LevelLock来自其他游戏对象的脚本。

enter image description here

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


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

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

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

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

改变:

vlBtn = GetComponent<Button> ();

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

同时改变:

private Button lvlBtn;

private UnityEngine.UI.Button lvlBtn;

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

关于c# - GetComponent 函数返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49827358/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com