한 줄 요약
델리게이트 : 함수를 저장하는 변수. 저장된 함수들을
Invoke를 통해 호출. 저장 시에는 매개변수와 반환 형식이 일치해야함
Invoke();함으로써 등록된 함수를 호출할 수 있다.Func<> 형식을 사용하고, 반환 타입이 없는 델리게이트는 Action<> 형식을 사용한다.[델리게이트] += [메서드] // 메서드 등록
[델리게이트] -= [메서드] // 메서드 등록 해제
기능이 적절하게 동작하기 위해서 뿐만 아니라 성능을 위해서도 메서드의 등록 해제 관리는 중요
객체 A가 객체 B의 메서드를 자신의 델리게이트에 등록
A는 B를 참조하지않으면 델리게이트를 실행할 때 오류가 생기므로 B에 대한 참조를 유지
만약에 B를 더이상 아무 것도 참조하지 않아도 A에 등록된 메서드 때문에 B가 메모리 상에 유지
(= 가비지 컬랙션 방해)
이러한 문제가 발생할 수 있기 때문에 적절하게 등록/해제 해주는 것이 중요
/// <summary>
/// 턴이 종료될 때 스택만큼 독 데미지 적용
/// (Bio 타입은 30%)
/// </summary>
public class PoisonEffect : BaseEffect
{
public PoisonEffect(EffectData effectData, EffectController effectController) : base(effectData, effectController)
{
EffectController.OnActionStart += Apply;
}
public override void Apply()
{
base.Apply();
...(데미지를 주는 로직)...
}
public override void Exit()
{
base.Exit();
EffectController.OnActionStart -= Apply;
}
}
OnActionStart.Invoke()가 호출되는 시점에 실행된다.Exit();을 호출해 델리게이트 연결을 해제한다.