https://www.youtube.com/watch?v=A7mfPH8jyBE&list=PLO-mt5Iu5TeZF8xMHqtT_DhAPKmjF6i3x&index=8
1. 프리펩 만들기
하이어라이키의 Enemy A, B 로 바꾸고 Prefabs 폴더 생성 후 A, B 드래그로 변환
프리펩과 연결된 오브젝튼트는 아이콘과 색상이 다르다.
프리펩 inspector 창에서 체인을 누르고 변경시 모든 오브젝트에 적용된다.
2. 오브젝트 풀 만들기
유니티는 생성 Instantiate 와 삭제 Destroy 함수를 제공
Instantiate + Destroy 함수를 자주 사용하면 메모리 문제 발생
이를 위해 오브젝트 풀링 사용.
프리펩들을 저장할 배열 변수 선언
- Create empty (PoolManager)
PoolManager 스크립트 생성
프리팹을 보관할 변수와 풀 담당을 하는 리스트들 생성
public class PoolManager : MonoBehaviour
{
// .. 프리팹들을 보관할 변수
public GameObject[] prefabs;
// .. 풀 담담을 하는 리스트들
List<GameObject>[] pools;
}
- 자료형[] 변수 : 배열 변수를 선언하겠다.
프리팹 할당시 여러개를 선택후 (Prefabs변수에)드래그하면 자동으로 할당이 된다. (다수를 할당할 때 사용)
pools 초기화
private void Awake()
{
pools = new List<GameObject>[prefabs.Length];
for(int index=0;index<pools.Length;index++)
{
pools[index] = new List<GameObject>();
}
}
- 반복문을 통해 모든 오브젝트 풀 리스트를 초기화
3. 풀링 함수 작성
게임 오브젝트를 반환하는 함수 선언
public GameObject Get(int index)
{
GameObject select = null;
return select;
}
- 어디서나 사용해야 함으로 public
- 게임오브젝트 지역변수와 리턴을 미리 작성
선택한 풀의 놀고 있는 (비활성화 된)게임오브젝트 접근, 발견하면 select변수에 할당
// ... 선택한 풀의 놀고 있는 (비활성화) 게임 오브젝트 접근
foreach(GameObject item in pools[index])
{
if (!item.activeSelf)
{
// ... 발견하면 select 변수에 할당
select=item;
select.SetActive(true);
break;
}
}
- foreach : 배열, 리스트들의 데이터를 순차적으로 접근하는 반복문
- 비활성화(대기 상태) 오브젝트를 찾으면 SetActive 함수로 활성화
못 찾았으면?, 새롭게 생성하고 select 변수에 할당
// ... 못 찾았으면?
if (!select)
{
// ... 새롭게 생성하고 select 변수에 할당
select = Instantiate(prefabs[index], transform);
pools[index].Add(select);
}
- 미리 선언한 변수가 계속 비어있으면 생성 로직 진입
- Instantiate : 원본 오브젝트를 복제하여 장면에 생성하는 함수
4. 풀링 사용해보기
플레이어 소환 담당 자식 오브젝트 및 스크립트 생성 (Spawner)
다양한 곳에서 접근할 수 있도록 게임 매니저에 풀 매니저 추가
public class GameManager : MonoBehaviour
{
public static GameManager instance;
public Player player;
public PoolManager pool;
}
인스펙터에서 변수 초기화(풀매니저 오브젝트 드래그)(스크립트 아님!)
-테스트 출력 생략-
게임매니저의 인스턴스까지 접근하여 풀링의 함수 호출
GameManager.instance.pool.Get(Random.Range(0,2))
- Random.Range(a, b) : a~b-1 의 정수를 랜덤하게 반환
***프리펩은 장면의 오브젝트를 접근할 수 없다.
***따라서 스크립트에서 할당해야한다.
***프리펩을 만들 때 transfrom을 초기화해주자
Enemy 스크립트에서 target을 할당해야 한다.
private void OnEnable()
{
target = GameManager.instance.player.GetComponent<Rigidbody2D>();
}
- OnEnable : 스크립트가 활성화 될 때, 호출되는 이벤트 함수
5. 주변에 생성하기
소환 오브젝트 자식 오브젝트 하나 추가(Creat Empty(Point))
기즈모를 보이게 설정
3D 아이콘 변경하기
- 인스펙터의 아이콘을 클릭하여 다른 아이콘으로 변경가능
3D 아이콘 크키 크게 바꾸기
ctrl + d 로 많이 생성(16개)
자식 오브젝트의 트랜스폼을 담을 배열 변수 선언, 소환 타이머를 위한 변수 선언
public class Spawner : MonoBehaviour
{
public Transform[] spawnPoint;
float timer;
}
초기화(Awake)
private void Awake()
{
spawnPoint=GetComponentsInChildren<Transform>();
}
- GetComponentslnChildren : 자식들을 가져옴
시간을 재는 함수(Update)
void Update()
{
timer += Time.deltaTime;
if (timer > 0.2f)
{
timer = 0;
spawn();
}
}
- Time.deltaTime 계속 더하기
소환 함수를 작성
void spawn()
{
GameObject enemy = GameManager.instance.pool.Get(Random.Range(0,2));
enemy.transform.position = spawnPoint[Random.Range(1,spawnPoint.Length)].position;
}
- enemy의 position도 spawnPoint중 하나의 position으로 할당
깃허브 올리기
Commit : ver 1.6
Description : Object Pooling
https://github.com/mekain80/CloneCode_Undead_Survivor
'게임개발 > 언데드서바이벌_골드메탈_클론코딩' 카테고리의 다른 글
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 7 (회전하는🪓근접무기 구현) (0) | 2023.04.10 |
---|---|
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 6+ (소환 레벨⏳적용하기) (0) | 2023.04.09 |
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 5 (몬스터🧟만들기) (0) | 2023.04.07 |
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 3 (2D 셀 애니메이션🏃제작하기) (0) | 2023.04.06 |
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 2+ (새로운 인풋시스템 적용하기, Input Manager ) (0) | 2023.04.06 |