Unity/RPG Project
RPG Project - 8 [ NPC Chat System ]
SiJun-Park
2024. 10. 15. 03:09
오늘은 Project - 7에 이어지는 내용입니다.
목표는 NPC 채팅 다이로그를 출력입니다.
가장 먼저 위 Chat System에 필요한 스크립트 작성을 하여야합니다.
public class ChatControl : MonoBehaviour
{
[Header("기본정보")]
[SerializeField] private Text _Name;
[SerializeField] private Text _Body;
[SerializeField] private float _Speed;
private string _TotalBody;
public bool _InputKey = false; // 키 입력 받았을 시 모든 채팅 출력
public void Init(string name, string body)
{
_Body.text = "";
_Name.text = name;
_TotalBody = body;
gameObject.transform.SetAsLastSibling(); // 가림이 생길 수 있으니
StartCoroutine(Chat());
}
IEnumerator Chat()
{
foreach(char c in _TotalBody)
{
if (_InputKey)
{
_Body.text = _TotalBody;
yield break;
}
_Body.text += c;
yield return new WaitForSeconds(_Speed);
}
_InputKey = true;
}
}
처음 설정으로 Init으로 NPC 이름과 총 출력할 문자열을 저장합니다.
그리고 코루틴을 돌려주며 코루틴에선 위에서 설정한 문자열을 하나씩 돌며 문자를 _Body에 더해줍니다
이때 만약에 유저 키 입력이 있었다면 InputKey 변수가 True가 되어서 모든 텍스트를 출력을 합니다.
두번째로는 NPC에서 수정을 하여야합니다.
private UserControl _User;
void Start()
{
_User = UserControl._instance;
_Action = GetComponent<Animator>();
_Origin_Look = _spine.transform.rotation;
}
void Update()
{
if (_target) {
User_Action();
See();
}
else See_Back();
}
void User_Action()
{
if (Input.GetKeyDown(KeyCode.Space) && _User._CurrentState != UserControl.State.Wait)
{
_User._Action.SetFloat("X", 0);
_User._Action.SetFloat("Y", 0);
_User._Action.Play("Idle,Walk");
_User._CurrentState = UserControl.State.Wait;
_User.transform.LookAt(transform.position);
Chat.GetComponent<ChatControl>()._InputKey = false;
Chat.SetActive(true);
Chat.GetComponent<ChatControl>().Init(transform.name, "안녕하세요 테스트입니다. 잘 출력이 되고 있나요?");
}
else if (Input.GetKeyDown(KeyCode.Space) && _User._CurrentState == UserControl.State.Wait)
{
Chat.GetComponent<ChatControl>()._InputKey = true;
}
else if (Input.GetKeyDown(KeyCode.Escape) && _User._CurrentState == UserControl.State.Wait)
{
_User._CurrentState = UserControl.State.Idle;
Chat.GetComponent<ChatControl>()._InputKey = false;
Chat.SetActive(false);
}
}
수정된 부분만 가져 왔습니다.
만약 타겟이 있을 시 User_Action이라는 함수도 들어가줍니다.
이때 유저가 Space를 누르고 현재 상태가 Wait상태가 아니라면 들어오게 됩니다
이때 유저가 어떠한 행동을 할수도 있으니 초기화를 해주고 기본 설정을 해줍니다.
만약에 Wait상태인데 스페이스바를 또 눌렀다면 모든 채팅을 출력을 합니다.
그게 아닌 Esc를 누르면 NPC창을 나오게 됩니다.
추후에는 클릭 가능한 메뉴도 만들 예정입니다.
-> 퀘스트, 상점용도
또한 현재 채팅이 하나인데 나중에 DB를 연결해서 여러개를 만들 예정입니다.