2016-08-11 7 views
0

私はすでにこれに関する他の質問を読んでおり、どれも問題を解決していません。私はプレイヤーに近づくとAIが戻ってくるゲームを作っています[レイがある距離を飛ぶならば、レイキャストはブールをトグルします]しかし、これはアップデート機能にあるので、レイはすべてのフレームを更新し、その後、AIを元に戻すためのコードを既に開始しているので、ブールをトグルします。ブールを避けるにはレイヤーマスクを使用してレイキャスティングを一時停止する方法を教えてください真であるので、AIが後方に移動しているときにレイキャストは無視されます。レイヤーマスクを使用して一時的にレイキャストを無視する

void Update() 
    { 
     //raycasting 
     RaycastHit hit; 
     Ray ray = new Ray(transform.position, Vector3.forward); 

     //check if raycast hit player 
     if (Physics.Raycast(ray, out hit, 2)) 
     { 
      if (hit.collider.tag == "PlayerFront") 
      { 
       avoid = true; 
       movementSpeed = 0; 
      } 
     } 
     else 
     { 
      movementSpeed = 2f; 
      avoid = false; 
     } 

     if (avoid == true) 
     { 
      startPos = enemy.transform.position; 
      endPos = enemy.transform.position + Vector3.back * distance; 

      currentLerpTime += Time.deltaTime; 
      if (currentLerpTime >= lerpTime) 
      { 
       currentLerpTime = lerpTime; 
      } 

      float perc = currentLerpTime/lerpTime; 
      enemy.transform.position = Vector3.Lerp(startPos, endPos, perc); 

      avoidCount+=1; 

      avoid = false; 
     } 

     else if (avoid == false) 
     { 
      transform.LookAt(target); 
      transform.Translate(Vector3.forward * Time.deltaTime * movementSpeed); 
      currentLerpTime = 0; 
     } 
    } 
+1

なぜレイアマスクを使うべきだと思いますか? 'avoid == true'のときにレイキャストしないほうが簡単ではないですか? –

+0

これを達成するためのオプションがあります:State Machine、 "IF(false == avoid)"文などで呼び出しをカプセル化します。RayCastは非常に高価です。 – Cabrra

答えて

1

私の提案は、あなたのコードの下部にelseブロック内if (Physics.Raycast...ブロックを置くことであろう。 (それはtrueない場合は他の値avoidことができなかったがありますので、else if (avoid == false)が冗長であることに注意してください。

これはあなたがすでにあなたが求めるものを達成し、また、よりパフォーマンスされる、回避されていないだけでレイキャスト時にことを意味します。

しかし、それはまた、あなたのコードは、現在ifブロックでavoid = falseを設定していることは注目に値します - 。あなたが唯一の現在時刻に単一のフレームのために避けることができますので、あなたは、おそらくのためtrueとしてavoidを残す方法を見つける検討するかもしれませんより長い時間。

関連する問題