UnitRenderSystem.cs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. using CMDType = ET.AnimatorEventType;
  2. using AniType = Mono.AnimationData.AnimationType;
  3. using UnityEngine;
  4. using System.Text.RegularExpressions;
  5. using ET.EventType;
  6. using Sirenix.Utilities;
  7. using CommonAI.Zone;
  8. namespace ET.Client
  9. {
  10. [Event(SceneType.Current)]
  11. [FriendOf(typeof(ET.Client.UnitRenderComponet))]
  12. public class AnimatorEventHandler : BEvent<EventType.PlayAnimatorEvent>
  13. {
  14. public override void OnEvent(EventType.PlayAnimatorEvent args)
  15. {
  16. var component = ModelViewComponent.Instance.GetChild<UnitRenderComponet>(args.UnitId);
  17. if (component == null)
  18. {
  19. Log.Debug($"Not found UnitRener of object{args.UnitId}");
  20. return;
  21. }
  22. if (component.AniData == null)
  23. {
  24. var unit = UnitMgr.Instance.GetUnit(args.UnitId);
  25. Log.Error($"UnitRender({unit?.ZoneObject}) not contains AnimationData component");
  26. return;
  27. }
  28. if (args.CommandType == CMDType.Skill)
  29. {
  30. var m = Regex.Match(args.SkillName, "[Ss]kill(\\d+)");
  31. if (m.Success)
  32. {
  33. int n = System.Convert.ToInt32(m.Groups[1].Value, 10);
  34. if (n >= 0 && AniType.SkillMax > AniType.Skill0 + n)
  35. {
  36. AnimatorCommand cmd = new AnimatorCommand((AniType)(AniType.Skill0 + n))
  37. {
  38. Duration = args.Duration,
  39. Speed = args.Speed,
  40. GroupId = args.GroupId,
  41. Loop = args.Loop
  42. };
  43. component.AppendCommand(cmd);
  44. return;
  45. }
  46. }
  47. Log.Error($"Not support skill animation: {args.SkillName}");
  48. }
  49. else
  50. {
  51. AnimatorCommand cmd = args.CommandType switch
  52. {
  53. AnimatorEventType.Idle => UnitRenderComponet.CMDIdle,
  54. AnimatorEventType.Run => UnitRenderComponet.CMDRun,
  55. AnimatorEventType.Dead => UnitRenderComponet.CMDDead,
  56. _ => UnitRenderComponet.CMDIdle
  57. };
  58. component.AppendCommand(cmd);
  59. }
  60. if(!args.Audio.IsNullOrWhitespace())
  61. {
  62. //TODO: Playaudio
  63. }
  64. }
  65. }
  66. [Event(SceneType.None)]
  67. public class SyncUnitPosEventHandler : BEvent<EventType.SyncUnitPosEvent>
  68. {
  69. public override void OnEvent(SyncUnitPosEvent args)
  70. {
  71. var unitRender = ModelViewComponent.Instance.GetChild<UnitRenderComponet>(args.Id);
  72. if(unitRender != null)
  73. {
  74. var transform = unitRender.GameObject.transform;
  75. transform.position = RenderUtils.UnityPosFromBattle(args.Pos);
  76. transform.rotation = RenderUtils.UnityRotationFromBattle(args.Rotation);
  77. if(args.Id == UnitMgr.Instance.ActorId)
  78. {
  79. CameraMgr.FollowMe(transform.position);
  80. }
  81. }
  82. else
  83. {
  84. Log.Debug($"Not exist unitRender: {args.Id}");
  85. }
  86. //_actor.SendUnitMove(dx, dy, true);
  87. //(_actor.ZUnit as ZoneActor).SendUnitStopMove();
  88. //StartSeek(p.X, p.Y, 0, null, false);
  89. }
  90. }
  91. [FriendOf(typeof(UnitRenderComponet))]
  92. public static class UnitRenerSystem
  93. {
  94. [ObjectSystem]
  95. public class UnitRenerAwakeSystem : AwakeSystem<UnitRenderComponet, GameObject>
  96. {
  97. protected override void Awake(UnitRenderComponet self, GameObject go)
  98. {
  99. self.GameObject = go;
  100. self.AniData = self.GameObject.GetComponent<Mono.AnimationData>();
  101. if (self.AniData != null)
  102. {
  103. self.ExeCommand(UnitRenderComponet.CMDIdle);
  104. }
  105. }
  106. }
  107. [ObjectSystem]
  108. public class UnitRenerUpdateSystem : UpdateSystem<UnitRenderComponet>
  109. {
  110. protected override void Update(UnitRenderComponet self)
  111. {
  112. if (self.AniData == null) { return; }
  113. var cmd = self.FilterCmdList();
  114. if (cmd != null)
  115. {
  116. if (self.DoingCmd?.Type != cmd.Type || cmd.IsSkillCmd())
  117. {
  118. self.ExeCommand(cmd);
  119. }
  120. }
  121. }
  122. }
  123. [ObjectSystem]
  124. public class UnitRenerDestroySystem : DestroySystem<UnitRenderComponet>
  125. {
  126. protected override void Destroy(UnitRenderComponet self)
  127. {
  128. if(self.AniData!= null)
  129. {
  130. self.AniData.Animancer.Stop();
  131. }
  132. GameObjectPool.Instance?.RecycleObject(self.GameObject);
  133. self.Reset();
  134. }
  135. }
  136. //===UnitRener 扩展方法-------
  137. public static void AppendCommand(this UnitRenderComponet self, AnimatorCommand cmd)
  138. {
  139. self.Commands.Add(cmd);
  140. }
  141. //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  142. //执行指令
  143. private static void ExeCommand(this UnitRenderComponet self, AnimatorCommand cmd)
  144. {
  145. self.DoingCmd = (AnimatorCommand)cmd;
  146. if(!cmd.IsSkillCmd())
  147. {
  148. self.AniData.PlayAnimation(cmd.Type);
  149. }
  150. else
  151. {
  152. //Skill动作和实际技能时间不太匹配,切到idle动作
  153. self.AniData.PlayAnimation(cmd.Type, () => {
  154. if (self.DoingCmd == cmd)
  155. {
  156. self.ExeCommand(UnitRenderComponet.CMDIdle);
  157. }
  158. });
  159. }
  160. }
  161. //从指令队列中分析出当前需要执行的指令
  162. private static AnimatorCommand FilterCmdList(this UnitRenderComponet self)
  163. {
  164. var cmds = self.Commands;
  165. if (cmds.Count <= 0)
  166. {
  167. return null;
  168. }
  169. /*var cmd = cmds[0];
  170. for(var i=1; i<cmds.Count; i++)
  171. {
  172. var next = cmds[i];
  173. if(next.Type == CMDType.StopRun && cmd.Type == CMDType.Run)
  174. {
  175. cmd = UnitRener.CMDIdle;
  176. }
  177. else if(next.Type == CMDType.StopSkill && cmd.Type >= CMDType.Skill0 && cmd.Type <= CMDType.Skill3)
  178. {
  179. cmd = UnitRener.CMDIdle;
  180. }
  181. else if(next.Type > cmd.Type && cmd.Type < CMDType.Skill0)
  182. {
  183. cmd = next;
  184. }
  185. }*/
  186. var cmd = cmds[cmds.Count - 1];
  187. if(cmd.GroupId > 0)
  188. {
  189. int delIndex = -1;
  190. for(var i = cmds.Count -2; i >= 0; i--)
  191. {
  192. if (cmds[i].GroupId != cmd.GroupId)
  193. {
  194. delIndex = i;
  195. break;
  196. }
  197. }
  198. if(delIndex >= 0)
  199. {
  200. cmds.RemoveRange(0, delIndex + 1);
  201. }
  202. else
  203. {
  204. cmds.Clear();
  205. }
  206. }
  207. else
  208. {
  209. cmds.Clear();
  210. }
  211. return cmd;
  212. }
  213. }
  214. }