본문 바로가기

Unity

[Unity] npc와 대화를 해보자(2)

728x90

[Unity] 대화창을 만들어 object의 이름을 출력해보자에서 설명했던 대화창 출력 방법에서 변화된것이 많아서 GameManager 스크립트의 코드를 전부 가져왔습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
 
public class GameManager : MonoBehaviour
{
    public Text talkText;
    public TalkManager talkManager;
    public GameObject TalkImage;
    public GameObject scanObject;
    public Image portraitImage;
 
    public bool isMove;
    public int talkIndex;

 

  • talkText - 대화창에 텍스트를 띄어줄 변수이다.
  • talkManager - TalkManager 스크립트를 저장한 변수이다.
  • TalkImage - 대화창 배경이 될 변수이다.
  • scanObject - rayCast로 확인한 오브젝트를 저장할 변수이다.
  • portraitImage - 오브젝트의 이미지를 저장할 변수이다.
  • isMove - 플레이어가 움직일 수 있는지 없는지에 대한 정보를 저장할 변수이다.
  • talkIndex - 몇번째 대화가 이어지는지 저장할 변수이다.
1
2
3
4
5
6
7
8
public void ShowText(GameObject scanObj)
    {
        scanObject = scanObj;
        ObjectData objectData = scanObject.GetComponent<ObjectData>();
        OnTalk(objectData.id, objectData.isNpc);
 
        TalkImage.SetActive(isMove);
    }

 

scanObject에 인자로 받은 scanObj를 저장해주고 확인한 오브젝트의 ObjectData를 가져온다. 그리고 OnTalk에 확인한 오브젝트의 값을 인자로 전달해준다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void OnTalk(int id, bool isNpc)
    {
        string talkData = talkManager.GetTalk(id, talkIndex);
 
        if(talkData == null)
        {
            isMove = false;
            talkIndex = 0;
            return;
        }
 
        if (isNpc)
        {
            talkText.text = talkData;
            portraitImage.sprite = talkManager.GetSprite(id);
            portraitImage.color = new Color(1111);
        }
        else
        {
            talkText.text = talkData;
            portraitImage.color = new Color(1110);
        }
 
        isMove = true;
        talkIndex++;
    }
}

 

전달받은 인수를 사용하여 talkManager의 GetTalk 함수를 사용하여 talkData에 저장해준다. 그리고 저장된 talkData를 talkText의 text값으로 넘겨주어서 npc와 대화할 수 있게 해준다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Player : MonoBehaviour
{
    public GameManager manager;
 
    void Update()
    {
        if (Input.GetButtonDown("Jump"&& scanObj != null)
        {
            manager.ShowText(scanObj);
        }
    }
}

 

마지막으로 플레이어가 스페이스바를 누르면 대화가 실행될 수 있게 Player 스크립트에 위의 내용을 추가해준다.

 

 

728x90