using cfg.DialogueCfg; using Cysharp.Threading.Tasks; using Framework; using Gameplay; using Gameplay.Guide; using Gameplay.Level; using PhxhSDK; using System; using System.Collections.Generic; using System.Linq; using Random = UnityEngine.Random; /// /// 台词管理器 /// public class DialogueManager : Singlenton, IInitable, IUpdatable { /// /// 台词播放记录数据 /// private class DialoguePlayData { /// /// 台词对应次数字典 /// public Dictionary DicCount; /// /// 上一次日期 /// public DateTime LastTime; public DialoguePlayData() { DicCount = new(); } public void SetNewTime(DateTime dateTime) { LastTime = dateTime; DicCount.Clear(); } } /// /// 实际语音id = 角色id * RATIO + 台词id /// 实际台词文本key = "Dialogue_{实际语音id}" /// private const int RATIO = 1000; /// /// 台词播放记录数据key /// private const string DIALOGUE_PLAY_DATA = "Dialogue_Play_Data"; /// /// 角色台词对应的权重字典,key:角色id,value: subKey:台词id,subValue:台词权重 /// private Dictionary> dicDialogueWeight; /// /// 台词数据字典字典,key:台词类型,value:台词配置数据列表 /// private Dictionary> dicDialogue; /// /// 台词播放记录数据 /// private DialoguePlayData dialoguePlayData; #region 战斗台词 /// /// 当前播放的战斗台词 /// private Audio curFightAudio; /// /// 当前战斗台词优先级 /// private int curFightDialoguePriority; /// /// 当前战斗语音类型 /// private E_DialogueType curFightDialogueType; /// /// 等待播放的获得增益buff语音,value:角色id /// private readonly Queue queueWaitGetBuffDialogue = new(); #endregion /// /// 是否初始化 /// private bool isInit; #region 临时数据 /// /// 符合条件的台词数据 /// private readonly List listDialogueDataTemp = new(); private readonly List listDialogueWeight = new(); #endregion /// /// 是否正在播放战斗语音 /// public bool IsPlayingFightDialogue { get { return null != curFightAudio && curFightAudio.IsPlaying; } } public void Init() { isInit = false; dicDialogueWeight = new(); dialoguePlayData = StorageMgr.Instance.GetStorage(DIALOGUE_PLAY_DATA); EventManager.Instance.Register(EventManager.EventName.AllConfigLoad, OnInit); EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_SELF_RETREAT, (Action)OnFightRetreat); EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_SELECT_UNIT, (Action)OnFightChoose); EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_CLICK_MOVE, (Action)OnFightMove); EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_CLICK_ATTACK, (Action)OnFightAttack); EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_USE_SKILL, (Action)OnFightUseSkill); EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_UP_VEHICLE, (Action)OnFightBoardVehicle); EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_DOWN_VEHICLE, (Action)OnFightLeaveVehicle); EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_GET_P_BUFF, (Action)OnFightGetBuff); EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_KILL_ENEMY, (Action)OnFightKillEnemy); EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_LET_ENEMY_RETREAT, (Action)OnFightRepelEnemy); EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_BE_ATTACK_AND_HAS_SHEILD, (Action)OnFightArmourDown); EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_BE_ATTACK_AND_NO_SHEILD, (Action)OnFightArmourBloodZero); EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_BE_ATTACK_AND_DEAD, (Action)OnFightKnockedDown); EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_BE_ATTACK_AND_ENTER_LOW_MORALE, (Action)OnFightStifleState); EventManager.Instance.Register(EventManager.EventName.INFIGHT_AUDIO_BE_ATTACK_AND_ENTER_RETREAT, (Action)OnFightRetreatState); } public void Update(float deltaTime) { if (null == LevelManager.Instance.CurrentLevel) return; if (!LevelManager.Instance.CurrentLevel.IsInBattle()) return; if (IsPlayingFightDialogue) return; if (E_DialogueType.FightUseSkill != curFightDialogueType) { if (queueWaitGetBuffDialogue.Count > 0) queueWaitGetBuffDialogue.Clear(); return; } while (queueWaitGetBuffDialogue.TryDequeue(out int roleId)) { PlayFightDiaogue(roleId, E_DialogueType.FightGetBuff); } } public void Release() { EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_BE_ATTACK_AND_ENTER_RETREAT, (Action)OnFightRetreatState); EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_BE_ATTACK_AND_ENTER_LOW_MORALE, (Action)OnFightStifleState); EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_BE_ATTACK_AND_DEAD, (Action)OnFightKnockedDown); EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_BE_ATTACK_AND_NO_SHEILD, (Action)OnFightArmourBloodZero); EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_BE_ATTACK_AND_HAS_SHEILD, (Action)OnFightArmourDown); EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_LET_ENEMY_RETREAT, (Action)OnFightRepelEnemy); EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_KILL_ENEMY, (Action)OnFightKillEnemy); EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_GET_P_BUFF, (Action)OnFightGetBuff); EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_DOWN_VEHICLE, (Action)OnFightLeaveVehicle); EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_UP_VEHICLE, (Action)OnFightBoardVehicle); EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_USE_SKILL, (Action)OnFightUseSkill); EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_CLICK_ATTACK, (Action)OnFightAttack); EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_CLICK_MOVE, (Action)OnFightMove); EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_SELECT_UNIT, (Action)OnFightChoose); EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_AUDIO_SELF_RETREAT, (Action)OnFightRetreat); EventManager.Instance.Unregister(EventManager.EventName.AllConfigLoad, OnInit); listDialogueDataTemp.Clear(); } /// /// 播放台词 /// /// /// /// /// public async UniTask