C# 对Unity 2D中的多个对象使用相同的布尔值

C# 对Unity 2D中的多个对象使用相同的布尔值,c#,unity3d,game-development,C#,Unity3d,Game Development,我有四个具有相同脚本和相同bool的游戏对象,当其中一个被光线击中时,bool状态为true,但函数不会启动,因为其他三个游戏对象设置为false 我尝试的是: 代码在实例化最后一个对象时运行良好 如果我在第一个对象上禁用了脚本并再次重新启用它,则该函数仅在该对象上运行良好 选择公共布尔值; void Start(){ 所选=假; } 无效更新(){ showRange(); } 公共void showRange(){ 如果(所选==true){ for(int i=0;i

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

我尝试的是:

  • 代码在实例化最后一个对象时运行良好
  • 如果我在第一个对象上禁用了脚本并再次重新启用它,则该函数仅在该对象上运行良好
  • 选择公共布尔值;
    void Start(){
    所选=假;
    }
    无效更新(){
    showRange();
    }
    公共void showRange(){
    如果(所选==true){
    for(int i=0;i
    尝试使用gamemanager。 您的gamemanager可以有一个公共bool变量“selected”

    新启动方法: 新showRange函数
    public void showRange(){
    如果(gamemanager.Instance.selected){
    for(int i=0;i

    我相信这段代码可以改进。如果有帮助,请告诉我

    只需使用一个静态变量:

    你应该:

    选择公共静态布尔


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

    showRange()将不适用于所选对象,因为该方法希望所有四个对象都被选中,然后它就工作了(愚蠢的方法,我因此无法睡眠)

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

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


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

    尝试将
    public bool selected
    更改为
    public static bool selected
    。最简单的解决方案是使用静态变量。实际上,您可以简化ShowRange()方法:
    public void ShowRange(){foreach(tileRange中的var tile){tile.GetComponent().enabled=selected;}}}
    这是关于,而不是.public静态游戏管理器实例;你的意思是(publicstaticgameobjectinstance;),因为它给了我一个错误(在unitymonobhavior中没有定义gamemanager),你的gamemanager应该是一个单独的脚本。创建一个新脚本,将其命名为gamemanager,然后尝试回答有人问了一个简单的问题,应该会得到一个简单的答案,告诉他们复制粘贴一个单一模式,使用一个管理器使用多个脚本对我来说似乎完全是过火了。
    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 static gamemanager Instance;
    public bool selected;
    private void Awake()
    {
        Instance = this;
    }
    
    void Start() {
    gamemanager.Instance.selected = false;
    }
    
    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;
        }
    }
    }