/* 얕은 지식에서 질문을 통해 배움을 얻고자 합니다. */
/* 2류의 공부방법이지만 현재로선 최선이기에 이렇게 글 적어봅니다. */
MMORPG의 몬스터의 전투 A.I의 경우,
보통 대기상태, 전투상태, 사망상태, 결과상태 정도의 FSM으로 구성되고
세부적으로 대기 상태에서는 적의 발견정도를 처리,
전투 상태에서는 전투 시작후 종결 직전까지의 상태
사망 상태는 사망처리, 결과는 아이템등 기타 처리로 둔다고 생각합니다.
이런 경우 보통 전투 AI를 보면 if , else if 의 도배로 단순 코드 나열 괴물덩어리 되기 일쑤입니다.
결국 하나의 Loop는 거대해지고 많은 몹이 몰리면 쉽게 렉이 발생합니다.
결국 저의 짧은 소견으로는 하나의 몬스터를 실행하는 Ai를 통합적으로 돌리는 것이 아니라
애초에 코드안에서 설정된 값을 읽어들여 배분하는 것이 더 좋지 않을 까 싶습니다.
function Attack1
{
공격한다.
10번 공격하면 return
}
function Attack2
{
공격한다.
5번 공격하면 return
}
function Runaway
{
if 적과의 거리 1000이상이면 return
if 나의 피 100이상이면 return
else if 도망간다.return
}
function Heal
{
자신의 피가 200이상이면 return
else if 힐한다. return
}
Monster { ......... AItype1 = "Attack1", AItype2 = "Runaway", AItype3 = "Heal", AItype4 = "Attack2"
프로그램은 Aitype을 사망 FSM 조건되기 전까지 계속 순차적으로 순환시킨다고 합시다.
이런 몬스터의 A.I 설정 구축은 기획자는 편하게 함수만들고 적용시킬 수 있지 않을 까 싶습니다.
결국 하나의 몹이 수십개의 조건문을 거치지 않고 자신에게 최적화된 AI만을 실행시키는 것이
어렵나요? 아님 별 차이가 없나요? 제가 궁금한겁니다.
하나의 행동을 토큰화시켜 조합하는 방식과
하나의 AI안에서 수십개의 조건문으로 처리하는 것
차이가 무엇이고 현실이 어떠한지 알고 싶습니다.
- 이제 막 기획시작하려고 하는 사람 -
보통은 추상화된 FSM을 두고 거기에 각 상태에 해당하는 객체를 밀어넣거나, 외부 스크립트로 분리 혹은 이 둘을 조합해서 사용합니다.
근데.. 기획을 하시면서 저런 프로그램적인 아키텍쳐까지 고려하실 필요가 있나요? 적절한 트리거만 잘 설정하셔서 테이블화 해주시면 구현은 그 부분의 전문가인 개발자들이 잘 알아서 해 줄거라 생각되네요. FSM의 if문을 완전히 제거할 수는 없겠지만, 2차원 테이블로 간단하게 처리해 버릴 수 도 있답니다.
그런부분은 그냥 개발자들에게 맞겨두시고, 각 상태별 전이 테이블 정도만 엑셀 작업을 해서 개발자에게 툭~ 던져 주시면 됩니다. ;]