CTT/Unity/Assets/HotfixView/Event/Battle/PlayEffectEvent.cs

156 lines
6.0 KiB
C#

using Cal;
using Cal.DataTable;
using DG.Tweening;
using ET.EventType;
using ET;
using System;
using System.Collections.Generic;
using UnityEngine;
namespace ET
{
public class PlayEffectEvent : AEvent<PlayEffect>
{
public override async ETTask Run(PlayEffect args)
{
Unit unit = args.unit;
Unit targetUnit = args.targetUnit;
int effectId = args.effectId;
EffectAttachType posType = args.posType;
EffectTargetType targetType = args.targetType;
int time = args.time;
EffectConfig effectConfig = EffectConfigCategory.Instance.Get(effectId);
if (effectConfig == null)
{
Log.Error($"effectConfig == null where id= {effectId}");
return;
}
Transform go = await ResourceViewHelper.LoadPrefabAsync(effectId);
try
{
switch ((EffectType)effectConfig.EffectType)
{
case EffectType.None:
break;
case EffectType.BulletAtk:
PlayBulletEffect(go, unit, targetUnit, time);
break;
case EffectType.PositionAtk:
case EffectType.Acception:
PlayCommonEffect(targetType, go, unit, targetUnit, posType);
break;
case EffectType.Continue:
PlayContinueEffect(targetType, go, unit, targetUnit, posType, time);
break;
default:
break;
}
}
catch (Exception e)
{
Log.Error(e);
ResourceViewHelper.DestoryPrefabAsync(go.gameObject);
}
}
private void PlayContinueEffect(EffectTargetType targetType, Transform go, Unit unit, Unit targetUnit, EffectAttachType posType, int time)
{
switch (targetType)
{
case EffectTargetType.Target:
go.GetComponent<SpriteRenderer>().flipX = unit.UnitType != UnitType.Player;
DoTargetContinueEffect(targetUnit, posType, go,time).Coroutine();
break;
case EffectTargetType.Caster:
targetUnit = unit;
DoTargetContinueEffect(targetUnit, posType, go,time).Coroutine();
break;
case EffectTargetType.TeamPosition:
break;
case EffectTargetType.EnermyPosition:
break;
default:
break;
}
}
private void PlayBulletEffect(Transform go, Unit unit, Unit targetUnit,int time)
{
go.GetComponent<SpriteRenderer>().flipX = unit.UnitType != UnitType.Player && unit.UnitType != UnitType.TeamMember;
MonoAnimancer monoAnimancer = go.GetComponent<MonoAnimancer>();
Vector3 startPos = unit.GetComponent<UnitView>().AtkPosition;
Vector3 endPos = targetUnit.GetComponent<UnitView>().AtkPosition;
go.position =startPos;
monoAnimancer.PlayOther();
go.DOMove(endPos, time/1000f).OnComplete(()=> {
ResourceViewHelper.DestoryPrefabAsync(go.gameObject);
});
}
private void PlayCommonEffect(EffectTargetType targetType, Transform go, Unit unit, Unit targetUnit, EffectAttachType posType)
{
switch (targetType)
{
case EffectTargetType.Target:
go.GetComponent<SpriteRenderer>().flipX = unit.UnitType != UnitType.Player;
DoTargetEffect(targetUnit, posType, go);
break;
case EffectTargetType.Caster:
targetUnit = unit;
DoTargetEffect(targetUnit, posType, go);
break;
case EffectTargetType.TeamPosition:
break;
case EffectTargetType.EnermyPosition:
break;
default:
break;
}
}
private void DoTargetEffect(Unit targetUnit, EffectAttachType posType, Transform go)
{
Vector3 targetPos;
switch (posType)
{
case EffectAttachType.Top:
targetPos = targetUnit.GetComponent<UnitView>().HeadPoint.position;
break;
default:
case EffectAttachType.Center:
targetPos = targetUnit.GetComponent<UnitView>().AtkPosition;
break;
case EffectAttachType.Foot:
targetPos = targetUnit.GetComponent<UnitView>().FootPoint.position;
break;
}
MonoAnimancer monoAnimancer = go.GetComponent<MonoAnimancer>();
go.position =targetPos;
monoAnimancer.PlayOther(() => ResourceViewHelper.DestoryPrefabAsync(go.gameObject));
}
private async ETVoid DoTargetContinueEffect(Unit targetUnit, EffectAttachType posType, Transform go,int time)
{
Vector3 targetPos;
switch (posType)
{
case EffectAttachType.Top:
targetPos = targetUnit.GetComponent<UnitView>().HeadPoint.position;
break;
default:
case EffectAttachType.Center:
targetPos = targetUnit.GetComponent<UnitView>().AtkPosition;
break;
case EffectAttachType.Foot:
targetPos = targetUnit.GetComponent<UnitView>().FootPoint.position;
break;
}
MonoAnimancer monoAnimancer = go.GetComponent<MonoAnimancer>();
go.position = targetPos;
monoAnimancer.PlayOther();
await TimerComponent.Instance.WaitAsync(time);
ResourceViewHelper.DestoryPrefabAsync(go.gameObject);
}
}
}