2016-08-11 5 views
0

나는 이미이 문제에 관해 다른 질문을 읽었으며 아무도 내 문제를 해결하지 못했습니다. 광선이 특정 거리에 도달하면 광선 캐스트가 부울을 토글합니다. 그러나 업데이트 기능에 있기 때문에 광선이 모든 프레임을 업데이트하고 광선이 모든 프레임을 업데이트합니다. 그런 다음에 bool을 토글합니다. 내가 인공 지능을 되돌려 놓기 위해 이미 코드를 시작 했으므로, bool을 토글합니다. bool을 피할 때 레이 캐스트를 일시적으로 멈추는 방법을 레이어 마스크를 사용하여 알려주실 수 있습니까? 사실이며, 레이 캐스트는 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

왜 layermask를 사용해야한다고 생각하십니까? 'avoid == true' 일 때 레이크 캐스트를하지 않는 것이 쉽지 않은가요? –

+0

이것을 수행 할 수있는 옵션이 있습니다 : State Machine, "IF (false == avoid)"문 등으로 호출을 캡슐화하십시오. RayCast는 상당히 비싼 작업입니다. – Cabrra

답변

1

나의 제안은 코드의 맨 아래에있는 else 블록 내부의 if (Physics.Raycast... 블록을 넣어하는 것입니다. 그렇지 않은 경우 avoid이 될 수있는 다른 값이 없기 때문에 (else if (avoid == false)이 중복되어 있습니다 true.

이것은 당신이 무엇을 물어 달성하고도 더 확대됨에 될 것이다, 만 레이 캐스트 이미 피하지 않을 때 것을 의미 .

그러나, 그것은 또한 코드가 현재 if 블록에 avoid = false을 설정하는 것을 주목할 필요 -. 그래서 당신은 현재 한 번에 하나의 프레임에 대한 피할 당신은 아마도에 대한 trueavoid을 떠날 수있는 방법을 찾는 고려해 볼 수 있습니다 더 오랜 기간.