오늘 학습 키워드
오늘 학습 한 내용을 나만의 언어로 정리하기
필수 기능 설계
맵 설계 및 상호작용 영역
- 맵 자체는 어제 만들어 두었으니 상호작용 시작
- 맵의 특정 구역에 들어가면 위에 텍스트로 표시되도록 만듬
// 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인지 다시 한 번 확인해라
내일 학습 할 것은 무엇인지
추가 미니게임 만들 예정… 그리고 리더보드 기능 추가해야함