UnitRenderSystem.cs 6.4 KB

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