Unity/Study

유니티 NPC 간단 대화 시스템

홍삼맛 2023. 11. 28. 14:59

📌 NPC 간단 대화 시스템

  • 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 설계도 데이터를 부여한다.

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;
}

 

 

💡 결과 화면

NPC 대화