OnNewZoneObject.cs 3.4 KB

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