Ssssong += Dev

[퍼즐게임] WHITE POLYGON - 3 본문

개발/WHITE POLYGON

[퍼즐게임] WHITE POLYGON - 3

ssong_dev 2022. 7. 12. 17:15

씬 이동, 인벤토리, 공간 회전 동작, 대화시스템 기본 세팅하였다.

대화시스템은 아직 텍스트 출력만 넣어두고 여러 텍스트 순서대로 출력하는 건 적용되지 않았다.

 

 

 

인벤토리와 대화시스템 관리는 싱글턴으로 관리하고 있다. 

싱글턴 생성이 프레임워크로 들어가 있는데, 이 코드를 유용하게 쓰고 있다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public abstract class CSingleton<T> : CComponent where T : CComponent
{
    public static T m_oInstance = null;

    //! 인스턴스 프로퍼티
    public static T Instance
    {
        get
        {
            if(m_oInstance == null)
            {
                var oGameObject = new GameObject(typeof(T).ToString());
                m_oInstance = Function.AddComponent<T>(oGameObject);

                DontDestroyOnLoad(oGameObject);
            }

            return m_oInstance;
        }
    }

    //! 인스턴스를 생성한다.
    public static T Create()
    {
        return CSingleton<T>.Instance;
    }
}

 

 

 

 

대화시스템 현재 세팅된 모습인데 다음 대화로 넘기는 기능이 아직 없어서 추가해야 한다.

다음 대화가 없다면 창을 끄는 것과 대화 진행 상태, 퀘스트 조건에 따른 진행 상태도 추가되어야 한다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;

public class CDialogueSystem : CSingleton<CDialogueSystem>
{
    private TextMeshProUGUI textMeshProUGUI;
    private float textSpeed;
    private string textContent;

    private bool isTalking = false;

    public void SetDialogueInfo(TextMeshProUGUI a_textMesh, float a_textSpeed, string a_textContent)
    {
        textMeshProUGUI = a_textMesh;
        textSpeed = a_textSpeed;
        textContent = a_textContent;
    }

    public void WriteText()
    {
        isTalking = true;
        StartCoroutine(TextEffect());
    }

    public void WriteAllText()
    {
        StopAllCoroutines();
        textMeshProUGUI.text = textContent;
        isTalking = false;
    }

    IEnumerator TextEffect()
    {
        foreach(char letter in textContent.ToCharArray())
        {
            textMeshProUGUI.text += letter;
            yield return new WaitForSeconds(textSpeed);
        }

        isTalking = false;
    }

    public override void Update()
    {
        base.Update();

        if(Input.GetKeyDown(KeyCode.Space))
        {
            if(isTalking)
            {
                WriteAllText();
            }
        }
    }
}

 

 

 

캐릭터마다 대화창이 보이거나 또는 다른 퀘스트 조건이 실행되어야 하므로

델리게이트로 각 기능을 더해주고자 한다. ShowDialogue 메서드는 텍스트 객체 세팅 후 좀 더 사용하기 편하게 수정될 것이다.

위치도 CCharacter로 옮겨줘야 한다.

public class CCharacter : CComponent
{
    public delegate void CharacterClickEvent();
    public CharacterClickEvent characterClickEvent;

    private void OnMouseDown()
    {
        characterClickEvent();
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ShopKeeper : CCharacter
{
    [SerializeField]
    private CDialogueObj dialogueUI;

    public override void Start()
    {
        base.Start();
        characterClickEvent += ShowDialogue;
    }

    private void ShowDialogue()
    {
        dialogueUI.gameObject.SetActive(true);
        CDialogueSystem cDialogue = CDialogueSystem.Instance;
        cDialogue.SetDialogueInfo(dialogueUI.textMesh, 0.1f, "뭐 좀 사갈래?");
        cDialogue.WriteText();
    }
}

 

'개발 > WHITE POLYGON' 카테고리의 다른 글

[퍼즐게임] WHITEPOLYGON - 6  (0) 2022.07.24
[퍼즐게임] WHITE POLYGON - 5  (0) 2022.07.19
[퍼즐게임] WHITEPOLYGON - 4  (0) 2022.07.18
[퍼즐게임] WHITE POLYGON - 2  (0) 2022.07.08
[퍼즐게임] WHITE POLYGON - 1  (0) 2022.07.08