[๋ณธ ํฌ์คํ ์ Youtube ๊ณจ๋๋ฉํ๋์
'์ ๋ํฐ ๋ฑ์๋ผ์ดํฌ' ๊ฐ์ ์์์ ์ ๋ฆฌํ ํฌ์คํ ์ ๋๋ค.]
๋ชฌ์คํฐ์ ๊ธฐ๋ณธ์ ์ธ ํด์ ๋ง๋๋ ๊ณผ์ ์ ์งํํ๋ค๋ฉด,
์ด์ ๋ชฌ์คํฐ๋ฅผ ์๋์ผ๋ก ๋ ๋ฒจ์ ๋ง๊ฒ ์ํํ๊ณ , ์ฌํ์ฉํ๋ ์ต์ ํ ๊ณผ์ ์ด ํ์ํ๋ค.
ํ๋ฆฌํฉ ๋ง๋ค๊ธฐ
๋จผ์ Prefab์ ๋ฐ๋ก ๋ณด๊ดํ ํด๋๋ฅผ Project์ ์์ฑํด์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ค๋ธ์ ํธ๋ฅผ ๋๋๊ทธ ๋๋กญํ์ฌ ํ๋ฆฌํฉ์ผ๋ก ๋ณํํ๋ฉด ๋๋ค.
์ด๋ ๊ฒ ํ๋ฆฌํฉ์ผ๋ก ์ค์ ํ๋ฉด ํ๋ฆฌํฉ๊ณผ ์ฐ๊ฒฐ๋ ์ค๋ธ์ ํธ๋ ์์ด์ฝ๊ณผ ์์์ด ๋ค๋ฅด๋ค.
ํ๋ฆฌํฉ์ ์ค์ ์ ๋ฐ๊พธ๋ฉด Scene์ ํ๋ฆฌํฉ๊ณผ ์ฐ๊ฒฐ๋ ๋ชจ๋ ์ค๋ธ์ ํธ๋ ๋์ผํ๊ฒ ๋ฐ๋๊ฒ ๋๋ค.
์ค๋ธ์ ํธ ํ ๋ง๋ค๊ธฐ
ํ๋ฆฌํฉ์ ๋ง๋ค์๋ค๋ฉด ํ๋ฆฌํฉ์ ๊ด๋ฆฌํด์ค ํ์ด ํ์ํ๋ค.
Hierarchy์ ๋น ์ค๋ธ์ ํธ๋ก PoolManager์ ์์ฑํด ์ฃผ๊ณ ,
์ฝ๋๋ฅผ ์ ์ด์ค PoolManager ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
๋จผ์ PoolManager ์คํฌ๋ฆฝํธ์๋ ํ๋ฆฌํฉ๋ค์ ๋ณด๊ดํ ๋ณ์์ ํ ๋ด๋น์ ํ๋ ๋ฆฌ์คํธ๋ค์ด ํ์ํ๋ค.
// .. ํ๋ฆฌํฉ๋ค์ ๋ณด๊ดํ ๋ณ์
public GameObject[] prefabs;
// .. ํ ๋ด๋น์ ํ๋ ๋ฆฌ์คํธ๋ค
List<GameObject>[] pools;
์ด์ ๋ณ์๋ฅผ ์ ์ธํ๋ค๋ฉด ์ ์ธํ ๋ฆฌ์คํธ๋ฅผ ์ด๊ธฐํ๋ฅผ ์งํํด์ผ ํ๋ค.
void Awake()
{
pools = new List<GameObject>[prefabs.Length];
for(int i = 0; i < pools.Length; i++)
{
pools[i] = new List<GameObject>();
}
}
๋จผ์ pools์ ๋ฐฐ์ด์ ์ด๊ธฐํํด์ฃผ๊ณ , ๋ฐ๋ณต๋ฌธ for๋ฌธ์ ์ฌ์ฉํ์ฌ ์ฐจ๋ก๋ก ์ด๊ธฐํํ๋ฉด ๋๋ค.
ํ๋ง ํจ์ ์์ฑ
์ด์ ์์ฑ๋ ๊ฒ์ ์ค๋ธ์ ํธ๋ฅผ ๋ฐํํ๋ ํจ์์ธ Get ํจ์๋ฅผ ๋ง๋ค๋ฉด ๋๋ค.
์ธ์ ์ด๋์๋ ์ฌ์ฉํด์ผ ํ๊ธฐ์ public์ผ๋ก ๋ง๋ค๋ฉด ๋๋ค.
๋ํ, ๊ฐ์ ธ์ฌ ์ค๋ธ์ ํธ ์ข ๋ฅ๋ฅผ ๊ฒฐ์ ํ๋ ๋งค๊ฐ๋ณ์(int index)๋ ์ถ๊ฐํด์ผ ํ๋ค.
public GameObject Get(int index)
{
GameObject select = null;
// ... ์ ํํ ํ์ ๋๊ณ (๋นํ์ฑํ ๋) ์๋ ๊ฒ์์ค๋ธ์ ํธ ์ ๊ทผ
foreach (GameObject item in pools[index])
{
if (!item.activeSelf)
// ... ๋ฐ๊ฒฌํ๋ฉด select ๋ณ์์ ํ ๋น
{
select = item;
select.SetActive(true);
break;
}
}
// ... ๋ชป์ฐพ์์ผ๋ฉด?
if (!select)
// ... ์๋กญ๊ฒ ์์ฑํ์ฌ selet ๋ณ์์ ํ ๋น
{
select = Instantiate(prefabs[index], transform);
pools[index].Add(select);
}
return select;
}
๋จผ์ , ๊ฒ์์ค๋ธ์ ํธ ์ง์ญ๋ณ์(select)์ ๋ฆฌํด์ ๋ฏธ๋ฆฌ ์์ฑํด ์ฃผ์.
๊ทธ ์ฌ์ด์ ๋ค์ด๊ฐ ์ฝ๋๋ ๋ ๊ฐ์ง ์ํฉ์ผ๋ก ๊ตฌ๋ถ๋๋ค.
๋งค๊ฐ ๋ณ์๋ก ๋ฐ์ index์ ๊ฒ์์ค๋ธ์ ํธ๊ฐ pool ์์์ ์ด๋ฏธ ์๋๋ฐ ๋นํ์ฑํ๋์ด ์๋ค๋ฉด,
ํด๋น ์ค๋ธ์ ํธ๋ฅผ select ๋ณ์์ ํ ๋นํ๊ณ ํ์ฑํ์ํค๋ฉด ๋๋ค.
๋ง์ฝ ์ฐพ์ง ๋ชปํ๋ค๋ฉด Instantiate ํจ์๋ฅผ ํตํด์ ์์ฑํ๋ฉด ๋๋ค.
Instantiate : ์๋ณธ ์ค๋ธ์ ํธ๋ฅผ ๋ณต์ ํ์ฌ ์ฅ๋ฉด์ ์์ฑํ๋ ํจ
๋ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ก transform์ ๋ฃ์ ์ด์ ๋ ๋ถ๋ชจ ์ค๋ธ์ ํธ ์์ ์์ฑํ๋ค๋ ๋ป์ด๋ค.
๋ง์ฝ, ๋งค๊ฐ๋ณ์๋ฅผ ๋ฃ์ง ์๋๋ค๋ฉด Hierarchy์ ๊ณ์ ์์ฑ๋๋ค.
๋ค์์ผ๋ก pools์๋ค๊ฐ .Add()๋ฅผ ํตํด์ ์ถ๊ฐํด ์ฃผ๋ฉด ๋๋ค.
ํ์ผ ์๋ ์ค์
์ด๋ ๊ฒ Get() ํจ์๋ฅผ ํตํด์ ๋ชฌ์คํฐ๋ฅผ ์คํฐํ๊ฒ ๋๋ฉด,
๋ชฌ์คํฐ๊ฐ ํ๋ ์ด์ด๋ฅผ ๋ฐ๋ผ์ค์ง ์์ผ๋ฉฐ ์ง์์ ์ผ๋ก ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
์๋ํ๋ฉด, ํ๋ฆฌํฉ์ ์ฅ๋ฉด์ ์ค๋ธ์ ํธ๋ฅผ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ ๊ธฐ์ Enemy ์ฝ๋๋ฅผ ์์ ํด ์๋์ผ๋ก Player์ ํ๊ฒ์ผ๋ก ์ค์ ํ๊ณ ๋ฐ๋ก ์ค๊ฒ ๋ง๋ค์ด์ผ ํ๋ค.
void OnEnable()
{
target = GameManager.instance.player.GetComponent<Rigidbody2D>();
}
ํ๋ฆฌํฉ์ด ํ์ฑํ๋๋ฉด์ ํ์ผ์ ์ค์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ OnEnable() ํจ์ ์์ ์์ฑํด์ผ ํ๋ค.
์ด๋ ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์๋์ผ๋ก ์์ฑ๊ณผ ๋์์ target์ ์ค์ ํ ์ ์๋ค.
์ฃผ๋ณ์ ์์ฑํ๊ธฐ
Get ํจ์๋ฅผ ์ด์ฉํด ์์ฑํ๋ค๋ฉด ์์ฑ ์ง์ ๊ณผ ์์ฑํ๋ ์ฝ๋๊ฐ ํ์ํ๋ค.
๊ทธ๋ฌ๋ฏ๋ก ํ๋ ์ด์ด์ ์ํ ๋ด๋น ์์ ์ค๋ธ์ ํธ ๋ฐ ์คํฌ๋ฆฝํธ(Spawner)๋ฅผ ์ถ๊ฐํด ์ฃผ์.
๊ทธ๋ฆฌ๊ณ Spawner์์ ๋น ์ค๋ธ์ ํธ(Point)๋ฅผ ์์ฑํ์ฌ Icon ๋ชจ์์ ์ค์ ํ๋ฉด ๋๋ค.
์ด๋ ๊ฒ ๋น ์ค๋ธ์ ํธ๊ฐ ์ด๋์ ์๋์ง ํ์ธํ ์ ์๋ค.
๋ํ 3D Icons ์ฌ๋ผ์ด๋๋ฅผ ํตํด ์์ด์ฝ์ ํฌ๊ธฐ๋ ์กฐ์ ์ด ๊ฐ๋ฅํ๋ค.
์ด๋ ๊ฒ ์์ฑํ Point๋ฅผ Ctrl + D๋ฅผ ํตํด ์นด๋ฉ๋ผ ๋ฐ์ ์ ์ ํ ๋ฐฐ์น๋ฅผ ํ๋ฉด ์ค๋น๋ ๋์ด๋ค.
์ด์ ์ฝ๋๋ฅผ ํตํด์ ํด๋น ์คํฐ ์ง์ ์์ ๋ชฌ์คํฐ๋ฅผ ์คํฐ์ํค๋ฉด ๋๋ค.
public class Spawner : MonoBehaviour
{
public Transform[] spawnPoint;
public SpawnData[] spawnData;
int level;
float timer;
void Awake()
{
spawnPoint = GetComponentsInChildren<Transform>();
}
void Update()
{
timer += Time.deltaTime;
if (timer > 0.2f)
{
timer = 0;
Spawn();
}
}
void Spawn()
{
GameObject enemy = GameManager.instance.pool.Get(Random.Range(0,2));
enemy.transform.position = spawnPoint[Random.Range(1, spawnPoint.Length)].position;
}
}
๋จผ์ ๋ง๋ค์ด์ค point๋ฅผ ์ ์ธํด์ผ ํ๋ค.
์์น๋ง ํ์ํ๋ Transformํํ์ ๋ฐฐ์ด spawnPoint๋ฅผ ์ ์ธํ๊ณ ,
Awake() ํจ์ ์์์ ์ด๊ธฐํ๋ฅผ ์งํํ๋ฉด ๋๋ค.
์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ GetComponentsInChildren<Transform>์ผ๋ก ์ด๊ธฐํํด์ผ ํ๋ค.
๋ฐฐ์ด์ด๊ธฐ ๋๋ฌธ์ Components๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฉฐ Spawner ์์ ์ค๋ธ์ ํธ์ด๊ธฐ ๋๋ฌธ์ InChildren์ ์ฌ์ฉํด์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ Update() ํจ์ ์์์ timer ๋ณ์์ ํ ํ๋ ์์ด ์๋นํ ์๊ฐ์ธ deltaTime์ ๊ณ์ ๋ํด์ฃผ์.
๊ทธ๋ฆฌ๊ณ if๋ฌธ์ ํตํด์ timer๊ฐ 0.2f ๋ณด๋ค ํฌ๋ค๋ฉด timer๋ฅผ 0์ผ๋ก ์ด๊ธฐํํ๊ณ ์ํํ๋ ํจ์์ธ Spawn()์ ์ฌ์ฉํ๋ฉด ๋๋ค.
Spawn() ํจ์๋ PoolManager์ Get() ํจ์๋ฅผ ํตํด ๋๋ค ํ ๋ชฌ์คํฐ๋ฅผ ์์ฑํ๊ณ ,
์ํํ ์์น๋ spawnpoint ์ค์์ ๋๋คํ ํ ๊ฐ์ ํฌ์ธํธ์ ์ํํ๋๋ก ์ง์ ํ๋ฉด ๋๋ค.
์๊ฐ์ ๋ฐ๋ฅธ ๋์ด๋
์ด์ ๊ธฐ์กด์ ์ ์๋ ์ฝ๋๋ฅผ ์๊ฐ์ ๋ฐ๋ผ ๋์ด๋๋ฅผ ์ฌ๋ฆฌ๋ ์ฝ๋๋ก ์์ ์ ํด๋ณด์.
์์ ํ ์ฝ๋๋ GameManager, Spawner, Enemy๋ฅผ ์์ ํ๋ฉด ๋๋ค.
GameManager ์์ ์ฝ๋ ๐
public class GameManager : MonoBehaviour
{
public static GameManager instance;
public float gameTime;
public float maxGameTime = 2 * 10f;
public PoolManager pool;
public Player player;
private void Awake()
{
instance = this;
}
void Update()
{
gameTime += Time.deltaTime;
if (gameTime > maxGameTime)
{
gameTime = maxGameTime;
}
}
}
๋จผ์ GameManger์์ ๊ฒ์ ์๊ฐ๊ณผ ์ต๋ ์๊ฐ์ ์ ์ธํด์ผ ํ๋ค.
์ต๋ ์๊ฐ์ ํ ์คํธ ์์ผ๋ก 20์ด๋ก ์ค์ ํ์๋ค.
๊ทธ๋ฆฌ๊ณ Update๋ฌธ์์ ํ ํ๋ ์๋น ์๊ฐ์ gameTime์ ๊ณ์ ๋ํด์ฃผ๊ณ ,
์ต๋ ์๊ฐ์ ์ด๊ณผํ ๊ฒฝ์ฐ์ ๊ฒ์ ์๊ฐ๊ณผ ์ต๋ ์๊ฐ์ด ๊ฐ์์ง๊ฒ ์์๋ก ์กฐ์นํ๋ค. (์ถํ ์์ ์์ )
Spawner ์์ ์ฝ๋ ๐
public class Spawner : MonoBehaviour
{
public Transform[] spawnPoint;
public SpawnData[] spawnData;
int level;
float timer;
void Awake()
{
spawnPoint = GetComponentsInChildren<Transform>();
}
void Update()
{
timer += Time.deltaTime;
level = Mathf.Min(Mathf.FloorToInt(GameManager.instance.gameTime / 10f), spawnData.Length-1);
if (timer > spawnData[level].spawnTime)
{
timer = 0;
Spawn();
}
}
void Spawn()
{
GameObject enemy = GameManager.instance.pool.Get(0);
enemy.transform.position = spawnPoint[Random.Range(1, spawnPoint.Length)].position;
enemy.GetComponent<Enemy>().Init(spawnData[level]);
}
}
[System.Serializable]
public class SpawnData
{
public float spawnTime;
public int spriteType;
public int health;
public float speed;
}
๋จผ์ ๊ฒ์ ๋ ๋ฒจ์ ๋ณ์๋ก ์ ์ธํ๊ณ ๊ฒ์ ์๊ฐ์ 10f๋ก ๋๋ ๊ฐ์ ๋ ๋ฒจ๋ก ์ ํ๋ค.
์ฌ๊ธฐ์ Mathf.Min()์ ๋ ๋ฒจ์ ์ด๊ณผํ ๊ฒฝ์ฐ ์๋ฌ ๋ฐฉ์ง๋ฅผ ์ํด ์ฌ์ฉํ์๋ค.
Mathf.FloorToInt๋ ์์์ ๋ค์๋ฅผ ๋ฒ๋ฆฌ๋ฉด์ ์ ์๋ก ํ๋ณํ ํ๋ ํจ์์ด๋ฉฐ,
๋ฐ๋๋ก ์ฌ๋ฆผ์ ์ฌ์ฉํ๋ฉฐ ํ๋ณํ ํ ๊ฒฝ์ฐ์๋ Mathf.CeilToInt๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ชฌ์คํฐ์ ์ถ๊ฐํ ์์ฑ์ ๋ฐ๋ก ๋ฌถ์ด๋๋ ํด๋์ค๋ฅผ ๋ง๋ค์ด์ ์์ ๊ณผ ์ถ๊ฐ์ ์ฉ์ดํ๋๋ก ํ์๋ค.
์ฌ๊ธฐ์ [System.Serializable]์ ์์ฑ์ ๋ถ์ฌํ๋ ์ฝ๋์ด๋ฉฐ ์ด๋ฅผ ์ง๋ ฌํ๋ผ๊ณ ํ๋ค.
์ง๋ ฌํ๋ ๊ฐ์ฒด๋ฅผ ์ ์ฅ ํน์ ์ ์กํ๊ธฐ ์ํด ๋ณํํ๋ ๊ณผ์ ์ด๋ค.
๋ง์ฝ ์ง๋ ฌํ๋ฅผ ์งํํ์ง ์์ผ๋ฉด public์ผ๋ก ํ๋๋ผ๋ Inspector ์์์ ํ์ธํ ์ ์๋ค.
์ด๋ ๊ฒ ์ง์ ์์ฑํ ํด๋์ค๋ฅผ ์ง๋ ฌํ๋ฅผ ํตํ์ฌ ์ธ์คํํธ์์ ์ด๊ธฐํ๊ฐ ๊ฐ๋ฅํด์ง๋ค.
SpawnData ํด๋์ค์์ ์ถ๊ฐํ ๋ณ์๋ ์คํ๋ผ์ดํธ ํ์ , ์ํ์๊ฐ, ์ฒด๋ ฅ, ์๋์ด๋ค.
๊ทธ๋ฆฌ๊ณ Update์ ์ํ๋๋ ์กฐ๊ฑด๋ฌธ์ SpawnData๋ฅผ ํตํด ์์ ํ๋ฉด ๋๋ค.
๊ทธ๋ผ spawnData๋ฐฐ์ด์ ํด๋นํ๋ level์ spawnTime ๊ฐ์ด ์ง๋ ๋๋ง๋ค ๋ชฌ์คํฐ๊ฐ ์คํฐ์ด ๋๋ค.
๊ทธ ๋ฐ์ Spawn() ํจ์์์ ์์ ๋ ๋ถ๋ถ์ ์๋ซ๋ถ๋ถ์์ ๋ค๋ฃจ๋๋ก ํ๊ฒ ๋ค.
๋ชฌ์คํฐ ๋ค๋ฌ๊ธฐ
์ด๋ ๊ฒ SpawnData์์ ๋ชฌ์คํฐ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์๋ค๋ฉด ๋ชฌ์คํฐ์ ์ฃผ์ ์ํค๋ ์ฝ๋๋ ํ์ํ๋ค.
๋จผ์ ๋ชฌ์คํฐ ํ๋ฆฌํฉ ํ๋๋ฅผ ์ญ์ ํด ํ๋๋ง ๋จ๊ฒจ์ ๊ทธ ํ๋ฆฌํฉ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋๋ฅผ ํตํด ์์ ํ๊ฒ ํ๋ฉด ๋๋ค.
public float health; // ํ์ฌ ์ฒด๋ ฅ
public float maxHealth; // ์ต๋ ์ฒด๋ ฅ
public RuntimeAnimatorController[] animCon; // ๋ณ์ ์ ์ธ
์ด๋ ๊ฒ ์ฌ๋ฌ ๊ฐ์ animator์ ๊ฐ์ ธ์ฌ animCon์ ๋ฐฐ์ด๋ก ์ ์ธํ๊ณ ,
๋ชฌ์คํฐ์ ํ์ฌ์ ์ต๋ ์ฒด๋ ฅ์ ์ ์ธํด์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ Inspector์์ ์ ๋๋ฉ์ด์ ์ปจํธ๋กค๋ฌ ๋ณ์๋ฅผ ์ด๊ธฐํ์์ผ์ฃผ๋ฉด ๋๋ค.
void OnEnable()
{
target = GameManager.instance.player.GetComponent<Rigidbody2D>();
isLive = true;
health = maxHealth;
}
๊ธฐ์กด์๋ isLive(์์กด ์ฌ๋ถ)๋ true๋ก ์ค์ ๋์ด ์๋๋ฐ, ์ด ๋ถ๋ถ๋ OnEnable์์ true๋ก ์ด๊ธฐํํ๊ณ ,
์ฒด๋ ฅ ๋ํ ์ค๋ธ์ ํธํ๋ง์ ์ํด์ ํ์ฑํ ๋์ ๋๋ฅผ ๋๋นํด ์ต๋ ์ฒด๋ ฅ์ผ๋ก ์ด๊ธฐํํด์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด์ ์ด๊ธฐ ์์ฑ์ ์ ์ฉํ๋ ํจ์๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค.
public void Init(SpawnData data)
{
anim.runtimeAnimatorController = animCon[data.spriteType];
speed = data.speed;
maxHealth = data.health;
health = data.health;
}
๋งค๊ฐ๋ณ์๋ก SpawnData๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ์ค๊ณ ,
anim.runtimeAnimatorController๋ฅผ ํตํด์ animCon๋ฐฐ์ด์ ์๋ spawndata์ spriteType์ ํ์ฑํํด์ค๋ค.
( anim์ Animator๋ก ์์์ ์ ์ธ๊ณผ ์ด๊ธฐํ๋ฅผ ์งํํด์ค์ผ ํ๋ค.)
๊ทธ๋ฆฌ๊ณ , ๋ฏธ๋ฆฌ ์ ๋ ฅํด ์ค ๋ชฌ์คํฐ์ ๋ฐ์ดํฐ๋ก ์ด๊ธฐํํด์ฃผ๋ฉด ๋๋ค.
์ํ ์ ์ฉํ๊ธฐ
์ด์ ์ ์ฒด์ ์ผ๋ก ์์ ํ ์ฝ๋๋ฅผ ๋ค๋ฌ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
๋จผ์ , ํ ๋งค๋์ ์์ ๋น ๋ฐ์ดํฐ๋ฅผ ์ญ์ ์์ผ์ค์ผ ํ๋ค.
void Spawn()
{
GameObject enemy = GameManager.instance.pool.Get(0);
enemy.transform.position = spawnPoint[Random.Range(1, spawnPoint.Length)].position;
enemy.GetComponent<Enemy>().Init(spawnData[level]);
}
๊ทธ๋ ๊ธฐ์ Spawn()์ GameManager.Instance.pool.Get(0)์ผ๋ก ๋ณ๊ฒฝํด์ผ ํ๋ค.
(๋ฐ์ดํฐ๊ฐ ํ๋์ด๊ธฐ ๋๋ฌธ์ด๋ค.)
๊ทธ๋ฆฌ๊ณ enemy.GetComponent<Enemy>().Init(spawnData[level]); ๋ฅผ ํตํด์
๋ชฌ์คํฐ๋ฅผ ์ํ๊ณผ ๋์์ ๋ชฌ์คํฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ์ ํ๋ฉด ๋๋ค.
์ด๋ฌ๋ฉด, level๊ฐ(0,1)์ด ์๊ฐ์ ๋ง๊ฒ spawnData์ ๋ชฌ์คํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ์ฃผ์ ํ๊ฒ ๋๋ค.
์ด๋ ๊ฒ ๋๋ง์ ํด๋์ค๋ฅผ ๋ง๋ค์ด ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
Enemy ์์ ์ฝ๋ ๐
public class Enemy : MonoBehaviour
{
public float speed;
public float health;
public float maxHealth;
public RuntimeAnimatorController[] animCon;
public Rigidbody2D target;
bool isLive;
Rigidbody2D rigid;
Animator anim;
SpriteRenderer spriter;
void Awake()
{
rigid = GetComponent<Rigidbody2D>();
anim = GetComponent<Animator>();
spriter = GetComponent<SpriteRenderer>();
}
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;
}
void LateUpdate()
{
spriter.flipX = target.position.x < rigid.position.x;
}
void OnEnable()
{
target = GameManager.instance.player.GetComponent<Rigidbody2D>();
isLive = true;
health = maxHealth;
}
public void Init(SpawnData data)
{
anim.runtimeAnimatorController = animCon[data.spriteType];
speed = data.speed;
maxHealth = data.health;
health = data.health;
}
}
'๐ฎ Unity > Project' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Unity] ๋ก๊ทธ๋ผ์ดํฌ ์์กด RPG (4) - ๋ชฌ์คํฐ ๋ง๋ค๊ธฐ (0) | 2024.03.13 |
---|---|
[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 |