0

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

4

1 回答 1

2

[简短回答]

如果您的脚本附加到超过 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 个按钮会响应鼠标单击,您无法控制哪个按钮。

于 2013-01-04T18:18:05.740 回答