VFX가 재생되는 메서드와 VFX가 재생될 타이밍의 메서드와 연결하고 싶은데 어떻게 해야할까?
우선 내가 시도해 본 방법은 PoolableVFX라는 클래스에 Action을 매개변수로 받는 메서드를 만들었다. 받은 액션에 SFX가 Play되는 메서드를 연결하려고 했다.
public class PoolableVFX : Monobehaviour, IPoolObject
{
...
public void SetData(Action trigger)
{
trigger += PlaySFX;
}
}
이후 도트데미지가 적용되는 부분에 다음과 같이 작성하였다.
public class TurnBasedPeriodicDamageDebuff : TurnBasedBuff
{
//배틀 End때 아야하는 느낌
private StatusEffectManager manager;
public override IEnumerator Apply(StatusEffectManager manager)
{
this.manager = manager;
BattleManager.Instance.OnBattleEnd += TakeDamage;
VFX.SetData(ApplyEffect);
yield return null;
}
public override void OnEffectRemoved(StatusEffectManager effect)
{
BattleManager.Instance.OnBattleEnd -= TakeDamage;
ApplyEffect = null;
}
private void TakeDamage()
{
ApplyEffect?.Invoke();
manager.Owner.TakeDamage(Value, ModifierType);
//대미지를 처리해준다?
}
}
실제 코드와 똑같지는 않지만, 이해가 가도록 작성하였다. 아무튼, 이런 식으로 코드를 구성하였을 때 나는 내가 의도한 대로 ApplyEffect가 콜되었을때, 자동으로 VFX가 Play되는 것을 기대했다. 하지만, 코드는 제대로 동작하지 않았다. 실제로 디버깅했을때, ApplyEffect가 null로 들어왔다.
이유가 무엇일까?
ApplyEffect가 매개변수로 넘겨질 때, ApplyEffect는 참조형식으로 넘겨지는 것이 아닌 값 형식으로 넘겨진다. trigger += PlaySFX;에서 trigger는 도트데미지에 존재하는 ApplyEffect가 아닌 값이 복사된 ApplyEffect이다. 따라서 내가 짠 코드는 제대로 동작하지 않는 것이다.
위의 방법에서 매개변수에 ref를 붙여준다. 값 형식이 아닌 참조형식을 넘겨줄 수 있도록. 하지만 ref를 붙여도 결과가 바뀌지 않았다.
복사된 Action인 trigger를 Return하여 ApplyEffect = return된 trigger로 만든다. 다만, 나의 경우에는 이 방식을 사용할 수 없는 구조였기 때문에 이 방식을 사용하지 않았다.
ApplyEffect가 존재하는 클래스의 내부에서 메서드를 연결해준다. 이는 실제로 Action에 메서드를 연결해 줄 때 대부분 사용하는 방식이다. 다만, 이런 식으로 만들고 싶지 않았기 때문에 Action을 매개변수로 넘겨 연결하려 했던 것이다.
public void ApplyVFX()
{
ApplyEffect += vfx.OnSpawnFromPool;
}
나의 경우에는 2번 방법을 사용해서 해결했다.