2017-09-14 8 views
2

私は、移動するオブジェクトをクリックすることで文字を作ろうとしています(基本的なRTSの動き)、コルーチンを使用するとvoid Updateを使うよりも計算能力が向上すると聞いています。しかし、私はコルーチンには新しく、いくつかの助けが必要です。Navmesh&co-routineを使った基本的なRTSムーブメント?

  • また、このスクリプトの簡単なクリックとコール機能のため、クリックするコードを含める必要はありません。ここで

は私の質問です

  1. 私のキャラクターはMoveToPoint()は、まず、2回オブジェクトをクリックするプレイヤーが必要になりますFollowTarget()を使用して、むしろ何度も、次の起動に使用している場合は、私は考え出したように見えることはできません理由.. ..

  2. 同じオブジェクトで複数の時間をクリックすると、複数のUpdatePosition()が実行されます。そのオブジェクトで1回実行させるにはどうすればよいですか? (私の友人は、明らかにキャラクターを歩かせようとするとオブジェクトを強くクリックしてしまいますが、今は10個のコルーチンが走っています)。

  3. 複数の文字があり、次のキャラクターのコルーチンもやはり停止しているようです。お互いに影響を与えずに、個別に&のフォローをフォローするようにするにはどうすればよいですか?

    void Start() 
    { 
        agent = GetComponent<NavMeshAgent>(); 
    } 
    
    IEnumerator UpdatePosition() 
    { 
        while(true) 
        { 
         yield return new WaitForSeconds(0.5f); 
         if (target != null) 
         { 
          agent.SetDestination(target.position); 
          Debug.Log("Still looping"); 
         } 
         else 
         { 
          Debug.Log("Not looping!"); 
         } 
        } 
        Debug.Log("Finished Co-routine!"); 
    } 
    
    public void MoveToPoint (Vector3 point) 
    { 
        agent.SetDestination(point); 
    } 
    
    public void FollowTarget(Interactable newTarget) 
    { 
        agent.stoppingDistance = newTarget.radius * .8f; 
        StartCoroutine(UpdatePosition()); 
        target = newTarget.transform; 
    } 
    
    public void StopFollowingTarget() 
    { 
        StopCoroutine(UpdatePosition()); 
        agent.stoppingDistance = 0f; 
        target = null; 
    } 
    
+1

あなたが2回クリックする必要がある理由は、コルーチンでは最初に半分待ってから目的地を更新するだけなのかもしれません。 'yield return new WaitForSeconds(0.5)'をwhileループの最後に移動することを検討してください。 –

答えて

1

1)あなたのコルーチンにあなたが最初の半秒待つだけにして宛先を更新するので、あなたが二回クリックする必要が理由と考えられます。 whileループの末尾にyield return new WaitForSeconds(0.5)を移動することを検討してください。

2)これは、FollowTarget()に電話するたびにStartCoroutineを呼び出すためです。たとえば、bool coroutineRunningのようなブール値を持ち、開始時にfalseに設定することで、これを回避できます。コルーチンの初めにこれをtrueに設定し、代わりにFollowTargetでStartCoroutineを呼び出すのでは、

if (!coroutineRunning) 
{ 
    StartCoroutine(UpdatePosition())`. 
} 

3)わからないようなものを使用。スクリプトがエージェントごとに個別に実行されていることを確認してください。

+0

Ahahahaha、私は、質問1で感謝していませんでした。ありがとう! 2番目の答えにも感謝して、私は今それを試しています。 – Irfx

関連する問題