2016-08-11 64 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了更长的时间。