//Public /// <summary> /// 효과를 추가합니다. /// </summary> public void AddEffect(CharacterEffect effect, EffectStateStruct state) { if (m_Effect.TryGetValue(effect, out EffectStateStruct originalState)) { originalState.Replace(state); m_Effect[effect] = originalState; } else { m_Effect.Add(effect, state); //초기화 effect.Init(this); //DefaultVFX에서 효과 갯수를 추가한다. LoopDefaultVFX(effect, (Type effectType, EffectVFXStateStruct vfxState) => { vfxState.effectCount++; m_DefaultVFX[effectType] = vfxState; //효과가 추가된 기본 VFX 재생 vfxState.vfx.OpenVFX(); }); } }
/// <summary> /// 해당 효과의 상태를 설정합니다. /// </summary> /// <param name="effect">효과</param> /// <param name="newState">변경할 상태</param> public void SetEffectState(CharacterEffect effect, EffectStateStruct newState) { if (m_Effect.ContainsKey(effect)) { m_Effect[effect] = newState; } }
/// <summary> /// 현재 적용된 모든 이펙트를 가져옵니다. /// </summary> /// <returns></returns> public CharacterEffect[] GetEffect_All() { CharacterEffect[] effect = new CharacterEffect[m_Effect.Keys.Count]; m_Effect.Keys.CopyTo(effect, 0); return(effect); }
/// <summary> /// 해당 효과의 상태를 가져옵니다. /// </summary> /// <param name="effect">효과</param> /// <returns></returns> public EffectStateStruct?GetEffectState(CharacterEffect effect) { if (m_Effect.TryGetValue(effect, out EffectStateStruct state)) { return(state); } else { return(null); } }
//Private /// <summary> /// 해당 이펙트 타입에 해당하는 DefaultVFX를 전부 탐색합니다. /// </summary> /// <param name="effect"></param> private void LoopDefaultVFX(CharacterEffect effect, Action <Type, EffectVFXStateStruct> call) { Type effectType = effect.GetType(); while (effectType.BaseType != null) { if (m_DefaultVFX.TryGetValue(effectType, out EffectVFXStateStruct vfxState)) { call(effectType, vfxState); } effectType = effectType.BaseType; } }
/// <summary> /// 효과를 제거합니다. /// </summary> public void RemoveEffect(CharacterEffect effect) { if (m_Effect.Remove(effect)) { //DefaultVFX에서 효과 갯수를 제거한다. LoopDefaultVFX(effect, (Type effectType, EffectVFXStateStruct vfxState) => { vfxState.effectCount--; m_DefaultVFX[effectType] = vfxState; //효과로 제거된 기본 VFX 재생 중지 if (vfxState.effectCount < 0) { vfxState.vfx.CloseVFX(false); } }); } }
/// <summary> /// 해당 효과의 상태를 설정합니다. /// </summary> /// <param name="effect">효과</param> /// <param name="newState">변경할 상태</param> public void SetEffectState(CharacterEffect effect, EffectStateStruct newState) { m_EffectList.SetEffectState(effect, newState); }
/// <summary> /// 해당 효과의 상태를 가져옵니다. /// </summary> /// <param name="effect">효과</param> /// <returns></returns> public EffectStateStruct?GetEffectState(CharacterEffect effect) { return(m_EffectList.GetEffectState(effect)); }
/// <summary> /// 캐릭터 효과를 제거합니다. /// </summary> /// <param name="effect"></param> public void RemoveEffect(CharacterEffect effect) { m_EffectList.RemoveEffect(effect); OnRemoveEffect(effect); }
/// <summary> /// 캐릭터 효과를 추가합니다. /// </summary> /// <param name="effect">추가할 효과</param> public void AddEffect(CharacterEffect effect, EffectStateStruct state) { m_EffectList.AddEffect(effect, state); OnAddEffect(effect); }
/// <summary> /// 캐릭터 효과가 제거될 때 호출됩니다. /// </summary> /// <param name="effect"></param> protected virtual void OnRemoveEffect(CharacterEffect effect) { }
/// <summary> /// 캐릭터 효과가 추가되었을 떄 호출됩니다. /// </summary> /// <param name="effect"></param> protected virtual void OnAddEffect(CharacterEffect effect) { }