TIL)2024-03-04 잊고 있었던 트러블 슈팅

2024. 3. 4. 23:00내외 교육들/TIL

 

오늘은 최종 프로젝트 작업 마무리 중에 생각났던 트러블 슈팅 하나를 정리하는 시간을 가져볼 것이다.

NPC의 행동 개선

[원인]

술을 원하는 손님 NPC의 행동 패턴이 기존 게임 기획과는 매끄럽지 않게 지적되었다. 지적한 것은 경찰의 단속이나 플레이어가 가게를 위장 상태로 바뀌었는데, 손님들은 계속 술을 주문한다는 것이다. 그래서 이 점을 개선할 것이다.

[개선방안]

  1. 손님 NPC들의 상호작용들은 Update() 문 안에서 시간 경과에 따른 주변 환경의 변화에 따라서 행동을 결정하도록 각기 다른 행동 패턴들을 메서드로 구현하였다.
  2. 문제는 시간은 delta.Time 값을 끊임없이 더해서 시간의 지남을 구현하지만, 특별한 상황(경찰의 단속, 플레이어의 위장 상태 전환)은 한 두번의 변화가 일어나며, 다시 전환하기에는 NPC 스크립트 내부에서 이러한 변화를 감지하기 힘들다
  3. 기존의 이벤트 함수 내에서 특별한 조건에 따라서 변화 시키기에는 조건을 만드는 것에 많은 복잡성과 불규칙적인 상황을 캐치하기가 함들다.
  4. 더 쉬운 방법은 코루틴 메서드 내에 yield 반환문에서 특수한 조건을 만족하는 람다식을 조건으로 걸어버리는 것이다.
// 경찰의 검문 상태를 실시간으로 감지하는 코루틴 함수
private IEnumerator PoliceSearchStartStatus()
{
    yield return new WaitUntil(() => isSearching == true && interactionStarted);
    isChanged = true;
}

private void Start()
{
		StartCoroutine(PoliceSearchStartStatus())
}

// Update 문 내에서 경찰이 심문 상태에 들어가면 bool 값이 바뀌는 컴포넌트 내의 bool을 찾아
// isSearching 내에 적용시기면 실시간으로 bool의 변화를 감지할 수 있다.

[해결]

이 코루틴을 Start()에 선언을 해도 해당 bool의 변화를 실시간으로 감지해서 종료시킬 수 있기 때문에 훨씬 더 간결하게 사용할 수 있다.