์ด์ ์ด ํ๋กํ ํ์ ๊ฐ๋ฐ ํ๋ก์ ํธ๋ ์ฌ์ ์ ๋์ด ์กฐ๊ธ์ฉ ๋ณด์ด๊ธฐ ์์ํ๋ ๋ฏํ๋ค. ๋ฌผ๋ก ์์ง ๋ค์ ์คํ ์ด์ง ๋ด๋ถ ๊ตฌํ๋ ํด์ผ ํ๊ณ , ๊ฒ์ ์์ ์ ์์ฌ ๋ํ ๊ฐ๋จํ๊ฒ ๊ตฌํํด์ผ ํ์ง๋ง ๊ทธ๊ฑด ๊ทธ ๋ ์๊ฐํ์.
๋์์ด๋ ๋๊ป์ ๊ณ ์์ ์ ๋ง ๋ง์ด ํด์ฃผ์ ๋ค. ์๋๋ผ๋ฉด ์ฌ๋ฌ ๋์์ด๋ ๋ถ๋ค์ด ๊ฐ ํํธ๋ณ๋ก ๋ด๋นํ์๊ฒ ๋ ํ ๋ฐ, ๊ทธ๊ฑธ ํผ์์ ์ฒ๋ฆฌํ๊ณ ๊ณ์๋.... ๊ทธ๋ฐ ๋์์ด๋ ๋์ ๋ ธ๊ณ ๊ฐ ๋ค์ด๊ฐ ๋ฐฐ๊ฒฝ ๋ฐ ๋ฐฐ๊ฒฝ ์ค๋ธ์ ํธ๋ค์ด ๊ฑฐ์ ๋ค ์์ฑ์ด ๋์๋ค.
๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง๋ค(๋ท์ฐ ๋ฐฐ๊ฒฝ ๋ฑ)์ ์์ง ์งํ ์ค์ด์๊ณ , ๊ธธ๊ฐ์ ์๋ ๋ฐฐ๊ฒฝ ์ค๋ธ์ ํธ(์ ๋ด๋ ๋ฑ)๋ค์ ์์ฑ์ด ๋์๋ค. ๊ทธ๋์ ๊ทธ๊ฒ๋ค๋ถํฐ ์ฐ์ ์ ์ผ๋ก ๋ฐฐ์น๋ฅผ ํ๋ ค๊ณ ํ๋ค.
1. ๋ฐฐ๊ฒฝ ๋ฐฐ์น ์ , ์ค์ํ ๋ถ๋ถ์ ๊นจ๋ซ๋ค.
๊ทธ๋ฐ๋ฐ, ์ด๋ณด ๊ฐ๋ฐ์๋ค์ ๋ชจ์์ด๋ผ์ ๊ทธ๋ฐ์ง ์ค์๋ฅผ ํ๊ณ ๋ง์๋ค. ๊ฐ๋ฐ ์์ ์ ์ ๋จ์(Unit) ๊ฐ๋ ์ ๊ณต๋ถํ์ง ์๊ณ , ๊ธฐ์ค ๋จ์ ๋ํ ์ ํ์ง ์์์๋ค....
Unity์์ ์ ๋(Unit)์ด๋ผ๋ ๊ธธ์ด ๋จ์๊ฐ ์กด์ฌํ๋ค. ๋ฌผ๋ฆฌ ์ฐ์ฐ์ 1 ์ ๋ ๋น 1m๋ก ๊ณ์ฐํ๊ธฐ ๋๋ฌธ์ ๋ฌผ๋ฆฌ๊ฐ ๋ง์ด ๋ค์ด๊ฐ ๊ฒ์์ ์ด ์ ์ ์์งํด์ผ ํ๋ค๊ณ ํ๋ค.
๋ํ, ์คํ๋ผ์ดํธ(Sprite)์์ PPU(Pixels Per Unit)์ด๋ ๊ฒ๋ ์ค์ ํ ์ ์๋ค.
PPU(Pixels Per Unit)๋ 1 ์ ๋(Unit) ์์ ๋ฐฐ์น๋ ํฝ์ ์ ๊ฐ์. ์ฆ, 1 ์ ๋์ ํํ๋์ด์ง ํฝ์ ์ ๊ฐ์
PPU๊ฐ 100 ์ด๋ผ๋ฉด, "100 X 100" ์ฌ์ด์ฆ์ ์คํ๋ผ์ดํธ๊ฐ 1 ์ ๋ ํฌ๊ธฐ์ ๋ฑ ๋ง๊ฒ ๋๋ค.
100 * 100 ์คํ๋ผ์ดํธ์ PPU๋ฅผ 10์ผ๋ก ํ๋ฉด, (100 / 10) * (100 / 10) = 100 ์ ๋์ ์ฐจ์งํ๊ฒ ๋๋ค.
์ฆ, Unity์ ์ ๋(Unit) ๋จ์์ ๋ง์ถ ๋ ์ด PPU๋ฅผ ํตํด ์กฐ์ ํ๋ฉด, ํธ๋์คํผ์์ ๋ณ๋์ ์ค์ผ์ผ ์กฐ์ ์์ด ํธํ๊ณ ์ ํํ๊ฒ ํฌ๊ธฐ ๋ฐ ๊ฑฐ๋ฆฌ ๊ณ์ฐ์ด ๋๋ค๋ ๊ฑธ ๋ค๋ฆ๊ฒ ๊นจ๋ฌ์๋ฒ๋ ธ๋ค.
๋ฐ์์จ ์คํ๋ผ์ดํธ์ ํฝ์ ์๋ ์ ํด์ ธ์๋๋ฐ, ์ค์ผ์ผ ๊ฐ์ ๋๋ ค๋ฒ๋ฆฌ๋ฉด ๋์ ๊ณต๊ฐ์ ์๋์ ์ผ๋ก ์ ์ ํฝ์ ์ด ์กด์ฌํ๊ฒ ๋๋ฏ๋ก ํ์ง์ด ๋จ์ด์ ธ ๋ณด์ผ ์ ๋ฐ์ ์์ ๊ฒ์ด๋ค. (์ด๋ฏธ์ง๋ฅผ ํ๋ํ๋ฉด ๊นจ์ ธ๋ณด์ด๋ ๊ฒ๊ณผ ๋น์ทํ ๊ฒ์ด ์๋๊น ์ถ๋ค.)
๊ธฐํ์์์ ์ฃผ์ธ๊ณต ์บ๋ฆญํฐ์ ํค๊ฐ 1.2m์ด๋ค. 64 * 128 (๋๋ต์ ์ธ ์์น) ์ ๋ ํฌ๊ธฐ์ ์คํ๋ผ์ดํธ๋ผ๋ฉด ๋ํธ ๊ทธ๋ํฝ์ธ ๊ฒ ๋ง๋ฅ ํํ์ด ๋ ๊ฒ ๊ฐ์ผ๋, ์ข ๋ ๋ง์ ํฝ์ ์๋ก ํํ์ ํด์ผ ํ๊ฒ ์ง? 256 * 512 ์ด๋ฉด ๋ ๊น?...
๊ทธ๋ฆฌ๊ณ PPU๋ฅผ 500์ผ๋ก ์ค์ ํ๋ฉด, 1 ์ ๋์ 1m๋ก ๊ฐ์ฃผํ๋คํ์ผ๋, 1m๋ฅผ ์กฐ๊ธ ๋๋ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๊ฒ ๋ ๊ฒ์ด๋ค. ๋น๊ตํ ์ ์๋ ๊ธฐ์ค(์บ๋ฆญํฐ) ๊ธธ์ด๊ฐ ์๊ฒผ์ผ๋, ๋ฐฐ๊ฒฝ ๊ฑด๋ฌผ์ด๋ ์ค๋ธ์ ํธ๋ค์ ํฌ๊ธฐ ๋ํ ์ด๋ฏธ์ง ํฌ๊ธฐ ๋๋น PPU๋ฅผ ์ ์กฐ์ ํ์ฌ ์ค์ง์ ์ธ ํฌ๊ธฐ ์ ํ ์ด ๊ฐ๋ฅํ ๊ฒ์ด๋ผ๊ณ ์๊ฐ๋๋ค.
๋ํ, PPU๋ฅผ ์ฌ์ฉํ์ฌ ์กฐ์ ํ๋ ๊ฒ์ด ์นด๋ฉ๋ผ ์ฌ์ด์ฆ ๊ณ์ฐ์ ์ ํํ๊ฒ ํ ์ ์์ผ๋ฏ๋ก ์ ์ฉํ๋ค.
๐Unity Documention์ ์ํ๋ฉด,
"๊ฐ๊ธ์ ํธ๋์คํผ์ ์ค์ผ์ผ ๊ฐ์ ์กฐ์ ํ์ง ์์ ๊ฒ์ ๊ถ๊ณ ํ๋ฉฐ, ํ์ค ํฌ๊ธฐ๋ก ๋ชจ๋ธ(์ฌ๊ธฐ์๋ ์ด๋ฏธ์ง)์ ๋ง๋ค์ด ํธ๋์คํผ์ ์ค์ผ์ผ ๊ฐ์ ๋ณ๋๋ก ์กฐ์ ํ์ง ์๋๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ด์์ "
ํนํ๋, ๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์ ์ด ์ค์ํ ์ค๋ธ์ ํธ๋ผ๋ฉด ๋๋์ฑ ๊ทธ๋ด ๊ฒ์ด๋ผ ์๊ฐ๋๋ค. ์์์๋ ๋งํ์ง๋ง, Unity ๋ฌผ๋ฆฌ ์์ง์ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ ๊ณต๊ฐ์์์ ํ ์ ๋์ 1m์ ํด๋นํ๋ค๊ณ ๊ฐ์ฃผํ๋ค.
๋ง์ฝ ๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์ ์ ์ ์ฉํ ์ค๋ธ์ ํธ๊ฐ ๊ต์ฅํ ํด ๊ฒฝ์ฐ, "์ฌ๋ก์ฐ ๋ชจ์ "์ผ๋ก ์งํ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์๋ค.
๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์ ์ ๋ฌผ๋ฆฌ ์์ง์ ๊ธฐ๋ฐํ์ฌ ์ค์ ๋ก ์ ํํ ์ ๋์ํ๊ณ ์์ผ๋, ๋ฌผ๋ฆฌ ์ ์ฉ ๊ธฐ๋ณธ ๋จ์์ ๋นํด ์ค๋ธ์ ํธ์ ํฌ๊ธฐ๊ฐ ์ง๋์น๊ฒ ํฌ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ๊ฒ ๋ณด์ด๋ ๊ฒ์ด๋ค.
๋ฌผ๋ก ํ์ฌ ๋ด๊ฐ ์งํ ์ค์ธ ํ๋ก์ ํธ์ ๊ฒ์์ ๋ฌผ๋ฆฌ ์ฐ์ฐ์ด ๋ง์ด ๋ค์ด๊ฐ์ง ์๋๋ค. ํ์ง๋ง, ๋์ค์ ์ ํํ ๋ฌผ๋ฆฌ ์ฐ์ฐ์ด ๋ง์ด ๋ค์ด๊ฐ๋ ๊ฒ์์ ๊ฐ๋ฐํ ๋, ์ด๋ฐ ๋ถ๋ถ์ ๋ชฐ๋๋ค๋ฉด ๋ง์ด ๊ณ ์ํ์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
์ด๋ณด๋ผ์ ๋ชฐ๋ผ ๊ณ ๋ ค๋ฅผ ๋ชปํ๋ ๋ด์ฉ์ด ๋ง๋ค. ํ์ฌ ์งํํ๊ณ ์๋ ํ๋ก์ ํธ๋ ํธ๋์คํผ์ ์ค์ผ์ผ๋ก ์๋์ ์ธ ํฌ๊ธฐ ์กฐ์ ์ ํ๋ค. ์ฐ๋ฆฌ๊ฐ ๋ชฐ๋ผ์ ๋ง์์ ๋ชป ๋๋ ธ๊ธฐ ๋๋ฌธ์ ๋์์ด๋ ๋ ๋ํ ์ด๋ฐ ๋ถ๋ถ์ ๊ณ ๋ คํ์ง ๋ชปํ๊ณ , ์บ๋ฒ์ค ํฌ๊ธฐ๋ฅผ 2์ ์ ๊ณฑ์๋ก ํ์ง ์์์ ๊ฒ์ด๋ค. (๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ์ํด 2์ ์ ๊ณฑ ์๋ก ์ค์ ํ๋ ๊ฒ์ด ์ข๋ค๊ณ ํ๋ค.)
์ฒ์๋ถํฐ ์ ๋ถ ๋ค ์์ ํ๊ธฐ์๋ PSD, PSB ํ์ผ์ด ์ ๋ํฐ์์ ์ด๋ฏธ์ง ํฌ๊ธฐ๊ฐ ๋์ค์ง ์์์, ์ ๋ถ ์ผ์ผํ ๋ฆฌ์์ค๋ง๋ค ๋ฌผ์ด๋ด์ผ ํ๋๋ฐ ๊ทธ๊ฒ๋ณด๋ค๋ ๊ทธ๋ฅ ์ด๋๋ก ์งํํ๋ ๊ฒ ๋์ ๊ฒ ๊ฐ์๋ค.
๋ฐฐ๊ฒฝ ๋ฐ ๋ฐฐ๊ฒฝ ์ค๋ธ์ ํธ ์ค์นํ๊ธฐ (๋๋ต์ ์ธ ์ค์น์ผ ๋ฟ ์์ฑ์ ์๋)
๊ณตํฌ ๊ฒ์์ด๋ค ๋ณด๋, ์ ์ญ ์กฐ๋ช ์ธ๊ธฐ๋ฅผ ๋ฎ๊ฒ ํด๋จ๋๋ฐ ๋๋ฌด ์ ๋ณด์ฌ์ ์ ์ ์ฌ๋ ค์ ์บก์ณํ๋ค. ๋ท ๋ฐฐ๊ฒฝ(์ฐ, ๋๋ฌด)๋ ์์ง ์์ ์ค์ด๋ผ๊ณ ํ์ ์ ๊ฒ์ ๋ฐํ์ผ๋ก ์ผ๋จ ํด๋จ๋ค.
2. ์นด๋ฉ๋ผ๊ฐ ์ฃผ์ธ๊ณต ์บ๋ฆญํฐ๋ฅผ ์ถ์ ํ์ฌ ๋ฐ๋ผ๊ฐ๊ฒ ๋ง๋ค๊ธฐ
Unity์์ ์ ๊ณตํ๋ ์๋ค๋จธ์ (Cinemachine)์ ์ฌ์ฉํ๋ฉด ์ํ๊ฐ์ ์นด๋ฉ๋ผ ์ดฌ์์ ํ ์ ์๋ค. ํ์ง๋ง, ์๋ค๋จธ์ ๊ณต๋ถ๋ ๋ชป ํ๊ณ ์คํฌ๋ฆฝํธ๋ก ๊ตฌํํด๋ณด๋ ๊ฒ ์ข ๋ ํ๋ก๊ทธ๋๋ฐ์ ์ผ๋ก ์ป์ ๊ฒ ๋ง์ ๊ฒ ๊ฐ์์ ๋์ ํ๋ค. ๐Dev GomDol ๋์ ์์์ ์ฐธ๊ณ ํ๋ค. ๊ทผ๋ฐ, ์ฌ์ค์ ๋ฐ๋ผ์น๊ณ ์๊ณ ๋ฆฌ์ฆ ์ดํดํ๋ ๊ณผ์ ์ ๊ฑฐ์น ๊ฒ ๋ค๋ค..ใ ใ ใ
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraManager : MonoBehaviour
{
public Transform followingTarget;
public float moveSpeed;
public Vector2 canMoveAreaCenter; // ์นด๋ฉ๋ผ ์ด๋ ๊ฐ๋ฅ์์ญ ์ค์ฌ
public Vector2 canMoveAreaSize; // ์นด๋ฉ๋ผ ์ด๋ ๊ฐ๋ฅ์์ญ ํฌ๊ธฐ
private float cameraHalfWidth; // ์นด๋ฉ๋ผ์ ์๋ ๊ณต๊ฐ์์์ ๊ฐ๋ก ๊ธธ์ด
private float cameraHalfHeight; // ์นด๋ฉ๋ผ์ ์๋ ๊ณต๊ฐ์์์ ์ธ๋ก ๊ธธ์ด
void Awake()
{
cameraHalfHeight = Camera.main.orthographicSize;
cameraHalfWidth = Screen.width * cameraHalfHeight / Screen.height;
}
void LateUpdate() /* ์นด๋ฉ๋ผ ์ด๋์ LateUpdate()์์ ์ฒ๋ฆฌ */
{
FollowTarget();
}
private void OnDrawGizmos() /* ์นด๋ฉ๋ผ๊ฐ ํ๊ฒ์ ๋ฐ๋ผ ์ด๋์ด ๊ฐ๋ฅํ ์์ญ์ ํ์ */
{
Gizmos.color = Color.red;
Gizmos.DrawWireCube(canMoveAreaCenter, canMoveAreaSize);
}
private void FollowTarget()
{
Vector3 targetPosition = new Vector3(followingTarget.position.x,
this.transform.position.y,
this.transform.position.z);
this.transform.position = Vector3.Lerp(this.transform.position,
targetPosition,
moveSpeed * Time.deltaTime);
float restrictionAreaX = canMoveAreaSize.x * 0.5f - cameraHalfWidth;
float clampX = Mathf.Clamp(this.transform.position.x,
-restrictionAreaX + canMoveAreaCenter.x,
restrictionAreaX + canMoveAreaCenter.x);
float restrictionAreaY = canMoveAreaSize.y * 0.5f - cameraHalfHeight;
float clampY = Mathf.Clamp(this.transform.position.y,
-restrictionAreaY + canMoveAreaCenter.y,
restrictionAreaY + canMoveAreaCenter.y);
this.transform.position = new Vector3(clampX, clampY, this.transform.position.z);
}
}
์นด๋ฉ๋ผ๊ฐ ์ด๋ํ ์ ์๋ ์์ญ์ ๋จผ์ ์ค์ ํ๊ณ , ๊ทธ ๋ฐ์ ๋์ด๊ฐ๋ ค๊ณ ํ๋ฉด ์นด๋ฉ๋ผ ์ด๋์ด ๋ ์ด์ ์ ๋๋๋ก ํ๋ค.
์์ธํ ์๊ณ ๋ฆฌ์ฆ์ ์์ ๊ฑธ์ด๋ ๋งํฌ ์์์ ์๋ค.
์๊ฐํ๊ณ , ์ด๊ฒ์ ๊ฒ ์ฐพ์๋ณธ ๊ฑด ๋ง์๋ฐ ๊ตฌํํ ๊ฑด ๋ณ๋ก ์๋ค.....ใ ใ ใ ํ๋ก์ ํธ ๋ง๊ฐ์ผ์ด ๋ค๊ฐ์ค๋๋ฐ...
3. ์นด๋ฉ๋ผ ์ถ์ ์ด๋ ๋ฐ ์ ํ๊ตฌ์ญ ์ค์ ์๋ฃ