3D턴제 전투게임 ManiMind VFX효과구현 트러블슈팅
트러블 슈팅
-
- 문제상황
스킬에 사용되는 VFX마다 프리펩으로 만들어서 스킬데이터와 연결해주는 형태로 만들지를 고민했다. 각각의 프리펩은 스킬 효과마다 로컬포지션을 조정해놓음으로써 스킬이펙트가 발생할 위치와 회전, 크기를 조절할 수 있다.
해결방법
스킬에 사용되는 VFX마다 프리펩을 만들게 되면, 같은 VFX를 사용하더라도 크기와 위치조절이 필요할때마다 프리펩을 만들어야하고 이는 프로젝트의 용량을 무겁게 만들고, VFX의 수정을 어렵게 만들 수 있다. 따라서 VFXData를 만들어 LocalPosition과 LocalRotation, LocalScale을 동적으로 변경할 수 있도록 만들었다.
-
- 문제상황
스킬을 사용할 때마다 생성되는 VFX를 생성과 파괴를 반복하면 게임의 성능이 떨어지는 문제가 발생한다.
해결방법
VFX를 ObjectPool패턴을 사용하여, 자주사용되는 VFX에 대해서 생성과 파괴를 반복하는 대신 SetActive를 False로 해놓는 방식으로 갖고있다가 필요한 시점에 초기화 후 SetActive를 true로 하여 마치 생성을 한 것처럼 보이게 만든다.
구체적인 해결과정
1. VFX효과를 입력할 데이터 형태
먼저, VFX효과를 어떻게 적용할 것인지에 대한 데이터 입력을 ActiveSkillSO에 있는 SkillEffectDatas에 입력하도록 만들었다.
어째서 SkillEffectDatas 인가??
- 스킬의 효과가 적용되는 데이터가 SkillEffectDatas에 존재한다. 공격유닛과 타겟유닛이 모두 정해지는 시점이 SkillEffectDatas에 있는 AffectTargetWithSkill메서드이기 때문에 해당 위치에 데이터를 입력해주도록 만들었다.
2. VFX에 ObjectPoolManager적용
우리 프로젝트에서는 ParticleSystem을 활용한 VFX를 사용하기 때문에 ObjectPoolManager에 등록되어있는 (만약 등록되어있지 않다면, 직접 생성해서) VFX게임오브젝트를 가져와서 Scriptable에 입력되어있는 데이터를 기반으로 VFX의 위치와 VFX가 발생할 타이밍을 설정하여 효과를 발생시켜주어야 한다.
3. VFXController Class를 통한 VFX생성, 구독
VFX가 실제로 실행될 시점에 VFX오브젝트를 씬에 생성해주어야 한다. 이를 위해서는 VFX를 생성하는 메서드가 VFX오브젝트 외부에 존재하여야 한다. 따라서 이를 실행해줄 VFXController를 생성해주었다. 또한, VFX가 지속적으로 유지되다가 특정시점에 구독이 해제되어야 할 필요가 있을 수 있기때문에 해당 시점을 Action을 이용하여 구독함으로써 VFX가 재생되어야 할 시점에 재생될 수 있게 만들어 주었다.