C#值切换值没有我触摸它

时间:2013-01-04 17:07:11

标签: c# monodevelop unity3d

我正在使用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。我想知道我是否完全错过了一些东西。这个类中没有其他代码使用布尔值,也没有其他几个我做过的类。那问题出在哪里呢?

1 个答案:

答案 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个按钮将响应鼠标单击,您无法控制哪个。