배틀레드_NPC

양규빈·2024년 4월 16일

유니티

목록 보기
26/34
post-thumbnail

시연영상
퀘스트 시연 영상과 동일합니다.

NPC

NPC(None player characeter)는 게임 플레이 과정에서 만나게 되는 요소 중 하나입니다.
플레이어가 직접 조작하지 않지만, 게임 상에서 존재하여 컨텐츠의 볼륨을 풍부하게 만들어주는 중요한 역할을 하고 있습니다.

플레이어와 적대적인 관계인 NPC, 우호적인 관계의 NPC 등등.
여러 NPC가 존재할 것입니다.

이러한 NPC는 플레이어와 상호작용하여 퀘스트를 주거나 대화를 하는 등의 기능을 담당할 수 있습니다.

인게임 상에서 구현한 npc 플레이어 입니다.
유니티 에셋 스토어에서 구한, 무료 npc 에셋을 이용했습니다.

배틀레드에서 구현된 NPC의 역할과 기능은 아래와 같습니다.

상호작용을 통해서 대화 가능
퀘스트 부여

퀘스트를 통해서 인게임 컨텐츠를 안내하여, 플레이어가 보상을 바라고 플레이를 유도하도록 만들었습니다.

구현

NPC매니저

개별 NPC 오브젝트의 제어와 고유값을 할당해주는 함수입니다.
플레이어블 캐릭터의 CharacterManger와 유사한 기능을 담당합니다.

NPC의 데이터를 저장하는 캐릭터 클래스와 번호 index를 저장하는 인트형 변수, 애니메이터를 인스턴스화하여 저장한 controller 변수를 가지고 있습니다.

nNpcDataIndex 변수는 게임매니저에서 초기화한 npc 데이터 배열에 접근할 수 있는 인덱스 값을 저장합니다.

유니티 엔진의 인스펙터 상에서 개발자가 직접 입력하여, npc를 구분할 수 있게 합니다.

Total_Npc매니저

Total_NpcManager는 현재 씬에 존재하는 npc들을 총괄하여 관리하고, UI와의 연계. 그리고 npc의 기능 함수를 구현한 매니저 클래스 입니다.

npc와 ui와의 매핑을 위해서 딕셔너리를 관리합니다.
ui 요소는 드랍 아이템 구현에 사용되었던 DropItemUI 오브젝트풀 객체를 재사용하였으며, npc 객체와 매핑하여 관리합니다.

매핑된 bool 변수는 현재 ui와의 활성이 이루어졌는지 아닌지 판단하기 위한 변수입니다.
이는, NPC 탐색이 플레이어블 캐릭터 기준, Update 생명주기에서 이뤄지기 때문에, 추가적인 제어 플래그를 필요로 하게 된 것입니다.

DropUI 관련 함수는 위와 같습니다.
아이템 드랍 함수에서 사용된 코드를 이식하여, 필요에 따라 적절히 수정하였습니다.

클릭 이벤트 함수는, npcData를 매개변수로 넘겨서 어떤 npc의 기능 함수를 호출해야하는지 분류하도록 하였습니다.

npc의 이름을 기준으로 함수를 호출합니다.
UI로 대화를 출력하기 위해서, UI매니저가 관리하는 프린트 오브젝트 함수를 호출하고, 스크립트를 변수로 넘깁니다.

그리고, 해당 퀘스트를 Active True 상태로 바꾸어서, 플레이어가 퀘스트를 받을 수 있도록 합니다.
(active가 false라면, 퀘스트 관리 창의 스크롤뷰에 출력되지 않습니다.)

PrintTextFieldUICls

NPC와의 대화를 구현하기 위해서 만든 UI 프레임입니다.
내용 텍스트, 이름 텍스트, 화면 전체에 할당된 버튼 객체, 텍스트 진행 안내를 위한 가이드 화살표 객체로 구성되어 있습니다.

텍스트는 스트링 배열 형태로 받는, 함수. 단일 스트링을 매개변수로 받는 함수로 나뉩니다.
스크립트 배열을 매개변수로 받을 경우에는, 코루틴 함수를 이용해서 ShowText의 생명주기에 맞게 전체 문자열을 출력할 수 있도록 하였습니다.

ShowText() 함수는 텍스트를 ui에 출력하는 함수입니다.
isSkip과 isNext 변수는, 텍스트의 스킵과 종료를 관리하는 변수입니다.

스킵 상태에 진입 시에, 반복문을 즉시 탈출하고, 전체 텍스트를 출력하도록 해줍니다.
반복문 전체 출력 이후에는 무조건 skip을 생략하고 next 변수를 사용할 수 있도록 하였습니다.

이때. 버튼을 클릭함으로써, isNext와 isSkip의 값을 변경할 수 있는데, 이를 통해서 텍스트의 스킵과 장면 넘김을 구현할 수 있습니다.

nowCnt == targetCnt
조건문은, 현재 텍스트의 출력 횟수가 전체 스크립트 갯수와 일치하는지 확인하여 프린트 오브젝트를 종료할 수 있도록 해줍니다.

profile
훌륭한 개발자를 꿈꾸는 중입니다

0개의 댓글