저번에 대화를 간단히만 구현해보았는데 이번에는 대화에서 직접 선택지를 고를 수 있는 좀 더 향상된 대화 시스템을 구현해보고자 한다.
열거형 블프를 만들어서 위와 같이 2가지의 상태를 입력으로 추가한다.
대화 위젯을 위와 같이 만들었다.
대화 선택지를 고르는 Option 위젯을 만들었다.
BPI를 만들고 Interact, ConversationClosed, SetInteractableState 함수를 추가한다.
다음으로 액터 컴포넌트를 만들고 함수를 9개를 추가한다.
이는 대화를 하는 NPC에 들어가는 액터 컴포넌트의 베이스이다.
Open Conversation은 대화 위젯을 띄운다.
Close Conversation은 대화 위젯을 지우고 BPI에 신호를 보낸다.
이 신호는 대화가 끝나고 위젯 제거 후 캐릭터는 다시 UI를 인게임으로 설정하고 마우스도 안보이게 설정해야하기 때문에 필요하다.
Progress Dialogue는 DialogueIndex를 설정하고 대화함수로 보낸다.
Add Dialogue는 DialogueIndex의 값을 1추가하고 입력받은 Speaker, Dialogue, OptionText를 Update Dialouge Text로 보낸다.
FIND 함수로 대화가 중복되었는지 확인한다.
Update Selected Option은 Dialogue Progress에 Progress Index와 Option Index를 추가한다.
Clear Dialogue Progress는 Dialogue Progress를 Clear 함수로 지운다.
Remove Dialogue Progress는 For loop를 이용하여 Dialogue Progress에서 입력받은 값만큼 뒤로 간다.
이는 대화를 다시 뒤로 돌리고 싶을 때 이용된다.
Set Dialog Tree Index는 Dialogue Tree Index의 값을 조정한다.
이는 대화의 구조체에서 방향을 트는 일을 한다.
아래의 동영상 예시를 보면 이해가 쉽다.
NPC Base를 만들고 머리 위에 이름을 임시로 할당하였다.
BCanShowInteract? Bool 변수를 만들어서 머리위의 이름이 보이거나 보이지 않도록 설정하였다.
NPC Base의 자손 블프를 만들어서 위에 Text를 이름을 바꾸었다.
BPI의 Interact 함수를 불러와 이벤트로 호출한다.
플레이어의 앞에 콜리전을 만들고 위와 같이 오버랩시작과 오버랩 끝날 시 노드를 만들었다.
자세히 보면 오버랩시작시 겹쳐진 액터에 BPI Interactable이 있을 시 Interactalbe 액터변수에 할당하고 위에서 만든 BCanShowInteract? 변수값을 True로 설정하여 이름이 보이도록한다.
오버랩 종료시 Interactable를 없애고 BCanShowInteract? 값을 False로 하여 이름이 안보이도록한다.
캐릭터 블프에서 전에만든 InteractTrace에 새롭게 노드를 추가하였다.
E를 누를시 Interactable이 Valid이면 Interact 함수를 실행하고 UI 모드로 진입한다.
AC_Dialogue_Base의 자손 블프를 만들어 위와 같이 노드를 구성하였다.
Add Dialogue로 대화를 입력하고 Make Array를 붙여 옵션 내용을 원하는대로 추가할 수 있다.
Switch 함수를 이용하여 옵션 내용에 따라서 대화분기를 설정할 수 있다.
대충 만든 전체 내용이다.
간단히 퀴즈를 내고 맞추면 대화가 바뀌도록 만들었다.
정답을 맞출 시 Set Dialogue Tree Index함수로 값을 바꾼다.
맨 앞의 Dialogue Tree Index값이 바뀜에 따라 대화가 아래로 진행된다.
아래는 Random Interger로 세가지 옵션 대화가 무작위로 나오도록 하였다.
만든 NPC_Quiz를 배치하고 테스트하였다.
대화가 잘 진행되는 것을 볼 수 있다.
'언리얼 - 게임 개발' 카테고리의 다른 글
첫 게임 개발 (30) _ 숨겨진 장소 만들기 (0) | 2024.08.23 |
---|---|
첫 게임 개발 (29) _ 대화 시스템 추가 및 간단한 컷씬 구현 (0) | 2024.08.21 |
첫 게임 개발 (27) _ 세이브 로드 시스템 구현하기 2 (0) | 2024.08.18 |
첫 게임 개발 (26) _ 세이브 로드 시스템 구현하기 1 (0) | 2024.08.15 |
첫 게임 개발 (25) _ 메인 메뉴 만들기 (0) | 2024.08.15 |