【问题标题】:why are the conditions in my if statement being ignored? C#为什么我的 if 语句中的条件被忽略? C#
【发布时间】:2014-09-27 03:15:53
【问题描述】:

我知道这是一个初学者的问题,但在我了解这里发生的情况之前,我无法继续学习。在我在 Update() 中执行的 if 块中,我无法理解为什么两个 if 语句同时执行。我认为一旦在块的开头初始化了主动变量,编译器就会向下移动到第一个 if 语句以查看条件是否为真。如果为真,它将执行该块中的代码,直到计时器达到零。然后它会向下移动到下一个。如果第一个条件为真,那么第二个条件为假,因此它会再次移动到开头。将为主动性计算一个新的布尔值,并重复该过程。让我大吃一惊的是,无论我做什么,都会执行两个块并且完全忽略计时器。这很混乱!

我编写了一些非常基本的代码来突出我遇到的问题。我在 Unity3d 中使用这个 C# 代码:

public float firstTimer = 2;
public float secondTimer = 10; 
public bool initiative; 

void Update()
{

    initiative = InitiativeOrder(); 

    if(initiative == true && firstTimer > 0);
    {
        firstTimer -= Time.deltaTime;
        Debug.Log ("First timer has finished!"); 
    }

    if(initiative == false && secondTimer > 0);
    {
        secondTimer -= Time.deltaTime;
        Debug.Log ("Second timer has finished!"); 
    }
}

public bool InitiativeOrder()
{
    float player =  Random.Range(1,10); 
    float enemy = Random.Range(1,10); 

    if(player > enemy)
    {
        return true; 
    }
    else if (player < enemy)
    {
        return false; 
    }
    else 
    {
        return true; 
    }
}

【问题讨论】:

  • 删除 ;从你的 if() if(initiative == true && firstTimer > 0);

标签: if-statement unity3d


【解决方案1】:

计时器不工作的原因是因为 ;在你的 if() 之后

if(initiative == true && firstTimer > 0);<----remove these from your if

让你的 if() 像这样

if(initiative == true && firstTimer > 0)
    {
        firstTimer -= Time.deltaTime;
        Debug.Log ("First timer has finished!"); 
    }

    if(initiative == false && secondTimer > 0)
    {
        secondTimer -= Time.deltaTime;
        Debug.Log ("Second timer has finished!"); 
    }

它没有执行两个 if() 块

这段代码

initiative = InitiativeOrder(); 

被称为每一帧女巫我猜是 60 fps 所以每秒每一帧它都在执行该方法,并且每秒多少次它是真或假的机会就是为什么它似乎同时触发 if( ) 阻塞,但实际上每个更新的帧都会触发它的 true 或 false,这非常快

如果你把这个调用放在 OnStart() 中,它只会触发一次,就像

void Start(){
 initiative = InitiativeOrder(); 
}

编辑您的代码

public float firstTimer = 2;
public float secondTimer = 10; 
public bool initiative; 
void Start(){
 initiative = InitiativeOrder();
}
void Update()
{



    if(initiative == true && firstTimer > 0)
    {
        firstTimer -= Time.deltaTime;
        Debug.Log ("First timer has finished!"); 
    }

    if(initiative == false && secondTimer > 0)
    {
        secondTimer -= Time.deltaTime;
        Debug.Log ("Second timer has finished!"); 
    }
}

public bool InitiativeOrder()
{
    float player =  Random.Range(1,10); 
    float enemy = Random.Range(1,10); 

    if(player > enemy)
    {
        return true; 
    }
    else if (player < enemy)
    {
        return false; 
    }
    else 
    {
        return true; 
    }
}

【讨论】:

  • 非常感谢!我仍然有点卡住,因为即使我将初始化放在 Start 或 OnStart 中,它仍然会在真假之间快速振荡。为什么会这样?
  • 你删除了 if() 之后的 ;'s
  • 你得到了你想要的吗?
  • 在start中,两个>没了,还在做。我一定是错过了什么
  • 试试我在编辑你的代码部分的方式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-26
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
相关资源
最近更新 更多