C# Unity如何只选择数组中的一项并取消选择其他项

Posted

技术标签:

【中文标题】C# Unity如何只选择数组中的一项并取消选择其他项【英文标题】:C# Unity how to select only one item in an array and deselect other items 【发布时间】:2021-06-21 17:58:09 【问题描述】:

我有一个游戏对象数组,我正在循环遍历该数组,以便为​​每个游戏对象设置一个延迟的材质动画。我正在使用协程,以便在其中使用 WaitForSeconds 和 for 循环来为每个对象添加延迟。

最终会发生的是数组中的所有对象都被选中,因此动画会发生在所有对象上,而不是一次只发生一个对象

我正在寻找的,只有在索引处选择的立方体来改变颜色并恢复以前立方体的颜色。

我怎样才能做到这一点?

 public GameObject[] laneMat; 
 void Update()
 
    StartCoroutine(matColor(laneMat, .3f));
 

 IEnumerator matColor(GameObject[] gameObject, float delay)
 
 time += Time.deltaTime;
  for (int i = 0; i < laneMat.Length; i++)
  
     if (duration > time)
     
         laneMat[i].GetComponent<Renderer>().material.SetColor("_Color", Color.red);
         
         yield return new WaitForSeconds(delay);
     
     else if (time > duration && time < duration + .3f)
        
            Renderer render = GetComponent<Renderer>();
            render.material.SetColor("_Color", originalColor);
            yield return null;
        
    
 

我尝试使用 List 并在第一个循环中创建另一个循环来选择预览立方体并使用 removeAt() 删除它们,但它有点紧张,而不是我正在寻找的效果

【问题讨论】:

欢迎来到 Stack Overflow!您能否添加此代码当前的功能以及它与您的预期输出有何不同?它可以帮助用户尝试理解您的问题。我不太明白这里的问题,但我会小心让协程更新方法:协程将在每一帧触发。你有没有考虑把协程放在 Start 方法中,让协程永远循环? 感谢您的评论,我有更新中的协程,因为我在一定时间内做动画,当时间结束时,数组中选择的所有游戏对象都会恢复到原来的颜色。 .我有更大的代码,我没有包括我不想引起更多的混乱,但我想我应该有。我将编辑帖子 你绝对不应该每一帧都启动一个新的 Corotuine!您将获得数百个同时运行的例程 .... 【参考方案1】:

您可以在此处对循环使用条件

    public GameObject[] laneMat; 
     void Update()
     
        StartCoroutine(matColor(laneMat, .3f));
     
    
     IEnumerator matColor(GameObject[] gameObject, float delay)
     
     time += Time.deltaTime;
      for (int i = 0; i < laneMat.Length; i++)
      
         if (duration > time)
         
if(selected = true)  laneMat[i].GetComponent<Renderer>().material.SetColor("_Color", Color.red);  else  laneMat[i].GetComponent<Renderer>().material.Color = defaultColor; 
             
             yield return new WaitForSeconds(delay);
         
        
     
    

【讨论】:

【参考方案2】:

我认为您应该将枚举器更改为 Start 函数,而不是 Update 函数。从 Update 调用 StartCoroutine 意味着您在每一帧都启动一个新的协程,该协程独立于您已经启动的所有其他协程。

如果将调用移至 Start 函数,则可以在必要时使用延迟来使代码等待。恢复其他游戏对象的一种方法是在第一个循环中嵌套第二个循环。由于您可以访问更改后的游戏对象的索引,因此您可以简单地避免恢复该游戏对象的材质。

从那里开始,只需将 yield return 语句放置在您想要延迟的任何位置。

 public GameObject[] laneMat; 
 void Start()
 
    StartCoroutine(matColor(.3f));
 

 IEnumerator matColor(float delay)
 
    while (true) 
        for (int i = 0; i < laneMat.Length; i++)
        
            laneMat[i].GetComponent<Renderer>().material.SetColor("_Color", Color.red);
             
            //if you want a delay before reverting the other gameobject materials, it should go here
            
            for (int j = 0; j < laneMat.Length; i++) 
                if (j != i)  //if the index of the current gameObject is different from the one in the outer loop
                    laneMat[j].GetComponent<Renderer>().material.SetColor("_Color", originalColor);
                    
                    //if you want a delay between reverting each gameobject's material, it should go here
                
                   

            yield return new WaitForSeconds(delay);
        
        
        //if you want a delay before the process starts again, it should go here
    

我没有测试过这段代码,但我认为它应该是一个很好的起点。

祝你好运!

【讨论】:

以上是关于C# Unity如何只选择数组中的一项并取消选择其他项的主要内容,如果未能解决你的问题,请参考以下文章

ruby 选择数组中的项并递归删除它。

ruby 选择数组中的项并递归删除它。

arcengine用c#开发怎么实现选择属性表中的一项属性平移至地图显示?

在输入字段 c# 中的 Unity 上显示从日历中选择的日期

如何打乱问题并显示数组的一项

Unity & C# - 从数组中选择一个随机字符串