using Entitas; using UnityEngine; using Game; using System; using System.Collections.Generic; [Game] public class SkillComponent : IComponent { public MetaData SkillId = new MetaData(); //正在释放的技能id public bool IsRunning; //是否技能释放中 public Vector3 CastDir; //技能释放方向 public HashSet> HitSet = new HashSet>(); //技能命中信息 生命周期为一次技能释放 public List HitInfo = new List(); //受击命中信息 结算时清空 } namespace Game { public abstract partial class Util { public static void CastSkill(GameEntity entity, string skillId, string skillTimeline, Vector3 castDir) { TimelineManager.Instance.EndSkillTimeline(entity); entity.skill.HitSet.Clear(); var skill = entity.skill; var move = entity.move; skill.IsRunning = true; entity.iD.Data.IsFreeControl = false; move.IsFreeTurn = false; move.TempMoveForceScale = 0; skill.CastDir = castDir; skill.SkillId.Value = skillId; move.MoveDir = castDir; //释放技能会覆盖移动方向 if (castDir != GameConst.NoneDir && castDir != GameConst.Stop) { if (castDir.x != 0) { move.IsRight = castDir.x > 0; } } TimelineManager.Instance.RunSkillTimeline(entity, skillTimeline); } public static void EndSkillTimeline(GameEntity entity) { TimelineManager.Instance.EndSkillTimeline(entity); ClearSkill(entity); var move = entity.move; entity.iD.Data.IsFreeControl = true; move.IsFreeTurn = true; if (entity.hasCombo) { entity.combo.Stance = EComboStance.Idle; } } public static void ClearSkill(GameEntity entity) { var skill = entity.skill; skill.HitSet.Clear(); skill.IsRunning = false; skill.SkillId.Value = ""; } public static void CastSkillMonster(GameEntity entity, int index, Vector3 castDir) { if (!entity.hasAI) { return; } var cfgData = Util.GetMonsterConfigData(entity.CfgId()); var cfg = cfgData.GetFeatureEntityParamMonster(); var skillList = cfg.MonsterSkillList; if (skillList.Count == 0) { Util.Print("怪物技能数量为0:", entity.CfgId()); return; } else if (index < 0 || index >= skillList.Count) { Util.Print("怪物技能释放失败 序号错误:", entity.CfgId(), index, skillList.Count); return; } var skillCfg = Util.GetSkillMonsterConfigData(skillList[index].TechnicalName); var skillTimeline = skillCfg.Template.Skill.Timeline; CastSkill(entity, skillCfg.TechnicalName, skillTimeline, castDir); } private static void CastSkillBullet(GameEntity entity) { if (!entity.hasBullet) { return; } var bullet = entity.bullet; CastSkill(entity, "bullet", bullet.Timeline, bullet.CastDir); Util.EntityMove(entity.ID(), bullet.CastDir); } } }