내일배움캠프 76일차 8/01 TIL + 마법사 추가, 공격 시스템 개선, HSM버그 수정
작업 내용
마법사 유닛 추가
마법사 유닛을 추가하였다. 공격은 파이어볼트로 화염구체를 날려서 적에게 맞으면 폭발 애니메이션이 실행되고 주변에 데미지를 준다.
그런데 이 유닛을 만들다보니 공격 시스템이 UserUnitAction 클래스의 Attack 함수 한개에서 상태이상, 범위공격, 투사체 등을 모두 관리하는게 너무 확장성도 별로고 유지보수도 별로 같아 보였다.
그래서 공격 시스템을 개편하기로 했다.
공격 시스템 개편
당장 계획은 AttackBehaviour 클래스를 만들고 거기에 Attack 함수를 넣어준 다음 파생 클래스들에서 이를 구현하여 호출할 생각이다.
HSM에 버그
그리고 Statemachine에 버그가 있는데, NavMesh가 완벽하지는 않아서 가끔 유닛이 제자리 걸음을 하고 있다.
그래서 유닛이 이전 위치와 위치가 똑같으면 IdleState로 탈출하게 하였는데 아주 미세한 차이로 제자리 걸음을 계속했다.
그래서 차라리 이동에 시간 제한을 주었다. 다음은 UserUnitMoveState 클래스이다 :
private float timeLimit; // 일정 시간 이상 이동만 할 경우 강제로 상위 스테이트로 전환
private float startTime;
public override void Enter()
{
base.Enter();
agent.updatePosition = true;
agent.isStopped = false;
animator.SetBool(userUnit.AnimIsMoving, true);
agent.speed = userUnit.Stat.MovementSpeed.TotalValule;
userUnit.FlipToRight(userUnit.Action.TargetPosition.x > userUnit.transform.position.x);
agent.SetDestination(userUnit.Action.TargetPosition);
timeLimit = agent.remainingDistance / agent.speed + 1.0f;
startTime = Time.time;
isUpdating = true;
}
public override void Update()
{
//목적지에 도달했나 확인
if (agent.remainingDistance <= agent.stoppingDistance)
{
userUnit.StateMachine.ChangeToSuperState();
}
else if (Time.time - startTime > timeLimit) // 시간 제한에 도달했나 확인
{
userUnit.StateMachine.ChangeToSuperState();
}
}
거리와 속도에 관해 시간 제한을 주고 시간안에 도착 못하면 상위 스테이트로 반환했다.
그랬더니 추격하다가 제자리 걸음하는 문제도 깔끔하게 제자리 걸음 하다가 다시 추격으로 돌아가서 적 위치에 대한 목표지점을 다시 계산하니 추격도 자연스러워졌다.
물론 이제 미로같은 맵이 생기면 가다가 제 시간에 못 도착할 수도 있지만 당장 맵에서는 아무리 먼곳까지도 잘 이동하고 그런 오래 걸리는 경우는 다시 명령을 내려줄 수도 있을 것이다.
마무리
유닛 상태에 시간 제한을 둔 것은 정말 좋았다. 하고나니 이전에 골치를 아프게하던 무한 제자리 걸음 현상이 거의 깔끔하게 사라진듯 하다. 역시 이러한 방어 코드가 필요한듯 하다.