처음에 Unity에서 Enemy 클래스에 상태 패턴을 구현할 때, 적이 스폰된 후 플레이어를 추적하지 않는 문제가 발생했다. StateMachine과 ChaseState를 제대로 설정했음에도 적이 움직이지 않았고, 그 이유를 찾는 데 시간이 걸렸다.
문제는 초기화 순서에서 발생했다. 적이 스폰된 후 Init() 메서드를 통해 SpawnData로부터 속도와 체력을 설정했지만, 그 후에 상태 전환이 이루어지지 않아서 적이 움직이지 않았다. 스폰 데이터로 적의 속성은 설정되었으나, ChaseState로 상태 전환이 이루어지지 않아서 플레이어를 추적하는 동작이 실행되지 않았다.
이 문제를 해결하기 위해 Init() 메서드 내에서 적의 속성들을 초기화한 후, 즉시 ChasePlayer() 메서드를 호출하여 상태를 ChaseState로 전환하는 방식으로 변경했다. 이를 통해 적이 스폰되자마자 플레이어를 추적하도록 동작하게 만들었다.
public void Init(SpawnData data)
{
animator.runtimeAnimatorController = animCon[data.spriteType];
speed = data.speed;
maxHealth = data.health;
health = data.health;
ChasePlayer(); // 적이 활성화되면 바로 플레이어 추적 시작
}
이렇게 함으로써 적이 활성화되자마자 플레이어를 추적하는 동작을 하도록 만들었다.
초기화와 상태 전환의 관계: Init() 메서드에서 데이터만 설정하고 상태 전환을 하지 않으면 적이 움직이지 않을 수 있다. 적이 활성화될 때 상태 전환이 잘 이루어지도록 보완해야 한다.
상태 패턴의 관리: 상태 전환 로직은 상태 패턴을 사용하는 핵심 중 하나다. 적이 스폰되었을 때 바로 적절한 상태로 전환하는 것이 중요하다.
Unity의 OnEnable() 메서드 활용: OnEnable()을 이용하면 적이 활성화될 때마다 원하는 상태로 전환하여 일관성 있는 동작을 보장할 수 있다.
스크립트 스폰데이터 내용
[System.Serializable]
public class SpawnData
{
public float spawnTime;
public int spriteType;
public int health;
public float speed;
}
public void Init(SpawnData data)
{
animator.runtimeAnimatorController = animCon[data.spriteType];
speed = data.speed;
maxHealth = data.health;
health = data.health;
ChasePlayer(); // 적이 활성화되면 바로 플레이어 추적 시작
}
이렇게해서 스폰데이터 내용을 적(Enemy)스크립트로 데이터를 가져와 적(Enemy)스크립트에있는 변수에 덮어 씌우는 방식이다.
이렇게 덮어씌워지면 적이 활성화 됬을시 ChasePlayer(); 메서드를 통해 추적상태로 들어가게 되는것이다.


