From 7fc3282e808373d9c2b3839a289248c6fd85d7b4 Mon Sep 17 00:00:00 2001 From: Oliver Wong Date: Thu, 2 Apr 2026 14:31:46 +0800 Subject: [PATCH] feat: implement audio object definitions and refactor audio system - Add AudioObjectDefinitions.cs with name-to-ID mappings and ambiguity detection - Update AudioSystem.cs to support Play(uint) and deprecated Play(string) with warnings - Rename PitchStepManager to PitchStepResolver and update all references - Refactor generated code to use 'this.' prefix and foreach loops - Remove TestEnum from audio enums and IDs - Update SampleScene.unity to use new AudioSystem namespace and rain sound parameter - Optimize binary serialization in generated audio classes --- Assets/Resources/AudioData/AudioObject.bytes | Bin 7593 -> 7567 bytes Assets/Scenes/SampleScene.unity | 6 +- .../OCES/Audio/Generated/AmbiencePath.cs | 2 +- .../Audio/Generated/AmbienceTransition.cs | 2 +- .../OCES/Audio/Generated/AudioEnumIds.cs | 3 - .../OCES/Audio/Generated/AudioEnums.cs | 6 - .../OCES/Audio/Generated/AudioGroup.cs | 2 +- .../OCES/Audio/Generated/AudioObject.cs | 6 +- .../Audio/Generated/AudioObjectDefinitions.cs | 145 ++++++++++++++++++ .../Generated/AudioObjectDefinitions.cs.meta | 11 ++ .../OCES/Audio/Generated/MusicContainer.cs | 6 +- .../Scripts/OCES/Audio/Generated/MusicPath.cs | 2 +- .../OCES/Audio/Generated/MusicSegment.cs | 2 +- .../OCES/Audio/Generated/MusicTransition.cs | 2 +- .../OCES/Audio/HandWritten/AudioScheduler.cs | 6 +- .../OCES/Audio/HandWritten/AudioSystem.cs | 37 ++++- ...tchStepManager.cs => PitchStepResolver.cs} | 2 +- ...ager.cs.meta => PitchStepResolver.cs.meta} | 0 18 files changed, 208 insertions(+), 32 deletions(-) create mode 100644 Assets/Scripts/OCES/Audio/Generated/AudioObjectDefinitions.cs create mode 100644 Assets/Scripts/OCES/Audio/Generated/AudioObjectDefinitions.cs.meta rename Assets/Scripts/OCES/Audio/HandWritten/{PitchStepManager.cs => PitchStepResolver.cs} (97%) rename Assets/Scripts/OCES/Audio/HandWritten/{PitchStepManager.cs.meta => PitchStepResolver.cs.meta} (100%) diff --git a/Assets/Resources/AudioData/AudioObject.bytes b/Assets/Resources/AudioData/AudioObject.bytes index 900b2eea4bd852319d02c21a9eee6717ee8023cd..e8ae4212d3312474464e86500d5f1903bf406f42 100644 GIT binary patch delta 82 zcmZ2!-EX~tlaDcVG8bP0kj&6K2C<)uAD gq>Ixk;!88*3lj5EbK;>ARnn`O7!5W%%cL;^03-Gq7ytkO delta 104 zcmeCTUTM97laDcfG8bP0kj& AmbiencePathList() { - this.m_ambiencePathInfoList ??= new List(m_ambiencePathInfos.Values); + this.m_ambiencePathInfoList ??= new List(this.m_ambiencePathInfos.Values); return this.m_ambiencePathInfoList; } diff --git a/Assets/Scripts/OCES/Audio/Generated/AmbienceTransition.cs b/Assets/Scripts/OCES/Audio/Generated/AmbienceTransition.cs index 044042e..c56856b 100644 --- a/Assets/Scripts/OCES/Audio/Generated/AmbienceTransition.cs +++ b/Assets/Scripts/OCES/Audio/Generated/AmbienceTransition.cs @@ -65,7 +65,7 @@ public partial class AmbienceTransitionConfig : IBinarySerializable public List AmbienceTransitionList() { - this.m_ambienceTransitionInfoList ??= new List(m_ambienceTransitionInfos.Values); + this.m_ambienceTransitionInfoList ??= new List(this.m_ambienceTransitionInfos.Values); return this.m_ambienceTransitionInfoList; } diff --git a/Assets/Scripts/OCES/Audio/Generated/AudioEnumIds.cs b/Assets/Scripts/OCES/Audio/Generated/AudioEnumIds.cs index e3a6e25..199092b 100644 --- a/Assets/Scripts/OCES/Audio/Generated/AudioEnumIds.cs +++ b/Assets/Scripts/OCES/Audio/Generated/AudioEnumIds.cs @@ -9,12 +9,9 @@ namespace OCES.Audio { public const uint GameState = 1; - public const uint TestEnum = 2; - public static void RegisterAllGameState() { StateGroupRegistry.Register(1); - StateGroupRegistry.Register(2); } } } diff --git a/Assets/Scripts/OCES/Audio/Generated/AudioEnums.cs b/Assets/Scripts/OCES/Audio/Generated/AudioEnums.cs index 7a5541e..04d5468 100644 --- a/Assets/Scripts/OCES/Audio/Generated/AudioEnums.cs +++ b/Assets/Scripts/OCES/Audio/Generated/AudioEnums.cs @@ -15,10 +15,4 @@ namespace OCES.Audio Bass = 6, // 测试用值 } - public enum TestEnum - { - Holiday = -1, - Regular = 5, - } - } diff --git a/Assets/Scripts/OCES/Audio/Generated/AudioGroup.cs b/Assets/Scripts/OCES/Audio/Generated/AudioGroup.cs index ae5cac9..0a84ba7 100644 --- a/Assets/Scripts/OCES/Audio/Generated/AudioGroup.cs +++ b/Assets/Scripts/OCES/Audio/Generated/AudioGroup.cs @@ -60,7 +60,7 @@ public partial class AudioGroupConfig : IBinarySerializable public List AudioGroupList() { - this.m_audioGroupInfoList ??= new List(m_audioGroupInfos.Values); + this.m_audioGroupInfoList ??= new List(this.m_audioGroupInfos.Values); return this.m_audioGroupInfoList; } diff --git a/Assets/Scripts/OCES/Audio/Generated/AudioObject.cs b/Assets/Scripts/OCES/Audio/Generated/AudioObject.cs index 9beb8e0..c1cd206 100644 --- a/Assets/Scripts/OCES/Audio/Generated/AudioObject.cs +++ b/Assets/Scripts/OCES/Audio/Generated/AudioObject.cs @@ -178,9 +178,9 @@ public partial class AudioObject : IBinarySerializable else { writer.Write(Name.Count); - for (int i = 0; i < Name.Count; i++) + foreach (var t in Name) { - writer.Write(Name[i]); + writer.Write(t); } } writer.Write(Comment); @@ -213,7 +213,7 @@ public partial class AudioObjectConfig : IBinarySerializable public List AudioObjectList() { - this.m_audioObjectInfoList ??= new List(m_audioObjectInfos.Values); + this.m_audioObjectInfoList ??= new List(this.m_audioObjectInfos.Values); return this.m_audioObjectInfoList; } diff --git a/Assets/Scripts/OCES/Audio/Generated/AudioObjectDefinitions.cs b/Assets/Scripts/OCES/Audio/Generated/AudioObjectDefinitions.cs new file mode 100644 index 0000000..51ddc04 --- /dev/null +++ b/Assets/Scripts/OCES/Audio/Generated/AudioObjectDefinitions.cs @@ -0,0 +1,145 @@ +/* auto generated, do not modify */ +using System.Collections.Generic; + +namespace OCES.Audio +{ +public static class AudioObjectDefinitions +{ + public static readonly Dictionary NameToId = new() + { + { "AnimCollision", 1 }, + { "AnimToWeapon", 2 }, + { "ArrowFire", 3 }, + { "BoxBeSelected", 4 }, + { "BoxCollision", 5 }, + { "BoxMove", 6 }, + { "BoxTouch", 7 }, + { "BoxToWeapon", 8 }, + { "ChangeColor", 9 }, + { "ClickButton", 10 }, + { "CoinFly", 11 }, + { "DamageByArrow", 12 }, + { "DamageByBullet", 13 }, + { "DamageByCannonBall", 14 }, + { "Defeat", 15 }, + { "DestroyBox", 16 }, + { "DevilAttackShield", 17 }, + { "DevilBeHit_01", 18 }, + { "DevilBeHit_02", 18 }, + { "DevilBeHit_03", 18 }, + { "DevilDie", 19 }, + { "DevilFire", 20 }, + { "DevilResurrection", 21 }, + { "DragonAttackShield", 22 }, + { "DragonBeHit", 23 }, + { "DragonDie", 24 }, + { "DragonFire", 25 }, + { "DragonResurrection", 26 }, + { "GhostAttackShield", 27 }, + { "GhostBeHit", 28 }, + { "GhostDie", 29 }, + { "GhostFire", 30 }, + { "GhostResurrection", 31 }, + { "GunFire", 32 }, + { "HorseMove", 33 }, + { "LevelBegins", 34 }, + { "PrincessDown", 35 }, + { "PrincessFear", 36 }, + { "ShieldBroken", 37 }, + { "ShieldUnderAttack", 38 }, + { "Spin", 39 }, + { "TigerMove", 40 }, + { "UnlockProp", 41 }, + { "UnlockTurret", 42 }, + { "Victory", 43 }, + { "WeaponExhausted", 44 }, + { "WeaponFire", 45 }, + { "au_stream", 46 }, + { "rain", 46 }, + { "Chinese Number 01", 48 }, + { "Chinese Number 02", 48 }, + { "Chinese Number 03", 48 }, + { "Chinese Number 04", 48 }, + { "Chinese Number 05", 48 }, + { "Chinese Number 06", 49 }, + { "Chinese Number 07", 49 }, + { "Chinese Number 08", 49 }, + { "Chinese Number 09", 49 }, + { "Chinese Number 10", 49 }, + { "sfx_amb_desert", 2000 }, + { "sfx_amb_forest", 2001 }, + { "sfx_anim_common_item_fly", 3000 }, + { "sfx_anim_corePlay_character_footstep_grass", 3001 }, + { "sfx_anim_corePlay_character_footstep_sand", 3002 }, + { "sfx_anim_corePlay_character_footstep_stone", 3003 }, + { "sfx_anim_corePlay_fireBall", 3004 }, + { "sfx_anim_corePlay_freeze", 3005 }, + { "sfx_anim_corePlay_getIn_devil", 3006 }, + { "sfx_anim_corePlay_getIn_dragon", 3007 }, + { "sfx_anim_corePlay_getIn_ghost", 3008 }, + { "sfx_anim_corePlay_newBoxFromStorage", 3009 }, + { "sfx_anim_corePlay_shield_broke_wood", 3010 }, + { "sfx_anim_corePlay_shield_broke_crystal", 3011 }, + { "sfx_anim_corePlay_shield_broke_eggRoll", 3012 }, + { "sfx_anim_corePlay_shield_show_crystal", 3013 }, + { "sfx_anim_corePlay_shield_show_eggRoll", 3014 }, + { "sfx_anim_corePlay_shield_show_wood", 3015 }, + { "sfx_anim_corePlay_shield_underAttack_wood", 3016 }, + { "sfx_anim_corePlay_shield_underAttack_crystal", 3017 }, + { "sfx_anim_corePlay_shield_underAttack_eggRoll", 3018 }, + { "sfx_anim_corePlay_slow", 3019 }, + { "sfx_anim_corePlay_speedUp", 3020 }, + { "sfx_anim_corePlay_useProp_", 3021 }, + { "sfx_anim_cutScene_in", 3022 }, + { "sfx_anim_cutScene_out", 3023 }, + { "sfx_notice_common_negative", 4000 }, + { "sfx_notice_corePlay_losing", 4001 }, + { "sfx_notice_corePlay_restart", 4002 }, + { "sfx_notice_corePlay_warning", 4003 }, + { "sfx_notice_guide", 4004 }, + { "sfx_notice_spinWheel_click", 4005 }, + { "sfx_notice_spinWheel_getReward", 4006 }, + { "sfx_notice_corePlay_levelStart_hard", 4007 }, + { "sfx_ui_labelSwitch_home", 5000 }, + { "sfx_ui_panel_common_close", 5001 }, + { "sfx_ui_panel_common_open", 5002 }, + { "sfx_ui_panel_continue_open", 5003 }, + { "sfx_ui_panel_corePlay_guide_open", 5004 }, + { "sfx_ui_panel_initPack_open", 5005 }, + { "sfx_ui_panel_piggyBank_close", 5006 }, + { "sfx_ui_panel_piggyBank_open", 5007 }, + { "sfx_ui_panel_removeAds_open", 5008 }, + { "0", 5009 }, + { "sfx_ui_panel_summerPack_open", 5010 }, + { "sfx_ui_panel_unlockItem_open", 5011 }, + { "voice_princess_fear", 9000 }, + }; + + public static readonly HashSet AmbiguousNames = new() + { + "DevilBeHit_01", + "DevilBeHit_02", + "DevilBeHit_03", + "Chinese Number 01", + }; + + public static readonly HashSet SharedIdNames = new() + { + "DevilBeHit_01", + "DevilBeHit_02", + "DevilBeHit_03", + "au_stream", + "rain", + "Chinese Number 01", + "Chinese Number 02", + "Chinese Number 03", + "Chinese Number 04", + "Chinese Number 05", + "Chinese Number 06", + "Chinese Number 07", + "Chinese Number 08", + "Chinese Number 09", + "Chinese Number 10", + }; +} +} diff --git a/Assets/Scripts/OCES/Audio/Generated/AudioObjectDefinitions.cs.meta b/Assets/Scripts/OCES/Audio/Generated/AudioObjectDefinitions.cs.meta new file mode 100644 index 0000000..4b1965a --- /dev/null +++ b/Assets/Scripts/OCES/Audio/Generated/AudioObjectDefinitions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 524b2a6c9b0c412a8979b5a28b1247b9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/OCES/Audio/Generated/MusicContainer.cs b/Assets/Scripts/OCES/Audio/Generated/MusicContainer.cs index e5e90f2..e60136f 100644 --- a/Assets/Scripts/OCES/Audio/Generated/MusicContainer.cs +++ b/Assets/Scripts/OCES/Audio/Generated/MusicContainer.cs @@ -94,9 +94,9 @@ public partial class MusicContainer : IBinarySerializable else { writer.Write(Segments.Count); - for (int i = 0; i < Segments.Count; i++) + foreach (var t in Segments) { - writer.Write(Segments[i]); + writer.Write(t); } } writer.Write((byte)ContainerType); @@ -116,7 +116,7 @@ public partial class MusicContainerConfig : IBinarySerializable public List MusicContainerList() { - this.m_musicContainerInfoList ??= new List(m_musicContainerInfos.Values); + this.m_musicContainerInfoList ??= new List(this.m_musicContainerInfos.Values); return this.m_musicContainerInfoList; } diff --git a/Assets/Scripts/OCES/Audio/Generated/MusicPath.cs b/Assets/Scripts/OCES/Audio/Generated/MusicPath.cs index 7b7b1bd..72c65d4 100644 --- a/Assets/Scripts/OCES/Audio/Generated/MusicPath.cs +++ b/Assets/Scripts/OCES/Audio/Generated/MusicPath.cs @@ -58,7 +58,7 @@ public partial class MusicPathConfig : IBinarySerializable public List MusicPathList() { - this.m_musicPathInfoList ??= new List(m_musicPathInfos.Values); + this.m_musicPathInfoList ??= new List(this.m_musicPathInfos.Values); return this.m_musicPathInfoList; } diff --git a/Assets/Scripts/OCES/Audio/Generated/MusicSegment.cs b/Assets/Scripts/OCES/Audio/Generated/MusicSegment.cs index 3fe054d..2d3b139 100644 --- a/Assets/Scripts/OCES/Audio/Generated/MusicSegment.cs +++ b/Assets/Scripts/OCES/Audio/Generated/MusicSegment.cs @@ -44,7 +44,7 @@ public partial class MusicSegmentConfig : IBinarySerializable public List MusicSegmentList() { - this.m_musicSegmentInfoList ??= new List(m_musicSegmentInfos.Values); + this.m_musicSegmentInfoList ??= new List(this.m_musicSegmentInfos.Values); return this.m_musicSegmentInfoList; } diff --git a/Assets/Scripts/OCES/Audio/Generated/MusicTransition.cs b/Assets/Scripts/OCES/Audio/Generated/MusicTransition.cs index 666c75b..1eba725 100644 --- a/Assets/Scripts/OCES/Audio/Generated/MusicTransition.cs +++ b/Assets/Scripts/OCES/Audio/Generated/MusicTransition.cs @@ -81,7 +81,7 @@ public partial class MusicTransitionConfig : IBinarySerializable public List MusicTransitionList() { - this.m_musicTransitionInfoList ??= new List(m_musicTransitionInfos.Values); + this.m_musicTransitionInfoList ??= new List(this.m_musicTransitionInfos.Values); return this.m_musicTransitionInfoList; } diff --git a/Assets/Scripts/OCES/Audio/HandWritten/AudioScheduler.cs b/Assets/Scripts/OCES/Audio/HandWritten/AudioScheduler.cs index a401448..379a97a 100644 --- a/Assets/Scripts/OCES/Audio/HandWritten/AudioScheduler.cs +++ b/Assets/Scripts/OCES/Audio/HandWritten/AudioScheduler.cs @@ -31,7 +31,7 @@ namespace OCES.Audio AudioMixerGroup m_voiceGroup; AudioSourcePool m_pool; AudioContainerSelector m_containerSelector; - PitchStepManager m_pitchStepManager; + PitchStepResolver m_pitchStepResolver; #if UNITY_EDITOR void Update() @@ -70,7 +70,7 @@ namespace OCES.Audio this.m_pool = new AudioSourcePool(transform); this.m_containerSelector = new AudioContainerSelector(); - this.m_pitchStepManager = new PitchStepManager(); + this.m_pitchStepResolver = new PitchStepResolver(); AudioMixerGroup[] sfx = Find("Master/SFX"); if (sfx.Length > 0) this.m_sfxGroup = sfx[0]; @@ -166,7 +166,7 @@ namespace OCES.Audio } // 执行播放 - float pitch = this.m_pitchStepManager.ResolvePitch(audioObject, now); //算一下用不用变调 + float pitch = this.m_pitchStepResolver.ResolvePitch(audioObject, now); //算一下用不用变调 PlayNewSound(audioObject, pitch); this.m_lastPlayTime[audioObject.Id] = now; } diff --git a/Assets/Scripts/OCES/Audio/HandWritten/AudioSystem.cs b/Assets/Scripts/OCES/Audio/HandWritten/AudioSystem.cs index 7f68034..2814973 100644 --- a/Assets/Scripts/OCES/Audio/HandWritten/AudioSystem.cs +++ b/Assets/Scripts/OCES/Audio/HandWritten/AudioSystem.cs @@ -26,6 +26,13 @@ namespace OCES.Audio // 公开接口 // ───────────────────────────────────────────── + public void Play(uint audioId) + { + AudioObject obj = this.m_audioObjects.QueryById(audioId); + if (obj != null) + Play(obj); + } + public void Play(AudioObject audioObject) { this.m_scheduler.TryPlay(audioObject); @@ -33,14 +40,36 @@ namespace OCES.Audio public void Play(int audioId) { - AudioObject obj = this.m_audioObjects.QueryById((uint)audioId); - if (obj != null) - this.m_scheduler.TryPlay(obj); + Play((uint)audioId); } + + [Obsolete("Use Play(uint) instead")] public void Play(string audioName) { - // TODO: 按文件名播放 + if (!AudioObjectDefinitions.NameToId.TryGetValue(audioName, out uint id)) + { + Debug.LogWarning($"[Audio] Name '{audioName}' not found."); + return; + } + + if (AudioObjectDefinitions.AmbiguousNames.Contains(audioName)) + { + Debug.LogWarning( + $"[AudioSystem] Name '{audioName}' is ambiguous. Using first matched ID: {id}. " + + "Use ID instead to avoid unexpected behavior." + ); + } + + if (AudioObjectDefinitions.SharedIdNames.Contains(audioName)) + { + Debug.LogWarning( + $"[AudioSystem] Name '{audioName}' is a item of a container AudioObject (ID: {id}). " + + "Use ID instead to avoid unexpected behavior." + ); + } + + Play(id); } public void SetLowpass(bool enable) diff --git a/Assets/Scripts/OCES/Audio/HandWritten/PitchStepManager.cs b/Assets/Scripts/OCES/Audio/HandWritten/PitchStepResolver.cs similarity index 97% rename from Assets/Scripts/OCES/Audio/HandWritten/PitchStepManager.cs rename to Assets/Scripts/OCES/Audio/HandWritten/PitchStepResolver.cs index c1482a3..6f5f917 100644 --- a/Assets/Scripts/OCES/Audio/HandWritten/PitchStepManager.cs +++ b/Assets/Scripts/OCES/Audio/HandWritten/PitchStepResolver.cs @@ -3,7 +3,7 @@ using UnityEngine; namespace OCES.Audio { - public class PitchStepManager + public class PitchStepResolver { readonly Dictionary m_pitchStepCounts = new(); readonly Dictionary m_pitchStepLastTime = new(); diff --git a/Assets/Scripts/OCES/Audio/HandWritten/PitchStepManager.cs.meta b/Assets/Scripts/OCES/Audio/HandWritten/PitchStepResolver.cs.meta similarity index 100% rename from Assets/Scripts/OCES/Audio/HandWritten/PitchStepManager.cs.meta rename to Assets/Scripts/OCES/Audio/HandWritten/PitchStepResolver.cs.meta