C# 有没有一种简单的方法可以摆脱这个IF循环?
我正在学习如何编程,我觉得我总是被这种循环问题所困扰。 问题是,当分组bool在更新时(每帧)始终为真时,什么是摆脱if的最佳方法。我只需要执行一次EUREKAC# 有没有一种简单的方法可以摆脱这个IF循环?,c#,loops,unity3d,if-statement,C#,Loops,Unity3d,If Statement,我正在学习如何编程,我觉得我总是被这种循环问题所困扰。 问题是,当分组bool在更新时(每帧)始终为真时,什么是摆脱if的最佳方法。我只需要执行一次EUREKA using System.Collections; using System.Collections.Generic; using UnityEngine; public class GroupedWordsEyes : MonoBehaviour { void Update() { //Check
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GroupedWordsEyes : MonoBehaviour
{
void Update()
{
//Check if words are grouped
bool grouped = CompareTags_Word1.colliding == true;
if (grouped)
{
Debug.Log("EUREKAAAA!");
//get out of the loop!
}
}
}
编辑:更新答案,因为我误解了问题 您有几个选择,这完全取决于您的架构
this.enabled=false
-这将禁用组件,并且不会运行任何脚本。这取决于体系结构,因为这也将禁用连接到此体系结构的任何其他功能或子组件。您可以通过确保此脚本仅包含您希望能够禁用的特定部分来缓解此问题
if (grouped && !hasDoneEureka)
{
// do the thing
hasDoneEureka = true;
}
请注意,这将确保您只运行一次所需的内容,但可能不是最优的,因为虽然它不会每次都“执行”,但它会检查每一帧。您似乎希望
if
中的代码仅在“冲突”更改时执行。
然后需要记住上一个值并检查更改:
编辑根据OP的评论更改代码
public class GroupedWordsEyes : MonoBehaviour
{
private bool previousGrouped = false; // assume that at first there is no collision
void Update()
{
//Check if words are grouped
bool grouped = CompareTags_Word1.colliding == true;
if (grouped != previousGrouped )
{
// always remember a change
previousGrouped = grouped;
// only when just collided
if (grouped)
{
Debug.Log("EUREKAAAA!");
}
}
}
}
听起来您希望只在条件第一次匹配之前调用
Update
只需将设置为false
即可禁用该组件
这样,Unity就不再调用Update
public class GroupedWordsEyes : MonoBehaviour
{
void Update()
{
//Check if words are grouped
if (CompareTags_Word1.colliding)
{
Debug.Log("EUREKAAAA!");
enabled = false;
}
}
}
你为什么要跳出这个圈子?在
Debug.Log
之后什么也不做……你不是在循环中——很可能你的Update()
方法被称为lots,因此Debug.Log
被称为lotslots@canton7-这是Unity3d。组件上的Update
功能是游戏引擎的更新循环。这实际上是一个循环的主体,虽然没有编写循环。@McAdan当然,但是return
(正如您的答案所建议的)不会让您脱离游戏引擎的主循环,eitherOk,看起来idk技术上称为“一个循环”。正如@canton7所说,Update()被调用了很多次,我只需要调用一次,但是idk知道怎么做。它不起作用。似乎是回归;就像之前有人说的那样,这无助于脱离游戏引擎的主循环。太好了,我开始理解了。现在的问题是,我只能执行一次,似乎当hasdoneureka=true时;这样我就可以继续进入if了。我需要运行它并实时检查多个对象的冲突,所以我不能只禁用脚本/对象。@Matias-在这种情况下,只需删除返回值
。。。下次它出现时,它将绕过if语句,并通过扩展,绕过您所指的“eureka”,并继续运行。mhhh,如果我删除返回
,同样的行为。在if中设置booltrue
后,我无法触发//再次执行该操作。@Matias这不是你问题的全部要点吗?你只想做一次尤里卡的事情…这是给我一个尤里卡在第一帧,即使布尔分组是假的。当CompareTags_Word1.colling==true时;然后是给我另一个尤里卡,但是如果CompareTags_Word1.colling==false;我也收到了Eurekas:/@Matias当发生新的碰撞时,我将代码稍微更改为仅限Eureka。我正在实时检查多个碰撞的对象。我需要保持脚本运行!