2016-08-11 46 views
0

我已經閱讀了其他問題,並沒有解決我的問題。我正在製作一個AI,如果AI靠近玩家就會退回[如果光線擊中某個距離,光線會轉換爲布爾值],但是因爲這是更新函數,所以光線會更新每一幀,並且然後當我不需要它時切換布爾值,因爲我已經啓動了使AI返回的代碼,請有人告訴我如何使用圖層蒙版臨時停止射線投射,當'avoid'布爾是當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

你爲什麼認爲你應該使用圖層遮罩? 「避免==真實」時,僅僅不進行光線投射並不容易? –

+0

您可以選擇完成此操作:狀態機,使用「IF(false == avoid)」語句等封裝調用... RayCast是相當昂貴的操作。 – Cabrra

回答

1

我的建議是把if (Physics.Raycast...else塊內部在你的代碼的底部。 (請注意,else if (avoid == false)是多餘的,因爲沒有其他價值avoid可能是,如果它不是true

這將意味着你只光線投射時,你是不是已經避免,這將完成你問什麼,也更高性能。

然而,這也是值得注意的是,您的代碼當前設置avoid = falseif塊 - 所以你目前只避免在同一時間一幀你可以或許考慮找一個方式離開avoid作爲true了更長的時間。