오늘 학습 키워드

오늘 학습 한 내용을 나만의 언어로 정리하기

필수 기능 설계

맵 설계 및 상호작용 영역

  • 맵 자체는 어제 만들어 두었으니 상호작용 시작
  • 맵의 특정 구역에 들어가면 위에 텍스트로 표시되도록 만듬
// BaseRoom.cs
// 사실 특정 방에 들어가서 추가적으로 뭐가 일어나지는 않아서 abstract로 만들 필요는 없었지만
// 확장성을 고민해서 이렇게 만듬
public abstract class BaseRoom : MonoBehaviour
{
    private string roomName;
    public virtual string RoomName { get => roomName; set => roomName = value; }
 
    private UIManager uiManager;
 
    public virtual void Init(UIManager uiManager)
    {
        this.uiManager = uiManager;
    }
    protected virtual void EnterRoom()
    {
        Debug.Log($"{RoomName} 입장");
        uiManager.EnterRoom(RoomName);
        return;
    }
 
    protected virtual void ExitRoom()
    {
        Debug.Log($"{RoomName} 퇴장" );
        uiManager.ExitRoom();
        return;
    }
 
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.CompareTag("Player"))
        {
            EnterRoom();
        }
        else return;
    }
 
    private void OnTriggerExit2D(Collider2D collision)
    {
        if (collision.CompareTag("Player"))
        {
            ExitRoom();
        }
        else return;
    }
}

  • 이제 NPC를 만들어 볼 예정

  • 내가 생각한 아이디어 : NPC 앞에 가서 상호작용 키를 누르면 특정 대사가 출력되도록 하기

  • 저의 테스트 NPC가 되어주신 정지원님께 무한한 감사 표합니다

  • MessagePivot을 평소에는 숨겼다가, 플레이어가 가까이 와서 상호작용 키를 누르면 보이게 할 것
  • BaseNPC
// BaseNPC.cs
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
 
namespace Metaverse
{
    public class BaseNPC : MonoBehaviour
    {
        private string name;
        public string Name { get => name; set => name = value; }
 
        [SerializeField] private GameObject messagePivot;
        public GameObject MessagePivot { get => messagePivot; set => messagePivot = value; }
 
        protected TextMeshProUGUI message;
 
        protected virtual void Start()
        {
            if (MessagePivot == null)
            {
                Debug.LogError($"{Name}'s Message Pivot is Null");
            }
            message = MessagePivot.GetComponentInChildren<TextMeshProUGUI>();
            MessagePivot.SetActive(false);
            // 나중에 상속받아서 override 로 메시지 내용 지정하면 됨
            return;
        }
 
        public void ShowMessage()
        {
            CancelInvoke();
            Debug.Log($"{Name} NPC와 상호작용");
            MessagePivot.SetActive(true);
            Invoke("EndMessage", 2f);
            return;
        }
 
        public void EndMessage()
        {
            MessagePivot.SetActive(false);
            return;
        }
    }
}
  • 그리고 플레이어가 상호작용 키를 누르면 레이캐스팅 보내야하니까, Input Action에 Interaction을 바인딩

  • 성공!


(아직 카메라 이동 세팅 안해서 저렇게 보임)

  • 아는 분들 많이 추가함

미니게임 추가하기

  • FlappyPlane을 새 씬에 넣기로 함

  • 그 과정에서 원래 스페이스바와 왼쪽 마우스 클릭을 처리하던 부분을 input action으로 변경함

  • 그리고 UI도 TopDown 때 처럼 Enum State로 관리하기로 함

  • 씬을 관리하고 데이터를 옮기기 위한 전체 관리자인 GlobalManager 클래스를 작성함

public enum SceneNumber
{
    Metaverse,
    FlappyPlane
}
 
 
 
public class GlobalManager : MonoBehaviour
{
    public static GlobalManager instance;
    public Vector2 lastPosition;
    
 
    private void Awake()
    {
        if(instance == null)
        {
            instance = this;
            DontDestroyOnLoad(instance);
        }
        else
        {
            Destroy(this);
        }
    }
 
    public void SceneChange(SceneNumber sceneNumber)
    {
        
        if (sceneNumber != SceneNumber.Metaverse)
        {
            if(sceneNumber == SceneNumber.FlappyPlane)
            {
                FlappyPlane.GameManager.isFirstLoading = true;
            }
 
            GameObject player = FindObjectOfType<PlayerController>().gameObject;
            lastPosition = player.transform.position;
        }
        SceneManager.LoadScene((int)sceneNumber);
 
    }
}

학습하며 겪었던 문제점 & 에러

문제 1

  • 문제&에러에 대한 정의

분명 특정 구역에 들어가면 위에 텍스트로 장소 이름이 뜨도록 설정해 놨는데… 그게 중복되는 경우가 생김

  • 내가 한 시도

클래스를 굳이 분리해서 다시 만들어봄

  • 해결 방법

그게 문제가 아니었음. 이미 만들어둔 방을 Ctrl + D 하다보니 콜라이더 위치가 조정되지 않았던 것..

  • 새롭게 알게 된 점

Ctrl + D 한 뒤에 위치 조정한다고 해서 콜라이더가 같이 가지는 않는다

  • 이 문제&에러를 다시 만나게 되었다면?

콜라이더 위치 제대로 확인하자

문제 2

  • 문제&에러에 대한 정의

상호작용 처리를 하려는데, 아무리 레이캐스트를 쏴도 NPC한테 맞지가 않았음

  • 내가 한 시도

로그를 찍어봤는데, 충돌체가 Player로 찍혀있었음

  • 해결 방법

레이어마스크 추가해서 NPC로 인식하게 함. 플레이어가 레이를 쏘는데 문제는 플레이어도 콜라이더를 가지고 있어서 그랬던 것 같음.

  • 이 문제&에러를 다시 만나게 되었다면?

레이어마스크 써서 해결하자

문제 3

  • 문제&에러에 대한 정의

말풍선 부분이 저렇게 foreground에 짤려서 보임

  • 내가 한 시도

Renderer 에서 Sorting Layer를 변경해 보았음. 그리고 Order in Layer도 변경해봄

  • 해결 방법

생각해보니 NPC들을 BaseNPC로 프리팹 화 해서 가지고 있었지만 이걸 가져온 뒤에는 Unpacking 했기 때문에 각각의 NPC에 Sorting Layer가 변경되지 않았음.

  • 새롭게 알게 된 점

프리팹을 Unpacking 하면 연동이 끊긴다!!!!

  • 이 문제&에러를 다시 만나게 되었다면?

프리팹화 되어있는거 다시 한 번 확인하기

문제 4

  • 문제&에러에 대한 정의

재시작을 하면 HomeUI가 아니고 바로 GameUI 되면서 게임 시작할 수 있도록 하려고 했는데… 그게 자꾸 안됨

  • 내가 한 시도

GameManager instance로 해주고 디버그 켜서 제대로 활성화되나 해주고 계속 봤음

  • 해결 방법

isFirstLoading 이 static이 아니였어…

  • 새롭게 알게 된 점

static은 Scene 재로드해도 남아있긴함

  • 이 문제&에러를 다시 만나게 되었다면?

내가 원하는 변수가 static인지 다시 한 번 확인해라

내일 학습 할 것은 무엇인지

추가 미니게임 만들 예정… 그리고 리더보드 기능 추가해야함