2016-08-09 1 views
-1

나는 플레이어가 로봇과 싸우는 게임을 만들고 있는데, 조건이 충족되면 AI가 뒤로 이동하고 플레이어에서 멀리 회전하도록 코드를 구현했다. 그러나 이것이 반복되는 공동 작업은 영원히 반복되며 어떻게 깨지는지 확신 할 수 없습니다.유니티 5 코 루틴이 종료 될 때까지 기다릴 필요가 없다

void Update() 
    { 
     //looking at player 
     playerVelocity = ((TTarget.position - previous).magnitude)/Time.deltaTime; 
     previous = TTarget.position; 

     GameObject thePlayer = GameObject.Find("Player"); 
     PlayerMovement playerMovement = thePlayer.GetComponent<PlayerMovement>(); 
     enemyHit = playerMovement.hitEnemy; 

     if (enemyHit == false) 
     { 
      //enemy moving 
      transform.LookAt(TTarget); 
      transform.Translate(Vector3.forward * Time.deltaTime * movementSpeed); 
     } 
     else if (enemyHit == true) 
     { 
      StartCoroutine("Evade"); 
      //Debug.Log ("Hello"); 
      StopCoroutine("Evade"); 
     } 
    } 

    IEnumerator Evade() 
    { 
     //GameObject thePlayer = GameObject.Find("Player"); 
     //PlayerMovement playerMovement = thePlayer.GetComponent<PlayerMovement>(); 
     //enemyHit = playerMovement.hitEnemy; 

     transform.Translate(Vector3.back * Time.deltaTime * movementSpeed); 
     yield return new WaitForSeconds(1); 

     Vector3 to = new Vector3(0, -45, 0); 
     if (Vector3.Distance(transform.eulerAngles, to) > 0.01f) 
     { 
      transform.eulerAngles = Vector3.Lerp(transform.rotation.eulerAngles, to, 99*Time.deltaTime); 
     } 

     yield break; 


    } 
+0

와 것이 일을하고자했다'debug.log를 것 같아요()'사이의 콜 루틴 (cooutine) 사이에 주석을 제거하면 로그에 출력되는 것을 볼 수 있습니까? –

+0

사용자가 제공 한 답변이 만족스럽게 질문에 대한 답변을 얻은 경우 옆에있는 체크 표시를 클릭하여 동의해야합니다. 이 질문과 이전 질문을 검토하여 답변을 받아 들일 수 있는지 확인하십시오. 감사! – Serlite

답변

0

문제는 coroutine을 시작한 다음 바로 중지하는 것입니다.

void Update() 
{ 
    enemyHit = playerMovement.hitEnemy; 

    if (enemyHit == false) 
    { 
     //enemy moving 
     transform.LookAt(TTarget); 
     transform.Translate(Vector3.forward * Time.deltaTime * movementSpeed); 
    } 
    else if (enemyHit == true) 
    { 
     StartCoroutine("Evade"); 
     Debug.Log ("Back From Coroutine"); 
     StopCoroutine("Evade"); 
     Debug.Log("Stopped Coroutine"); 
    } 
} 

IEnumerator Evade() 
{ 
    Debug.Log("Starting Coroutine"); 
    transform.Translate(Vector3.back * Time.deltaTime * movementSpeed); 
    yield return new WaitForSeconds(1); 

    Debug.Log("This is never called"); 

    Vector3 to = new Vector3(0, -45, 0); 
    if (Vector3.Distance(transform.eulerAngles, to) > 0.01f) 
    { 
     transform.eulerAngles = Vector3.Lerp(transform.rotation.eulerAngles, to, 99*Time.deltaTime); 
    } 
    yield break; 
} 

이는 것 출력 :

Starting Coroutine 
Back From Coroutine 
Stopped Coroutine 

나는 더 나은 그냥 내가 당신을 볼 부울 및 Invokehttp://docs.unity3d.com/ScriptReference/MonoBehaviour.Invoke.html

private bool avoidPlayer = false; 
void Update() 
{ 
    enemyHit = playerMovement.hitEnemy; 

    if (enemyHit == false) 
    { 
     //enemy moving 
     transform.LookAt(TTarget); 
     transform.Translate(Vector3.forward * Time.deltaTime * movementSpeed); 
    } 
    else if (enemyHit == true) 
    { 
     transform.Translate(Vector3.back * Time.deltaTime * movementSpeed); 
     avoidPlayer = true; 
    } 
    // Invoke the evade function every second until we have avoided the player 
    if(avoidPlayer) 
     Invoke("Evade", 1); 
} 

void Evade() 
{ 
    Vector3 to = new Vector3(0, -45, 0); 
    if (Vector3.Distance(transform.eulerAngles, to) > 0.01f) 
     transform.eulerAngles = Vector3.Lerp(
            transform.rotation.eulerAngles, to, 99*Time.deltaTime); 
    else 
     avoidPlayer = false; 
} 
관련 문제