🧩 코딩/코드 메모

Unity 풀링에 대해서 그리고 아주아주 간단한 풀링 코드

코스모스몰리 2022. 12. 16. 13:33
728x90

 

 

 

 

 

 

 

 


 

풀링코드

 

RPG 게임을 만들고 있던 중

이거는 인스턴스로 생성하지 않아도 활성화, 비활성화로 관리(?) 하면 되겠다! 싶은 오브젝트가 있어,

코드를 작성해보았습니다 !

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CircleObj : MonoBehaviour
{
    SpriteRenderer Srenderer;
    enemyObj enemyCs;
    public int Damage = 50;
    CircleCollider2D Ecollider2D;
    
    //클릭
    Vector3 mouseVec;
    Camera Camera;
    float MaxDistance = 5f;

    void Start()
    {
        Srenderer = GetComponent<SpriteRenderer>();
        enemyCs = GameObject.Find("Enemy").GetComponent<enemyObj>();
        Ecollider2D = GetComponent<CircleCollider2D>();
        Camera = GameObject.FindWithTag("MainCamera").GetComponent<Camera>();
    }
    
    void Update() 
    {
        //이 게임 오브젝트가 활성화가 되어있을때만 클릭 가능하도록.
        if(Input.GetMouseButtonDown(0) && gameObject.activeInHierarchy)
        {
            mouseVec = Input.mousePosition;
            mouseVec = Camera.ScreenToWorldPoint(mouseVec);            
            RaycastHit2D hit = Physics2D.Raycast(mouseVec,transform.forward,MaxDistance);
                if(hit)
                {
                    Srenderer.material.color = Color.red;
                    StartCoroutine("Ready");
                }
        }
    }

    IEnumerator Ready()
    {
        yield return new WaitForSeconds(1f);
        gameObject.SetActive(false);
        //코루틴 안에 넣어줌으로 연속으로 눌리지 않게.
        enemyCs.enemyHP = enemyCs.enemyHP - Damage;
        Srenderer.material.color = Color.gray;
        yield return null;
    }

   
}

 

 

위 코드는

적 주변에 (그림안에 검정색으로 칠해진) 서클이 Active 되고

이 서클을 클릭하면 몬스터의 체력이 닳고 색이 변한뒤 Active false 되는 스크립트 입니다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerAttack : MonoBehaviour
{
    public GameObject CircleObjt;  

    void Update()
    {
        if(!CircleObjt.activeInHierarchy)
        {
            StartCoroutine("PAttack");
        }
        
    }
    IEnumerator PAttack()
    {       
            CircleObjt.SetActive(true);
            CircleObjt.transform.position = new Vector3(Random.Range(5.7f,7.54f),Random.Range(-2.58f,-1.17f),0f);
            //(0.5f,-2.9f)
            //CircleObjt.transform.position = new Vector3(Random.Range(6.93f,11.69f),0.5f,0f);
            yield return null;
    }
}

해서 서클 오브젝트가 Active 되어있지 않으면

다시 Active 시켜주고  position을 랜덤 하게 주어 다른 곳에 뜨도록 하였습니다.

 

 

 


 

풀링 집중 탐구 🔎

 

이렇게 코드를 짜놓고 어느날,

구글 서칭중 이렇게 오브젝트를 미리 만들어 놓고 Active시켜주는 방법을 풀링이라는 방식이란걸 알았습니다.

 

계속 인스턴스로 생성을 하게 되면

오브젝트 생성,삭제 하는 과정에서 가비지(Garbage)값이 만들어지는데

이 가비지 값이 만들어지면 유니티에서 가비지 컬렉트( 메모리를 비우는 기술 )를 실행하는데,

이 과정에서 게임이 끊기게 된다고 합니다.

 

해서 이를 방지 하기 위해

오브젝트 풀링은, 오브젝트를 생성 하고 삭제 시키는 것이 아닌

활성화 -> 비활성화 -> 활성화 의 반복으로 실행 시킵니다.

 

보통은 리스트나 배열안에다가 넣으시고 코드를 작성하시는데

아직은 배열이나 리스트 활용이나

복잡한 공식을 활용하는 구현은 잘 하지 못해서

잘 정리 하신 분의 링크를 올립니다..

제꺼는 그냥 간단한 풀링 코드로 참고해주시길 바랍니다...

감사합니다 !

 

 

정리 해주신 글 ->

클릭

 

 

 

 

 

 

 

 

 

 

 

 

 


 

728x90