NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Pause/PauseManager.cs

345 lines
10 KiB
C#
Raw Normal View History

2023-08-22 19:08:45 +08:00
using Gameplay.Level;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
2024-09-09 19:22:22 +08:00
using Gameplay.Building;
2023-08-22 19:08:45 +08:00
using Gameplay.Common;
2024-06-03 20:00:42 +08:00
using Gameplay.Fight.Protect;
2023-10-19 15:00:19 +08:00
using Gameplay.Summon;
2023-12-13 16:20:41 +08:00
using Gameplay.Unit;
using Gameplay.Unit.Data;
2023-10-19 15:00:19 +08:00
using Gameplay.Vehicle.Impl;
2023-08-22 19:08:45 +08:00
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
{
2023-10-19 15:00:19 +08:00
if (Math.Abs(_globalScale - value) > 0.1f)
2023-08-22 19:08:45 +08:00
{
_globalScale = value;
isSpeedChanged = true;
// 暂停时强制更新一次
if (_globalScale == 0)
{
LogicUpdate(0);
}
}
}
}
public bool isSpeedChanged
{
2023-10-19 15:00:19 +08:00
get;
private set;
2023-08-22 19:08:45 +08:00
}
private List<AnimatorPauser> _animList;
private List<ParticalPauser> _paticalList;
public void Init()
{
_animList = new List<AnimatorPauser>();
_paticalList = new List<ParticalPauser>();
// 先把场景中的绑定
2023-12-14 18:25:52 +08:00
var allUnits = GameUnitManager.instance.infightUnits;
for (int i = 0; i < allUnits.count; i++)
2023-08-22 19:08:45 +08:00
{
2023-12-14 18:25:52 +08:00
var unit = allUnits.GetByIndex(i);
2023-10-19 15:00:19 +08:00
_AddUnit(unit);
2023-08-22 19:08:45 +08:00
}
_RegistEvents();
}
2023-10-19 15:00:19 +08:00
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;
2024-06-03 20:00:42 +08:00
case EGameUnitType.BeProtect:
var beProtectUnit = unit as BeProtectUnit;
_AddBeProtect(beProtectUnit);
break;
2024-09-09 19:22:22 +08:00
case EGameUnitType.Building:
var building = unit as UnitBuild;
_AddBuilding(building);
break;
2023-10-19 15:00:19 +08:00
default:
DebugUtil.LogError("暂未处理的类型:{0}", unit.gameunitType);
break;
}
}
2024-09-09 19:22:22 +08:00
private void _AddBuilding(UnitBuild building)
{
// 建筑有一个动画
var anims = building.Node.GameObject.GetComponentsInChildren<Animator>();
for (var i = 0; i < anims.Length; ++i)
{
var anim = anims[i];
_AddAnim(anim, building);
}
// 建筑也可能有特效
var particals = building.Node.GameObject.GetComponentsInChildren<ParticleSystem>();
for (var i = 0; i < particals.Length; ++i)
{
var partical = particals[i];
_AddPartical(partical, building);
}
}
2023-10-19 15:00:19 +08:00
2024-06-03 20:00:42 +08:00
private void _AddBeProtect(BeProtectUnit beProtectUnit)
{
// 动画
var anims = beProtectUnit.Node.GameObject.GetComponentsInChildren<Animator>();
for (var i = 0; i < anims.Length; ++i)
{
var anim = anims[i];
_AddAnim(anim, beProtectUnit);
}
// 特效
var particals = beProtectUnit.Node.GameObject.GetComponentsInChildren<ParticleSystem>();
for (var i = 0; i < particals.Length; ++i)
{
var partical = particals[i];
_AddPartical(partical, beProtectUnit);
}
}
2023-10-19 15:00:19 +08:00
private void _AddSummon(BaseSummon summon)
{
// 可能有动画
var anims = summon.Node.GameObject.GetComponentsInChildren<Animator>();
for (var i = 0; i < anims.Length; ++i)
{
var anim = anims[i];
_AddAnim(anim, summon);
}
// 也可能有特效
var particals = summon.Node.GameObject.GetComponentsInChildren<ParticleSystem>();
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)
2023-08-22 19:08:45 +08:00
{
var pauser = new AnimatorPauser(anim);
pauser.owner = owner;
_animList.Add(pauser);
}
2023-10-19 15:00:19 +08:00
private void _AddPartical(ParticleSystem partical,
GameUnit owner)
2023-08-22 19:08:45 +08:00
{
var pauser = new ParticalPauser(partical);
pauser.owner = owner;
_paticalList.Add(pauser);
}
private void _RegistEvents()
{
2023-10-19 15:00:19 +08:00
EventManager.Instance.Register(EventManager.EventName.INFIGHT_UNIT_READY, (Action<GameUnit>)_OnUnitReady);
EventManager.Instance.Register(EventManager.EventName.INFIGHT_UNIT_REMOVE, (Action<GameUnit>)_OnUnitRemove);
2023-08-22 19:08:45 +08:00
EventManager.Instance.Register(EventManager.EventName.EFFECT_INST_FINISHED, (Action<EffectPlayingData>)_OnEffectInstFinished);
2023-10-19 15:00:19 +08:00
EventManager.Instance.Register(EventManager.EventName.EFFECT_INST_RETURN, (Action<EffectPlayingData>)_OnEffectInstReturn);
}
private void _UnRegistEvents()
{
EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_UNIT_READY, (Action<GameUnit>)_OnUnitReady);
EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_UNIT_REMOVE, (Action<GameUnit>)_OnUnitRemove);
EventManager.Instance.Unregister(EventManager.EventName.EFFECT_INST_FINISHED, (Action<EffectPlayingData>)_OnEffectInstFinished);
EventManager.Instance.Unregister(EventManager.EventName.EFFECT_INST_RETURN, (Action<EffectPlayingData>)_OnEffectInstReturn);
2023-08-22 19:08:45 +08:00
}
2023-10-19 15:00:19 +08:00
private void _OnUnitReady(GameUnit unit)
2023-08-22 19:08:45 +08:00
{
2023-10-19 15:00:19 +08:00
_AddUnit(unit);
}
private void _OnUnitRemove(GameUnit unit)
{
_RemoveUnit(unit);
}
private void _RemoveUnit(GameUnit unit)
{
for (int i = 0; i < _animList.Count; i++)
2023-08-22 19:08:45 +08:00
{
2023-10-19 15:00:19 +08:00
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--;
}
2023-08-22 19:08:45 +08:00
}
2023-10-19 15:00:19 +08:00
}
2023-08-22 19:08:45 +08:00
2023-10-19 15:00:19 +08:00
private void _OnEffectInstFinished(EffectPlayingData effectData)
{
if (effectData.pauserData == null)
2023-08-22 19:08:45 +08:00
{
2023-10-19 15:00:19 +08:00
effectData.pauserData = new DataEffectPauser(effectData);
2023-08-22 19:08:45 +08:00
}
2023-10-19 15:00:19 +08:00
_animList.AddRange(effectData.pauserData.animPausers);
_paticalList.AddRange(effectData.pauserData.particalPauser);
2023-08-22 19:08:45 +08:00
}
2023-10-19 15:00:19 +08:00
private void _OnEffectInstReturn(EffectPlayingData effectData)
2023-08-22 19:08:45 +08:00
{
2023-10-19 15:00:19 +08:00
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);
}
}
2023-08-22 19:08:45 +08:00
}
2023-10-19 15:00:19 +08:00
2023-08-22 19:08:45 +08:00
public void LogicUpdate(float dt)
{
if (AreaManager.instance.isInSelecting)
{
globalScale = ELevelSpeed.Level_0;
2023-08-22 19:08:45 +08:00
}
else if (SkillManager.instance.needSkillPaused)
{
2024-09-24 12:52:07 +08:00
globalScale = ELevelSpeed.DEFAULT_SPEED;
2023-08-22 19:08:45 +08:00
}
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();
2024-02-20 15:17:22 +08:00
_animList.Clear();
_animList = null;
_paticalList.Clear();
_paticalList = null;
2023-08-22 19:08:45 +08:00
_instance = null;
}
}
}