我知道这是一个初学者的问题,但在我理解这里发生的事情之前,我无法继续学习。在我在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;
}
}
答案 0 :(得分:0)
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;
}
}