2016-07-31 2 views
-1

StartCoroutine이 말더듬을 일으키는 지 확실하지 않습니다. 그러나 스크립트를 Inspector에서 사용하지 않도록 설정하면 스크립트를 사용할 때 말더듬이 사라집니다.StartCoroutine을 사용할 때 플레이어가 망가져 있습니다. 어떻게 해결할 수 있습니까?

ThirdPersonController에 첨부 된 웨이 포인트 스크립트를 사용하고 있습니다. ThirdPersoncontroller에 Nav MesH Agent도 추가했습니다.

Naviagtion 창의 웨이 포인트로 두 개의 구체도 있습니다. 확인란을 선택하여 탐색을 정적으로 만들었고 평면에서도 Navigation Static을했습니다.

다음 구운.

애니메이터 창에서 휴머노이드 워크를 사용하여 새로운 상태 Walk를 만들었고 세트가 기본이므로 모든 플레이어가 게임을 실행할 때 자동으로 걷기 시작합니다.

플레이어가 웨이 포인트 사이를 걷고 있지만 모두 망가져 있습니다. 만약 내가 스크립트를 사용하고 있지 않다면 플레이어는 잘 걷고 있습니다. 다른 플레이어들도 스크립트를 사용할 때만 말더듬기가 잘됩니다.

은 중간 지점 스크립트입니다 :

using UnityEngine; 
using System.Collections; 

public class Patrol : MonoBehaviour 
{ 
    public Transform[] patrolPoints; 
    private NavMeshAgent agent; 
    private int dest = 0; 

    // Use this for initialization 
    void Start() 
    { 
     agent = GetComponent<NavMeshAgent>(); 
     StartCoroutine (Patrolling()); 
    } 


    IEnumerator Patrolling() 
    { 
     bool startPatorl = false; 

     for (int i = 0; i < patrolPoints.Length; i++) 
     { 
      while (!startPatorl) 
      { 

       if (agent.remainingDistance < 2.5f) 
       { 
        i++; 
        dest = i; 
       } 

       if (i >= patrolPoints.Length) 
       { 
        i = 0; 
        dest = 0; 
       } 

       agent.destination = patrolPoints[dest].transform.position; 
       yield return null; 
      } 
     } 
    } 
} 
+0

'startPatorl'이'Patrolling()'함수의 어느 곳에서도'true'로 설정되지 않기 때문에 프로그램이 무한 루프로 진행됩니다. while 루프는'startPatorl'이'false' 인 동안 실행됩니다. 어딘가에'startPatorl'을 설정해야합니다. 나는 당신이 무엇을하고 있는지를 모르기 때문에 이것을 어디서 할지를 말할 수는 없지만 그것이 문제입니다. – Programmer

+0

@Programmer 내가하고있는 것은 플레이어를 중간 지점으로 이동시키는 것입니다. 스크립트가 잘못된 방식입니다 (전체 스크립트 로직의 startPatrol이 아님)? –

+0

예. 그것을 보아서 그것은 틀립니다. 멈추지 않은 유일한 이유는 이것이 coroutine 함수이고 while 루프 안에'yield returns null; '이 있기 때문입니다. 그것 없이는 게임을 멈출 것입니다. 그 외에는, 나머지 코드를 이해하지 못합니다 ...'patrolPoints'에'waypoints'가 저장되어 있고 플레이어를'patrolPoints [0]'에서'patrolPoints'의 길이로 옮기고 싶습니까? – Programmer

답변

0

나는 문제가 당신의 코 루틴이 너무 많이 반복되는 생각이 줄을

yield return null; 

오순절을 변경하려고이 :

yield return new WaitForEndOfFrame(); 

또는이 :

yield return new WaitForSeconds(1);