C#值不用我碰就切换值

问题描述 投票:0回答:1

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

c# unity-game-engine
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 个按钮会响应鼠标单击,并且您无法控制哪一个。

© www.soinside.com 2019 - 2024. All rights reserved.