using CommonAI.ZoneClient; using ET.EventType; using FairyGUI; using Sirenix.Utilities; using UnityEngine; using XmdsCommon.Plugin; namespace ET.Client { [Event] [FriendOfAttribute(typeof(ET.Client.UnitRenderComponet))] [FriendOfAttribute(typeof(ET.Client.ModelViewComponent))] public class OnNewZoneObjectHandler : BEvent<EventType.OnNewZoneObject> { protected override async ETTask OnEvent(EventType.OnNewZoneObject args) { var obj = UnitMgr.Instance.GetUnit(args.ObjectId); if (obj == null) { //还没显示就已挂掉的单位,走好 Log.Debug($"ignore dead unit: {args.ObjectId}"); return; } if (obj is BattleUnit) { CreatUnitModel(obj as BattleUnit, args.ModelName).Coroutine(); } else if (obj is BattleSpell) { //TODO: 性能有问题时,可以减少法术展示 CreateSpellModel(obj as BattleSpell).Coroutine(); } else { Log.Error("unknow new object"); } await ETTask.CompletedTask; } private static CommonLang.Geometry.Vector3 vecTemp = new(); private async ETTask CreatUnitModel(BattleUnit unit, string modelName) { var zu = unit.ZUnit; if (modelName.IsNullOrWhitespace()) { modelName = $"Unit_{zu.Info.FileName}"; } Log.Debug("服务端给过来的怪物资源名字: " + zu.Info.FileName); modelName = "Unit_Mushroom3"; var go = await GameObjectPool.Instance.Acquire(modelName); go.SetActive(true); go.transform.parent = GlobalViewMgr.Instance.Unit; vecTemp.Set(zu.X, zu.Y, zu.Z); go.transform.position = RenderUtils.UnityPosFromBattle(vecTemp); go.transform.rotation = RenderUtils.UnityRotationFromBattle(zu.Direction); var render = ModelViewComponent.Instance.AddChildWithId<UnitRenderComponet, GameObject>(unit.Id, go, true); render.Vip = unit.Vip; if (zu.Info.Properties is XmdsUnitProperties prop && prop.ShowHPBanner) { CreateHeadbar(render, zu).Coroutine(); } if (unit is BattleActor) { CameraMgr.FollowMe(go.transform.position); } //Log.Debug($"unitRender({zu.ObjectID}),pos({zu.X},{zu.Y},{zu.Z}) ok."); switch (zu.CurrentState) { case CommonAI.Zone.Helper.UnitActionStatus.Move: EventSystem.Instance.Publish(PlayAnimatorEvent.Clone(zu.ObjectID, PlayAnimatorEvent.AniType.Run)); break; case CommonAI.Zone.Helper.UnitActionStatus.Dead: EventSystem.Instance.Publish(PlayAnimatorEvent.Clone(zu.ObjectID, PlayAnimatorEvent.AniType.Dead)); break; case CommonAI.Zone.Helper.UnitActionStatus.Stun: case CommonAI.Zone.Helper.UnitActionStatus.Damage: default: EventSystem.Instance.Publish(PlayAnimatorEvent.Clone(zu.ObjectID, PlayAnimatorEvent.AniType.Idle)); break; } if (zu.GetBuffStatusCount() > 0) { EventSystem.Instance.Publish(BuffChangeEvent.Static.Clone(zu.ObjectID, null, EventType.BuffChangeEvent.BuffOP.Reload)); } } 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 = GlobalViewMgr.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<UnitRenderComponet, GameObject>(zs.ObjectID, go, true); var et = go.GetComponent<EffectTime>(); if (et != null) { et.speed = zs.Info.EffectAddSpeed; //et.playAnimName = zs.Info.AnimtionName; //TODO:特效不支持播放动画 } } private async ETTask CreateHeadbar(UnitRenderComponet render, ZoneUnit zu) { var view = await GameObjectPool.Instance.AcquireHeadBar(); view.visible = true; render.HeadBar = view; var name = view.GetChild("text_name").asTextField; var progresshp = view.GetChild("bar_hp") as GProgressBar; progresshp.max = 100; progresshp.min = 0; render.NameBar = name; render.HPBar = progresshp; if (zu.Force == 3) { name.text = ""; name.visible = false; } else { name.text = zu.SyncInfo.Name; TryShowName(render); } progresshp.visible = false; progresshp.value = zu.HP * 100 / zu.MaxHP; render.SyncHeadBarPos(); } private async void TryShowName(UnitRenderComponet render) { if (render.Vip > 0) { render.NameBar.visible = true; render.NameBar.color = GameSetting.VipColor[render.Vip]; } else { render.NameBar.color = GameSetting.VipColor[0]; var unitCnt = UnitMgr.Instance.PlayerList.Count - 7; if (unitCnt <= GameSetting.Name_level_1) { render.NameBar.visible = true; } else { if (!ModelViewComponent.Instance.IsHideNormalName) { ModelViewComponent.Instance.IsHideNormalName = true; foreach(var id in UnitMgr.Instance.PlayerList) { if (id == render.Id) continue; var r = ModelViewComponent.Instance.GetChild<UnitRenderComponet>(id); if (r != null && r.NameBar != null && r.Vip == 0) { r.NameBar.visible = false; } }; } int showTime; if (unitCnt < GameSetting.Name_level_2) { showTime = 5000; } else if(unitCnt < GameSetting.Name_level_3) { showTime = 3000; } else if(unitCnt < GameSetting.Name_level_4) { showTime = 1500; } else { render.NameBar.visible = false; return; } render.NameBar.visible = true; await TimerComponent.Instance.WaitAsync(showTime); render.NameBar.visible = false; } } } } }