본문 바로가기
c#/수업내용

2020.05.13 ObjectPool을 왜 사용한 것인가?

by Luna_O 2020. 5. 13.
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class ObjectPool : MonoBehaviour
{
    private static ObjectPool instance;
    private string[] assetNames = {"axe""hammer""machete"}; //프리팹 이름 배열
    private List<GameObject> assetList; //나중에 찾아서 반환시켜야하니까 배열 만들어서 찾기 편하게 한 것
 
    void Start()
    {
        ObjectPool.instance = this;
        this.assetList = new List<GameObject>();
    }
 
    public static ObjectPool GetInstance()//싱글톤
    {
        return ObjectPool.instance;//인스턴스는 하나만 만들어서 한개의 인스턴스만 반환
    }
 
    public void LoadAllAssets() //프리팹을 찾아서 게임오브젝트로 만들어서 로드
    {
        foreach(var assetName in this.assetNames)
        {
            //프리팹 이름 배열을 이용하여 경로를 만든다
            string path = "Prefab/" + assetName;
            //경로를 이용하여 Resources 안에 있는 프리팹을 변수에 할당(게임오브젝트로 타입 변경)
            var prefab = Resources.Load(path) as GameObject;
            //찾은 프리팹을 게임오브젝트로 만들어서 할당
            var asset = Instantiate<GameObject>(prefab);
            //찾기 편하게 만든 무기오브젝트 배열에 만든 프리팹 게임오브젝트를 추가
            this.assetList.Add(asset);
            //위에서 찾은 프리팹을 게임오브젝트 만든 것의 이름을 설정
            asset.name = assetName;
            //게임오브젝트 만든 것의 부모로 지금 오브젝트로 설정
            asset.transform.SetParent(this.transform);
            //만든 게임오브젝트 비활성화    => 나중에 쓸때 따로 활성화 시켜서 사용
            asset.SetActive(false);
        }
    }
    public GameObject GetAsset(string name)  //이름을 전달받으면 게임오브젝트 찾아서 반환시켜 줌
    {
        //무기오브젝트 배열에서 전달받은 매개변수와 같은 게임오브젝트를 찾는다.
        var asset = this.assetList.Find(x => x.name == name);
        //찾은 게임오브젝트를 떼어서 반환시켜줘야하기 때문에 
        //지금 오브젝트에서 찾은 자식을 떼어준다
        if(asset != null)
        {
            asset.transform.SetParent(null);
        }
        //붙여준 부모에서 떼어냈으니 값을 반환시킨다
        return asset;
    }
 
    public void ReleaseAsset(GameObject asset) //다 사용하고 떼어 낼 매개변수인 게임오브젝트를 전달받아 자식으로 다시 붙여준다
    {
        //게임오브젝트를 비활성화 시킨다
        asset.SetActive(false);
        //비활성화 시킨 게임오브젝트를 다시 붙여준다
        //지금 오브젝트를 부모로 전달 받은 걸 자식으로 넣기
        //하지만 바로 부모로 붙히고 위치를 바꾸면 초기화가 안됨
        //먼저 떼어준다
        asset.transform.parent = null;
        //오브젝트의 위치를 다시 원상태로 초기화시킨다 Vector3 (0, 0, 0)
        asset.transform.localPosition = Vector3.zero;
        //Rotation을 바꿔주면 칼등으로 때린다 함, 밑에는 안해도되므로 주석
        //asset.transform.localRotation = Quaternion.Euler(Vector3.zero);
        //위치도 초기화 시켰으니 다시 전달받은 오브젝트를 자식으로 지금 오브젝트를 부모로 설정
        asset.transform.SetParent(this.transform);
    }
 
}
 
cs