본문 바로가기

유니티

[Behavior Designer] 07 . 시야각에 있다면 쫓아가는 BT

조건 (Conditional)을 충족한다면 행동(Action)을 하는 BT를 만들어 본다 .

해당 BT는 Conditional Task / Action Task 두가지 파트로 나뉜다.유튜브에 튜토리얼이 친절하게 올라와 있으니 참고.

[CONDITIONAL TASK]

[CONDITIONAL TASK]

Conditional Task는 상태를 확인만 한다 .

WIthInSight는 시야각 내부에 대상이 있는지에 대한 상태를 확인 할 것이다.

using UnityEngine;
using BehaviorDesigner.Runtime;
using BehaviorDesigner.Runtime.Tasks;

public class WithinSight : Conditional
{
    // How wide of an angle the object can see
    public float fieldOfViewAngle;
    // The tag of the targets
    public string targetTag;
    // Set the target variable when a target has been found so the subsequent tasks know which object is the target
    public SharedTransform target;

    // A cache of all of the possible targets
    private Transform[] possibleTargets;

    public override void OnAwake()
    {
        // Cache all of the transforms that have a tag of targetTag
        var targets = GameObject.FindGameObjectsWithTag(targetTag);
        possibleTargets = new Transform[targets.Length];
        for (int i = 0; i < targets.Length; ++i)
        {
            possibleTargets[i] = targets[i].transform;
        }
    }

    public override TaskStatus OnUpdate()
    {
        // Return success if a target is within sight
        for (int i = 0; i < possibleTargets.Length; ++i)
        {
            if (WithinSight2(possibleTargets[i], fieldOfViewAngle))
            {
                // Set the target so other tasks will know which transform is within sight
                target.Value = possibleTargets[i];
                return TaskStatus.Success;
            }
        }
        return TaskStatus.Failure;
    }

    // Returns true if targetTransform is within sight of current transform
    public bool WithinSight2(Transform targetTransform, float fieldOfViewAngle)
    {
        Vector3 direction = targetTransform.position - transform.position;
        // An object is within sight if the angle is less than field of view
        return Vector3.Angle(direction, transform.forward) < fieldOfViewAngle;
    }
}

=>완성된 코드. 해당 코드에서 사용하는 Vector3.Angle은 180도 까지만 알 수 있다.

그 이상은 360까지 를 참고하자.

[Action TASK]

[CONDITIONAL TASK]

대상을 발견했다면 그쪽으로 이동하는 작업을 작성하자.

using UnityEngine;
using BehaviorDesigner.Runtime;
using BehaviorDesigner.Runtime.Tasks;

public class MoveTowards : Action
{
   // The speed of the object
   public float speed = 0; 
   // The transform that the object is moving towards
   public SharedTransform target;

   public override TaskStatus OnUpdate()
   {
      // Return a task status of success once we've reached the target
      if (Vector3.SqrMagnitude(transform.position - target.Value.position) < 0.1f) {
         return TaskStatus.Success;
      }
      // We haven't reached the target yet so keep moving towards it
      transform.position = Vector3.MoveTowards(transform.position, target.Value.position, speed * Time.deltaTime);
      return TaskStatus.Running;
   }
}

 

[BT에서 구현]

[BT에서 구현]

=>먼저 대상 오브젝트에 BT 컴포넌트를 추가후 Open을 눌러 BT를 편집하자

=>프로퍼티 판넬에서 Task를 찾아 추가해주자 . 해당 Task는 Sequence로 묶어 실행. 순서대로 실행 될 것이다.

이제 각각의 Task의 Inspectr를 편집해주자.Yeo라 되어있는것은 테스트를 위해 MoveTowards의 이름을 바꾼 것  뿐이다.

각도를 지정 , 대상의 태그를 지정했다 . 이때 , Target은 SharedTransform으로 선언했으니 변수를 만들어 주어야 한다.

=>Variables에 원하는 이름,타입을 정한후 Add를 눌러 변수를 생성한다.

=>이제 각 Task에서 해당 변수를 등록해주는데 ,변수 옆 회색 버튼을 누른후 Target을 지정해준다.

해당 작업은 WithInSighr와  MoveTowards의 타겟에 모두 행해준다.

=>이제 실행을 한다면 대상이 시야 각에 있다면 대상으로 이동함을 볼 수 있다. 

Behavior Manager 측에서 제공하는 튜토리얼은 좀 더 심도있게 해당 부분을 다루고 있어 참고해보는 것도 좋을 듯 하다.

튜토리얼 다운

 

 

 

 

출처

 

 

'유니티' 카테고리의 다른 글

[Behavior Designer] 09 . 변수  (0) 2023.01.18
[Behavior Designer] 08 . 디버깅  (0) 2023.01.18
[Behavior Designer] 06 . PARENT TASKS  (0) 2023.01.18
[Behavior Designer] 05 . TASKS  (0) 2023.01.18
[Behavior Designer] 04 . Behavior Manager  (0) 2023.01.18