
이전 까지 플레이어를 추적하는 적 AI를 개발했었습니다.
Blackboard 시스템을 이용해 단 하나의 AI가 플레이어를 인식하게 되면 다른 AI도 인식이 가능하게 끔 만들어 보겠습니다.
경찰들이 무전을 해서 반응, 대응을 하는 방식으로 이라고 생각하시면 됩니다.
싱글톤 패턴을 만들어 Blackboard 시스템을 구현해 주겠습니다.
프로그램 전체에서 딱 하나만 존재해야 되는 객체를 보장하는 설계 패턴입니다.
지금 상황같은 경우엔 AI가 플레이어를 인식하는 부분이 되겠네요
AIBlackboard 라는 스크립트 파일을 새로 만든뒤 빈 오브젝트에 해당 스크립트 컴포넌트를 추가해 주었습니다.
public static AIBlackboard Instance; //singleton (모든 Ai가 접근)
public bool playerDetect = false;
public Vector3 lastPos; //마지막으로 감지된 플레이어 위치
void Awake()
{
//singleton
if (Instance == null)
Instance = this;
else
Destroy(gameObject);
}
public void ReportPlayer(Vector3 playerPos) //플레이어를 인식한 Ai가 메서드 호출
{
playerDetect = true;
lastPos = playerPos;
}
public void ClearDetection() //플레이어를 놓쳤을 때 호출
{
playerDetect = false;
}
void Awake 함수는 유니티의 생명주기 함수중 하나입니다.
게임 오브젝트가 활성화 될때 한 번 호출합니다. 보통 초기화 코드에 사용됩니다.
if (Instance == null)
Instance = this;
else
Destroy(gameObject);
이 부분이 싱글톤 패턴의 핵심 부분입니다.
만약 Instance가 비어있다면, 지금 생성된 객체를 싱글톤 인스턴스로 지정합니다.
이미 다른 AIBlackboard 인스턴스가 존재한다면 중복생성을 막기 위해 자신(gameObject)를 파괴합니다.
즉, 게임 전체에 하나의 AIBlackboard 가 존재합니다.
이 두 함수는 플레이어를 감지하고 추적에 실패했을때 bool형식으로 값을 변환해주고 이후 이 함수를 통해 다른 AI의 인식도 제어해 줍니다.
지난번 까지 개발했던 AI 스크립트에 해당 Blackboard 기능을 추가해 주겠습니다.
//플레이어가 시야 안에 있거나 일정거리 내에 들어왔을 때 추격 시작
if (!isChasing && (PlayerInSight() || distanceToPlayer <= chaseDis))
{
agent.isStopped = false; //이동 재게
isChasing = true;
//Debug.Log("Chasing now!");
AIBlackboard.Instance.ReportPlayer(player.position); // 공유 알림
}
AI가 추격을 시작하게 되는 부분입니다. 추격이 시작되면 AIBlackboard를 이용해 플레이어의 위치를 공유하게 됩니다.
if(!isChasing && AIBlackboard.Instance.playerDetect) // 순찰중 플레이어 위치 공유 받을때
{
isChasing = true;
agent.SetDestination(AIBlackboard.Instance.lastPos);
Debug.Log($"{gameObject.name} is joining chase via shared data!");
}
직접적인 시각,범위로 인한 추격이 아닌 다른 AI에게 정보를 공유받아 추격이 가능해야 되기 때문에 해당 코드를 추가했습니다.
if (PlayerInSight())
{
loseTimer = 0f; //시야 안이면 타이머 초기화
AIBlackboard.Instance.lastPos = player.position; //? 플레이어 위치 갱신
}
lastPos = player.position으로 값을 주어 시각으로 보고있어도 플레이어의 위치 정보를 다른 AI에게 공유하게 됩니다.
AIBlackboard.Instance.ClearDetection();
추적에 실패 할 경우 해당 코드를 작성해 다른 AI도 추적을 그만두고 순찰을 돌게 만들어줍니다.