OnNewZoneObject.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using CommonAI.ZoneClient;
  2. using FairyGUI;
  3. using Sirenix.Utilities;
  4. using UnityEngine;
  5. namespace ET.Client
  6. {
  7. [Event(SceneType.Current)]
  8. [FriendOfAttribute(typeof(ET.Client.UnitRenderComponet))]
  9. public class OnNewZoneObjectHandler : AEvent<EventType.OnNewZoneObject>
  10. {
  11. protected override async ETTask Run(Scene scene, EventType.OnNewZoneObject args)
  12. {
  13. var obj = UnitMgr.Instance.GetUnit(args.ObjectId);
  14. if (obj is BattleUnit)
  15. {
  16. await CreatUnitModel(obj as BattleUnit);
  17. }
  18. else if (obj is BattleSpell)
  19. {
  20. //TODO: 性能有问题时,可以减少法术展示
  21. await CreateSpellModel(obj as BattleSpell);
  22. }
  23. else
  24. {
  25. Log.Error("unknow new object");
  26. }
  27. }
  28. private static CommonLang.Geometry.Vector3 vecTemp = new();
  29. private async ETTask CreatUnitModel(BattleUnit unit)
  30. {
  31. var zu = unit.ZUnit;
  32. if (!UnitMgr.Instance.HasUnit(zu.ObjectID))
  33. {
  34. //还没显示就已挂掉的单位,走好
  35. Log.Debug($"ignore dead unit: {zu}@{zu.ObjectID}");
  36. return;
  37. }
  38. var go = await GameObjectPool.Instance.Acquire($"Unit_{zu.Info.FileName}");
  39. go.SetActive(true);
  40. go.transform.parent = GlobalViewComponent.Instance.Unit;
  41. vecTemp.Set(zu.X, zu.Y, zu.Z);
  42. go.transform.position = RenderUtils.UnityPosFromBattle(vecTemp);
  43. go.transform.rotation = RenderUtils.UnityRotationFromBattle(zu.Direction);
  44. var render = ModelViewComponent.Instance.AddChildWithId<UnitRenderComponet, GameObject>(unit.Id, go, true);
  45. CreateHeadbar(render, zu).Coroutine();
  46. if (unit is BattleActor)
  47. {
  48. CameraMgr.FollowMe(go.transform.position);
  49. }
  50. //Log.Debug($"unitRender({zu.ObjectID}),pos({zu.X},{zu.Y},{zu.Z}) ok.");
  51. //TODO: 同步ZoneUnit status
  52. }
  53. private async ETTask CreateSpellModel(BattleSpell spell)
  54. {
  55. var zs = spell.ZoneObject as ZoneSpell;
  56. var res = zs.Info.FileName;
  57. if (res.IsNullOrWhitespace())
  58. {
  59. Log.Debug($"spell({zs.Info.ID}) not config fileName");
  60. return;
  61. }
  62. if (!UnitMgr.Instance.HasUnit(zs.ObjectID) || (zs.Sender != null && !UnitMgr.Instance.HasUnit(zs.Sender.ObjectID)))
  63. {
  64. //还没显示就已挂掉的单位,走好
  65. Log.Debug($"ignore dead unit's spell: {zs.ObjectID}@{zs.Sender.ObjectID}");
  66. return;
  67. }
  68. GameObject go = await GameObjectPool.Instance.Acquire($"Effect_{res}");
  69. go.transform.parent = GlobalViewComponent.Instance.Unit;
  70. go.SetActive(true);
  71. go.transform.localScale = Vector3.one * zs.Info.FileBodyScale;
  72. vecTemp.Set(zs.X, zs.Y, zs.Z + zs.LaunchHeight);
  73. go.transform.position = RenderUtils.UnityPosFromBattle(vecTemp);
  74. go.transform.rotation = RenderUtils.UnityRotationFromBattle(zs.Direction);
  75. ModelViewComponent.Instance.AddChildWithId<UnitRenderComponet, GameObject>(zs.ObjectID, go, true);
  76. var et = go.GetComponent<EffectTime>();
  77. if (et != null)
  78. {
  79. et.speed = zs.Info.EffectAddSpeed;
  80. //et.playAnimName = zs.Info.AnimtionName;
  81. //TODO:特效不支持播放动画
  82. }
  83. }
  84. private async ETTask CreateHeadbar(UnitRenderComponet render, ZoneUnit zu)
  85. {
  86. var view = await GameObjectPool.Instance.AcquireHeadBar();
  87. view.visible = true;
  88. render.HeadBar = view;
  89. var name = view.GetChild("text_name");
  90. var progresshp = view.GetChild("bar_hp") as GProgressBar;
  91. progresshp.max = 100;
  92. progresshp.min = 0;
  93. name.text = render.GameObject.name;
  94. progresshp.value = zu.HP * 100 / zu.MaxHP;
  95. render.SyncHeadBarPos();
  96. }
  97. }
  98. }