[๋ณธ ํฌ์คํ ์ Youtube ๊ณจ๋๋ฉํ๋์
'์ ๋ํฐ ๋ฑ์๋ผ์ดํฌ' ๊ฐ์ ์์์ ์ ๋ฆฌํ ํฌ์คํ ์ ๋๋ค.]
RPG ๊ฒ์์๋ ๊ผญ ํ์ํ ์์๋ก ๋ชฌ์คํฐ(Enemy)๊ฐ ํ์ํ๋ค.
๋ชฌ์คํฐ Sprite๋ฅผ Hierarchy์ ์ถ๊ฐํ๊ณ ์ ๋๋ฉ์ด์ ๊น์ง ์ ์ฉํ๋ ๊ฑด ์ง๋ ํฌ์คํ ์์ ์ ๋ฆฌํ๋ค.
[Unity] ๋ก๊ทธ๋ผ์ดํฌ ์์กด RPG (2) - 2D ์ ์ ๋๋ฉ์ด์ ์ ์
[Unity] ๋ก๊ทธ๋ผ์ดํฌ ์์กด RPG (2) - 2D ์ ์ ๋๋ฉ์ด์ ์ ์
[๋ณธ ํฌ์คํ ์ Youtube ๊ณจ๋๋ฉํ๋์ '์ ๋ํฐ ๋ฑ์๋ผ์ดํฌ' ๊ฐ์ ์์์ ์ ๋ฆฌํ ํฌ์คํ ์ ๋๋ค.] 2D ์ ์ ๋๋ฉ์ด์ ์ ์์ ํ๊ธฐ ์ํด์๋ Unity์ Animator ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ๊ฐํธํ๋ค. Animator ๋จผ์ , ์์ฑํ
pids.tistory.com
ํ๋ ์ด์ด ์ถ์ ๋ก์ง
์ฌ๊ธฐ์๋ ๋ชฌ์คํฐ๊ฐ ํ๋ ์ด์ด๋ฅผ ์ถ์ ํ๊ณ ํ๋ฉด์์ ๋ฉ์ด์ง ๊ฒฝ์ฐ Player ์์ผ๋ก ์ฌ๋ฐฐ์น๋๋ ๋ก์ง์ ๋ง๋ค์ด๋ณด์.
๋ชฌ์คํฐ์๊ฒ ์ ์ฉํ ์๋ก์ด ๋ชฌ์คํฐ ์คํฌ๋ฆฝํธ๋ฅผ ์๋กญ๊ฒ ์์ฑํด์ผ ํ๋ค.
public float speed;
public Rigidbody2D target;
bool isLive
Rigidbody2D rigid;
SpriteRenderer spriter;
๋ชฌ์คํฐ์ ์ด๋ ์๋๋ฅผ ์ค์ ํ๋ speed์ ๋๊ตฌ๋ฅผ ๋ฐ๋ผ๊ฐ๊ฒ ์ค์ ํ ์ง ์ ํ๋ target์ public์ผ๋ก ์ ์ธํ๊ณ ,
๋ชฌ์คํฐ๊ฐ ์ด์์๋์ง ์ฃฝ์๋์ง ํ์ธํ๋ bool ํํ์ isLive,
void Awake()
{
rigid = GetComponent<Rigidbody2D>();
spriter = GetComponent<SpriteRenderer>();
}
๊ทธ๋ฆฌ๊ณ Rigidbody2D์ SpriteRenderer๋ฅผ ์ ์ธํ๊ณ Awake()๋ฌธ์์ ์ด๊ธฐํ๋ฅผ ํ๋ฉด
Player์ ๋ฐ๋ผ์ค๋๋ฐ ํ์ํ ๋ณ์๋ ์ค๋น๊ฐ ๋์๋ค.
void FixedUpdate()
{
if (!isLive)
return;
Vector2 dirVec = target.position - rigid.position;
Vector2 nextVec = dirVec.normalized * speed * Time.fixedDeltaTime;
rigid.MovePosition(rigid.position + nextVec);
rigid.velocity = Vector2.zero;
}
๋ฌผ๋ฆฌ ์ด๋์ด๊ธฐ ๋๋ฌธ์ FixedUpdate()์์ ์์ฑ์ ํด์ผํ๋ค.
๋จผ์ ์กฐ๊ฑด๋ฌธ์ ํตํด ๋ชฌ์คํฐ๊ฐ ์ด์์๋์ง ํ์ธํ๊ณ ์ฃฝ์๋ค๋ฉด ์๋ ์ฝ๋๊ฐ ์คํ๋๋ฉด ์ ๋จ์ผ๋ก return ์ํค๋ฉด ๋๋ค.
Vector2 dirVec์ targer(Player)์ ๋ฐฉํฅ์ ๋ด์ ๋ณ์์ด๋ค.
Vector2 nextVec์ ์์ผ๋ก ๋ชฌ์คํฐ๊ฐ ๊ฐ์ผ ํ ๋ค์ ์์น๋ฅผ ๋ด๋ ๋ณ์์ด๋ค.
dirVec์ 1์ด ์๋์ผ๋ก normalized๋ฅผ ํตํด ์ ๊ทํ์์ผ์ฃผ๊ณ ,
๋ชฌ์คํฐ์๊ฒ ์ค์ ํ speed๋ฅผ ๊ณฑํ์ฌ, ํ๋ ์์ ์ํฅ์ผ๋ก ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง์ง ์๋๋ก FixedDeltaTime์ ์ฌ์ฉํด์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ rigid.MovePosition()์ ํตํด ๋ชฌ์คํฐ์ ํ์ฌ position์์ ๋ค์ ์์น์ธ nextVec์ ๋ํ๋ฉด ์์ฑ์ด๋ค.
ํ์ง๋ง ์ด๋ ๊ฒ ์ฝ๋๋ฅผ ์คํํ๋ฉด Enemy์ Player๊ฐ ๋ถ๋ชํ๋ฉด ๋ฐ๋ ค๋๋ ํ์์ด ๋ฐ์ํ๋ค.
๊ทธ๋ ๊ธฐ์ Enemy์ rigid.velocity๋ฅผ zero๋ก ๋ง๋ค์ด์ฃผ๋ ์ฝ๋๋ ์์ฑํด์ผ ํ๋ค.
๋ํ, Enemy์ RigidBody2D์ Gravity Scale(์ค๋ ฅ์ ์ํฅ)์ 0์ผ๋ก ์ค์ ํ๊ณ ,
๋ถ๋ชํ ๋ Enemy๋ Player๊ฐ ํ์ ํ๋ ํ์์ ๋ง๊ธฐ ์ํด Constraints์์ Freeze Rotation์ Z์ถ๋ ์ฒดํฌ๋ฅผ ํด์ผ ํ๋ค.
๋ํ Enemy์ ํผ๊ฒฉ ๋ฒ์๋ฅผ ํ์ธํ๊ธฐ ์ํด Capsule Collider2D๋ ์ถ๊ฐํ์ฌ Size๋ฅผ ์ค์ ํ๋ฉด ๋๋ค.
์ด์ Enemy๊ฐ Player์ ๋ฐฉํฅ์ ์ธ์ ๋ ์ง ๋ฐ๋ผ๋ณด๊ฒ ์ค์ ๋ง ํ๋ฉด ๋๋ค.
void LateUpdate()
{
spriter.flipX = target.position.x < rigid.position.x;
}
spriter์ค์ ์ LateUpdate()์์ ์์ฑํ๋ฉด ๋๋ค.
๋ฐฉํฅ์ ์ค์ ํ๊ธฐ ์ํด์๋ ๋ชฉํ์ X์ถ ๊ฐ๊ณผ ์์ ์ X์ถ ๊ฐ์ ๋น๊ตํ์ฌ ์์ผ๋ฉด true๊ฐ ๋๋๋ก ์ค์ ํ๋ฉด ๋๋ค.
์ด๋ ๊ฒ ์ค์ ํ๋ฉด ์์ ์ ์ผ๋ก Player์ ๋ฐ๋ผ์ค๊ฒ ๋๋ค.
๋ชฌ์คํฐ ์ฌ๋ฐฐ์น
์ด๋ ๊ฒ Player์ ์ซ์์ค๊ฒ ์ค์ ํ์์ง๋ง, Player๊ฐ Enemy๋ณด๋ค speed๊ฐ ๋ ๋น ๋ฅธ ์ํฉ์์
ํ์ชฝ ๋ฐฉํฅ์ผ๋ก ์ญ ๊ฐ๋ค๋ฉด, Enemy๋ Player์ ์ซ์์ฌ ์ ์๊ฒ ๋๋ค.
๊ทธ๋ ๊ธฐ์ ํ๋ฉด์์ ์ฌ๋ผ์ง Enemy๋ฅผ ๋ค์ Player ์์ผ๋ก ์ฌ๋ฐฐ์นํ์ฌ ๊ฒ์์ ๊ธด์ฅ๊ฐ์ ์ถ๊ฐํด์ผ ํ๋ค.
์ฌ๋ฐฐ์น๋ฅผ ์งํํ๋ ๊ฒ์ด๊ธฐ์ Enemy Script๊ฐ ์๋ Reposition Script์์ ์์ฑํด์ผ ํ๋ค.
(ํ Object์ ์ฌ๋ฌ ๊ฐ์ Script๋ฅผ ์ ์ฉํ ์ ์๋ค.)
case "Enemy":
if (coll.enabled)
{
transform.Translate(playerDir * 20 + new Vector3(Random.Range(-3f, 3f), Random.Range(-3f, 3f),0f));
}
break;
Tile map ์ฌ๋ฐฐ์น์์ ์์ฑํ swich๋ฌธ์์ Enemy case๋ฅผ ์ถ๊ฐ ์์ฑํ๋ฉด ๊ฐ๋จํ๋ค.
๋จผ์ , ์กฐ๊ฑด๋ฌธ์ ํตํด์ Enemy์ Collider๊ฐ ํ์ฑํ๋์ด ์๋์ง ํ์ธํ๋ค.
(๋ฌผ๋ก ์ฝ๋ ์ด๋ฐ์ Collider2D๋ฅผ ์ ์ธํ๊ณ Awake()์์ ์ด๊ธฐํ๋ฅผ ํด์ค์ผ ํ๋ค.)
ํ์ฑํ๋ฅผ ํ์ธํ๋ ์ด์ ๋ ๋์ค์ Enemy๊ฐ ์ฃฝ์ผ๋ฉด Enemy์ Collider์ ๋นํ์ฑํ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๋ค์์ผ๋ก transform.Translate()๋ฅผ ํตํด Enemy์ ์์น๋ฅผ ์ฎ๊ฒจ์ฃผ๋ฉด ๋๋ค.
playerDir(ํ๋ ์ด์ด ์ด๋ ๋ฐฉํฅ)์ผ๋ก 20๋งํผ์ ๊ฑฐ๋ฆฌ ๋ค์ -3f์ 3 ์ฌ์ด์ ๋๋ค ํ ๊ฑฐ๋ฆฌ์์ ์ฌ๋ฐฐ์นํ๋ฉด ๋๋ค.
์ด์ , Enemy์ Reposition Script๋ฅผ ์ถ๊ฐํ๊ณ , Enemy Tag๋ ์ถ๊ฐ ์ ์ฉํ๋ฉด
ํ๋ฉด์์ Enemy๊ฐ ์ฌ๋ผ์ ธ๋ Player ์์ผ๋ก ์ฌ๋ฐฐ์น๋์ด ๊ณ์ ๋์ค๋ ๊ฑธ ํ์ธํ ์ ์๋ค.
+ Player๊ฐ Enemy๋ฅผ ๋ฐ ์ ์๋๋ก Player์ Rigidbody 2D์์ Mass๋ฅผ ๋๋ ค์ค์ผ ํ๋ค.
'๐ฎ Unity > Project' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Unity] ๋ก๊ทธ๋ผ์ดํฌ ์์กด RPG (5) - ๋ชฌ์คํฐ ์ํ (0) | 2024.04.17 |
---|---|
[Unity] ๋ก๊ทธ๋ผ์ดํฌ ์์กด RPG (3) - ๋ฌดํ ๋งต ์ด๋ (1) | 2024.03.10 |
[Unity] ๋ก๊ทธ๋ผ์ดํฌ ์์กด RPG (2) - 2D ์ ์ ๋๋ฉ์ด์ ์ ์ (0) | 2024.02.28 |
[Unity] ๋ก๊ทธ๋ผ์ดํฌ ์์กด RPG (1) - ํ๋ ์ด์ด ์ด๋ ๊ตฌํ (1) | 2024.02.07 |
๋ฌผ๋ฆฌ ์ด๋ ๊ตฌํ (1) | 2023.02.12 |