프로그래밍/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;}}}}
'프로그래밍 > Unity' 카테고리의 다른 글
유니티 VideoPlayer. (0) | 2017.08.03 |
---|---|
unity JsonUtility 사용법. (저장 / 불러오기) (0) | 2016.07.20 |
LitJSON 파일 있는지 없는지 확인 함수 (0) | 2016.07.10 |