[2025/07/14]TIL

오수호·2025년 7월 14일

TIL

목록 보기
40/60

ManiMind개발 중 트러블 슈팅


문제상황

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이다. 따라서 내가 짠 코드는 제대로 동작하지 않는 것이다.

시도해본 방법2

위의 방법에서 매개변수에 ref를 붙여준다. 값 형식이 아닌 참조형식을 넘겨줄 수 있도록. 하지만 ref를 붙여도 결과가 바뀌지 않았다.

해결방법

  1. 복사된 Action인 trigger를 Return하여 ApplyEffect = return된 trigger로 만든다. 다만, 나의 경우에는 이 방식을 사용할 수 없는 구조였기 때문에 이 방식을 사용하지 않았다.

  2. ApplyEffect가 존재하는 클래스의 내부에서 메서드를 연결해준다. 이는 실제로 Action에 메서드를 연결해 줄 때 대부분 사용하는 방식이다. 다만, 이런 식으로 만들고 싶지 않았기 때문에 Action을 매개변수로 넘겨 연결하려 했던 것이다.

    public void ApplyVFX()
    {

                 ApplyEffect += vfx.OnSpawnFromPool;
    }

나의 경우에는 2번 방법을 사용해서 해결했다.

profile
게임개발자 취준생입니다

0개의 댓글