Unity 개발일지

[Unity] 동적 생성을 해보자 본문

Unity 개발

[Unity] 동적 생성을 해보자

아머르 2024. 6. 26. 19:13

[동적 생성이란?]

동적 생성이란 게임 실행 중에 코드를 통해 오브젝트를 생성하는 것을 말한다.

동적생성은 미리 정의된 프리팹을 인스턴스화 하거나, 코드로 직접 오브젝트를 만드는 방식으로 이루어질 수 있다.

Scene전환을 해도 되지만 전환 시 신경써줘야하는 부분들도 많기 때문에 동적 생성을 선호하기도 한다.

 

[동적 생성의 장점]

 - 씬이 가벼워져서 씬 로딩이 빠름

 - 씬이 변화가 없어서 Git 충돌이 거의 없음

 - Prefab단위로 작업을 진행해 분업이 편리

 - 추후 대부분의 리소스 및 UI를 Adressable로 보내 빌드 용량을 낮추기 용이함

 - 와이어 프레임상 변경이 일어날 경우 간단하게 바꿀 수 있음(유지보수 용이)

 

[동적 생성의 단점]

 - 동적생성을 하는 코드를 추가 작성해야 해서 코드가 복잡해짐

 - 실행시키기 전까지 확인이 안됨

 - 배치 변경시 해당 프리팹을 찾아가서 일일이 수정해야함 (디버깅이 어려움)

 

[총평]

개발을 하다보면 피해갈 수 없는 요소

 - 대부분의 정보, 좌표까지 데이터로 넘기면 대부분의 변경사항은 개발자가 하지 않아도 됨!

 - 어드레서블 에셋 또는 에셋 번들을 사용하려면 필수!

 - 깃 충돌을 최소화할 수 있음!

 

 

[동적 생성의 활용]

1. 랜덤생성

 - 로그라이크류에 유리

 - 맵에 게임에 큰 영향을 미치지 않는 오브젝트 배치에 사용

 - 생성된 데이터를 캐싱하여 같은 위치에 다시 배치하도록 작업할 수 있음

 - 인력이 적게 들어 개발기간 단축에 좋으나 변수가 큼

   (자원이 한쪽에 몰려있다거나, 초기지역에 있어선 안되는 몬스터가 등장한다거나, 움직일 수 없게 된다거나)

InitWorld 메서드를 보면

Resources폴더에서 Player와 CameraContainer를 소환해서 player에 부착해주었다.

그리고, terrain의 크기를 계산해서 terrain 안의 랜덤한 위치에 나무와 돌을 소환하도록 해주었다.

 

이상한 곳에 소환되는 것을 방지하기 위해 SpawnManager에는 Ray를 쏴서

Ground가 아닌 곳에서 생성되려고 하면 막아주는 로직도 구현가능하다.

한쪽에 자원이 몰려서 생기는 경우가 발생 > 영역을 지정해서 영역별로 소환해주자!

 

 

2. 지정된 위치 생성

 - 지정된 위치에 생성 (기획대로의 배치를 위함)

 - 데이터 테이블에서 데이터 변경으로 조정이 가능

 - 생성해보고 마음에 안들면 계속 수정해야 하지만, 픽스 될 경우 신경 쓸 필요가 없는 점이 장점

 

3. Baked Light

 Baked Lightmap은 빛을 씬에 굽는 방식으로, 씬 안에 있는 오브젝트와 함께 굽는다.

그 말은 즉, 동적 생성이 불가능 하다는 얘기일 뻔했지만... SceneManager.LoadScene의 옵션을 이해하면 해결이 가능!

 - LoadSceneMode.Single

 DontDestroyOnLoad로 등록된 오브젝트를 제외한 나머지를 제거 후 새로운 씬을 로드

 

 - LoadSceneMode.Additive

 현재 씬 상태에서 새로 로드된 씬을 로드(여러개의 씬이 한 장면에 존재할 수 있음)

즉, Additive로 로드하면 현재 씬에 원하는 지형물 같은 것들을 추가할 수 있다!

LoadSceneMode.Addictive와 LoadSceneAsync를 이용해서 화면이 넘어가는 동안 화면이 멈춰있다는 느낌을 없애기 위해 LoadScene을 써도 되지만 Async를 써주었다.

 

 > Additive의 다른 응용

 기왕 Additive를 배워본 김에 다른 사용법도 알아보자.

매니저들을 싱글톤으로 많이 사용을 하는데 Additive로 로드하게되면

매니저들이 다시 생성되거나 파괴되는 것을 사전에 방지할 수도 있다.

 

4. UI의 동적 생성

 이것 저것 씬에서 제거하고 보니 눈에 거슬리는 UI들도 동적 생성이 가능하다.

 

런타임 시점에 프리팹 인스턴스화 - Unity 매뉴얼

프리팹은 복잡한 게임 오브젝트나 게임 오브젝트 컬렉션을 런타임 시점에 인스턴스화하려는 경우에 매우 유용합니다. 코드를 사용하여 처음부터 게임 오브젝트를 만드는 것보다는 코드를 사용

docs.unity3d.com

 

 

5. Resources.Load

 Resources.Load의 문제점

 - 리소스 폴더 안에 경로로 저장된 에셋을 불러온다.

 - Load에서 탐색과 메모리 할당이 일어난다.

 - 동적으로 자주 사용하다보면 성능 이슈가 일어날 수 있다.

 

 > ResourceManager

 만들다 보니 Resources.Load가 계속 사용되는데 이렇게 계속 사용할 것 같으면 오브젝트풀을 응용해서 최소한의 호출로 사용할 수 있는 리소스 관리용 매니저를 하나 만들자!

 

 

 

동적 생성에 대해 더 알고싶다면 공식 홈페이지 자료를 참고해보자!

 

게임 오브젝트 생성 및 제거 - Unity 매뉴얼

일부 게임은 씬에 일정한 수의 오브젝트를 유지하지만 게임플레이 중에 캐릭터, 보물 및 기타 오브젝트를 만들고 제거하는 것은 매우 일반적입니다. Unity에서 게임 오브젝트는 기존 오브젝트의

docs.unity3d.com

반응형