我正在使用C#在Unity中开发游戏。使用布尔值的代码的一部分决定是否允许玩家购买建筑物的升级。如果是,则构建的整数增加1.接下来,布尔值设置为false。如果他不是,那么现在没有任何事情发生。
游戏中有一个按钮,功能上将周数增加1,允许玩家再次升级建筑物(从而再次将布尔值设为真)。
问题是购买升级后,boolean设置为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。我想知道我是否完全错过了一些东西。这个类中没有其他代码使用布尔值,也没有其他几个我做过的类。那问题出在哪里呢?
答案 0 :(得分:2)
[简答]
如果您的脚本附加到多个对象,则 OnGUI()中的最顶层按钮正在修改 facmag 或调用 NextProcess()。强>
[我的评论略微扩展]
Unity对象之间共享的脚本的执行顺序是不可控制的。 (你可以modify script order in a single object。)这意味着 OnGUI()将在random order中为其附加的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个按钮将响应鼠标单击,您无法控制哪个。