我正在使用 C# 在 Unity 中开发游戏。代码的一部分使用布尔值来决定是否允许玩家购买建筑物的升级。如果是,则建筑物的整数增加 1。接下来,布尔值将设置为 false。如果他没有,那么目前什么也不会发生。
游戏中有一个按钮,功能上将周数增加 1,允许玩家再次能够升级建筑(从而再次将布尔值设置为 true)。
问题是,购买升级后,布尔值被设置为 false,即使我再次将其设置回 true,当我尝试升级建筑物时,布尔值似乎也是 false。我还尝试借助整数而不是布尔值(使用值 0 和 1)来检查它,但问题仍然存在。
这是一些代码:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class ActivateTrigger : MonoBehaviour
{
public int transtech = 0;
public int factech = 0;
public bool facmag = true;
public bool transmag = true;
void OnGUI () {GUI.Box(new Rect(0, Screen.height - 120 - 60, 150, 30), "Week: " + week.ToString());
if (GUI.Button(new Rect(0, Screen.height - 120 - 30, 150, 20), "Continue one week"))
{
NextProcess();
}
if (GUI.Button(new Rect(20, 70, 120, 20), "Koop upgrade") )
{
Debug.Log("Facmag: " + facmag);
if (facmag == true)
{
facmag = false;
}
}
void NextProcess()
{
Debug.Log("Next process called");
facmag = true;
transmag = true;
Debug.Log("Facmag: " + facmag);
}
}
因此,当调用 NextProcess() 时,调试日志显示值为 true。但是第一次购买升级后,无论我是否按下按钮执行 NextProcess(),该值都保持为 false。我想知道我是否完全错过了一些东西。这个类中没有其他代码使用布尔值,我所拥有的其他几个类也没有使用布尔值。那么问题出在哪里呢?
[简答]
如果您的脚本附加到超过 1 个对象,则只有 OnGUI() 中最上面的按钮正在修改 facmag 或调用 NextProcess()。
[稍微扩展我上面的评论]
Unity 对于对象之间共享的脚本的执行顺序是不可控的。 (不过,您可以在单个对象中修改脚本顺序。)这意味着OnGUI()将以其附加的N个对象以随机顺序被调用N次。只有位于特定鼠标位置的“最顶层”GUI 元素才会接受鼠标输入。
示例:
using UnityEngine;
using System.Collections;
public class OverlapButton : MonoBehaviour {
public string id_;
void OnGUI(){
if(GUI.Button(new Rect(0,0,50,50),"Touch")){
Debug.Log("I'm object " + id_);
}
}
}
如果将此脚本附加到 50 个对象,Unity 将绘制 50 个按钮,但只有 1 个按钮会响应鼠标单击,并且您无法控制哪一个。