조건 (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 측에서 제공하는 튜토리얼은 좀 더 심도있게 해당 부분을 다루고 있어 참고해보는 것도 좋을 듯 하다.
출처
- https://icechou.tistory.com/316
- https://opsive.com/support/documentation/behavior-designer/writing-a-new-conditional-task/
'유니티' 카테고리의 다른 글
[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 |