
유니티 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 | 
 
                   
                   
                  