๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿง‘‍๐Ÿ’ป ์ฝ”๋”ฉ/Unity

[Practice Unity] ์˜ค๋ธŒ์ ํŠธ ํ’€๋ง

728x90

๊ฒŒ์ž„ ๊ฐœ๋ฐœ์˜ ๋Œ€ํ‘œ์ ์ธ ๊ธฐ์ˆ  ์ค‘ ํ•˜๋‚˜์ธ ์˜ค๋ธŒ์ ํŠธ ํ’€๋ง์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋‘๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ธŒ์ ํŠธ ํ’€๋ง์€ ์›Œ๋‚™ ๋Œ€ํ‘œ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€๋‹ด์„ ์ค„์ด๋Š” ๊ธฐ๋ฒ•์ด์–ด์„œ ๋งŽ์ด ์ ‘ํ–ˆ์—ˆ๋Š”๋ฐ ์ด์ฐธ์— ๋ณต์Šต ๊ฒธ ๋‹ค์‹œ ์ •๋ฆฌํ•ด ๋‘๊ณ  Queue๋‚˜ List๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋ฟ๋งŒ ์•„๋‹Œ ์œ ๋‹ˆํ‹ฐ ์ž์ฒด์—์„œ ์ง€์›ํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ ํ’€๋ง์ด ๋˜ ์žˆ๋‹ค๊ณ  ํ•˜๋”๊ตฐ์š”. ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋„ ๊ณต๋ถ€ํ•ด ๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

 

์˜ค๋ธŒ์ ํŠธ ํ’€๋ง์„ ์“ฐ๋Š” ์ด์œ ๋Š” ์ด๋ฏธ ์ธํ„ฐ๋„ท์— ์ฐจ๊ณ  ๋„˜์น˜๊ฒŒ ์žˆ์ง€๋งŒ ๊ทธ๋ž˜๋„ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•˜์ž๋ฉด, ์œ ๋‹ˆํ‹ฐ์—์„œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํŒŒ๊ดดํ•˜๋Š” ์ž‘์—…์€ ๊ฝค ๋ฌด๊ฑฐ์šด ์ž‘์—…์ž…๋‹ˆ๋‹ค. ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ƒˆ๋กœ ํ• ๋‹นํ•ด์•ผ ํ•˜๊ณ  ํŒŒ๊ดดํ•  ๋•Œ๋Š” ํŒŒ๊ดดํ•˜๊ณ  ๋‚˜์„œ ์ƒ๊ธฐ๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํŒ…์œผ๋กœ ์ธํ•œ ํ”„๋ ˆ์ž„ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์˜ค๋ธŒ์ ํŠธ ํ’€๋ง์ด๋ผ๋Š” ๊ธฐ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ•„์š”ํ•  ๋•Œ ๊บผ๋‚ด์“ฐ๊ณ  ํŒŒ๊ดดํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋‹ค์‹œ ํ’€์— ๋„ฃ์–ด๋‘๋Š” ๋ฐฉ์‹์œผ๋กœ ํ”„๋ ˆ์ž„ ์ €ํ•˜๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public Queue<GameObject> objectPool = new Queue<GameObject>();
 
private void Awake() // ์ดˆ๊ธฐ ์„ค์ •
{
    instance = this;
 
    for(int i=0; i<2; i++// ํ•„์š”ํ•œ ๊ฐฏ์ˆ˜๋งŒํผ ๋งŒ๋“ค์–ด์„œ queue์— ๋„ฃ์–ด์ฃผ๊ธฐ
    {
        GameObject tmpObject = Instantiate(enemyPrefabs[0], Vector3.zero, Quaternion.identity);
        objectPool.Enqueue(tmpObject);
        tmpObject.SetActive(false);
    }
}
 
private void CreateEnemy()
{
    if (objectPool.Count == 0// queue์— ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์—†์œผ๋ฉด ์ถ”๊ฐ€๋กœ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.
    {
        GameObject tmpObject = Instantiate(enemyPrefabs[0], Vector3.zero, Quaternion.identity);
          objectPool.Enqueue(tmpObject);
    }
 
    // queue์—์„œ ๋ฐ›์•„์˜จ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋žœ๋คํ•œ ์œ„์น˜์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.
    GameObject getObject = GetQueue();
    Transform spawnPoint = spawnPoints[Random.Range(0, spawnPoints.Length)];
    getObject.transform.position = spawnPoint.position;
}
 
public void InsertQueue(GameObject gameObject) // queue์— ๋‹ค์‹œ ๋„ฃ์„ ๋•Œ ์‚ฌ์šฉ
{
    objectPool.Enqueue(gameObject);
    gameObject.SetActive(false);
}
 
public GameObject GetQueue() // queue์—์„œ ๋ฐ›์•„๊ฐˆ ๋•Œ ์‚ฌ์šฉ
{
    GameObject getObject = objectPool.Dequeue();
    getObject.SetActive(true);
    return getObject;
}
cs

์šฐ์„  Queue๋ฅผ ์ด์šฉํ•œ ์˜ค๋ธŒ์ ํŠธ ํ’€๋ง์ž…๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ œ์ผ ์ฒ˜์Œ ์˜ค๋ธŒ์ ํŠธ ํ’€๋ง์„ ๊ณต๋ถ€ํ•  ๋•Œ ์ผ€์ด๋””๋‹˜์˜ ์œ ํŠœ๋ธŒ๋ฅผ ๋ณด๊ณ  ๊ณต๋ถ€ํ•ด์„œ queue๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ stack์ด๋‚˜ list๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์ƒ๊ด€์€ ์—†์Šต๋‹ˆ๋‹ค. ๋ญ˜ ์“ฐ๋“  ํฌ๊ฒŒ ์ฐจ์ด๋Š” ์—†๋‹ค๊ณ  ํ•˜๋”๊ตฐ์š”.

 

 

์Œ... ์œ ๋‹ˆํ‹ฐ์—์„œ ์ œ๊ณตํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ ํ’€์„ ์จ๋ณด๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ ์ด๋Ÿฐ ์˜ค๋ฅ˜๊ฐ€ ๊ณ„์† ๋ฐœ์ƒํ•˜๋„ค์š”. ์ด๊ฒŒ 21๋ฒ„์ „ ์ดํ›„๋กœ ๋‚˜์˜จ ๊ฑฐ์—ฌ์„œ ์•„์ง ๊ด€๋ จ ์ž๋ฃŒ๊ฐ€ ๋งŽ์ด ์—†๋Š”๋ฐ ๊ณต์‹ ๋„ํ๋จผํŠธ๋ฅผ ๋’ค์ง€๋ฉด์„œ ์ฐจ์ฐจ ๊ณต๋ถ€ํ•ด ๋ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ณต๋ถ€ํ•ด์„œ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ฒŒ ๋˜๋ฉด ๋‹ค์‹œ ๊ธ€์„ ์จ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•œ๋™์•ˆ์€ ์ง์ ‘ ๋งŒ๋“ค์–ด์„œ ์“ฐ๋Š”๊ฑธ๋กœใ…Ž...

728x90