프로그래밍/Unity 2016. 7. 15. 19:43

유니티는 플랫폼이 다양하다.
그 중 모바일 플랫폼도 쓰는데, 모바일 플랫폼에서 게임오브젝트 또는 프리팹을 동적으로 생성하는 작업(Instantiate 함수)은 플랫폼 특성상 과부하가 걸릴 수 밖에 없다. 따라서 주기적 / 반복적으로 생성하는 객체는 씬이 처음 로드할 때 모두 생성한 후 사용하는 방식이 속도면에서 유리하다(렉을 방지한다). 이처럼 사용할 객체를 미리 만들어 놓은 후 필요할 때 가져다 사용하는 방식을 오브젝트 풀링이라고 한다.


ex) GameManager.cs

using UnityEngine;
using System.Collections;
using System.Collections.Generic; // List 자료형을 사용하기 위해 추가해야 하는 네임스페이스
public class GameManager : MonoBehaviour
{
public Transform[] points;
public GameObject monsterPrefab;
public List<GameObject> monsterPool = new List<GameObject>(); //몬스터를 미리 생성해 저장할 리스트 자료형
public float createTime = 2.0f;
public int MaxMonster = 10;
public bool isGameOver = false;
public static GameManager instace - null; // 싱글턴 패턴을 위한 인스턴스 변수 선언
void Awake()
{
//GameManager 클래스를 인스턴스에 대입
instance = this;
}
void Start()
{
points = GameObject.Find("SpawnPoint").GetComponentsInChildren<Tranform>();
for(int i=0;i<maxMonster;i++)
{
GameObject monster = (GameObject)Instantiate(monsterPrefab);
monster.name = "Monster_" + i.ToString();
monster.SetActive(false);
monsterPool.Add(monster);
}
if(points.Length>0)
{
StartCoroutine(this.CreateMonster());
}
}
IEnumerator CreateMonster()
{
while(!isGameOver)
{
int monsterCount = (int) GameObject.FindGameObjectsWithTag("Monster").Length;
if(monsterCount < maxMonster)
{
yield return new WaitForSeconds(createTime);
int idx = Random.Range(1,points.Length);
Instantiate(monsterPrefab,points[idx].position,points[idx].rotation);
}
else
{
yield return null;
}
}
}
}


posted by 천마서생
: