본문 바로가기

Project/우다다다 고영희

[우다다다 고영희] Unity: 오브젝트 풀링을 이용한 무한 장애물

728x90

오브젝트 풀링 구현 오브젝트 풀링의 구현에는 많은 방법이 있으니 찾아보고 본인이 사용하기 편한 방법을 사용하면 될 것 같다.

 

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
41
42
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class ObjectManager : MonoBehaviour
{
    public GameObject car1Prefab;
    public GameObject car2Prefab;
    public GameObject car3Prefab;
    public GameObject car4Prefab;
    public GameObject car5Prefab;
    public GameObject car6Prefab;
    public GameObject car7Prefab;
    public GameObject car8Prefab;
    public GameObject car9Prefab;
 
    GameObject[] car1;
    GameObject[] car2;
    GameObject[] car3;
    GameObject[] car4;
    GameObject[] car5;
    GameObject[] car6;
    GameObject[] car7;
    GameObject[] car8;
    GameObject[] car9;
 
    GameObject[] targetPool;
 
    void Start()
    {
        car1 = new GameObject[3];
        car2 = new GameObject[3];
        car3 = new GameObject[3];
        car4 = new GameObject[3];
        car5 = new GameObject[3];
        car6 = new GameObject[3];
        car7 = new GameObject[3];
        car8 = new GameObject[3];
        car9 = new GameObject[3];
 
        Generate();
    }

 

오브젝트 풀링을 사용하고 싶은 오브젝트의 Prefab을 저장하고 Start 함수에서 공간을 확보해준다.

 

  • carXPrefab - 프리팹으로 저장된 오브젝트를 저장해주는 변수이다.
  • carX - carXPrefab에 있는 오브젝트를 배열로써 저장해주는 변수이다.

 

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
  void Generate()
    {
        for (int i = 0; i < car1.Length; i++)
        {
            car1[i] = Instantiate(car1Prefab);
            car1[i].SetActive(false);
        }
 
        for (int i = 0; i < car2.Length; i++)
        {
            car2[i] = Instantiate(car2Prefab);
            car2[i].SetActive(false);
        }
 
        for (int i = 0; i < car3.Length; i++)
        {
            car3[i] = Instantiate(car3Prefab);
            car3[i].SetActive(false);
        }
 
        for (int i = 0; i < car4.Length; i++)
        {
            car4[i] = Instantiate(car4Prefab);
            car4[i].SetActive(false);
        }
 
        for (int i = 0; i < car5.Length; i++)
        {
            car5[i] = Instantiate(car5Prefab);
            car5[i].SetActive(false);
        }
 
        for (int i = 0; i < car6.Length; i++)
        {
            car6[i] = Instantiate(car6Prefab);
            car6[i].SetActive(false);
        }
 
        for (int i = 0; i < car7.Length; i++)
        {
            car7[i] = Instantiate(car7Prefab);
            car7[i].SetActive(false);
        }
 
        for (int i = 0; i < car8.Length; i++)
        {
            car8[i] = Instantiate(car8Prefab);
            car8[i].SetActive(false);
        }
 
        for (int i = 0; i < car9.Length; i++)
        {
            car9[i] = Instantiate(car9Prefab);
            car9[i].SetActive(false);
        }
    }

 

Generate 함수를 통해서 미리 선언해놓은 배열의 크기만큼 프리팹들을 넣어준다. 오브젝트 풀을 만드는 과정이다.

 

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
41
42
43
44
 public GameObject MakeObject(string type)
    {
        switch (type)
        {
            case "car1":
                targetPool = car1;
                break;
            case "car2":
                targetPool = car2;
                break;
            case "car3":
                targetPool = car3;
                break;
            case "car4":
                targetPool = car4;
                break;
            case "car5":
                targetPool = car5;
                break;
            case "car6":
                targetPool = car6;
                break;
            case "car7":
                targetPool = car7;
                break;
            case "car8":
                targetPool = car8;
                break;
            case "car9":
                targetPool = car9;
                break;
        }
 
        for (int i = 0; i < targetPool.Length; i++)
        {
            if (!targetPool[i].activeSelf)
            {
                targetPool[i].SetActive(true);
                return targetPool[i];
            }
        }
        return null;
    }
}

 

이제 필요할 때마다 오브젝트를 쓰기 위하여 MakeObject 함수를 만들어서 인자로 받은 type에 따른 오브젝트를 생성시켜준다.

728x90