2024-05-10
이동하는 플레이어를 따라 움직이는 기능을 구현하고 싶었다.

첫번째 시도한 방법은 플레이어 오브젝트 안에 Main Camera 를 넣어주는 것이었다.
스크립트나 설정 필요 없이 손쉬운 방법이다.
플레이어의 이동에 따라 카메라도 잘 움직이긴 한다.
하지만, 조금 더 부드러운 카메라 전환을 원해서 다른 방법을 찾아보았다.
public class CameraMovement : MonoBehaviour
{
public GameObject Target; // 카메라가 따라다닐 목표
public float speed = 4.0f;
public float z = 10f;
Transform this_transform;
Transform target_transform;
void Start()
{
this_transform = GetComponent<Transform>();
target_transform = Target.GetComponent<Transform>();
}
void Update()
{
this_transform.position = Vector2.Lerp(this_transform.position,target_transform.position,speed*Time.deltaTime);
this_transform.Translate(0, 0, z);
}
}
이전에 사용한 적이 있는 선형 보간 Lerp 함수를 사용하여 카메라가 플레이어를 따라 부드럽게 움직였지만, 생각보다 끊김과 버벅거림이 있었다.
플레이어 이동을 담당하는 키 입력 받는 로직과 플레이어가 움직일 때, Idle 과 Walk 를 구분하는 isWalking 변수를 바꾸는 로직이 Update 함수에 존재한다.
Update 함수는 매 프레임마다 호출되고, 그 주기가 일정하기 않기 때문에 발생한다고 생각하였다.
플레이어의 움직임을 담당하는 Update 함수가 아닌,
Update 함수가 모두 끝난 뒤 호출되는 LateUpdate 함수에 카메라 이동 로직을 넣어주었다.
왼쪽 상단에 현재 시간을 표시하는 UI 를 만들어주었다.
시간은 유저가 보는 화면의 왼쪽 상단에 고정되어 있어야한다.
따라서, Render Mode 를 Screen Space - Camera 로 설정해주었다.
카메라가 보고 있는 화면에 고정적으로 띄워주기 때문에,
앞서 플레이어를 따라 이동하는 카메라의 왼쪽 상단에 표시된다.
현재 시간을 받아와 Text 에 표시해주기만 하면 된다.
using System;
using UnityEngine.UI;
public class TimeUI : MonoBehaviour
{
private Text timeTxt;
private void Awake()
{
timeTxt = transform.GetComponent<Text>();
}
void Update()
{
timeTxt.text = NowTime();
}
public static string NowTime()
{
return DateTime.Now.ToString("HH:mm");
}
}
자세히 알아보자.
System 네임스페이스에서 제공하는 DateTime.Now 를 통해 현재 시간을 받아올 수 있다.
ToString 과 함께 아래의 형식을 사용해 원하는 방식으로 표시해주면 된다.
| 형식 | 표시 |
|---|---|
| yyyy | 년도 |
| MM | 월 |
| dd | 일 |
| HH | 시 |
| mm | 분 |
| ss | 초 |
| tt | 오전, 오후 |
맵을 구현하다 실수로 타일을 잘못된 폴더에 저장을 해서 삭제했다가
노가다로 만든 타일맵이 2번이나 사라졌다.
시간이 매우 아깝지만, 타일맵을 활용해서 맵을 꾸밀 때 같은 실수를 반복하진 않을 것 같다.