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 组件并执行相同的操作只是为了检查它是否有效,所以我不知道为什么它找不到按钮组件。如果有人可以帮助解决这个问题或向我指出我做错的事情,我将非常感激
编辑:
检查器选项卡:
控制台选项卡:
您的屏幕截图显示您已将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,例如Image、Text、Rigidbody等。创建一个class名称并确保它不存在于 Unity API 中,否则您将继续遇到此类问题,甚至 SO 上的人员也无法帮助您,除非他们有权访问您的项目。