본문 바로가기
게임 개발

Enemy가 웨이포인트 주변에서 부르르 떨리는 이슈

by chobbo 2024. 7. 19.

문제 상황

 

 

원래 코드

using UnityEngine;

public class EnemyMoveState : EnemyBaseState
{
    private readonly float range = 0.01f;

    public EnemyMoveState(EntityStateMachine stateMachine) : base(stateMachine)
    {
    }

    public override void Enter()
    {
        base.Enter();
        StartAnimation(entityStateMachine.Entity.AnimationData.MoveParameterHash);
    }

    public override void Exit()
    {
        base.Exit();
        StopAnimation(entityStateMachine.Entity.AnimationData.MoveParameterHash);
    }

    public override void Update()
    {
        base.Update();

        if(IsArrivalToWayPoint()) 
        {
            // 현재 enemy 위치 웨이포인트로 변경
            enemy.transform.position = enemy.WayPoints[enemy.TargetIndex].transform.position;

            // 다음 웨이포인트로 목적지 변경
            enemy.SetTargetIndex((enemy.TargetIndex+1) % enemy.WayPoints.Length);
            //TODO :: EndPoint 도착 시 처리
            //if (curIndex == enemy.WayPoints.Length)
            //{
            //    enemy.gameObject.SetActive(false);
            //}
        }
        else if (!enemy.HealthSystem.IsDie())
        {
            MoveToWayPoint();
        }
    }

    private void MoveToWayPoint()
    {
        Vector3 moveDir = GetDirectionToWayPoint();
        Rotate(moveDir);
        Move(moveDir, enemy.CurStat.MoveSpeed);
    }

    private void Rotate(Vector3 dir )
    {
        enemy.transform.rotation = Quaternion.LookRotation(dir);
    }

    private Vector3 GetDirectionToWayPoint()
    {
        Vector3 dir = (enemy.WayPoints[enemy.TargetIndex].transform.position - enemy.transform.position ).normalized;
        dir.y = 0;
        return dir;
    }

    private bool IsArrivalToWayPoint()
    {
        Vector3 distanceVector = (enemy.transform.position - enemy.WayPoints[enemy.TargetIndex].transform.position);
        float distance = distanceVector.sqrMagnitude;
        return distance < range * range;
    }
}

 

해결

웨이포인트와 enemy 사이의 거리를 검사하는 IsArrivalToWayPoint 메서드에서

사이 거리를 너무 작게 잡아 생기는 오류였다.

 

적당한 거리로 설정해주었더니 이슈가 해결되었다.


https://github.com/Defense-Hub/ProjectDH/issues/138