일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- script
- 메서드
- 유한상태머신
- UI
- 유니티
- 코루틴
- skybox
- InputManager
- 자료구조
- 장애물달리기
- 배열
- 직렬화
- 효과음
- 인터페이스
- inputsystem
- c#
- 스택
- 비선형자료구조
- delegate
- 프로그래머스
- FSM
- invokec#events
- Generic
- unity
- ObjectPool
- LINQ
- 스파르타내일배움캠프
- soundmanager
- BGM
- 람다식
- Today
- Total
Unity 개발일지
[Unity] 동적 생성을 해보자 본문
[동적 생성이란?]
동적 생성이란 게임 실행 중에 코드를 통해 오브젝트를 생성하는 것을 말한다.
동적생성은 미리 정의된 프리팹을 인스턴스화 하거나, 코드로 직접 오브젝트를 만드는 방식으로 이루어질 수 있다.
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들도 동적 생성이 가능하다.
5. Resources.Load
Resources.Load의 문제점
- 리소스 폴더 안에 경로로 저장된 에셋을 불러온다.
- Load에서 탐색과 메모리 할당이 일어난다.
- 동적으로 자주 사용하다보면 성능 이슈가 일어날 수 있다.
> ResourceManager
만들다 보니 Resources.Load가 계속 사용되는데 이렇게 계속 사용할 것 같으면 오브젝트풀을 응용해서 최소한의 호출로 사용할 수 있는 리소스 관리용 매니저를 하나 만들자!
동적 생성에 대해 더 알고싶다면 공식 홈페이지 자료를 참고해보자!
'Unity 개발' 카테고리의 다른 글
[Unity] MonoBehaviour와 Unity 생명주기 실습하기 (3) | 2024.07.16 |
---|---|
[Unity] Delegate(대리자)와 Event, Action 그리고 Callback (0) | 2024.06.27 |
[Unity] Invoke C# Events를 이용한 InputManager만들기 - 4 - (0) | 2024.06.25 |
[Unity] Invoke C# Events를 이용한 InputManager만들기 - 3 - (0) | 2024.06.19 |
[Unity] Invoke C# Events를 이용한 InputManager만들기 - 2 - (0) | 2024.06.18 |