![유니티 NPC 간단 대화 시스템](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0Csez%2FbtsA6RMSKmL%2FZssOM5kn2GxS7Dx6epxS70%2Fimg.png)
유니티 NPC 간단 대화 시스템Unity/Study2023. 11. 28. 14:59
Table of Contents
📌 NPC 간단 대화 시스템
- NPC 근처에 가면 대화 걸기 버튼 생성, 멀어지면 버튼 사라짐
- 버튼을 누르고 대화 시작
📌 구현 결과
- NPC 대화창을 구현, 가져올 데이터는 NPC 이미지, 이름, 대화 로그
📄 NPCBlueprint.cs
public class NPCBlueprint : CharacterBlueprint
{
[SerializeField] private string npcIntro;
public string NPCIntro => npcIntro;
}
- 캐릭터 설계도를 베이스로 모든 NPC는 대화 인트로를 가지게 설계함
- 임시로 NPC에 설계도를 하나씩 붙여서 데이터를 불러오게 함 => 나중에 리소스 제어로 관리하도록 수정 필요
📄 NPC.cs
public class NPC : MonoBehaviour
{
[SerializeField] private NPCBlueprint npcBlueprint;
[SerializeField] private TextMeshProUGUI displayName;
[SerializeField] private SpriteRenderer spriteRenderer;
[SerializeField] private Animator animator;
private void Start()
{
InitNPC();
}
public void InitNPC()
{
if (npcBlueprint == null) return;
displayName.text = npcBlueprint.CName;
spriteRenderer.sprite = npcBlueprint.CSprite;
animator.runtimeAnimatorController = npcBlueprint.CAnim;
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.CompareTag("Player"))
{
Manager.Game.MainUI.ActiveDialogueButton(true, npcBlueprint);
}
}
private void OnTriggerExit2D(Collider2D collision)
{
if (collision.CompareTag("Player"))
{
Manager.Game.MainUI.ActiveDialogueButton(false);
}
}
}
- 기존 설계도를 베이스로 가져와 데이터 초기화
- 게임 내에서는 원형 콜라이더를 부여해서 범위안에 Player가 들어가거나 나갈 시, 대화창 UI를 활성화
- 그리고 활성화 시, NPC 설계도 데이터를 부여한다.
📄 UI_Scene_Main.cs
// 대화창 초기화
private void InitDialogue()
{
dialogueEnterBtn.onClick.AddListener(EnterDialogue);
dialogueExitBtn.onClick.AddListener(ExitDialogue);
dialoguePanel.SetActive(false);
}
// 대화창 들어가기
private void EnterDialogue()
{
Manager.Game.State = GameState.Pause; // 키 조작 제어
dialoguePanel.SetActive(true);
}
// 대화창 나가기
private void ExitDialogue()
{
Manager.Game.State = GameState.Play; // 키 조작 복구
dialoguePanel.SetActive(false);
}
// 대화하기 버튼 활성화 체크
public void ActiveDialogueButton(bool isOn, NPCBlueprint npcBlueprint = null)
{
if (isOn)
{
dialogueEnterBtn.gameObject.SetActive(true);
SetDialogue(npcBlueprint);
}
else
{
dialogueEnterBtn.gameObject.SetActive(false);
}
}
// 대화창 NPC 데이터 설정
private void SetDialogue(NPCBlueprint npcBlueprint)
{
portraitName.text = npcBlueprint.CName;
portraitImage.sprite = npcBlueprint.CSprite;
dialogueText.text = npcBlueprint.NPCIntro;
}
💡 결과 화면
'Unity > Study' 카테고리의 다른 글
유니티 Manager System (0) | 2023.12.05 |
---|---|
유니티 2D 공 충돌 물리엔진 (0) | 2023.11.30 |
유니티 타일 꾸미기 (0) | 2023.11.25 |
유니티 Input System을 활용한 캐릭터 회전 구현 (0) | 2023.11.25 |
유니티 Input System을 활용한 캐릭터 이동 구현 (0) | 2023.11.24 |