2016-08-01 3 views
0

Каждый раз, когда я запускаю этот раздел кода и нажимаю клавишу «d», Unity выйдет из строя. Это заставляет меня думать, что есть логическая ошибка, но я понятия не имею, что происходит не так.Unityscript - как наилучшим образом установить 5-секундную задержку на действие, которое занимает 5 секунд.

private var delayAmount   = 5.0; 
private var timeDelay   = 0.0; 
private var abilityEnd   = 0.0; 
public var  abilityDuration  = 5.0; 
public var  speed    = 2.0; 

function Update() 
{ 
    if (Input.GetKey ("d") && Time.time > timeDelay) 
    { 
     abilityEnd = Time.time + abilityDuration; 
     while(abilityEnd > Time.time) 
     { 
      transform.Translate(0, 0, Time.deltaTime * speed); 
     } 
     timeDelay = Time.time + delayAmount;  
    } 
} 
+0

Что вы здесь делаете? –

+0

действительно не понимают, что вы пытаетесь сделать здесь, но в целом лучший способ добавить задержку - использовать сопрограммы и выход. Вы можете посмотреть здесь: https://docs.unity3d.com/ScriptReference/MonoBehaviour.StartCoroutine.html – adityasinghraghav

ответ

0

Используйте если оператор вместо цикла, а поскольку цикл не ломается и единство перегрузок и аварий (не цитируйте меня, я не являюсь экспертом, это только мое объяснение).

+0

Это не сработало? – LongarMD

+0

Я предполагаю, что это действительно сработало, но проблема больше, поэтому она не полностью исправила проблему для ОП (отсюда и необоснованный нижний предел, который вы впервые получили). – Everts

0

Что происходит, так это то, что когда он входит, он остается в бесконечном цикле, потому что Time.time не может измениться! Вы просто заблокировали сам движок, введя в то время, когда оно передает значение, которое невозможно обновить.

Вы должны изменить свой подход, позволив двигателю выйти из метода обновления. Общим способом решения этих сценариев является использование множества подпрограмм и семафоров выполнения.