【问题标题】:Using same Boolean with multiple objects in Unity 2D在 Unity 2D 中对多个对象使用相同的布尔值
【发布时间】:2019-05-03 04:27:10
【问题描述】:

我有四个具有相同脚本和相同布尔值的游戏对象,当其中一个被射线击中时,布尔状态为真,但该函数不会启动,因为其他三个游戏对象设置为 false。

我尝试了什么:

  1. 代码在最后一个被实例化的对象上运行良好
  2. 如果我在第一个对象上禁用脚本并重新启用它,则该功能仅在此对象上正常工作
public bool selected;

void Start(){
    selected = false;
}

void Update(){
    showRange ();
}



public void showRange(){

    if (selected == true) {
        for (int i = 0; i < tileRange.Count; i++) {
            tileRange [i].GetComponent<SpriteRenderer> ().enabled = true;
        } 
    } else {
            for (int i = 0; i < tileRange.Count; i++) {
                tileRange [i].GetComponent<SpriteRenderer> ().enabled = false;
        }
    }
}

【问题讨论】:

  • 尝试将public bool selected 更改为public static bool selected
  • 最简单的解决方案是使用静态变量。你实际上可以简化你的 ShowRange() 方法:public void showRange(){ foreach(var tile in tileRange) { tile.GetComponent&lt;SpriteRenderer&gt; ().enabled = selected; } }
  • 这是关于c#,而不是unityscript

标签: c# unity3d game-development


【解决方案1】:

【讨论】:

    【解决方案2】:

    尝试使用游戏管理器。

    public static gamemanager Instance;
    public bool selected;
    private void Awake()
    {
        Instance = this;
    }
    

    您的游戏管理器可以“选择”一个公共布尔变量。

    新的启动方式:

    void Start() {
    gamemanager.Instance.selected = false;
    }
    

    新的 showRange 功能

    public void showRange(){
    
    if (gamemanager.Instance.selected) {
        for (int i = 0; i < tileRange.Count; i++) {
            tileRange [i].GetComponent<SpriteRenderer> ().enabled = true;
        } 
    } else {
            for (int i = 0; i < tileRange.Count; i++) {
                tileRange [i].GetComponent<SpriteRenderer> ().enabled = false;
        }
    }
    }
    

    我确信这段代码可以改进。让我知道它是否有帮助。

    【讨论】:

    • 公共静态游戏管理器实例;你的意思是(public static GameObject Instance;),因为它给了我一个错误(gamemanager is not defined in unity monobehaviour)
    • 你的游戏管理器应该是一个单独的脚本。创建一个新脚本,将其命名为 gamemanager,然后尝试答案
    • 问一个简单问题的人应该得到一个简单的答案,告诉他们复制粘贴单例模式并使用管理器使用多个脚本对我来说似乎完全是矫枉过正。
    【解决方案3】:

    问题不在于选定的布尔值,而在于 showRange() 方法。如果光线击中一个对象,它将被选中,而其他三个将保持未选中状态((这是因为我使用了一个列表来存储最后击中的对象,那么代码仅适用于该列表中的对象))

    showRange() 对选中的对象不起作用,因为该方法希望所有四个对象都被选中,然后才起作用(愚蠢的方法,我因此无法入睡)。

    我设法修复了 showRange() 问题,使用一个新脚本关闭所有游戏对象脚本组件并打开选定的一个脚本,这将使 showRange() 方法无法检查其他三个对象的布尔状态.

    感谢(Guilherme、misher 和 Josep)的帮助,我真的很感激,但正如上面所示,问题不在布尔值中。

    对于 (Muhammad Farhan Aqeel),我相信您的代码应该可以工作,但我没有设法让它工作,可能是因为我还是编程新手。

    【讨论】:

      猜你喜欢
      • 2023-02-14
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 2020-05-18
      • 2014-08-06
      • 2013-03-20
      • 2018-05-06
      相关资源
      最近更新 更多