2014-09-27 8 views
2

Я знаю, что это проблема новичка, но я не могу прогрессировать с учебой, пока не пойму, что здесь происходит. В блоке if, который я выполняю в Update(), я не могу понять, почему два оператора if выполняются одновременно. Я думал, что как только инициативная переменная будет инициализирована в начале блока, компилятор перейдет к первому оператору if, чтобы убедиться, что условие истинно. Если это правда, он будет выполнять код в этом блоке до тех пор, пока таймер не достигнет нуля. Затем он переместился бы вниз. Если условие было истинным в первом, тогда во втором было бы ложно, так что оно снова вернется к началу. Для инициативы будет рассчитано новое значение bool, и процесс будет повторен. Что мне кажется, что независимо от того, что я делаю, выполняются оба блока, и таймеры полностью игнорируются. Это очень запутанно!Почему в моей инструкции if игнорируются условия? C#

Я сделал очень простой код, чтобы подчеркнуть проблему, с которой я сталкиваюсь. Я использую этот код C# в Unity3d:

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

удалить; после вашего if() if (инициатива == true && firstTimer> 0); – JRowan

ответ

0

Причина, по которой таймер не работает, потому что; после если()

if(initiative == true && firstTimer > 0);<----remove these from your 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!"); 
    } 

его не выполняет, как если() блокирует

этот код

initiative = InitiativeOrder(); 

вызывается каждый фрейм-фрейм должен угадать 60 кадров в секунду, поэтому для каждого кадра в секунду он выполняет этот метод и вероятность, однако, много раз в секунду, что это правда или ложно, почему кажется, что он запускает оба блока 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; 
    } 
} 
+0

Большое спасибо! Я все еще немного застрял, потому что даже когда я вставлял инициализацию в Start или OnStart, он все еще выполняет быстрое колебание между истинным и ложным. Почему это должно быть? – OwenAlexander

+0

удалили ли вы из после if() – JRowan

+0

да два условия были удалены. – OwenAlexander

Смежные вопросы