상황
게임 인공지능을 개발 중입니다(유니티 사용)
최적화를 위해 AI를 [대기, 전투] 2단계로 세분화 합니다.
대기 상태
1초에 한번씩 A라는 행동을 합니다
구현
Update 함수에서 내가 대기 상태라면 현재 타임 스탬프를 가져와서 이전에 기록해둔 타임스탬프와 비교해서 1초이상이 지났다면 A 함수를 호출 후 현재 타임 스탬프를 기록합니다.
전투 상태
매프레임마다 B라는 행동을 합니다
구현
Update 함수에서 내가 전투 상태라면 B 함수를 호출합니다.
문제점
1. 이전에 기록해둔 타임 스탬프는 멤버 변수입니다. 순수하지 못하고 버그를 일으킬 가능성이 다분합니다(ex. 전투 후 대기 상태로 돌아올 때 초기화를 제대로 해주지 않으면 A 라는 상태가 즉시 호출됩니다)
2. 경계 상태가 추가 되고 조건이 플레이어가 근처에 있을 때라면 새로운 변수가 추가 돼야하고 Update 함수가 복잡해집니다
어떻게 해야 선언형적이며 버그를 줄일 수 있는 코드를 짤 수 있을까요
게임 인공지능을 개발 중입니다(유니티 사용)
최적화를 위해 AI를 [대기, 전투] 2단계로 세분화 합니다.
대기 상태
1초에 한번씩 A라는 행동을 합니다
구현
Update 함수에서 내가 대기 상태라면 현재 타임 스탬프를 가져와서 이전에 기록해둔 타임스탬프와 비교해서 1초이상이 지났다면 A 함수를 호출 후 현재 타임 스탬프를 기록합니다.
전투 상태
매프레임마다 B라는 행동을 합니다
구현
Update 함수에서 내가 전투 상태라면 B 함수를 호출합니다.
문제점
1. 이전에 기록해둔 타임 스탬프는 멤버 변수입니다. 순수하지 못하고 버그를 일으킬 가능성이 다분합니다(ex. 전투 후 대기 상태로 돌아올 때 초기화를 제대로 해주지 않으면 A 라는 상태가 즉시 호출됩니다)
2. 경계 상태가 추가 되고 조건이 플레이어가 근처에 있을 때라면 새로운 변수가 추가 돼야하고 Update 함수가 복잡해집니다
어떻게 해야 선언형적이며 버그를 줄일 수 있는 코드를 짤 수 있을까요
선언형적은 대체 무슨 단어임
타임스탬프를 비교해서 대입하고 어쩌구 같은 로직을 구현하는게 아닌, 딜레이는 1, 콜백은 A, 반복 여부 true 이런식으로 선언해주듯 코딩하는거요
45.8은 그걸 이해 못한 게 아니라 말 그대로 '선언형적'이라는 말이 말이 안 된다고 지적한 것 같은데
틱 시스템을 만들고, 1초마다 호출되도록 콜백을 등록하면 됨 - dc App
UniRX 쓰셈
유한상태머신
Reactive Programming 찾아보세요
기본적으로는 FSM인데 상태가 많고 전환조건이 많아질수록 복잡해지는건 피할수없음 BT(행동트리)를 쓰면 그나마 유연해지긴 하는데 결국 근본적으로 복잡함을 피할순없음
n초야 코루틴에 n초 넘기면 되고 행동은 클래스로 래핑시켜서 대입하든지 델리게이트에 추가하든지 하면 되고 초기화는 FSM의 OnEnter나 OnExit에 넣으면 되는데 다른 방법이 있나?