123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- 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;
- }
- }
- }
- }
- }
|