Unity PAT 프로젝트 #5 Blackboard

SourStar15·2025년 11월 11일

PAT-Project

목록 보기
5/10
post-thumbnail

Blackboard

이전 까지 플레이어를 추적하는 적 AI를 개발했었습니다.
Blackboard 시스템을 이용해 단 하나의 AI가 플레이어를 인식하게 되면 다른 AI도 인식이 가능하게 끔 만들어 보겠습니다.

경찰들이 무전을 해서 반응, 대응을 하는 방식으로 이라고 생각하시면 됩니다.

Singleton

싱글톤 패턴을 만들어 Blackboard 시스템을 구현해 주겠습니다.

Singleton이란?

프로그램 전체에서 딱 하나만 존재해야 되는 객체를 보장하는 설계 패턴입니다.
지금 상황같은 경우엔 AI가 플레이어를 인식하는 부분이 되겠네요

  • 보통 게임 전체에서 단 하나의 공용 저장소나 관리자가 필요할 때 사용합니다.

Blackboard 구현

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

void Awake 함수는 유니티의 생명주기 함수중 하나입니다.
게임 오브젝트가 활성화 될때 한 번 호출합니다. 보통 초기화 코드에 사용됩니다.

if (Instance == null)
	Instance = this;
else
	Destroy(gameObject);

이 부분이 싱글톤 패턴의 핵심 부분입니다.
만약 Instance가 비어있다면, 지금 생성된 객체를 싱글톤 인스턴스로 지정합니다.
이미 다른 AIBlackboard 인스턴스가 존재한다면 중복생성을 막기 위해 자신(gameObject)를 파괴합니다.
즉, 게임 전체에 하나의 AIBlackboard 가 존재합니다.

ReportPlayer / ClearDetection

이 두 함수는 플레이어를 감지하고 추적에 실패했을때 bool형식으로 값을 변환해주고 이후 이 함수를 통해 다른 AI의 인식도 제어해 줍니다.

AI 수정

지난번 까지 개발했던 AI 스크립트에 해당 Blackboard 기능을 추가해 주겠습니다.

//플레이어가 시야 안에 있거나 일정거리 내에 들어왔을 때 추격 시작
 if (!isChasing && (PlayerInSight() || distanceToPlayer <= chaseDis))     
        {
            agent.isStopped = false;    //이동 재게
            isChasing = true;
            //Debug.Log("Chasing now!");

            AIBlackboard.Instance.ReportPlayer(player.position);        // 공유 알림
        }

AI가 추격을 시작하게 되는 부분입니다. 추격이 시작되면 AIBlackboard를 이용해 플레이어의 위치를 공유하게 됩니다.

정보공유를 받은 AI의 추격

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도 추적을 그만두고 순찰을 돌게 만들어줍니다.

profile
말하는 감자

0개의 댓글