2016-11-09 3 views
1

У меня есть код, который, когда он выполняется, перетаскивает символ вперед. Проблема в том, что персонаж никогда не перестает двигаться и продолжает навсегда. Есть ли способ остановить движение персонажа через 2 секунды? Вот код, я использую:Остановка функции обновления в Unity

public class meleeAttack : MonoBehaviour 
{ 
    public int speed = 500; 
    Collider storedOther; 
    bool isHit = false; 

    void Start() 
    { 
    } 

    void Update() 
    { 
     if (isHit == true) 
     { 
      storedOther.GetComponent<Rigidbody>().AddForce(transform.forward * speed); 
     } 

    } 



    void OnTriggerStay(Collider other) 
    { 
     if (other.gameObject.tag == "Player" && Input.GetKeyUp(KeyCode.F)) 
     { 
      storedOther = other; 
      isHit = true; 
     } 
    } 

} 

Я не уверен, если есть способ, чтобы остановить обновление функции(), поэтому он останавливает движение персонажа.

+0

Не вызывайте 'storedOther.GetComponent ()' в функции обновления. Либо вызовите его один раз во время 'Start()' и сохраните Rigidbody, сделайте то же самое для 'OnTriggerStay', когда вы получите новый коллайдер. –

ответ

2

Функция обновления является частью жизненного цикла скрипта Unity. Если вы хотите остановить выполнение функции обновления, вам необходимо отключить скрипт. Для этого, вы можете просто использовать:

enabled = false; 

Это отключит выполнение жизненного цикла вашего сценария, и тем самым предотвратить функция обновления будет называться.

Теперь, похоже, вы применяете силу к своему персонажу, чтобы заставить его двигаться. То, что вы, возможно, захотите сделать, - через две секунды удалить любую силу, присутствующую на вашем персонаже. Для этого вы можете использовать сопрограмму, которая является функцией, которая не будет выполняться только на одном кадре, но при необходимости на нескольких кадрах. Для этого необходимо создать функцию, которая возвращает IEnumerator параметра, и вы называете сопрограмму с методом StartCoroutine:

bool forcedApplied = false; 

void Update() 
{ 
    if (isHit == true && forceApplied == false) 
    { 
     storedOther.GetComponent<Rigidbody>().AddForce(transform.forward * speed); 

     forceApplied = true; 

     StartCoroutine(StopCharacter); 

     isHit = false; 
    } 

} 

IEnumerator StopCharacter() 
{ 
    yield return new WaitForSeconds(2); 

    storedOther.GetComponent<Rigidbody>().velocity = Vector3.zero; 

    forceApplied = false; 
} 

Это может быть различными способами достичь того, что вы хотите сделать. Это зависит от вас, чтобы выбрать то, что кажется актуальным для вашего текущего игрового процесса, и изменить этот сценарий таким образом.

+0

Я добавил код, который вы написали, и пока он не останавливает движение персонажа, он продолжает повторять этот процесс. Таким образом, персонаж возвращается назад каждые 2 секунды. Нужно ли мне что-то менять в функции обновления, чтобы она перестала перемещать символ навсегда, а не на пару секунд? – sam1319

+0

Проблема, вероятно, в том, что ваша переменная isHit всегда равна true. Я изменил свой пример, чтобы он был установлен на значение false после применения силы. – Isuka