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如何只选择数组中的一项并取消选择其他项的主要内容,如果未能解决你的问题,请参考以下文章
arcengine用c#开发怎么实现选择属性表中的一项属性平移至地图显示?