using CommonAI.ZoneClient; using Sirenix.Utilities; using UnityEngine; namespace ET.Client { [Event(SceneType.Current)] public class OnNewZoneObjectHandler : AEvent { protected override async ETTask Run(Scene scene, EventType.OnNewZoneObject args) { var obj = UnitMgr.Instance.GetUnit(args.ObjectId); if(obj is BattleUnit) { await CreatUnitModel(obj as BattleUnit); } else if(obj is BattleSpell) { //TODO: 性能有问题时,可以减少法术展示 await CreateSpellModel(obj as BattleSpell); } else { Log.Error("unknow new object"); } } private static CommonLang.Geometry.Vector3 vecTemp = new(); private async ETTask CreatUnitModel(BattleUnit unit) { var zu = unit.ZUnit; var go = await GameObjectPool.Instance.Acquire($"Unit_{zu.Info.FileName}"); go.SetActive(true); if (!UnitMgr.Instance.HasUnit(zu.ObjectID)) { //还没显示就已挂掉的单位,走好 Log.Debug($"ignore dead unit: {zu}@{zu.ObjectID}"); return; } ModelViewComponent.Instance.AddChildWithId(unit.Id, go, true); go.transform.parent = GlobalViewComponent.Instance.Unit; vecTemp.Set(zu.X, zu.Y, zu.Z); go.transform.position = RenderUtils.UnityPosFromBattle(vecTemp); go.transform.rotation = RenderUtils.UnityRotationFromBattle(zu.Direction); if (unit is BattleActor) { CameraMgr.FollowMe(go.transform.position); } Log.Debug($"unitRender({zu.ObjectID}),pos({zu.X},{zu.Y},{zu.Z}) ok."); //TODO: 同步ZoneUnit status } private async ETTask CreateSpellModel(BattleSpell spell) { var zs = spell.ZoneObject as ZoneSpell; var res = zs.Info.FileName; if(res.IsNullOrWhitespace()) { Log.Debug($"spell({zs.Info.ID}) not config fileName"); return; } if (!UnitMgr.Instance.HasUnit(zs.ObjectID) || (zs.Sender != null && !UnitMgr.Instance.HasUnit(zs.Sender.ObjectID))) { //还没显示就已挂掉的单位,走好 Log.Debug($"ignore dead unit's spell: {zs.ObjectID}@{zs.Sender.ObjectID}"); return; } GameObject go = await GameObjectPool.Instance.Acquire($"Effect_{res}"); go.transform.parent = GlobalViewComponent.Instance.Unit; go.SetActive(true); go.transform.localScale = Vector3.one * zs.Info.FileBodyScale; vecTemp.Set(zs.X, zs.Y, zs.Z + zs.LaunchHeight); go.transform.position = RenderUtils.UnityPosFromBattle(vecTemp); go.transform.rotation = RenderUtils.UnityRotationFromBattle(zs.Direction); ModelViewComponent.Instance.AddChildWithId(zs.ObjectID, go, true); var et = go.GetComponent(); if (et != null) { et.speed = zs.Info.EffectAddSpeed; //et.playAnimName = zs.Info.AnimtionName; //TODO:特效不支持播放动画 } } } }