유니티에서 배경을 활용하는 방법은 매우 다양할 것입니다.
저는 오늘 2D플랫포머 게임을 만드는 과정에서
MainCamera 오브젝트와 스크립트를 사용하여,
배경을 재활용하는 방법에 대해 정리해보고자 합니다.
제가 따라 만들고 있는 게임에서 배경은 2가지입니다.
우측 하이어라키창에 Background의 자식 오브젝트인 Far와 Middle입니다.
Far는 좌측 사진에서 빨간 네모 안의 하늘이미지, Middle은 빨간 네모 안의 수풀 이미지입니다.
CameraController라는 스크립트를 보면서
카메라와 배경이 플레이어를 따라다니도록 구현하는 코드들을 살펴보겠습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraController : MonoBehaviour
{
public Transform Player;
public Transform farBackground, middleBackground;
public float minHeight, maxHeight;
public float cameraSpeed;
private Vector2 lastPos;
void Start()
{
lastPos = transform.position; // 카메라의 초기 위치를 저장합니다.
}
void Update()
{ // 플레이어가 y축으로 움직일 때, 카메라를 범위 내에서 제한합니다.
float clampedY = Mathf.Clamp(Player.position.y, minHeight, maxHeight);
// 카메라의 위치를 플레이어와 같은 위치로 맞춥니다.
transform.position = new Vector3(Player.position.x, clampedY, transform.position.z);
// 카메라가 움직인 만큼 배경 이미지를 움직입니다.
Vector2 amountToMove = new Vector2(transform.position.x - lastPos.x, transform.position.y - lastPos.y);
// 먼 배경 이미지를 카메라와 같은 속도로 움직입니다.
farBackground.position += new Vector3(amountToMove.x, amountToMove.y, 0f);
// 가까운 배경 이미지를 카메라와 같은 속도로 움직입니다.
middleBackground.position += new Vector3(amountToMove.x, amountToMove.y, 0f);
// 카메라의 현재 위치를 저장합니다.
lastPos = transform.position;
}
}
CameraController스크립트는 main camera 오브젝트에 컴포넌트 형태로 추가했습니다.
하나하나 뜯어서 살펴보겠습니다.
Transform 타입의 변수 3개(Player, farBackground, middleBackground는 public으로 선언되어 있습니다.
awake나 start와 같은 생명주기 함수에서 초기화하지 않고,
인스펙터 창에서 오브젝트를 할당해 초기화를 진행해 주었습니다.
Player변수에는 카메라가 따라다닐 Player 오브젝트를 할당했습니다.
farBackground와, middleBackground 변수에는 두 배경을 할당했습니다.
float minHeight변수와 maxHeight변수에는 카메라가 플레이어를 따라
수직이동을 하는 과정에서 한계선 지정을 위해 선언한 것입니다.
예를 들어, 플레이어가 낮은 지형으로 이동할 경우
빨간 박스 안에 땅 바깥의 부분이 게임창에 보일 수 있습니다.
반대로 너무 높이 점프하거나, 높은 지형에서는 하늘 바깥의 검은색 부분이 보일 수도 있습니다.
이를 방지하기 위해 높이의 한계선을 만들어 준 것입니다.
매 프레임마다 실행되는 생명주기 함수인 Update함수의 내부를 살펴보겠습니다.
먼저 float타입의 clampedY입니다.
Mathf.Clamp함수가 사용되었는데요.
Mathf.Clamp함수는 총 3개의 매개변수를 갖습니다.
첫 번째는 반환될 값, 두 번째는 최솟값, 세 번째는 최댓값입니다.
즉, Player 오브젝트의 Y좌표 중에서 minHeight, maxHeight에 속하는 값만 clampedY 변수에 할당됩니다.
transfrom.position은 카메라의 위치입니다.
매 프레임마다 카메라의 위치에 Player의 x좌표, clampedY에 할당된 Player의 y좌표가 더해집니다.
Vector2 타입의 amounToMove 변수에는
카메라가 얼마나 이동했는지 계산한 값이 할당됩니다.
Start함수는 생명주기함수로써 게임이 실행된 후 1번만 실행됩니다.
함수 안에는 latsPos라는 변수 안에 카메라의 위치가 할당된 것을 확인할 수 있습니다.
프레임마다 카메라의 위치를 추적하고, 그 위치에서 초기에 선언한 lastPos를 빼면 이동한 거리가 나옵니다.
카메라가 이동한 거리를 배경의 위치에도 더해주게 되면, 배경도 카메라와 함께 플레이어를 쫓게 됩니다.
마지막으로 lastPos 값에 카메라의 현재 위치를 할당하면서,
프레임 사이에 카메라가 플레이어를 쫓아 얼마큼 이동했는지 알 수 있습니다.
이렇게 하면 배경 오브젝트를 수없이 생성하지 않아도,
게임 화면에서는 배경이 무한히 반복되는 것처럼 보이게 할 수 있습니다.
'게임 & 게임개발 > 유니티 기초' 카테고리의 다른 글
유니티 학습 일지 #6 | Time.Delta를 활용한 무적상태 구현하기 (0) | 2023.04.28 |
---|---|
유니티 학습 일지 #4 | Rigidbody2D에서 Collision Detection의 역할 (0) | 2023.04.25 |
유니티 학습 일지 #3 | Sorting Layer 와 Order in Layer (0) | 2023.04.24 |
유니티 학습 일지 #2 | Pixel Per Unit(PPU)란? (2) | 2023.04.22 |
유니티 학습 일지 #1 3D vs 3D URP의 차이 (0) | 2023.04.20 |