Main/Component/UI/Core/ToggleEx.cs
@@ -12,9 +12,39 @@ set { this.m_Audio = value; } } public GameObject activates; public GameObject deactivates; protected override void OnEnable() { base.OnEnable(); onValueChanged.AddListener(CustomChanged); } protected override void OnDisable() { base.OnDisable(); onValueChanged.RemoveListener(CustomChanged); } protected void CustomChanged(bool isOn) { // 使用 CanvasGroup 控制显隐,避免 SetActive 触发 Canvas 重建 if (activates != null) { var canvasGroup = activates.AddMissingComponent<CanvasGroup>(); canvasGroup.alpha = isOn ? 1f : 0f; canvasGroup.interactable = isOn; canvasGroup.blocksRaycasts = isOn; } if (deactivates != null) { var canvasGroup = deactivates.AddMissingComponent<CanvasGroup>(); canvasGroup.alpha = isOn ? 0f : 1f; canvasGroup.interactable = !isOn; canvasGroup.blocksRaycasts = !isOn; } } public override void OnPointerClick(PointerEventData eventData) Main/System/Battle/BattleField/BattleField.cs
@@ -77,6 +77,8 @@ public BattleSoundManager soundManager; public BattlePerformSwitch battleSwitch; #if UNITY_EDITOR public static Dictionary<string, string> battleHpRecorder = new Dictionary<string, string>(); #endif @@ -273,6 +275,11 @@ { BattleHeroInfoBar.largestPackUIDAllObjectsMaxHp.Remove(guid); } BattleMapConfig battleMapConfig = BattleMapConfig.Get(MapID); // 主线MapID == 1 battleSwitch = MapID == 1 ? BattleSwitch.storySwitch : BattleSwitch.nonStorySwitch; } protected void PreloadResources(List<TeamBase> redTeamList, List<TeamBase> blueTeamLis) @@ -933,13 +940,20 @@ return isFocus; } public virtual void PlayBuffAction(RecordAction buffAction, bool insert) public void PlayBuffAction(RecordAction buffAction, bool insert) { var targetPlayer = PackageRegeditEx.GetTargetRecordPlayer(this); if (insert) targetPlayer.ImmediatelyPlay(buffAction); if (battleSwitch.BuffAction) { var targetPlayer = PackageRegeditEx.GetTargetRecordPlayer(this); if (insert) targetPlayer.ImmediatelyPlay(buffAction); else targetPlayer.PlayRecord(buffAction); } else targetPlayer.PlayRecord(buffAction); { buffAction.ForceFinish(); } } Main/System/Battle/BattleField/RecordActions/BuffMountAction.cs
@@ -66,6 +66,9 @@ return; } // 加buff(onComplete写了) onComplete?.Invoke(); // 1帧就结束了 不管 base.ForceFinish(); } Main/System/Battle/BattleField/RecordActions/BuffUnmountAction.cs
@@ -43,6 +43,8 @@ { return; } onComplete?.Invoke(); // 1帧就结束了 不管 base.ForceFinish(); Main/System/Battle/BattleField/StoryBattleField.cs
@@ -370,8 +370,4 @@ return true; } public override void PlayBuffAction(RecordAction buffAction, bool insert) { buffAction.ForceFinish(); } } Main/System/Battle/BattleHUDWin.cs
@@ -121,8 +121,14 @@ private void OnDamageTaken(BattleDmgInfo damageInfo) { SetTargetDamage(damageInfo); SetSelfDamage(damageInfo); if (battleField != null) { if (battleField.battleSwitch.DamageTips) { SetTargetDamage(damageInfo); SetSelfDamage(damageInfo); } } } private void OnSpeedRatioChange(float newSpeedRatio) Main/System/Battle/Define/BattlePerformSwitch.cs
New file @@ -0,0 +1,94 @@ using System; [Serializable] public class BattlePerformSwitch { private bool _buffAction = true; private bool _buffIcon = true; private bool _nonDamageTips = true; private bool _damageTips = true; // 1·buff动画:buff飘字过程 // battleField.PlayBuffAction public bool BuffAction { get => _buffAction; set { if (_buffAction != value) { _buffAction = value; Save(); } } } // 2·buff图标:头顶buff图标(不包含命格) // heroInfoBar.RefreshBuff public bool BuffIcon { get => _buffIcon; set { if (_buffIcon != value) { _buffIcon = value; Save(); } } } // 3·非伤害飘字:过滤掉伤害之外的所有飘字 // battleObject.ShowTips // HeroBattleObject.ShowTips // heroInfoBar.ShowTips(2个) // heroInfoBar.PopUpTipsDirectly public bool NonDamageTips { get => _nonDamageTips; set { if (_nonDamageTips != value) { _nonDamageTips = value; Save(); } } } // 4·伤害飘字:仅伤害飘字 // BattleHUDWin.OnDamageTaken public bool DamageTips { get => _damageTips; set { if (_damageTips != value) { _damageTips = value; Save(); } } } // 是否为主线 非主线就是其他全部 public bool IsStory = true; public void Load() { string prefix = IsStory ? "StoryPerform_" : "NonStoryPerform_"; _buffAction = LocalSave.GetBool(prefix + "BuffAction", true); _buffIcon = LocalSave.GetBool(prefix + "BuffIcon", true); _nonDamageTips = LocalSave.GetBool(prefix + "NonDamageTips", true); _damageTips = LocalSave.GetBool(prefix + "DamageTips", true); } public void Save() { string prefix = IsStory ? "StoryPerform_" : "NonStoryPerform_"; LocalSave.SetBool(prefix + "BuffAction", BuffAction); LocalSave.SetBool(prefix + "BuffIcon", BuffIcon); LocalSave.SetBool(prefix + "NonDamageTips", NonDamageTips); LocalSave.SetBool(prefix + "DamageTips", DamageTips); } } Main/System/Battle/Define/BattlePerformSwitch.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: d9741c9e2ae13c14da895355d99da907 MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/System/Battle/Define/BattleSwitch.cs
New file @@ -0,0 +1,16 @@ public static class BattleSwitch { static BattleSwitch() { storySwitch = new BattlePerformSwitch() { IsStory = true }; nonStorySwitch = new BattlePerformSwitch() { IsStory = false }; storySwitch.Load(); nonStorySwitch.Load(); } public static readonly BattlePerformSwitch storySwitch; public static readonly BattlePerformSwitch nonStorySwitch; } Main/System/Battle/Define/BattleSwitch.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: 5d5180c1d4f068c49973dffa5f35a843 MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Main/System/Battle/UIComp/BattleHeroInfoBar.cs
@@ -137,18 +137,7 @@ public void RefreshBuff(List<HB428_tagSCBuffRefresh> datas) { if (battleObject.battleField is StoryBattleField) { return; } if (buffCells == null) { for (int i = 0; i < buffCells.Count; i++) { buffCells[i].SetActive(false); } } else if (battleObject.battleField.battleSwitch.BuffIcon && datas != null && datas.Count > 0) { for (int i = 0; i < buffCells.Count; i++) { @@ -166,6 +155,13 @@ { buffCells[i].SetActive(false); } } } else { for (int i = 0; i < buffCells.Count; i++) { buffCells[i].SetActive(false); } } @@ -197,26 +193,33 @@ // Debug.LogError($"[BattleHeroInfoBar.RefreshBuff] 设置护盾 - curHp: {curHp}, shieldValue: {shieldValue}, maxHp: {maxHp}, shield1前: {oldShield1Value}, shield1后: {shield1Value}, shield2前: {oldShield2Value}, shield2后: {shield2Value}"); } /// <summary> /// 添加飘字到队列 /// 添加飘字到队列(非伤害飘字) /// </summary> public void ShowTips(string message, bool useArtText = false, bool followCharacter = true, float scaleRatio = 1f) { messages.Add(new TipsInfo if (battleObject.battleField.battleSwitch.NonDamageTips) { message = message, useArtText = useArtText, followCharacter = followCharacter, scaleRatio = scaleRatio }); messages.Add(new TipsInfo { message = message, useArtText = useArtText, followCharacter = followCharacter, scaleRatio = scaleRatio }); } } /// <summary> /// 添加自定义飘字配置到队列 /// 添加自定义飘字配置到队列(非伤害飘字) /// </summary> public void ShowTips(TipsInfo tipsInfo) { messages.Add(tipsInfo); if (battleObject.battleField.battleSwitch.NonDamageTips) { messages.Add(tipsInfo); } } /// <summary> Main/System/PlayerProfile/SystemSetWin.cs
@@ -6,6 +6,29 @@ [SerializeField] Slider musicSlider; [SerializeField] Slider soundEffectSlider; // 静音音乐 [SerializeField] Toggle muteMusic; // 静音音效 [SerializeField] Toggle muteSoundEffect; // 主线战斗 [SerializeField] Toggle toggleStory; // 非主线战斗 [SerializeField] Toggle toggleNonStory; // 伤害飘字 [SerializeField] Toggle toggleDamageTips; // 非伤害飘字 [SerializeField] Toggle toggleNonDamageTips; // buff飘字 [SerializeField] Toggle toggleBuffFloatingTips; // buff图标显示 [SerializeField] Toggle toggleBuffIconShow; private BattlePerformSwitch currentSwitch; protected override void InitComponent() { base.InitComponent(); @@ -14,6 +37,8 @@ protected override void OnPreOpen() { base.OnPreOpen(); // 音量滑块 musicSlider.onValueChanged.RemoveListener(OnSliderBgMusic); musicSlider.onValueChanged.AddListener(OnSliderBgMusic); soundEffectSlider.onValueChanged.RemoveListener(OnSliderSoundEffect); @@ -21,6 +46,42 @@ musicSlider.value = SystemSetting.Instance.GetSoundVolume(); soundEffectSlider.value = SystemSetting.Instance.GetSoundEffect(); // 静音开关 muteMusic.onValueChanged.RemoveListener(OnMuteMusicChanged); muteMusic.onValueChanged.AddListener(OnMuteMusicChanged); muteSoundEffect.onValueChanged.RemoveListener(OnMuteSoundEffectChanged); muteSoundEffect.onValueChanged.AddListener(OnMuteSoundEffectChanged); muteMusic.isOn = SystemSetting.Instance.GetMuteMusic(); muteSoundEffect.isOn = SystemSetting.Instance.GetMuteSoundEffect(); // 应用静音状态 SoundPlayer.Instance.musicAudioSource.mute = muteMusic.isOn; // 战斗类型切换(互斥) toggleStory.onValueChanged.RemoveListener(OnToggleStoryChanged); toggleStory.onValueChanged.AddListener(OnToggleStoryChanged); toggleNonStory.onValueChanged.RemoveListener(OnToggleNonStoryChanged); toggleNonStory.onValueChanged.AddListener(OnToggleNonStoryChanged); // 默认选中主线战斗 toggleStory.isOn = true; toggleNonStory.isOn = false; currentSwitch = BattleSwitch.storySwitch; // 战斗表现开关 toggleDamageTips.onValueChanged.RemoveListener(OnToggleDamageTipsChanged); toggleDamageTips.onValueChanged.AddListener(OnToggleDamageTipsChanged); toggleNonDamageTips.onValueChanged.RemoveListener(OnToggleNonDamageTipsChanged); toggleNonDamageTips.onValueChanged.AddListener(OnToggleNonDamageTipsChanged); toggleBuffFloatingTips.onValueChanged.RemoveListener(OnToggleBuffFloatingTipsChanged); toggleBuffFloatingTips.onValueChanged.AddListener(OnToggleBuffFloatingTipsChanged); toggleBuffIconShow.onValueChanged.RemoveListener(OnToggleBuffIconShowChanged); toggleBuffIconShow.onValueChanged.AddListener(OnToggleBuffIconShowChanged); // 初始化战斗表现开关的状态 RefreshBattlePerformToggles(); } protected override void OnPreClose() @@ -37,4 +98,93 @@ { SystemSetting.Instance.SetSoundVolume(arg0); } private void OnMuteMusicChanged(bool value) { SystemSetting.Instance.SetMuteMusic(value); SoundPlayer.Instance.musicAudioSource.mute = value; } private void OnMuteSoundEffectChanged(bool value) { SystemSetting.Instance.SetMuteSoundEffect(value); // 音效静音可以通过控制音量实现,但不影响slider的值 // 这里需要控制所有音效源,可以使用SoundPlayer的全局控制 } private void OnToggleStoryChanged(bool value) { if (value) { // ToggleGroup 会自动处理互斥,不需要手动设置另一个为 false currentSwitch = BattleSwitch.storySwitch; RefreshBattlePerformToggles(); } } private void OnToggleNonStoryChanged(bool value) { if (value) { // ToggleGroup 会自动处理互斥,不需要手动设置另一个为 false currentSwitch = BattleSwitch.nonStorySwitch; RefreshBattlePerformToggles(); } } private void RefreshBattlePerformToggles() { if (currentSwitch == null) return; // 临时移除监听器以避免循环触发 toggleDamageTips.onValueChanged.RemoveListener(OnToggleDamageTipsChanged); toggleNonDamageTips.onValueChanged.RemoveListener(OnToggleNonDamageTipsChanged); toggleBuffFloatingTips.onValueChanged.RemoveListener(OnToggleBuffFloatingTipsChanged); toggleBuffIconShow.onValueChanged.RemoveListener(OnToggleBuffIconShowChanged); // 更新UI状态 toggleDamageTips.isOn = currentSwitch.DamageTips; toggleNonDamageTips.isOn = currentSwitch.NonDamageTips; toggleBuffFloatingTips.isOn = currentSwitch.BuffAction; toggleBuffIconShow.isOn = currentSwitch.BuffIcon; // 重新添加监听器 toggleDamageTips.onValueChanged.AddListener(OnToggleDamageTipsChanged); toggleNonDamageTips.onValueChanged.AddListener(OnToggleNonDamageTipsChanged); toggleBuffFloatingTips.onValueChanged.AddListener(OnToggleBuffFloatingTipsChanged); toggleBuffIconShow.onValueChanged.AddListener(OnToggleBuffIconShowChanged); } private void OnToggleDamageTipsChanged(bool value) { if (currentSwitch != null) { currentSwitch.DamageTips = value; } } private void OnToggleNonDamageTipsChanged(bool value) { if (currentSwitch != null) { currentSwitch.NonDamageTips = value; } } private void OnToggleBuffFloatingTipsChanged(bool value) { if (currentSwitch != null) { currentSwitch.BuffAction = value; } } private void OnToggleBuffIconShowChanged(bool value) { if (currentSwitch != null) { currentSwitch.BuffIcon = value; } } } Main/System/SystemSetting/SystemSetting.cs
@@ -13,6 +13,8 @@ const string QUALITY_LEVEL_KEY = "GameQualityLevel"; const string SOUND_VOLUME_KEY = "MusicKey"; //音乐 const string SOUND_EFFECT_KEY = "SoundEffectKey"; //音效 const string MUTE_MUSIC_KEY = "MuteMusicKey"; //静音音乐 const string MUTE_SOUND_EFFECT_KEY = "MuteSoundEffectKey"; //静音音效 const string GAMEFRAME_KEY = "GameFrameSetting";//垂直同步率 public Dictionary<SystemSwitch, bool> systemSettings = new Dictionary<SystemSwitch, bool>(); @@ -56,6 +58,26 @@ return LocalSave.GetFloat(SOUND_EFFECT_KEY, 0.6f); } public void SetMuteMusic(bool _mute) { LocalSave.SetBool(MUTE_MUSIC_KEY, _mute); } public bool GetMuteMusic() { return LocalSave.GetBool(MUTE_MUSIC_KEY, false); } public void SetMuteSoundEffect(bool _mute) { LocalSave.SetBool(MUTE_SOUND_EFFECT_KEY, _mute); } public bool GetMuteSoundEffect() { return LocalSave.GetBool(MUTE_SOUND_EFFECT_KEY, false); } public void SetGameFps(GameFps _frame) { LocalSave.SetInt(GAMEFRAME_KEY, (int)_frame);