[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 6 (오브젝트 풀링🏊으로 소환하기)

2023. 4. 9. 00:08·게임개발/언데드서바이벌_골드메탈_클론코딩

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

 

GitHub - mekain80/CloneCode_Undead_Survivor: https://www.youtube.com/watch?v=MmW166cHj54&list=PLO-mt5Iu5TeZF8xMHqtT_DhAPKmjF6i3x

https://www.youtube.com/watch?v=MmW166cHj54&list=PLO-mt5Iu5TeZF8xMHqtT_DhAPKmjF6i3x&index=1 - GitHub - mekain80/CloneCode_Undead_Survivor: https://www.youtube.com/watch?v=MmW166cHj54&li...

github.com

 

'게임개발 > 언데드서바이벌_골드메탈_클론코딩' 카테고리의 다른 글

[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 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
'게임개발/언데드서바이벌_골드메탈_클론코딩' 카테고리의 다른 글
  • [클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 7 (회전하는🪓근접무기 구현)
  • [클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 6+ (소환 레벨⏳적용하기)
  • [클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 5 (몬스터🧟만들기)
  • [클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 3 (2D 셀 애니메이션🏃제작하기)
메카인
메카인
  • 메카인
    메카인의 지식창고
    메카인
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 코딩 공부
        • TIL(Today I Learn)
        • TIL
        • 백준(C++)
        • Python
        • 알고리즘
        • 프로젝트 회고
      • C++
        • C++
        • C++ STL
        • C,C++ mCoding yotube
      • 게임개발
        • 언데드서바이벌_골드메탈_클론코딩
        • 3D_골드메탈_클론코딩
        • 유니티_문제해결
        • 게임 수학
      • Unreal 공부
        • UE5 GameDev
        • Unreal Engine 4 C++ The Ult..
      • 교재 문제 풀이
        • 운영체제
      • 정보처리기사
        • 정처기 요약
        • 정처기 오답노트
      • 학교수업
        • 데이터베이스
        • 프로그래밍 언어론
        • 리눅스 시스템
        • 네트워크
      • 일상
        • 주식
        • 독서
      • (비공개 전용)
        • memory
        • Build
        • OOP
        • Smart Pointer
        • lamda
        • 게임 수학
        • 모던 C++
        • 모던 C++ STL
        • 모던 C++ Concurrency, Paralle..
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • 블로그 관리
  • 링크

  • 공지사항

    • 공지사항 - 인생과 블로그의 목표
  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
메카인
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 6 (오브젝트 풀링🏊으로 소환하기)
상단으로

티스토리툴바