Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有一种简单的方法可以摆脱这个IF循环?_C#_Loops_Unity3d_If Statement - Fatal编程技术网

C# 有没有一种简单的方法可以摆脱这个IF循环?

C# 有没有一种简单的方法可以摆脱这个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

我正在学习如何编程,我觉得我总是被这种循环问题所困扰。 问题是,当分组bool在更新时(每帧)始终为真时,什么是摆脱if的最佳方法。我只需要执行一次EUREKA

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中设置bool
    true
    后,我无法触发
    //再次执行该操作。@Matias这不是你问题的全部要点吗?你只想做一次尤里卡的事情…这是给我一个尤里卡在第一帧,即使布尔分组是假的。当CompareTags_Word1.colling==true时;然后是给我另一个尤里卡,但是如果CompareTags_Word1.colling==false;我也收到了Eurekas:/@Matias当发生新的碰撞时,我将代码稍微更改为仅限Eureka。我正在实时检查多个碰撞的对象。我需要保持脚本运行!