using Gameplay.Level; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Gameplay.Common; using Gameplay.Summon; using Gameplay.Unit; using Gameplay.Unit.Data; using Gameplay.Vehicle.Impl; namespace Gameplay.Pause { using Character; using Framework; using Gameplay.Area; using Gameplay.Effect; using Gameplay.Skill; using UnityEngine; public class PauseManager { private static PauseManager _instance; public static PauseManager instance { get { return _instance; } } public static PauseManager CreateInstance() { if (_instance != null) return _instance; _instance = new PauseManager(); return _instance; } private float _globalScale = 1f; public float globalScale { get { return _globalScale; } set { if (Math.Abs(_globalScale - value) > 0.1f) { _globalScale = value; isSpeedChanged = true; // 暂停时强制更新一次 if (_globalScale == 0) { LogicUpdate(0); } } } } public bool isSpeedChanged { get; private set; } private List _animList; private List _paticalList; public void Init() { _animList = new List(); _paticalList = new List(); // 先把场景中的绑定 var allUnits = GameUnitManager.instance.infightUnits; for (int i = 0; i < allUnits.count; i++) { var unit = allUnits.GetByIndex(i); _AddUnit(unit); } _RegistEvents(); } private void _AddUnit(GameUnit unit) { switch (unit.gameunitType) { case EGameUnitType.Character: var character = unit as Character; _AddCharacter(character); break; case EGameUnitType.Vehicle: var vehicle = unit as NormalVehicle; _AddVehicle(vehicle); break; case EGameUnitType.Summon: var summon = unit as BaseSummon; _AddSummon(summon); break; case EGameUnitType.Player: // 玩家不需要暂停 break; default: DebugUtil.LogError("暂未处理的类型:{0}", unit.gameunitType); break; } } private void _AddSummon(BaseSummon summon) { // 可能有动画 var anims = summon.Node.GameObject.GetComponentsInChildren(); for (var i = 0; i < anims.Length; ++i) { var anim = anims[i]; _AddAnim(anim, summon); } // 也可能有特效 var particals = summon.Node.GameObject.GetComponentsInChildren(); for (var i = 0; i < particals.Length; ++i) { var partical = particals[i]; _AddPartical(partical, summon); } } private void _AddVehicle(NormalVehicle vehicle) { // 车有两个动画,车本身一个,炮台一个 var anim1 = vehicle.vAnim.rawAnim; var anim2 = vehicle.battery.rawAnim; if (anim1 != null) { _AddAnim(anim1, vehicle); } if (anim2 != null) { _AddAnim(anim2, vehicle); } } private void _AddCharacter(Character c) { var animator = c.RawAnimator; if (animator == null) return; _AddAnim(animator, c); } private void _AddAnim(Animator anim, GameUnit owner) { var pauser = new AnimatorPauser(anim); pauser.owner = owner; _animList.Add(pauser); } private void _AddPartical(ParticleSystem partical, GameUnit owner) { var pauser = new ParticalPauser(partical); pauser.owner = owner; _paticalList.Add(pauser); } private void _RegistEvents() { EventManager.Instance.Register(EventManager.EventName.INFIGHT_UNIT_READY, (Action)_OnUnitReady); EventManager.Instance.Register(EventManager.EventName.INFIGHT_UNIT_REMOVE, (Action)_OnUnitRemove); EventManager.Instance.Register(EventManager.EventName.EFFECT_INST_FINISHED, (Action)_OnEffectInstFinished); EventManager.Instance.Register(EventManager.EventName.EFFECT_INST_RETURN, (Action)_OnEffectInstReturn); } private void _UnRegistEvents() { EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_UNIT_READY, (Action)_OnUnitReady); EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_UNIT_REMOVE, (Action)_OnUnitRemove); EventManager.Instance.Unregister(EventManager.EventName.EFFECT_INST_FINISHED, (Action)_OnEffectInstFinished); EventManager.Instance.Unregister(EventManager.EventName.EFFECT_INST_RETURN, (Action)_OnEffectInstReturn); } private void _OnUnitReady(GameUnit unit) { _AddUnit(unit); } private void _OnUnitRemove(GameUnit unit) { _RemoveUnit(unit); } private void _RemoveUnit(GameUnit unit) { for (int i = 0; i < _animList.Count; i++) { var animPauser = _animList[i]; if (animPauser.isEffect) continue; if (animPauser.owner == unit) { _animList.RemoveAt(i); i--; } } // 遍历特效 for (int i = 0; i < _paticalList.Count; i++) { var particalPauser = _paticalList[i]; if (particalPauser.isEffect) continue; if (particalPauser.owner == unit) { _paticalList.RemoveAt(i); i--; } } } private void _OnEffectInstFinished(EffectPlayingData effectData) { if (effectData.pauserData == null) { effectData.pauserData = new DataEffectPauser(effectData); } _animList.AddRange(effectData.pauserData.animPausers); _paticalList.AddRange(effectData.pauserData.particalPauser); } private void _OnEffectInstReturn(EffectPlayingData effectData) { var animList = effectData?.pauserData?.animPausers; if (animList != null) { for (int i = 0; i < animList.Count; i++) { var animPauser = animList[i]; _animList.Remove(animPauser); } } var particalList = effectData?.pauserData?.particalPauser; if (particalList != null) { for (int i = 0; i < particalList.Count; i++) { var particalPauser = particalList[i]; _paticalList.Remove(particalPauser); } } } public void LogicUpdate(float dt) { if (AreaManager.instance.isInSelecting) { globalScale = 0.5f; } else if (SkillManager.instance.needSkillPaused) { globalScale = 1; } for (var i = 0; i < _animList.Count; ++i) { var pauser = _animList[i]; pauser.LogicUpdate(dt); } for (var i = 0; i < _paticalList.Count; ++i) { var pauser = _paticalList[i]; pauser.LogicUpdate(dt); } isSpeedChanged = false; } public void Dispose() { _UnRegistEvents(); _instance = null; } } }