[๋ณธ ํฌ์คํ ์ Youtube ๊ณจ๋๋ฉํ๋์
'์ ๋ํฐ ๋ฑ์๋ผ์ดํฌ' ๊ฐ์ ์์์ ์ ๋ฆฌํ ํฌ์คํ ์ ๋๋ค.]
์บ๋ฆญํฐ์ ๋ฌผ๋ฆฌ์ ์ธ ์์ง์๊ณผ ์ ๋๋ฉ์ด์ ์ด ์๋ค๋ฉด ๊ทธ ์บ๋ฆญํฐ๊ฐ ์์ง์ผ Map์ด ํ์ํ๋ค.
ํด๋น ๊ฒ์์ ๋ฑํ์ด์ด ์๋ฐ์ด๋ฒ ๋ฅ ๊ฒ์์ด๊ธฐ ๋๋ฌธ์ Tile Map์ ํ์ฉํ๋ฉด ๋๋ค.
ํ์ผ ๊ทธ๋ฆฌ๊ธฐ
Window > 2D > Tile Palette๋ฅผ ์ด๋ฉด Tile Palette ์ฐฝ์ด ์ด๋ฆฌ๊ฒ ๋๋ค.
์ฐฝ์ ์ด์ด ๋๊ณ Project์ +๋ฅผ ๋๋ฌ์ Rule Tile๋ ์์ฑํด์ผ ํ๋ค.
2D > Tile > Rule Tile๋ก ์์ฑํ๋ฉด ๋๋ค.
ํด๋น ๊ฒ์์ ๋งต์ ๊ณ์ ์ฌํ์ฉ๋๋ ํ์ผ๋งต 4๊ฐ๊ฐ ์๋ ๋งต์ผ๋ก,
ํ์ผ์ ๋๋ค์ฑ์ ์ฃผ๋ฉด ์๊ฐ์ ์ฌ๋ฏธ๊ฐ ๋ํด์ง๋ค.
Tilling Rules๋ฅผ 1๋ก ์ค์ ํ๊ณ 1๊ฐ์ ํ์ผ์ Output์ Random์ผ๋ก ์ค์ ํ๋ฉด ๋๋ค.
๊ทธ๋ ๊ฒ ๋๋ฉด ์ค๋น๋ 10๊ฐ์ ํ์ผ์ ๋ฃ์ด, 10๊ฐ ์ค 1๊ฐ์ ํ์ผ์ด ๋๋ค์ผ๋ก ๋์ค๊ฒ ๋๋ค.
์ด๋ ๊ฒ Tile์ ๊ทธ๋ฆด ์ค๋น๊ฐ ๋ค ๋์๋ค๋ฉด Hierarchy์ +๋ฅผ ๋๋ฌ์ Ractangular๋ฅผ ๋ง๋ค๋ฉด ๋๋ค.
2D Object > Tilemap > Rectangular๋ก ์์ฑํ๋ฉด ๋๋ค.
๊ทธ ํ Tile Palette๋ฅผ ํตํด์ Map Tile์ ๊ทธ๋ ค์ฃผ๋ฉด ๋๋ค.
ํด๋น ๊ฒ์์ ๋งต์ ์ํ์ข์ฐ 10์นธ์ฉ ๊ทธ๋ ค ์ด 20์นธ์ ๊ทธ๋ฆฌ๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ Rule Tile์ Noise๋ฅผ ์์ ํ๊ฒ ๋๋ฉด ๋ค๋ฅธ ๋๋ค ํ ํ์ผ๋ค์ด ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ฌ๋ฐฐ์น ์ด๋ฒคํธ ์ค๋น
์ด๋ ๊ฒ ํ์ผ์ด ์ค๋น๊ฐ ๋ค ๋์์ผ๋ฉด Hierarchy์ Tilemap์ Tilemap Collider 2D๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค.
์ถ๊ฐํ๊ณ ๋๋ฉด ํ์ผ๋ง๋ค ๋๋์ด ์๋๋ฐ ๋๋ ์ง ํํ๋ฅผ ํฉ์น๋ Composite Collider 2D๋ ์ถ๊ฐํด ์ฃผ์.
๊ทธ๋ฆฌ๊ณ Tilemap Collider 2D์์ ์ถ๊ฐํ Composite์ ์ฌ์ฉํ๋ค๋ Used By Composite์ ์ฒดํฌํ๋ฉด ๋๋ค.
์ด๋ ๊ฒ ๋๋ฉด ๋ชจ๋ ๊ฒ์ Composite Collider 2D๋ก ์์ํ๊ธฐ ๋๋ฌธ์ Composite Collider 2D์์ Is Trigger์ ์ฒดํฌํด์ผ ํ๋ค.
๋ํ, Rigidbody 2D๋ Body Type์ Static์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
์ด์ ๋ Tile๊ณผ Player ๋ฑ ๊ตฌ๋ถ์ ํ ์ ์๋ Ground, Area๋ฅผ Add Tag๋ก ์ถ๊ฐํ๋ฉด ๋๋ค.
Tile์ Ground๋ก Tag๋ฅผ ์ค์ ํ๊ณ , Player์ ์์ Object๋ก Area๋ฅผ ์์ฑํ์ฌ Tag๋ฅผ ์ถ๊ฐํด ์ฃผ์.
๋ํ ๊ฒฝ๊ณ๋ฅผ ํ์ธํ๋ Area Object์ Box Collider 2D๋ฅผ ์ถ๊ฐํ๊ณ Size 20, 20๊ณผ Is Trigger ์ฒดํฌ๋ฅผ ํ๋ฉด ๋๋ค.
์ฌ๋ฐฐ์น ๋ก์ง
์ด๋ ๊ฒ ์ค๋น๋ Tile map ์ด๋ ์คํฌ๋ฆฝํธ๋ก๋ GameManger์ Reposition์ด ํ์ํ๋ค.
Hierarchy์ GameManager(๋น Object)๋ฅผ ์์ฑํ๊ณ GameManager ์คํฌ๋ฆฝํธ๋ฅผ ๋ฃ์ด์ฃผ๊ณ ,
๋ง๋ค์ด์ค Reposition์ ๋ชจ๋ Tilemap์ ๋ฃ์ด์ฃผ๋๋ก ํ์.
public class GameManager : MonoBehaviour
{
public static GameManager instance;
public Player player;
private void Awake()
{
instance = this;
}
}
์ฌ๋ฐฐ์น์ ํ์ํ GameManger๋ Player์ ์ ๋ณด๋ง์ Reposition์์ ๋ถ๋ฌ์ค๋ ๊ฒ์ด๊ธฐ์
static ์ํ๋ก ์๊ธฐ ์์ ์ ๋ฉ๋ชจ๋ฆฌ์ ์น์ด ๋ฒ๋ฆฌ๊ณ , Player์ ๊ฐ์ ธ์ค๋ฉด ๋๋ค.
(static : ์ ์ ์ผ๋ก ์ฌ์ฉํ๊ฒ ๋ค๋ ํค์๋. ๋ฐ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์น์ด๋ฒ๋ฆฐ๋ค.)
์ ์ ๋ณ์๋ ์ฆ์ ํด๋์ค์์ ๋ถ๋ฅผ ์ ์๋ค๋ ํธ๋ฆฌํจ์ด ์๋ค.
์ฌ๋ฐฐ์น๋ฅผ ์คํํ๋ Reposition์ ๋ก์ง์ ๋ค์๊ณผ ๊ฐ๋ค.
if (!collision.CompareTag("Area"))
return;
Trigger๊ฐ ์ฒดํฌ๋ Collider์์ ๋๊ฐ์ ๋ ์คํํ๋ OnTriggerExit2D ํจ์๋ฅผ ์์ฑํด ์ฃผ๊ณ ,
๊ฐ์ฅ ๋จผ์ Tile๊ณผ Player์ Area๋ ์ถฉ๋์์ ๋ฒ์ด๋ฌ์ ๋๋ง ์คํ๋์ด์ผ ํ๊ธฐ์,
๋จผ์ OnTriggerExit2D์ ๋งค๊ฐ๋ณ์์ธ ์๋๋ฐฉ ์ฝ๋ผ์ด๋์ ํ๊ทธ๋ฅผ ์กฐ๊ฑด์ผ๋ก
Area Tag๊ฐ ์๋๋ฉด ๋ฐํํ๋ ์ฝ๋๋ฅผ ์คํํด์ผ ํ๋ค.
์ดํ X์ถ์ผ๋ก ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ์ด์ง ์ง, Y์ถ์ผ๋ก ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ์ด์ง์ง ํ์ธํ๋ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ค.
Vector3 PlayerPos = GameManager.instance.player.transform.position;
Vector3 myPos = transform.position;
float diffX = Mathf.Abs(PlayerPos.x - myPos.x);
float diffY = Mathf.Abs(PlayerPos.y - myPos.y);
Vector3 playerDir = GameManager.instance.player.inputVec;
float dirX = playerDir.x < 0 ? -1 : 1;
float dirY = playerDir.y < 0 ? -1 : 1;
PlayerPos์์๋ GameManager๊ฐ ๊ฐ์ง๊ณ ์๋ Player์ Position์ ๊ฐ์ ธ์ค๊ณ ,
myPos์์๋ ํด๋น Tile์ Position์ ๊ฐ์ ธ์์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ Player์ ์์น์ Tile์ ์์น์ ์ฐจ์ด์ ๊ฐ์ ๊ฐ์ ธ์ค๋ float ํํ์ diffX์ diffY๋ฅผ ๊ฐ์ ธ์ค๋๋ฐ,
์ ๋๊ฐ์ผ๋ก ๊ฐ์ ธ์์ผ ํ๊ธฐ์ MathF.Abs() ํจ์๋ฅผ ํตํด์ X์ถ๊ณผ Y์ถ์ ๊ฐ์ ๊ฐ์ ธ์์ผ ํ๋ค.
ํ์ง๋ง, ํ๋ ์ด๊ฑฐ๊ฐ ๋๊ฐ์ ์ผ๋ก ์ด๋ํ ๋๋ 1๋ณด๋ค ์์ ๊ฐ์ด ๋์ค๊ธฐ ๋๋ฌธ์
ํ๋ ์ด์ด์ ์ด๋ ๋ฐฉํฅ์ ์ ์ฅํ๊ธฐ ์ํ ๋ณ์์ธ Vector3 ํํ์ playerDir์ ์ถ๊ฐํ์ฌ,
์ผํญ์ฐ์ฐ์๋ก 1๊ณผ -1๋ก ๋ฐํํด ์ฃผ๋ฉด ๋๋ค.
ํด๋น ๊ฐ์ ๋๊ฐ์ ์ ์ด๋ ๊ฐ์ด๋ ์บ๋ฆญํฐ์ ๋ฐฉํฅ์ ๋ํ๋ด๊ฒ ๋๋ค.
์ฌ๋ฐฐ์น๋ฅผ ์งํํ๋ ๋ก์ง์ ์ฌ๋ฌ ๊ฐ์ง ํ๊ทธ๋ณ๋ก ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ Switch๋ฌธ์ผ๋ก ์์ฑํ๋ฉด ๋๋ค.
switch (transform.tag)
{
case "Ground":
if (diffX > diffY)
{
transform.Translate(Vector3.right * dirX * 40);
}
else if (diffX < diffY)
{
transform.Translate(Vector3.up * dirY * 40);
}
break;
case "Enemy":
break;
}
์์ ์ Tag๊ฐ Ground์ผ ๋ ์คํ๋๋ ๋ถ๋ถ์ ์ฌ๋ฐฐ์น ๋ก์ง์ผ๋ก ํ์ฌ
๋ ์ค๋ธ์ ํธ์ ๊ฑฐ๋ฆฌ ์ฐจ์ด์์ X์ถ์ด Y์ถ๋ณด๋ค ํฌ๋ฉด ์ํ์ผ๋ก ์ด๋ํ๋ Translate๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
(Translate : ์ง์ ๋ ๊ฐ๋งํผ ํ์ฌ ์์น์์ ์ด๋)
transform.Translate(๋ฐฉํฅ * ์ข, ์ฐ * ์ด๋ํ ๊ฐ)์ ๋ฃ์ด์ฃผ๋ฉด ํด๋น ๋ฐฉํฅ์ผ๋ก ์ง์ ๋ ๊ฐ๋งํผ ์ด๋ํ๊ฒ ๋๋ค.
TIP

Scene์ฐฝ์ Snapping ์์น๋ฅผ ๋ณ๊ฒฝํ๊ณ
Ctrl + ๊ธฐ์ฆ๋ชจ ๋๋๊ทธ๋ฅผ ํ๊ฒ ๋๋ฉด ์ค์ ๋ ์์น๋งํผ Object ์ด๋์ด ๊ฐ๋ฅํ๋ค.
์ด๋ฌ๋ฉด ์ฌ๋ฐฐ์น์ ํ์ํ ์คํฌ๋ฆฝํธ ์์ฑ์ ๋์ด๋ค.
์ด์ Tile map ์ค๋ธ์ ํธ๋ฅผ Ctrl+D ํ์ฌ ์ธ ๋ฒ ๋ณต์ฌํ๊ณ ์๋ง๊ฒ ๋ฐฐ์นํ๋ฉด ๋๋ค.
์นด๋ฉ๋ผ ์ค์
์ด๋ ๊ฒ ํ์ผ์ด ์ด๋ ๋ฐฉํฅ์ ๋ง๊ฒ ์ฌ๋ฐฐ์น๊ฐ ๋๋ ๊ฑธ ํ์ธํ ์ ์์ง๋ง, ์นด๋ฉ๋ผ๋ ๊ฐ์ด ์ด๋ํ์ง ์๋๋ค.
๋ํ, Game์ ์คํํ๋ฉด Tile์ด ๊ตฐ๋ฐ๊ตฐ๋ฐ ํ์ด ์๊ฒจ Pixel์ด ๊นจ์ ธ ๋ณด์ธ๋ค.
๊ทธ๋ ๊ธฐ์ Main Camera์์ Pixel Perfect Camera ์ปดํฌ๋ํธ๋ฅผ ์ถ๊ฐํ์ฌ
Pixel Per Unit์ 18๋ก ๋ณ๊ฒฝํ๊ณ Game ์ฐฝ์ ๋๋ฆฌ๊ฑฐ๋ ์ค์ฌ์ ์ง์๋ฅผ ๋ง์ถ๋ฉด ๊น๋ํ๊ฒ ๋ณด์ด๊ฒ ๋๋ค.
Reference Resolution์ ์นด๋ฉ๋ผ ํฌ๊ธฐ ๊ณ์ฐ์ ์ํ ์ฐธ๊ณ ํด์๋์ธ๋ฐ ์๋ง๊ฒ ์กฐ์ ํ๋ฉด ๋๋ค.
TIP

Game ์ฐฝ์ Simulator ๊ธฐ๋ฅ์ผ๋ก ๋ชจ๋ฐ์ผ ์ํฉ์ ๋ฏธ๋ฆฌ ํ์ธ์ด ๊ฐ๋ฅํ๋ค.
์ด์ ์นด๋ฉ๋ผ๊ฐ Player์ ๋ฐ๋ผ๊ฐ๋๋ก ํ๊ธฐ ์ํด Window > Package Manager์์ Chinemachine์ ์ค์นํ๋ฉด ๋๋ค.
(Packages๋ฅผ Unity Registry๋ก ๋ณ๊ฒฝํด์ผ ํ์ธ ๊ฐ๋ฅํ๋ค.)
์ด์ Hierarchy์์ +๋ฅผ ๋๋ฌ Chinemachine์ Virtual Camera๋ฅผ ์ถ๊ฐํด ์ฃผ์.
์ด๋ ๊ฒ ์ถ๊ฐํ๋ฉด Virtual Camera๊ฐ Main Camera์ ๊ฐ๋ ์ญํ ์ ํ๊ฒ ๋๋ค.
๊ทธ๋ฆฌ๊ณ , Virtual Camera์ Follow์ Player์ ํ ๋นํ๋ฉด ๋๋ค.
์ด๋๋ก ์คํํ๊ฒ ๋๋ฉด Camera๊ฐ Player์ ๋ฐ๋ผ๊ฐ๊ธด ํ์ง๋ง ๋ฏธ์ธํ ์ง๋์ด ์๊ธด๋ค.
ํด๋น ๊ฒ์์ ๋ฌผ๋ฆฌ ์ด๋์ ํตํด์ ์์ง์ด๊ธฐ ๋๋ฌธ์ Fixed Update๋ก ๋ณ๊ฒฝํ๋ฉด ๋๋ค.
'๐ฎ Unity > Project' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Unity] ๋ก๊ทธ๋ผ์ดํฌ ์์กด RPG (5) - ๋ชฌ์คํฐ ์ํ (0) | 2024.04.17 |
---|---|
[Unity] ๋ก๊ทธ๋ผ์ดํฌ ์์กด RPG (4) - ๋ชฌ์คํฐ ๋ง๋ค๊ธฐ (0) | 2024.03.13 |
[Unity] ๋ก๊ทธ๋ผ์ดํฌ ์์กด RPG (2) - 2D ์ ์ ๋๋ฉ์ด์ ์ ์ (0) | 2024.02.28 |
[Unity] ๋ก๊ทธ๋ผ์ดํฌ ์์กด RPG (1) - ํ๋ ์ด์ด ์ด๋ ๊ตฌํ (1) | 2024.02.07 |
๋ฌผ๋ฆฌ ์ด๋ ๊ตฌํ (1) | 2023.02.12 |