BulletAnt 개발일지 (21) - Niagara, Texture 최적화, BP 최적화

김펭귄·4일 전

Today What I Learned (TIL)

목록 보기
136/139

Niagara 이펙트 및 사운드 적용

기존 Cascade 이펙트를 Niagara로 전환하였다.
언리얼에서 제공하는 변환 플러그인을 사용하면 기존 Cascade를 자동 변환할 수 있다.

변환 후에는 Converted 이름의 Niagara System(NS) 이 생성되며,
Niagara 로그를 통해 정상 변환 여부를 확인 가능했다. 일부 경고는 발생했지만 큰 문제는 없었다.

Niagara 방향 문제

문제는 기존 Spitter 광선 이펙트가 X축 기준으로 제작되어 있었는데,
변환된 Niagara는 Z축 방향을 기준으로 동작하고 있었다는 점이었다.

그래서 각 Emitter의 Mesh Renderer에서 Pivot 및 Transform 값을 수정하여
원하는 방향으로 이펙트를 보정하였다.

GPU 시뮬레이션 사용

이펙트는 이벤트 처리나 물리 계산이 거의 없는 단순 연출용이었기 때문에
Sim Target을 GPU로 변경하였다.

CPU 시뮬레이션보다 부담이 적고,
현재 프로젝트처럼 적 개체 수가 많은 상황에서는 GPU 기반이 더 적합하다고 판단했다.

파티클 최소화

Particle 개수가 많아지면 성능이 떨어지므로, Spawn Rate랑 Life를 줄여줘서 파티클 개수를 줄였다.

공격 이펙트 재생 방식

Spitter는 공격 빈도가 높기 때문에 매번 Niagara Component를 생성하지 않고,
미리 BaseSpitter에 컴포넌트를 붙여 재사용하는 구조로 변경했다.

공격 몽타주의 AnimNotify에서:

  • 시작 시 StartSpit
  • 종료 시 StopSpit

를 호출하여 이펙트를 켜고 끄는 방식이다.

애니메이션은 서버/클라이언트 모두 재생되므로,
별도 RPC 없이 Notify만으로 자연스럽게 동기화되는 장점이 있었다.

void USpitterNotifyState::NotifyBegin(/**/)
{
	Owner->StartSpit();
}

void USpitterNotifyState::NotifyEnd(/**/)
{
	Owner->StopSpit();
}

void ABaseSpitterEnemy::StartSpit()
{
	NiagaraComp->Activate(true);
}

void ABaseSpitterEnemy::StopSpit()
{
	NiagaraComp->DeactivateImmediate();
}

사운드 처리

사운드 역시 동일하게 처리했다.

공격 몽타주에 PlaySound Notify를 추가하고,
소켓 위치를 따라가도록 Follow 옵션을 사용했다.

이 방식 역시 서버, 클라이언트 모두 동일하게 몽타주를 재생하므로
추가 동기화 없이 자연스럽게 처리되었다.

SoundCue 및 Attenuation 적용

사운드는 전부 SoundWave 대신 SoundCue를 사용하였다.

이유는 거리 기반 감쇠(Attenuation)를 적용하기 위해서였다.

  • Inner Radius 내부에서는 동일한 볼륨 유지
  • 이후 Falloff Distance 구간에서 점진적으로 감소

하도록 설정하였다.

또한:

  • 감쇠 함수(Function)
  • 적용 형태(Shape)

를 상황에 맞게 조정하여
대규모 전투 상황에서도 자연스럽게 공간감이 느껴지도록 구성했다.

Attenuation 공식 문서


텍스처 LOD 조정을 통한 최적화

최적화 방법을 찾아보던 중, 게임에서 사용하는 텍스처의 LOD(Level Of Detail)를 낮추는 것만으로도 메모리 사용량과 렌더링 비용을 줄일 수 있다는 점을 알게 되었다.

텍스처 에셋을 보면:

  • Imported : 원본 해상도
  • LOD Bias : 사용할 MipMap 단계

를 설정할 수 있다.

LOD Bias를 높이면, 2의 지수 단위로 더 낮은 해상도의 MipMap을 사용하게 된다.

사용 중인 텍스처 찾기

어떤 텍스처가 실제 사용되는지 확인하기 위해
언리얼의 Reference Viewer를 활용했다.

우클릭 해 Reference Viewer를 열고:

  • 탐색 깊이 증가
  • Texture만 필터링

하여 실제 참조 중인 텍스처들을 확인했다.

찾아낸 텍스처들은 한 번에 선택하여 LOD Bias를 일괄 수정할 수 있었다.

특히 대규모 적과 이펙트가 동시에 등장하는 현재 프로젝트에서는 텍스처 메모리 절감 효과가 꽤 체감되었다.


불필요한 에셋 참조

텍스처 최적화를 위해 Reference Viewer를 보다가 예상 못한 문제를 발견했다.

기존에는 모든 적 BP를 BP_BaseEnemy를 상속받아 제작했는데,
확인해보니 Larvae나 Spikan 같은 적들이:

  • SK_Manny
  • 테스트용 머티리얼
  • 테스트용 ABP

같은 전혀 필요 없는 에셋까지 참조하고 있었다.

원인은 부모 BP인 BP_BaseEnemy에 테스트용 Mesh, Material, ABP, DataAsset 등이 남아 있었기 때문이었다.

자식 BP에서 해당 에셋을 다른 에셋으로 교체하더라도, 부모가 참조 중인 에셋 의존성 자체는 유지된다고 한다.

그래서 기존처럼 BP를 BP에서 상속하는 대신:

LarvaeCharacter(C++)
 └ BP_Larvae

형태로 변경하여, 공통 로직은 C++에 두고 BP는 필요한 리소스만 가지게 만들었다.

수정 후 Reference Viewer를 확인해보니
각 적이 자기 리소스만 참조하도록 깔끔하게 정리되었다.

profile
반갑습니다

0개의 댓글