OBJECT POOLING
유니티에 오브잭트 풀링에 대해서 자습서에 있는 내용을 요약해보겠습니다.
일단 풀링이이란 기존에 다른 언어에서도 memory pool이라고 불리며, 동일한 사이즈의 메모리 블록들을 미리 할당해 놓고 사용하는 것 인데, 유니티에서는 총알, 많은 수의 적을 처리하는데 오브잭트를 미리 생성 , 활성화 비활성화 하는 것으로 효과적으로 사용할 수 있을 것 같습니다.
대상 : 초급
작성 환경 : 5.4f
[원본 강의] - OBJECT POOLING
https://unity3d.com/kr/learn/tutorials/topics/scripting/object-pooling
[사용된 함수 들]
Invoke()
CancelInvoke()
InvokeRepeating();
1단계 - 자동 발사를 통한 오브잭트 풀링 이해
[ BulletFireScript.cs ] - 미리 오브잭트를 생성하고, 발사하는 클래스
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 | using UnityEngine; using System.Collections; using System.Collections.Generic; public class BulletFireScript : MonoBehaviour { public float fireTime = 0.05f; public GameObject bullet; public int pooledAmount = 20; private List<GameObject> bullets = null; void Start () { bullets = new List<GameObject>(); for (int i = 0; i < pooledAmount; i++ ) { GameObject obj = (GameObject)Instantiate(bullet); obj.SetActive(false); bullets.Add(obj); } InvokeRepeating("Fire", fireTime, fireTime); } void Fire() { // 강의에서는 조건으로 bullets.Count를 넣었지만 매번 bullets의 카운트를 // 참고 하는 것 보다 pooledAmount가 bullets의 크기 이므로 // pooledAmount으로 변경 작성하였습니다. for(int i = 0 ; i < pooledAmount ; i++) { if(bullets[i].activeInHierarchy == false) { bullets[i].transform.position = transform.position; bullets[i].transform.rotation = transform.rotation; bullets[i].SetActive(true); break; } } } } | cs |
[BulletDestoryScript.cs] - 총알이 스스로 자동으로 사라지는 클래스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | using UnityEngine; using System.Collections; public class BulletDestoryScript : MonoBehaviour { public void OnEnable() { Invoke("Destory", 2.0f); } void Destory() { gameObject.SetActive(false); } public void OnDisable() { CancelInvoke(); } } | cs |
[BulletActionScript.cs] - 총알의 움직임 클래스
해당 스크립트는 블로그 주인장이 간단하게 만들었습니다.
이동방향은 초기 프로잭트 설정으로 인해 right입니다. 자신의 현재 좌표계에 맞게
수정이 필요합니다.
1 2 3 4 5 6 7 8 9 10 11 | using UnityEngine; using System.Collections; public class BulletActionScript : MonoBehaviour { void Update () { this.transform.Translate(Vector3.right); } } | cs |
각 스크립트를 Palyer와 Bullet이라는 오브잭트를 만들고 드래그 앤 드랍으로 부착합니다.
2단계 - 필요시 생성하는 발사를 통한 오브잭트 풀링 이해
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 | using UnityEngine; using System.Collections; using System.Collections.Generic; public class NewObjectPoolerScript : MonoBehaviour { public static NewObjectPoolerScript current = null; public GameObject pooledObject = null; public int pooledAmount = 20; public bool willGrow = true; public List<GameObject> pooledObjects = null; public void Awake() { current = this; } void Start () { pooledObjects = new List<GameObject>(); for (int i = 0; i < pooledAmount; i++) { GameObject obj = (GameObject)Instantiate(pooledObject); obj.SetActive(false); pooledObjects.Add(obj); } } public GameObject GetPooledObejcr() { for (int i = 0; i < pooledAmount; i++) { if (pooledObjects[i].activeInHierarchy == false) { return pooledObjects[i]; } } if(willGrow == true) { GameObject obj = (GameObject)Instantiate(pooledObject); pooledObjects.Add(obj); return obj; } return null; } } | cs |
BulletFireScriptcs 파일의 내용을 다음과 같이 수정합니다.
[BulletFireScript.cs] - 수정
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 | using UnityEngine; using System.Collections; public class BulletFireScript : MonoBehaviour { public float fireTime = 0.05f; void Start () { InvokeRepeating("Fire", fireTime, fireTime); } void Fire() { GameObject obj = NewObjectPoolerScript.current.GetPooledObejcr(); if (obj == null) return; obj.transform.position = transform.position; obj.transform.rotation = transform.rotation; obj.SetActive(true); } } | cs |
새로만든 NewObjectPoolerScript 스크립트를 Pooing_Manager 라는 오브잭트에 드래그 앤 드랍합니다.
게임을 실행하면 WillGrow가 True이기 때문에 Bullet이 지속적으로 생성되고 해당 값을 false로 바꾸면 생성된 Bullet으로만 발사합니다.
[참고]
OBJECT POOLING [유니티 자습서]
https://unity3d.com/kr/learn/tutorials/topics/scripting/object-pooling
'엔진 > Unity' 카테고리의 다른 글
[UNITY] Custom Unity Shaders (0) | 2016.11.07 |
---|---|
[UNITY] 캐릭터 회전 - Character Rotation (0) | 2016.09.29 |
[UNITY]]이벤트 함수 호출 순서 (0) | 2016.09.28 |