为什么我的if语句中的条件被忽略了? C#

时间:2014-09-27 03:15:54

标签: if-statement unity3d

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

我已经制作了一些非常基本的代码来强调我遇到的问题。我在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; 
    }
}

1 个答案:

答案 0 :(得分:0)

计时器不工作的原因是因为;在你的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,所以对于每秒每帧,它正在执行该方法,然而每秒多次的机会是真或假,这就是为什么它似乎正在解雇两个(如果) )块但实际上每个更新的帧都会触发真或假,这真的很快

如果你把这个调用放在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; 
    }
}