[Unity6] 2D Behavior Tree 3( Chase, Attack )
카테고리: Go Unity
Chase, Attack 행동
1. Blackboard 거리 변수 추가
currentDistance : Target 과의 거리 체크
chaseDistance : chaseDistance에 들어오면 따라가기
attackDistance : attackDistance 안에 들어오면 Attack
fallOutDistance : fallOutDistance보다 멀어지면 Idle 상태, 순찰
2. 투사체, 무기 관련 작업
3. EnemyPrefab - Behavior Agent, weapon 설정하기
거리계산
새로운 On Start Node 생성(별도의 로직으로 처리)
UpdateDistance CurrentDistance를 갱신
Conditional Branch, Create New Condition로 조건(current, chaseDistance 비교)에 따라 IstargetDetected 변경
Chase
Target이 attackDistance보다 멀면 따라가기 / 가까우면 Attack 행동 Target이 fallOutDistance보다 멀어지면 Idle
Chase : Self Navigation To Target
Attack
현재 무기로 공격/ Target이 멀어지면 Idle
Weapon : Try Attack With currentWeapon
New Action Node
Chase Action : Self Navigate To Target
UpdateDistance Action : Update Self and Target CurrentDistance
Weapon Action : try attack with CurrentWeapon
Chase
Chase Action : agent의 속도, 이동 위치 설정
EnemyState
using System;
using Unity.Behavior;
using UnityEngine;
using Action = Unity.Behavior.Action;
using Unity.Properties;
using UnityEngine.AI;
[Serializable, GeneratePropertyBag]
[NodeDescription(name: "Chase", story: "[Self] Navigate To [Target]", category: "Action", id: "1b2920d167edfa9124c5af5b723e5a4d")]
public partial class ChaseAction : Action
{
[SerializeReference] public BlackboardVariable<GameObject> Self;
[SerializeReference] public BlackboardVariable<GameObject> Target;
private NavMeshAgent agent;
protected override Status OnStart()
{
agent = Self.Value.GetComponent<NavMeshAgent>();
agent.speed = 5f;
agent.SetDestination(Target.Value.transform.position);
return Status.Running;
}
}
UpdateDistance
UpdateDistance Action : CurrentDistance(target과 자신과의 거리)를 갱신
EnemyState
using System;
using Unity.Behavior;
using UnityEngine;
using Action = Unity.Behavior.Action;
using Unity.Properties;
[Serializable, GeneratePropertyBag]
[NodeDescription(name: "UpdateDistance", story: "Update [Self] and [Target] [CurrentDistance]", category: "Action", id: "4e20c120715722a8167532f3cb55152d")]
public partial class UpdateDistanceAction : Action
{
[SerializeReference] public BlackboardVariable<GameObject> Self;
[SerializeReference] public BlackboardVariable<GameObject> Target;
[SerializeReference] public BlackboardVariable<float> CurrentDistance;
protected override Status OnUpdate()
{
CurrentDistance.Value = Vector2.Distance(Self.Value.transform.position, Target.Value.transform.position);
return Status.Success;
}
}
Weapon
Weapon Action : 무기에 맞게 TryAttack() 실행
EnemyState
using System;
using Unity.Behavior;
using UnityEngine;
using Action = Unity.Behavior.Action;
using Unity.Properties;
[Serializable, GeneratePropertyBag]
[NodeDescription(name: "Weapon", story: "try attack with [CurrentWeapon]", category: "Action", id: "c4825c53b5e000692e69d1965c1a4f14")]
public partial class WeaponAction : Action
{
[SerializeReference] public BlackboardVariable<WeaponBase> CurrentWeapon;
protected override Status OnUpdate()
{
CurrentWeapon.Value.TryAttack();
return Status.Success;
}
}
이것저것 메모
Conditional Branch, Create New Condition
조건(True, false)에 따라 노드를 실행하는 조건 분기 노드
두 수 비교조건 Inspector - Assign Condition - Variable Comparison
Create New Action과 같이 Create New Condition으로 새로운 조건을 생성할 수 있다.
CheckTargetDetect : Compare values of CurrentDistance and ChaseDistance
CheckTargetDetectCondition
using System;
using Unity.Behavior;
using UnityEngine;
[Serializable, Unity.Properties.GeneratePropertyBag]
[Condition(name: "CheckTargetDetect", story: "Compare values of [CurrentDistance] and [ChaseDistance]", category: "Conditions", id: "d502e9fb2afcf10ac06045774d095dd5")]
public partial class CheckTargetDetectCondition : Condition
{
[SerializeReference] public BlackboardVariable<float> CurrentDistance;
[SerializeReference] public BlackboardVariable<float> ChaseDistance;
public override bool IsTrue()
{
if (CurrentDistance.Value <= ChaseDistance.Value)
{
return true;
}
return false;
}
}
잡담, 일기?
Behavior 마무리
댓글남기기