|  |  |  | using Entitas; | 
					
						
							|  |  |  | using UnityEngine; | 
					
						
							|  |  |  | using Game; | 
					
						
							|  |  |  | using System; | 
					
						
							|  |  |  | using System.Collections.Generic; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [Game] | 
					
						
							|  |  |  | public class SkillComponent : IComponent | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     public MetaData<string> SkillId = new MetaData<string>(); //正在释放的技能id | 
					
						
							|  |  |  |     public bool IsRunning; //是否技能释放中 | 
					
						
							|  |  |  |     public Vector3 CastDir; //技能释放方向 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public Dictionary<Tuple<int, int>, SkillHitInfo> | 
					
						
							|  |  |  |         SkillHitInfo = new Dictionary<Tuple<int, int>, SkillHitInfo>(); //技能命中信息 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public List<SkillHitInfo> HitInfo = new List<SkillHitInfo>(); //受击命中信息 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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.SkillHitInfo.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.SkillHitInfo.Clear(); | 
					
						
							|  |  |  |             skill.HitInfo.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); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |