Pool Manager & Game Manager - TeamCrazyPerformance/Game_study GitHub Wiki

Object Pooling

  • Object๋ฅผ ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค Pool์ด๋ผ๋Š” ๊ณต๊ฐ„์—์„œ ๊บผ๋‚ด์™€์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.
  • Object๋ฅผ ์ƒ์„ฑ/์‚ญ์ œํ•  ๋•Œ ๋งˆ๋‹ค GC(Garbage Collection)๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ์ด๋Š” CPU์— ๋ถ€๋‹ด์„ ์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ์ดˆ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ์ง€์ •ํ•ด๋‘๊ณ  ๊ทธ ์•ˆ์—์„œ Object๋ฅผ ๊ด€๋ฆฌํ•จ์œผ๋กœ์จ ๊ฒŒ์ž„ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Pool Manager

  • ์ฒ˜์Œ ์‹œ์ž‘์‹œ ์ผ์ •๋Ÿ‰์˜ Object๋ฅผ ์ƒ์„ฑํ•˜์—ฌ Pool์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • Object๋ฅผ ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ํ™œ์„ฑํ™”ํ•ด pool์—์„œ ๊บผ๋‚ด๊ณ  ์‚ฌ์šฉ์ด ๋๋‚œ ๋’ค์—” ๋น„ํ™œ์„ฑํ™”ํ•ด ๋‹ค์‹œ pool์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

List๋ฅผ ์‚ฌ์šฉํ•œ object pool ๊ตฌํ˜„


/* Unity - Introduction to Object Pooling */
public static ObjectPool SharedInstance;
public List pooledObjects;
public GameObject objectToPool;
public int amountToPool;

void Awake()
{
    SharedInstance = this;
}

void Start() 
{
    pooledObjects = new List(); // pool ์ƒ์„ฑ
    GameObject tmp; 
    for(int i = 0; i < amountToPool; i++) // amountToPool๋งŒํผ object ์ƒ์„ฑ
    {
        tmp = Instantiate(objectToPool);
        tmp.SetActive(false);
        pooledObjects.Add(tmp);
    }
}

public GameObject GetPooledObject() // object๋ฅผ pool์—์„œ ๊บผ๋‚ด์˜ค๋Š” ํ•จ์ˆ˜
{
    for(int i = 0; i < amountToPool; i++) // List ์•ž๋ถ€๋ถ„๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๊ฒ€์ƒ‰
    {
        if(!pooledObjects[i].activeInHierarchy) // ๋งจ ์•ž์— ์žˆ๋Š” ์˜ค๋ธŒ์ ํŠธ๋ถ€ํ„ฐ ๋ฐ˜ํ™˜
        {
            return pooledObjects[i];
        }
    }
    return null;
}
/* ์„ค๋ช…์—์„  pool์— ๋‹ค์‹œ ๋„ฃ์„ ๋• SetActive(false); ๋ฅผ ํ†ตํ•ด deactive ํ•œ๋‹ค๊ณ  ์“ฐ์—ฌ์žˆ์Œ */
/* List๋ฅผ ๊ฒ€์ƒ‰ํ•ด์„œ ๊บผ๋‚ด์˜ค๋Š” ๋ฐฉ์‹๋ณด๋‹จ Stack์„ ์ด์šฉํ•œ ๊ตฌํ˜„๋ฐฉ์‹์ด ๋” ํšจ์œจ์ ์ผ ๋“ฏ? */

  • Unity์—์„œ๋„ 2021๋…„ ์ดํ›„ ์ž์ฒด์ ์œผ๋กœ Object Pooling์„ ์ง€์›ํ•ด์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ObjectPool objectPool = new ObjectPool(CreateObject,
                OnGetFromPool, OnReleaseToPool, OnDestroyPooledObject,
                collectionCheck, defaultCapacity, maxSize); 
// ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ, ์ดˆ๊ธฐํ™”, ํ™œ์„ฑํ™”, ์ œ๊ฑฐ, ์˜ˆ์™ธ์ฒ˜๋ฆฌ, ๊ธฐ๋ณธํฌ๊ธฐ, ์ตœ๋Œ€ํฌ๊ธฐ ์ง€์ •

GameManager

  • ๊ฒŒ์ž„์˜ ์ ์ˆ˜, ์ŠนํŒจ ์กฐ๊ฑด ๋“ฑ ๊ฒŒ์ž„์˜ ์ „๋ฐ˜์ ์ธ ํ๋ฆ„์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • Unity์—์„œ "GameManager" ๋ผ๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค๋ฉด ์ž๋™์œผ๋กœ ํ†ฑ๋‹ˆ๋ฐ”ํ€ด ๋ชจ์–‘์œผ๋กœ ๋ณ€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

image

์˜ˆ์‹œ

  • ๊ณ ๋“ฑํ•™๊ต ๋•Œ ๋งŒ๋“ค์—ˆ๋˜ ๊ฒŒ์ž„์„ Game Manager๋กœ ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.
  • ๊ฒŒ์ž„์˜ UI๋‚˜ ์ „๋ฐ˜์ ์ธ ๊ธฐ๋Šฅ์„ ๋งŽ์€ ์Šคํฌ๋ฆฝํŠธ๋กœ ์ž‘์„ฑํ–ˆ๋Š”๋ฐ, ์ด๋ฅผ Game Manager๋กœ ํ•œ ๋ฒˆ์— ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

image

image


/* GameManager๋ฅผ ํ™œ์šฉํ•œ ๋ฐฐํ„ฐ๋ฆฌ ๋ฐ ํญ์ฃฝ UI ๊ตฌํ˜„ */
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class GameManager : MonoBehaviour
{
    /* ๋ฐฐํ„ฐ๋ฆฌ ๋ถ€๋ถ„ ๋ณ€์ˆ˜ */
    public static bool onoff; // true : ์ผœ์ง / false : ๊บผ์ง
    public GameObject Target; // ์†์ „๋“ฑ ๋ถˆ๋น› ์˜ค๋ธŒ์ ํŠธ
    public static bool click; // ?
    private Image battery;
    public Sprite[] sprites;
    public int MaxTime = 120;
    public static float time = 0;

    /* ํญ์ฃฝ UI ๋ณ€์ˆ˜ */
    int fireworkCount;
    public GameObject[] Fireworks = new GameObject[3];

    void Start()
    {
        SetBattery();
    }

    // Update is called once per frame
    void Update()
    {
        UpdateBattery();
        UpdateFirework();
    }

    void SetBattery()
    {
        time = MaxTime;
        battery = GetComponent();
        onoff = false;
        Target.SetActive(false);
    }

    void UpdateBattery()
    {
        /* ๋ฐฐํ„ฐ๋ฆฌ ๋น„์œจ์— ๋”ฐ๋ฅธ UI ๋ณ€๊ฒฝ */
        if (time >= MaxTime * 0.8)
            battery.sprite = sprites[0];
        else if (time >= MaxTime * 0.6)
            battery.sprite = sprites[1];
        else if (time >= MaxTime * 0.4)
            battery.sprite = sprites[2];
        else if (time >= MaxTime * 0.2)
            battery.sprite = sprites[3];
        else if (time > 0)
            battery.sprite = sprites[4];
        else
            battery.sprite = sprites[5];

        /* ์†์ „๋“ฑ ๋ฐฐํ„ฐ๋ฆฌ ์†Œ๋ชจ */
        if (onoff && time > 0)
            time -= Time.deltaTime;
        else if (time < 0) // ๋ฐฐํ„ฐ๋ฆฌ ์—†์œผ๋ฉด ๊บผ์ง€๋„๋ก
        {
            time = 0;
        }
        if (Input.GetKeyDown(KeyCode.F) || click) // ์†์ „๋“ฑ on/off ๋ณ€๊ฒฝ ํ™•์ธ
        {
            onoff = !onoff;
            Target.SetActive(onoff);
            click = false;
        }
    }

    void UpdateFirework()
    {
        fireworkCount = Player.firework_Count;

        if (fireworkCount > 0)
        {

            Fireworks[0].gameObject.SetActive(true);
            Fireworks[1].gameObject.SetActive(false);

            if (fireworkCount > 1)
            {
                Fireworks[1].gameObject.SetActive(true);
                Fireworks[2].gameObject.SetActive(false);
            }

            if (fireworkCount > 2)
                Fireworks[2].gameObject.SetActive(true);
        }
        else
        {
            Fireworks[0].gameObject.SetActive(false);
            Fireworks[1].gameObject.SetActive(false);
            Fireworks[2].gameObject.SetActive(false);
        }
    }
}

23 ๊น€์ •์™„

โš ๏ธ **GitHub.com Fallback** โš ๏ธ