Object Pool, 파티클, 빛

감사콩·2025년 11월 12일

유니티

목록 보기
17/29
post-thumbnail

서론


유니티에서의 내장 오브젝트 풀링 기능을 알아보고
플레이어의 게임 경험에 있어 중요한 요소인 파티클, 빛에 대해서도 알아보겠다.



TIL 요약


  1. 오브젝트풀링은 생성과 파괴에서 발생하는 부하를 줄이기 위해 활용되며
    여러 방식이 있지만 오늘은 Unity 자체 ObjectPool을 활용.

  2. Particle, Light는 애니메이션과 마찬가지로 기능이 매우 많다.
    내가 뭔가를 창작하겠다는 생각보다는, 어떤 표현이 필요할 때
    어떤 기능을 사용하면 될 지 정도만 알아두자.



Object Pool


저번 달부터 오브젝트 풀링 패턴 자체는 사용해왔었다.
다만 내장 기능이 아닌 싱글톤 기반의 커스텀 오브젝트 풀링만 사용했었는데
이번엔 유니티에서 제공하는 내장 오브젝트풀 기능을 사용해보겠다.

오브젝트 풀 패턴

단순한 오브젝트의 생성(Instantiate)과 파괴(Destroy) 대신
필요한 오브젝트를 Pool에서 꺼내오고, 사용이 종료되면 다시 반환하는 로직의 패턴.

사용 시 이점

생성과 파괴에서 발생하는 부하를 줄이고, 추가로 생성과 파괴를 통해 GC 작동 시
조건에 따라 발생하는 메모리 단편화/누수를 방지하여 게임 최적화에 도움을 줌.

기본 개념은 저번에도 정리하였으니 넘어가고
Unity 내장 오브젝트풀에 대해 알아보겠다.

Unity Object Pool


Unity에서 네임스페이스를 통해 공식적인 오브젝트 풀링 API를 제공하고 있으며
이 기능을 알아보려 한다.

1. 네임스페이스

using UnityEngine.Pool;
일단 내부에서 어떤 방식으로 오브젝트풀링이 이루어지는 지 궁금해졌다

스택 기반의 제네릭 오브젝트풀링 클래스.

2. 생성자

생성자는 객체의 생성 방법과 객체를 꺼내거나, 반환하거나 파괴할 때 실행될 로직을 지정할 수 있다.

생성 방법을 정하고

  1. createFunc: 새 객체 생성 방법을 정의

이후 액션마다 실행할 로직을 정의

  1. actionOnGet: 객체를 풀에서 꺼낼 때 실행할 로직 지정
  2. actionOnRelease: 객체를 풀에 반환할 때 실행할 로직 지정
  3. actionOnDestroy: 객체를 완전히 파괴할 때 실행할 로직 지정

코드로 작성해보면 아래와 같다.

해당 델리게이트의 내용만 수정하면 되니 확장성을 보장.

빠른 제작이 가능하다는 장점이 있기에 나는 아마 자주 사용할 것 같다.

공식 문서


유니티 공식문서에 기본 기능이 적혀있길래 설명 부분만 번역기 돌려서 저장
프로퍼티, 메서드 는 필요에 맞게 활용해보자

메서드는 어떤 원리인 지만 파악하고 사용하면 될 것 같고

프로퍼티 쪽에서 CountAll, CountInactive는 어떤 방식으로 활용할까 하다가

FPS에서의 탄창 등, 반복 생성되고
현재 갯수 / 총 갯수
이런 식의 표시가 필요한 UI 같은 곳에 응용할 수 있을 듯 하다.
유닛 수 증가 시 오브젝트 풀 길이를 늘린다던가 하는 것도 활용 가능해보임.

유니티 오브젝트풀링은 여기까지 알아보고
기존 오브젝트풀링 코드 리팩토링을 해보면서 복습해보겠다.



Particle


탄환 발사 시 총구의 불꽃, 끊어진 전선에서의 전기 이펙트 등등
여러 곳에서 활용하여 플레이어의 몰입도를 높이기 위한 기능.

유용한 기능이 많긴 하지만 기능 전부 알아 볼 시간은 없다.
여러가지 적용해보고, 원하는 기능이 생길 경우엔 검색해보자

사용 방식에 따라 여러 이펙트를 만들 수 있겠지만
파티클 작업에 익숙해지는 건 후순위라고 생각되므로 필요할 경우 다시 찾아보겠다.



Light


게임에서의 광원 효과는 게임 분위기에 큰 영향을 주며
심지어는 게임의 장르를 정하게 되기도 하는 중요한 기능이다.

다만 난 지금 개발적 능력에서의 기본기를 다지는 게 더 중요하기에
파티클과 마찬가지로 주요 기능을 알아보고 필요 시에 추가로 찾아보자.

Type


유니티의 Light 컴포넌트에선 4가지 빛의 종류가 정해져 있다
종류별 특징을 알아보겠다.

1. Spot


보자마자 손전등부터 떠오르는 녀석.

  • 특징: 스포트라이트 처럼 원하는 반경에 광원 효과를 부여.
  • 역할: 손전등, 무대 스포트라이트와 같은 집중된 조명 효과

2. Directional


유니티 씬 생성과 동시에 생성되는 기본 광원.

  • 특징: 태양광처럼 무한히 멀리 위치하며 한 방향으로만 빛을 발산하는 광원
  • 역할: 씬 전체의 전역 조명이나 태양을 시뮬레이션하는 데 주로 사용

3. Point

  • 특징: 씬의 한 지점에 위치하며 모든 방향으로 균등하게 빛을 발산하는 광원
  • 역할: 전구, 횃불, 램프 등의 광원으로 활용 가능

4. Area Light

에디터로 테스트해보니 차이를 모르겠어서 검색해보니
자연스럽고 사실적인 하이라이트 (반사광, 자연광 등등) 를 연출하기 위한 기능이라고 한다.

따라서 높은 성능 부하를 일으키므로 Baked 환경에서만 활용 가능.
이 기능은 심화 단계에서 추가로 다뤄보겠다.


Mode


언제 광원의 빛과 그림자를 계산할지를 결정

1. RealTime

프레임마다 실시간으로 계산.

  • 특징: 광원의 위치, 색상, 세기 등이 런타임에 자유롭게 변경(움직이는 손전등 등)
    오브젝트가 움직일 때 그림자도 실시간으로 움직임

  • 장점: 유연하고 동적인 조명 효과.

  • 단점: 매 프레임 계산하므로, 실시간 광원이 많을 수록 런타임 성능 부하가 높아짐.


2. Baked

게임 실행 전에 미리 계산하여 Lightmap 이라는 텍스쳐 파일에 저장.

  • 특징: 정적인 오브젝트에만 영향을 가지며 광원이 움직일 수 없음.

  • 장점: 런타임 계산 비용이 절약되므로 성능상 이점이 있음.

  • 단점: 오브젝트가 움직이면 조명과 맞지 않아 어색해짐 = 유연성 낮음.


3. Mixed

이름 그대로 위의 두 기능을 결합한 Mode

  • 특징: 동적 그림자 및 직접광은 런타임에 실시간으로 계산
    정적 그림자와 간접광은 미리 Bake

  • 장점: 움직이는 광원과 동적 오브젝트를 사용하면서도 좋은 품질의 간접광 효과를 낼 수 있음.

  • 단점: 어정쩡한 성능 + 어정쩡한 퍼포먼스가 나올 수 있으니 주의


주로 Directional Light는 RealTime
Point 등의 정적인 실내 조명에선 Baked

이런 식으로 광원의 움직임 유무, 품질과 성능의 목표치에 맞춰서 결정하면 될 듯 하다.


Light Explorer

씬 내의 모든 light 효과를 보여줌

Light도 이 정도 알아보고 필요에 따라 활용해보자.



마무리

오늘은 기존에 활용하던 오브젝트풀링의 내장 기능을 알아보았는데
커스텀 제작한 오브젝트 풀링보다 구현에 더 적은 시간이 들어가는 장점이 있었다.

다만 커스텀으로 제작하면 내가 원하는 기능을 좀 더 자유롭게
(협업 간 간편한 테스트를 위해 기능간 연결을 쉽게 만든다던가)
만들 수 있어 장단점이 존재하는 것 같았다.

Particle, Light도 알아보았는데 없어선 안될 기능이지만
파고들면 또 끝이 없을 듯하여 적당히만 알아보고 기본기를 다지는 데 집중하려고 한다.

profile
안녕하시와요

1개의 댓글

comment-user-thumbnail
2025년 11월 12일

오늘 배웠던 오브젝트 풀에서
첫번째 단계 : 가장 기본적인 컬렉션 사용한 오브젝트 풀
두번째 단계 : 오브젝트 풀 제네릭 클래스 정의
세번째 단계 : 유니티 내장 오브젝트 풀

이렇게 3가지 구현 방법을 알아봤는데 이들을 선택하는 기준은 무엇일까요? (각각의 장단점)
빠른 구현 vs 커스터마이징 트레이드 오프를 고민해보면 좋을 것 같습니다.

답글 달기