while (timer < shipDisabledTimer)
{
newXPos = 0;
newYPos = 0;
}
полностью блокирует основной поток вашей игры, так как timer
и shipDisabledTime
не изменяются в цикле, поэтому он никогда не закончится.
Есть несколькоспособы, которыми вы могли бы пойти сюда.
Invoke
Invoke
позволяет вам вызывать метод после определенной задержки, чтобы вы могли легко сделать что-то вроде
public void Freeze()
{
frozen = true;
Invoke("Unfreeze"; shipDisabledTime);
}
private void Unfreeze()
{
frozen = false;
}
сопрограмма
A сопрограмма подобна временному Update
методу.В вашем случае проще всего использовать WaitForSeconds
и делать что-то вроде
public void Freeze()
{
StartCoroutine (FreezeRoutine());
}
private IEnumerator FreezeRoutine()
{
frozen = true;
yield return new WaitForSeconds(shipDisabledTime);
frozen = false;
}
простой таймер
Или вы можете использовать простой таймер, но в Update
(не цикл пока), как
private float timer = -1;
public void Freeze()
{
frozen = true;
timer = shipDisabledTime;
}
private void Update()
{
if(timer > 0)
{
timer -= Time.deltaTime;
if(timer <= 0)
{
timer = -1;
frozen = false;
}
}
...
}
И в любом случае, вы просто не берете никаких движений за это время
public void Move()
{
if(frozen) return;
...
}
За исключением *Решение 1040 * Вы также можете расширить их и решили, хотите ли вы, например, складывать несколько стоп-кадров, игнорировать их, когда они уже заморожены, или просто запускать таймеры заново.
Общее примечание: в c # достаточно просто использовать bool
это в основном то же самое, но легче читать и писать;)
Также обратите внимание, что этот вызов
disableship(frozen = false);
...
public Boolean disableship(Boolean frozen)
{
return frozen;
}
довольно странный ... во-первых, этот метод абсолютно ничего не делаетчем просто вернуть то же значение, которое вы передаете в качестве параметра .. вы скрываете поле frozen
с таким же именованным параметром, так что это ничего не делает!
Во-вторых, ваш метод возвращает Boolean
но вы не назначаете это ни на что.
Если вы хотите изменить значение, просто установите его, используя frozen = XY
, но не передавайте это в качестве параметра далее.
Aa и избегайте вызова Debug.Log
каждый кадр ..это замедлит работу вашего приложения даже в сборке, в которой вы даже не увидите журнал!