diff --git a/Assets/Resources/AudioData/AudioObject.bytes b/Assets/Resources/AudioData/AudioObject.bytes index 34dee00..0075179 100644 Binary files a/Assets/Resources/AudioData/AudioObject.bytes and b/Assets/Resources/AudioData/AudioObject.bytes differ diff --git a/Assets/Resources/AudioData/MusicContainer.bytes b/Assets/Resources/AudioData/MusicContainer.bytes index 198ee0f..8808722 100644 Binary files a/Assets/Resources/AudioData/MusicContainer.bytes and b/Assets/Resources/AudioData/MusicContainer.bytes differ diff --git a/Assets/Resources/AudioData/MusicPath.bytes b/Assets/Resources/AudioData/MusicPath.bytes index 8194d27..a426cfe 100644 Binary files a/Assets/Resources/AudioData/MusicPath.bytes and b/Assets/Resources/AudioData/MusicPath.bytes differ diff --git a/Assets/Resources/AudioData/MusicSegment.bytes b/Assets/Resources/AudioData/MusicSegment.bytes index 849834d..fbfd69b 100644 Binary files a/Assets/Resources/AudioData/MusicSegment.bytes and b/Assets/Resources/AudioData/MusicSegment.bytes differ diff --git a/Assets/Resources/AudioData/MusicTransition.bytes b/Assets/Resources/AudioData/MusicTransition.bytes index 9d618ed..1aa12d8 100644 Binary files a/Assets/Resources/AudioData/MusicTransition.bytes and b/Assets/Resources/AudioData/MusicTransition.bytes differ diff --git a/Assets/Resources/Audios/au_coreplay_collect_handbag.wav b/Assets/Resources/Audios/au_coreplay_collect_handbag.wav new file mode 100644 index 0000000..994623b Binary files /dev/null and b/Assets/Resources/Audios/au_coreplay_collect_handbag.wav differ diff --git a/Assets/Resources/Audios/au_coreplay_collect_handbag.wav.meta b/Assets/Resources/Audios/au_coreplay_collect_handbag.wav.meta new file mode 100644 index 0000000..f7d5596 --- /dev/null +++ b/Assets/Resources/Audios/au_coreplay_collect_handbag.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 0ff2a59f9d4f5412792e5bba783f5c7a +AudioImporter: + externalObjects: {} + serializedVersion: 7 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Audios/au_coreplay_pour_less_1.wav b/Assets/Resources/Audios/au_coreplay_pour_less_1.wav new file mode 100644 index 0000000..1a21712 Binary files /dev/null and b/Assets/Resources/Audios/au_coreplay_pour_less_1.wav differ diff --git a/Assets/Resources/Audios/au_coreplay_pour_less_1.wav.meta b/Assets/Resources/Audios/au_coreplay_pour_less_1.wav.meta new file mode 100644 index 0000000..6b5b017 --- /dev/null +++ b/Assets/Resources/Audios/au_coreplay_pour_less_1.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 6b648c023f5e041a893c06ee0cd55839 +AudioImporter: + externalObjects: {} + serializedVersion: 7 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Audios/au_coreplay_pour_less_2.wav b/Assets/Resources/Audios/au_coreplay_pour_less_2.wav new file mode 100644 index 0000000..e89ab8e Binary files /dev/null and b/Assets/Resources/Audios/au_coreplay_pour_less_2.wav differ diff --git a/Assets/Resources/Audios/au_coreplay_pour_less_2.wav.meta b/Assets/Resources/Audios/au_coreplay_pour_less_2.wav.meta new file mode 100644 index 0000000..f097559 --- /dev/null +++ b/Assets/Resources/Audios/au_coreplay_pour_less_2.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: deba7646359d5433aaecc6dbf9ec8e36 +AudioImporter: + externalObjects: {} + serializedVersion: 7 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Audios/au_coreplay_pour_mid_1.wav b/Assets/Resources/Audios/au_coreplay_pour_mid_1.wav new file mode 100644 index 0000000..8efc422 Binary files /dev/null and b/Assets/Resources/Audios/au_coreplay_pour_mid_1.wav differ diff --git a/Assets/Resources/Audios/au_coreplay_pour_mid_1.wav.meta b/Assets/Resources/Audios/au_coreplay_pour_mid_1.wav.meta new file mode 100644 index 0000000..96f30ea --- /dev/null +++ b/Assets/Resources/Audios/au_coreplay_pour_mid_1.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: cd9d756f436864f1c8b6a10dc273c708 +AudioImporter: + externalObjects: {} + serializedVersion: 7 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Audios/au_coreplay_pour_mid_2.wav b/Assets/Resources/Audios/au_coreplay_pour_mid_2.wav new file mode 100644 index 0000000..939fee2 Binary files /dev/null and b/Assets/Resources/Audios/au_coreplay_pour_mid_2.wav differ diff --git a/Assets/Resources/Audios/au_coreplay_pour_mid_2.wav.meta b/Assets/Resources/Audios/au_coreplay_pour_mid_2.wav.meta new file mode 100644 index 0000000..8100b50 --- /dev/null +++ b/Assets/Resources/Audios/au_coreplay_pour_mid_2.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 207d0e7be17864f8996e1f3d2140d117 +AudioImporter: + externalObjects: {} + serializedVersion: 7 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Audios/au_coreplay_pour_more_1.wav b/Assets/Resources/Audios/au_coreplay_pour_more_1.wav new file mode 100644 index 0000000..e183229 Binary files /dev/null and b/Assets/Resources/Audios/au_coreplay_pour_more_1.wav differ diff --git a/Assets/Resources/Audios/au_coreplay_pour_more_1.wav.meta b/Assets/Resources/Audios/au_coreplay_pour_more_1.wav.meta new file mode 100644 index 0000000..be7eb74 --- /dev/null +++ b/Assets/Resources/Audios/au_coreplay_pour_more_1.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: a91860e6b5a5c47d9a8acaac55bebf40 +AudioImporter: + externalObjects: {} + serializedVersion: 7 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Audios/au_coreplay_pour_more_2.wav b/Assets/Resources/Audios/au_coreplay_pour_more_2.wav new file mode 100644 index 0000000..745acad Binary files /dev/null and b/Assets/Resources/Audios/au_coreplay_pour_more_2.wav differ diff --git a/Assets/Resources/Audios/au_coreplay_pour_more_2.wav.meta b/Assets/Resources/Audios/au_coreplay_pour_more_2.wav.meta new file mode 100644 index 0000000..cf92e63 --- /dev/null +++ b/Assets/Resources/Audios/au_coreplay_pour_more_2.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: d8d6d1c358a444de6bf2863ee12c6a6e +AudioImporter: + externalObjects: {} + serializedVersion: 7 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Audios/au_coreplay_win.wav b/Assets/Resources/Audios/au_coreplay_win.wav new file mode 100644 index 0000000..a81a19c Binary files /dev/null and b/Assets/Resources/Audios/au_coreplay_win.wav differ diff --git a/Assets/Resources/Audios/au_coreplay_win.wav.meta b/Assets/Resources/Audios/au_coreplay_win.wav.meta new file mode 100644 index 0000000..a2f62c9 --- /dev/null +++ b/Assets/Resources/Audios/au_coreplay_win.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: f805529718cf2490c81ddeeeca559a6c +AudioImporter: + externalObjects: {} + serializedVersion: 7 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Audios/au_music_game_loop.wav b/Assets/Resources/Audios/au_music_game.wav similarity index 100% rename from Assets/Resources/Audios/au_music_game_loop.wav rename to Assets/Resources/Audios/au_music_game.wav diff --git a/Assets/Resources/Audios/au_music_game_loop.wav.meta b/Assets/Resources/Audios/au_music_game.wav.meta similarity index 100% rename from Assets/Resources/Audios/au_music_game_loop.wav.meta rename to Assets/Resources/Audios/au_music_game.wav.meta diff --git a/Assets/Resources/Audios/au_music_game_loop_notail.wav b/Assets/Resources/Audios/au_music_game_loop_notail.wav new file mode 100644 index 0000000..0f7c1d0 Binary files /dev/null and b/Assets/Resources/Audios/au_music_game_loop_notail.wav differ diff --git a/Assets/Resources/Audios/au_music_game_loop_notail.wav.meta b/Assets/Resources/Audios/au_music_game_loop_notail.wav.meta new file mode 100644 index 0000000..5169067 --- /dev/null +++ b/Assets/Resources/Audios/au_music_game_loop_notail.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 0546af815ebd141fabcda647c12e8ccf +AudioImporter: + externalObjects: {} + serializedVersion: 7 + defaultSettings: + serializedVersion: 2 + loadType: 2 + sampleRateSetting: 2 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 0.13 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Audios/au_music_home_loop_notail.wav b/Assets/Resources/Audios/au_music_home_loop_notail.wav new file mode 100644 index 0000000..34a13a2 Binary files /dev/null and b/Assets/Resources/Audios/au_music_home_loop_notail.wav differ diff --git a/Assets/Resources/Audios/au_music_home_loop_notail.wav.meta b/Assets/Resources/Audios/au_music_home_loop_notail.wav.meta new file mode 100644 index 0000000..94e2b63 --- /dev/null +++ b/Assets/Resources/Audios/au_music_home_loop_notail.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 921d30b7911b6459b82aeb4ce80bcae9 +AudioImporter: + externalObjects: {} + serializedVersion: 7 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Audios/au_music_home_start.pkf b/Assets/Resources/Audios/au_music_home_start.pkf new file mode 100644 index 0000000..74b3dfa Binary files /dev/null and b/Assets/Resources/Audios/au_music_home_start.pkf differ diff --git a/Assets/Resources/Audios/au_music_home_start.pkf.meta b/Assets/Resources/Audios/au_music_home_start.pkf.meta new file mode 100644 index 0000000..67c5ef3 --- /dev/null +++ b/Assets/Resources/Audios/au_music_home_start.pkf.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4e8fa10885f1b4a81a45db662ff7af77 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Audios/au_music_home_start.wav b/Assets/Resources/Audios/au_music_home_start.wav new file mode 100644 index 0000000..1a6f2ee Binary files /dev/null and b/Assets/Resources/Audios/au_music_home_start.wav differ diff --git a/Assets/Resources/Audios/au_music_home_start.wav.meta b/Assets/Resources/Audios/au_music_home_start.wav.meta new file mode 100644 index 0000000..d991a61 --- /dev/null +++ b/Assets/Resources/Audios/au_music_home_start.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: ae19d4b3ec8be4679b092fbefc78f066 +AudioImporter: + externalObjects: {} + serializedVersion: 7 + defaultSettings: + serializedVersion: 2 + loadType: 2 + sampleRateSetting: 2 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 0.13 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/HapticData/HapticObject.bytes b/Assets/Resources/HapticData/HapticObject.bytes index f518a4f..6678b91 100644 Binary files a/Assets/Resources/HapticData/HapticObject.bytes and b/Assets/Resources/HapticData/HapticObject.bytes differ diff --git a/Assets/Resources/Haptics/hp_coreplay_collect_handbag.haptic b/Assets/Resources/Haptics/hp_coreplay_collect_handbag.haptic new file mode 100644 index 0000000..8541791 --- /dev/null +++ b/Assets/Resources/Haptics/hp_coreplay_collect_handbag.haptic @@ -0,0 +1,73 @@ +{ + "version": { + "major": 1, + "minor": 0, + "patch": 0 + }, + "metadata": { + "editor": "Haptic Editor", + "author": "Oliver", + "source": "au_coreplay_collect_handbag", + "project": "Magic_Sort", + "tags": [], + "description": "" + }, + "signals": { + "continuous": { + "envelopes": { + "amplitude": [ + { + "time": 0.42857142857142855, + "amplitude": 0, + "emphasis": { + "amplitude": 0.25, + "frequency": 0.5 + } + }, + { + "time": 0.4612427930813581, + "amplitude": 0, + "emphasis": { + "amplitude": 0.5, + "frequency": 0.5 + } + }, + { + "time": 0.4855861627162076, + "amplitude": 0, + "emphasis": { + "amplitude": 0.75, + "frequency": 0.5 + } + }, + { + "time": 0.5393978219090326, + "amplitude": 0, + "emphasis": { + "amplitude": 1, + "frequency": 0.5 + } + } + ], + "frequency": [ + { + "time": 0.42857142857142855, + "frequency": 0 + }, + { + "time": 0.4612427930813581, + "frequency": 0 + }, + { + "time": 0.4855861627162076, + "frequency": 0 + }, + { + "time": 0.5393978219090326, + "frequency": 0 + } + ] + } + } + } +} \ No newline at end of file diff --git a/Assets/Resources/Haptics/hp_coreplay_collect_handbag.haptic.meta b/Assets/Resources/Haptics/hp_coreplay_collect_handbag.haptic.meta new file mode 100644 index 0000000..3c5fdef --- /dev/null +++ b/Assets/Resources/Haptics/hp_coreplay_collect_handbag.haptic.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: f26a3f5c6d14a44c196a2c50e54f37ec +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: dc84fb4fa9e67485a972c887d976d004, type: 3} diff --git a/Assets/Resources/Haptics/hp_coreplay_pour_less.haptic b/Assets/Resources/Haptics/hp_coreplay_pour_less.haptic new file mode 100644 index 0000000..3c97083 --- /dev/null +++ b/Assets/Resources/Haptics/hp_coreplay_pour_less.haptic @@ -0,0 +1,41 @@ +{ + "version": { + "major": 1, + "minor": 0, + "patch": 0 + }, + "metadata": { + "editor": "Haptic Editor", + "author": "Oliver", + "source": "new_au_coreplay_pour_less_1", + "project": "Magic_Sort", + "tags": [], + "description": "" + }, + "signals": { + "continuous": { + "envelopes": { + "amplitude": [ + { + "time": 0, + "amplitude": 0 + }, + { + "time": 0.4426649583600256, + "amplitude": 0.15 + } + ], + "frequency": [ + { + "time": 0, + "frequency": 0.0810719131614654 + }, + { + "time": 0.4426649583600256, + "frequency": 0.25 + } + ] + } + } + } +} \ No newline at end of file diff --git a/Assets/Resources/Haptics/hp_coreplay_pour_less.haptic.meta b/Assets/Resources/Haptics/hp_coreplay_pour_less.haptic.meta new file mode 100644 index 0000000..f427307 --- /dev/null +++ b/Assets/Resources/Haptics/hp_coreplay_pour_less.haptic.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: ee687f540e1b84654a3ab68e821cd838 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: dc84fb4fa9e67485a972c887d976d004, type: 3} diff --git a/Assets/Resources/Haptics/hp_coreplay_pour_mid.haptic b/Assets/Resources/Haptics/hp_coreplay_pour_mid.haptic new file mode 100644 index 0000000..a607646 --- /dev/null +++ b/Assets/Resources/Haptics/hp_coreplay_pour_mid.haptic @@ -0,0 +1,41 @@ +{ + "version": { + "major": 1, + "minor": 0, + "patch": 0 + }, + "metadata": { + "editor": "Haptic Editor", + "author": "Oliver", + "source": "au_coreplay_pour_mid_1.wav", + "project": "Magic_Sort", + "tags": [], + "description": "" + }, + "signals": { + "continuous": { + "envelopes": { + "amplitude": [ + { + "time": 0, + "amplitude": 0 + }, + { + "time": 0.513, + "amplitude": 0.4 + } + ], + "frequency": [ + { + "time": 0, + "frequency": 0 + }, + { + "time": 0.513, + "frequency": 0.4 + } + ] + } + } + } +} \ No newline at end of file diff --git a/Assets/Resources/Haptics/hp_coreplay_pour_mid.haptic.meta b/Assets/Resources/Haptics/hp_coreplay_pour_mid.haptic.meta new file mode 100644 index 0000000..493bb69 --- /dev/null +++ b/Assets/Resources/Haptics/hp_coreplay_pour_mid.haptic.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: cc4f61e064f1440e3adc42cb52023fb9 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: dc84fb4fa9e67485a972c887d976d004, type: 3} diff --git a/Assets/Resources/Haptics/hp_coreplay_pour_more.haptic b/Assets/Resources/Haptics/hp_coreplay_pour_more.haptic new file mode 100644 index 0000000..ba6b959 --- /dev/null +++ b/Assets/Resources/Haptics/hp_coreplay_pour_more.haptic @@ -0,0 +1,41 @@ +{ + "version": { + "major": 1, + "minor": 0, + "patch": 0 + }, + "metadata": { + "editor": "Haptic Editor", + "author": "Oliver", + "source": "au_coreplay_pour_more_1.wav", + "project": "Magic_Sort", + "tags": [], + "description": "" + }, + "signals": { + "continuous": { + "envelopes": { + "amplitude": [ + { + "time": 0, + "amplitude": 0 + }, + { + "time": 0.7, + "amplitude": 0.4 + } + ], + "frequency": [ + { + "time": 0, + "frequency": 0 + }, + { + "time": 0.7, + "frequency": 0.5 + } + ] + } + } + } +} \ No newline at end of file diff --git a/Assets/Resources/Haptics/hp_coreplay_pour_more.haptic.meta b/Assets/Resources/Haptics/hp_coreplay_pour_more.haptic.meta new file mode 100644 index 0000000..7cf0ad1 --- /dev/null +++ b/Assets/Resources/Haptics/hp_coreplay_pour_more.haptic.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: a5e848c536ee74d9a9d7c1e782ffc106 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: dc84fb4fa9e67485a972c887d976d004, type: 3} diff --git a/Assets/Resources/Haptics/hp_coreplay_win.haptic b/Assets/Resources/Haptics/hp_coreplay_win.haptic new file mode 100644 index 0000000..b852523 --- /dev/null +++ b/Assets/Resources/Haptics/hp_coreplay_win.haptic @@ -0,0 +1,73 @@ +{ + "version": { + "major": 1, + "minor": 0, + "patch": 0 + }, + "metadata": { + "editor": "Haptic Editor", + "author": "Oliver", + "source": "au_coreplay_win.wav", + "project": "Magic_Sort", + "tags": [], + "description": "" + }, + "signals": { + "continuous": { + "envelopes": { + "amplitude": [ + { + "time": 0.0006406149903907751, + "amplitude": 0 + }, + { + "time": 0.05509288917360666, + "amplitude": 0.73, + "emphasis": { + "amplitude": 0.75, + "frequency": 0.25 + } + }, + { + "time": 0.1646380525304292, + "amplitude": 0.26424694708276797 + }, + { + "time": 0.24407431133888532, + "amplitude": 1, + "emphasis": { + "amplitude": 1, + "frequency": 0.39 + } + }, + { + "time": 0.7021140294682896, + "amplitude": 0 + } + ], + "frequency": [ + { + "time": 0.0006406149903907751, + "frequency": 0 + }, + { + "time": 0.05509288917360666, + "frequency": 0.5 + }, + { + "time": 0.1646380525304292, + "frequency": 0.2472862957937585 + }, + { + "time": 0.24407431133888532, + "frequency": 0.7459294436906377 + }, + { + "time": 0.7021140294682896, + "frequency": 0 + } + ] + } + } + } +} \ No newline at end of file diff --git a/Assets/Resources/Haptics/hp_coreplay_win.haptic.meta b/Assets/Resources/Haptics/hp_coreplay_win.haptic.meta new file mode 100644 index 0000000..2208e6c --- /dev/null +++ b/Assets/Resources/Haptics/hp_coreplay_win.haptic.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 2dc504ef835db46b89c366c2b0650175 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: dc84fb4fa9e67485a972c887d976d004, type: 3} diff --git a/Assets/Scenes/SampleScene.unity b/Assets/Scenes/SampleScene.unity index 9d441df..55be1e6 100644 --- a/Assets/Scenes/SampleScene.unity +++ b/Assets/Scenes/SampleScene.unity @@ -520,6 +520,7 @@ GameObject: - component: {fileID: 519420031} - component: {fileID: 519420029} - component: {fileID: 519420030} + - component: {fileID: 519420033} m_Layer: 0 m_Name: Main Camera m_TagString: MainCamera @@ -645,6 +646,18 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &519420033 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 519420028} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a3d8ad76f12545caa287f26889c674e3, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &519563560 GameObject: m_ObjectHideFlags: 0 @@ -1948,7 +1961,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 2ce47fe7df364a8fa37501256e5b5155, type: 3} m_Name: m_EditorClassIdentifier: - targetGameState: 2 + targetGameState: 4 enableLowpass: 0 buttonText: {fileID: 519563562} --- !u!114 &1542973985 @@ -2817,7 +2830,6 @@ GameObject: m_Component: - component: {fileID: 2093584671} - component: {fileID: 2093584670} - - component: {fileID: 2093584672} m_Layer: 0 m_Name: AudioSystem m_TagString: Untagged @@ -2854,18 +2866,6 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &2093584672 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2093584669} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a3d8ad76f12545caa287f26889c674e3, type: 3} - m_Name: - m_EditorClassIdentifier: --- !u!1660057539 &9223372036854775807 SceneRoots: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/OCES/Audio/Generated/AudioConsts.cs b/Assets/Scripts/OCES/Audio/Generated/AudioConsts.cs index 4d625fa..e470b83 100644 --- a/Assets/Scripts/OCES/Audio/Generated/AudioConsts.cs +++ b/Assets/Scripts/OCES/Audio/Generated/AudioConsts.cs @@ -36,6 +36,11 @@ namespace OCES.Audio public static uint Play_Bar = 52; public static uint Play_Beat = 53; public static uint Play_Grid = 54; + public static uint Play_au_coreplay_collect_handbag = 101; + public static uint Play_au_coreplay_win = 102; + public static uint Play_au_coreplay_pour_less = 103; + public static uint Play_au_coreplay_pour_mid = 104; + public static uint Play_au_coreplay_pour_more = 105; } //public class Cues [SuppressMessage("ReSharper", "ClassNeverInstantiated.Global")] @@ -68,6 +73,14 @@ namespace OCES.Audio { "Bar", 52 }, { "Beat", 53 }, { "Grid", 54 }, + { "au_coreplay_collect_handbag", 101 }, + { "au_coreplay_win", 102 }, + { "au_coreplay_pour_less_1", 103 }, + { "au_coreplay_pour_less_2", 103 }, + { "au_coreplay_pour_mid_1", 104 }, + { "au_coreplay_pour_mid_2", 104 }, + { "au_coreplay_pour_more_1", 105 }, + { "au_coreplay_pour_more_2", 105 }, }; public static readonly HashSet AmbiguousNames = new() @@ -76,6 +89,12 @@ namespace OCES.Audio public static readonly HashSet SharedIdNames = new() { + "au_coreplay_pour_less_1", + "au_coreplay_pour_less_2", + "au_coreplay_pour_mid_1", + "au_coreplay_pour_mid_2", + "au_coreplay_pour_more_1", + "au_coreplay_pour_more_2", }; } //public class NameDictionaries @@ -99,6 +118,7 @@ namespace OCES.Audio Game, // 关卡内 Win, // 胜利 Lose, // 失败 + Test, } } //public class Parameters diff --git a/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/BeatClock.cs b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/BeatClock.cs index 34996c8..56638cf 100644 --- a/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/BeatClock.cs +++ b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/BeatClock.cs @@ -11,6 +11,7 @@ namespace OCES.Audio double m_startDspTime, m_secondsPerBeat; // 本次计数周期的起点 Coroutine m_beatCoroutine, m_barCoroutine, m_gridCoroutine; + Coroutine m_delayCoroutine; readonly Action m_onBeat, m_onBar, m_onGrid; readonly MonoBehaviour m_host; @@ -26,13 +27,13 @@ namespace OCES.Audio this.m_onGrid = onGrid; } - internal void Restart(MusicContainer container, float inheritedBpm, double dspTime) + internal void Restart(MusicContainer container, float inheritedBpm, double dspTime, double startOffset = 0d) { //Debug.Log($"[BeatClock] Restarting {container.Id}, inheritedBpm = {inheritedBpm}, dspTime = {dspTime}"); StopAll(); this.m_blendError = this.m_stopped = false; this.m_containerId = container.Id; - this.m_startDspTime = dspTime; + this.m_startDspTime = dspTime + startOffset; // BPM:优先用自己的,为 0 则用传入的继承值 float bpm = container.Bpm > 0f ? container.Bpm : inheritedBpm; @@ -57,6 +58,32 @@ namespace OCES.Audio this.m_barsPerGrid = container.Grid; } + double delay = this.m_startDspTime - AudioSettings.dspTime; + if (delay > 0) + { + this.m_delayCoroutine = this.m_host.StartCoroutine(DelayedStart(delay, hasTimeSig, hasGrid)); + } + else + { + StartCoroutines(hasTimeSig, hasGrid); + } + } + + IEnumerator DelayedStart(double delay, bool hasTimeSig, bool hasGrid) + { + yield return new WaitUntil(() => AudioSettings.dspTime >= this.m_startDspTime - 0.02); + + while (AudioSettings.dspTime < this.m_startDspTime) + yield return null; + + if (this.m_stopped || this.m_blendError) yield break; + + this.m_delayCoroutine = null; + StartCoroutines(hasTimeSig, hasGrid); + } + + void StartCoroutines(bool hasTimeSig, bool hasGrid) + { // 分层启动协程 // Beat:只要 BPM 有效就启动 this.m_beatCoroutine = this.m_host.StartCoroutine(BeatCoroutine()); @@ -82,10 +109,11 @@ namespace OCES.Audio internal void StopAll() { this.m_stopped = true; - if (this.m_beatCoroutine != null) this.m_host.StopCoroutine(this.m_beatCoroutine); - if (this.m_barCoroutine != null) this.m_host.StopCoroutine(this.m_barCoroutine); - if (this.m_gridCoroutine != null) this.m_host.StopCoroutine(this.m_gridCoroutine); - this.m_beatCoroutine = this.m_barCoroutine = this.m_gridCoroutine = null; + if (this.m_delayCoroutine != null) this.m_host.StopCoroutine(this.m_delayCoroutine); + if (this.m_beatCoroutine != null) this.m_host.StopCoroutine(this.m_beatCoroutine); + if (this.m_barCoroutine != null) this.m_host.StopCoroutine(this.m_barCoroutine); + if (this.m_gridCoroutine != null) this.m_host.StopCoroutine(this.m_gridCoroutine); + this.m_delayCoroutine = this.m_beatCoroutine = this.m_barCoroutine = this.m_gridCoroutine = null; } internal double GetNextDspTime(AlignMode mode) @@ -98,6 +126,11 @@ namespace OCES.Audio } double elapsed = now - this.m_startDspTime; + if (elapsed < 0) + { + return this.m_startDspTime; + } + double period = mode switch { AlignMode.Beat => this.m_secondsPerBeat, diff --git a/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/ChannelFader.cs b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/ChannelFader.cs index 81e33f6..53a9295 100644 --- a/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/ChannelFader.cs +++ b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/ChannelFader.cs @@ -16,6 +16,9 @@ namespace OCES.Audio public double BaseDspTime; // 读取Source Segment 的 dspTime public int SampleRate; // Source Segment 的采样率 public bool Ready; + public double SourceStartOffset; + public double TargetAudioTime; + public double StartPlayTime; } /// @@ -41,10 +44,12 @@ namespace OCES.Audio CurrentContainerId = containerId; CurrentVolume = startVolume; CurrentHandle = this.m_player.Play(containerId); + Debug.Log($"[ChannelFader] StartNew: containerId={containerId}, CurrentHandle={CurrentHandle}"); } public void StopCurrent() { + Debug.Log($"[ChannelFader] StopCurrent called! CurrentHandle={CurrentHandle}, stack=\n{Environment.StackTrace}"); StopHandle(CurrentHandle); CurrentHandle = null; CurrentContainerId = 0; @@ -84,7 +89,8 @@ namespace OCES.Audio /// 淡入分支:等待 FadeInOffset 后启动新音乐并淡入。 /// 主协程 yield return 此分支,以便 DoTransition 在新音乐就绪后才结束。 /// - internal IEnumerator FadeInBranch(uint newContainerId, ITransitionConfig transition, SyncPointState syncState = null, Action onContainerStarted = null) + internal IEnumerator FadeInBranch(uint newContainerId, ITransitionConfig transition, SyncPointState syncState = null, + Action onContainerStarted = null) { if (transition?.FadeInOffset > 0f) { @@ -94,7 +100,7 @@ namespace OCES.Audio if (newContainerId == 0) { - CurrentHandle = null; + CurrentHandle = null; CurrentContainerId = 0; if (syncState != null) syncState.Ready = true; yield break; @@ -102,43 +108,63 @@ namespace OCES.Audio float startVolume = transition?.FadeInTime > 0f ? 0f : 1f; StartNew(newContainerId, startVolume); + onContainerStarted?.Invoke(); - // SyncPoint: 获取新 Segment 的 AudioSource 并设置 timeSamples - if (syncState is { Mode: SyncPoint.SameAsCurrentSegment }) + switch (syncState) { - AudioSource newSource = CurrentHandle?.GetFirstLeafSource(); - if (newSource && newSource.clip) + // SyncPoint: 获取新 Segment 的 AudioSource 并设置 timeSamples + case { Mode: SyncPoint.SameAsCurrentSegment }: { - // 计算从读取Source Segment 到现在经过的 samples - double elapsedSeconds = AudioSettings.dspTime - syncState.BaseDspTime; - int elapsedSamples = (int)(elapsedSeconds * syncState.SampleRate); - int targetTimeSamples = syncState.BaseTimeSamples + elapsedSamples; - - if (targetTimeSamples < newSource.clip.samples) + AudioSource newSource = CurrentHandle?.GetFirstLeafSource(); + if (newSource && newSource.clip) { - newSource.timeSamples = targetTimeSamples; + double targetAudioTime = syncState.TargetAudioTime; + if (targetAudioTime > 0) + { + int targetTimeSamples = (int)(targetAudioTime * newSource.clip.frequency); + if (targetTimeSamples >= 0 && targetTimeSamples < newSource.clip.samples) + { + newSource.timeSamples = targetTimeSamples; + } + else + { + Debug.LogError( + $"[ChannelFader] SyncPoint: 目标 samples({targetTimeSamples}) 超出范围 [0, {newSource.clip.samples}),降级为 Start"); + } + } } else { - Debug.LogError($"[ChannelFader] SyncPoint.SameAsCurrentSegment: 新音频 samples({newSource.clip.samples}) <= 目标 samples({targetTimeSamples}),降级为 Start"); + Debug.LogError($"[ChannelFader] SyncPoint.SameAsCurrentSegment: 未能获取新 Segment 的 AudioSource,降级为 Start"); } + syncState.Ready = true; + break; } - else + case { Mode: SyncPoint.Start, StartPlayTime: > 0 }: { - Debug.LogError($"[ChannelFader] SyncPoint.SameAsCurrentSegment: 未能获取新 Segment 的 AudioSource,降级为 Start"); + AudioSource newSource = CurrentHandle?.GetFirstLeafSource(); + if (!newSource || !newSource.clip) + yield break; + + //在赋值的时候减过fade in time了 + int targetTimeSamples = (int)(syncState.StartPlayTime * newSource.clip.frequency); + + if (targetTimeSamples >= 0 && targetTimeSamples < newSource.clip.samples) + { + newSource.timeSamples = targetTimeSamples; + } + break; } - syncState.Ready = true; } - - onContainerStarted?.Invoke(); - + + if (transition?.FadeInTime > 0f) { yield return this.m_coroutineHost.StartCoroutine( FadeIn(CurrentHandle, transition.FadeInTime)); } } - + IEnumerator FadeOut(ContainerPlayHandle handle, float fromVolume, float duration) { //Debug.Log($"Fading out in {duration} seconds."); diff --git a/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/LongAudioContainerPlayer.cs b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/LongAudioContainerPlayer.cs index 4b2ffda..9116c01 100644 --- a/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/LongAudioContainerPlayer.cs +++ b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/LongAudioContainerPlayer.cs @@ -112,8 +112,9 @@ namespace OCES.Audio while (true) { + bool isLoop = loopsCompleted > 0; yield return this.m_coroutineHost.StartCoroutine( - PlayContainerOnce(container, handle.TargetVolume, handle, effectiveBpm)); + PlayContainerOnce(container, handle.TargetVolume, handle, effectiveBpm, isLoop)); if (handle.Cancelled) yield break; @@ -139,7 +140,12 @@ namespace OCES.Audio /// /// 播放一个 Container 一轮(不含循环逻辑) /// - IEnumerator PlayContainerOnce(MusicContainer container, float volumeScale, ContainerPlayHandle handle, float inheritedBpm) + IEnumerator PlayContainerOnce( + MusicContainer container, + float volumeScale, + ContainerPlayHandle handle, + float inheritedBpm, + bool isLoop = false) { if (container.Segments == null || container.Segments.Count == 0) yield break; @@ -151,11 +157,11 @@ namespace OCES.Audio break; case ContainerType.Sequence: - yield return PlaySequence(container, volumeScale, handle, inheritedBpm); + yield return PlaySequence(container, volumeScale, handle, inheritedBpm, isLoop); break; case ContainerType.Random: - yield return PlayRandom(container, volumeScale, handle, inheritedBpm); + yield return PlayRandom(container, volumeScale, handle, inheritedBpm, isLoop); break; } } @@ -211,7 +217,12 @@ namespace OCES.Audio // Sequence // ───────────────────────────────────────────── - IEnumerator PlaySequence(MusicContainer container, float volumeScale, ContainerPlayHandle handle, float inheritedBpm) + IEnumerator PlaySequence( + MusicContainer container, + float volumeScale, + ContainerPlayHandle handle, + float inheritedBpm, + bool isLoop = false) { bool isStep = container.ContainerPlayMode; @@ -219,7 +230,7 @@ namespace OCES.Audio { // Step: 每次只播一个,游标全局推进 int index = GetNextSequenceIndex(container); - yield return PlayChildAndWait(container.Segments[index], volumeScale, handle, inheritedBpm); + yield return PlayChildAndWait(container.Segments[index], volumeScale, handle, inheritedBpm, isLoop); } else @@ -233,7 +244,7 @@ namespace OCES.Audio if (i > 0 && container.StrategyParam > 0) yield return new WaitForSeconds(container.StrategyParam); - yield return PlayChildAndWait(container.Segments[i], volumeScale, handle, inheritedBpm); + yield return PlayChildAndWait(container.Segments[i], volumeScale, handle, inheritedBpm, isLoop); } } } @@ -242,7 +253,12 @@ namespace OCES.Audio // Random // ───────────────────────────────────────────── - IEnumerator PlayRandom(MusicContainer container, float volumeScale, ContainerPlayHandle handle, float inheritedBpm) + IEnumerator PlayRandom( + MusicContainer container, + float volumeScale, + ContainerPlayHandle handle, + float inheritedBpm, + bool isLoop = false) { bool isStep = container.ContainerPlayMode; // 同上,音乐系统默认 Continuous @@ -250,7 +266,7 @@ namespace OCES.Audio { // Step Random: 随机选一个播放,算一次 loopCount uint chosen = PickRandomChild(container); - yield return PlayChildAndWait(chosen, volumeScale, handle, inheritedBpm); + yield return PlayChildAndWait(chosen, volumeScale, handle, inheritedBpm, isLoop); } else { @@ -268,7 +284,7 @@ namespace OCES.Audio if (container.StrategyParam > 0 && remaining.Count < container.Segments.Count - 1) yield return new WaitForSeconds(container.StrategyParam); - yield return PlayChildAndWait(chosen, volumeScale, handle, inheritedBpm); + yield return PlayChildAndWait(chosen, volumeScale, handle, inheritedBpm, isLoop); } } } @@ -280,10 +296,14 @@ namespace OCES.Audio /// /// 播放一个子元素(segment 或 container),等待其完成后返回。 /// - IEnumerator PlayChildAndWait(uint id, float volumeScale, ContainerPlayHandle parentHandle, float inheritedBpm) + IEnumerator PlayChildAndWait(uint id, + float volumeScale, + ContainerPlayHandle parentHandle, + float inheritedBpm, + bool isLoop = false) { bool done = false; - ContainerPlayHandle child = PlayChild(id, volumeScale, () => done = true, inheritedBpm); + ContainerPlayHandle child = PlayChild(id, volumeScale, () => done = true, inheritedBpm, isLoop); if (child != null) parentHandle.ChildHandles.Add(child); @@ -299,17 +319,17 @@ namespace OCES.Audio /// /// 启动一个子元素的播放,不等待,返回句柄。 /// - ContainerPlayHandle PlayChild(uint id, float volumeScale, Action onDone, float inheritedBpm) + ContainerPlayHandle PlayChild(uint id, float volumeScale, Action onDone, float inheritedBpm, bool isLoop = false) { // ID < 1000000 是 MusicSegment,否则是嵌套 Container - return id < 1000000u ? PlaySegment(id, volumeScale, onDone) : Play(id, onDone, inheritedBpm: inheritedBpm); + return id < 1000000u ? PlaySegment(id, volumeScale, onDone, isLoop) : Play(id, onDone, inheritedBpm); } // ───────────────────────────────────────────── // Segment 播放 // ───────────────────────────────────────────── - ContainerPlayHandle PlaySegment(uint segmentId, float volumeScale, Action onFinished) + ContainerPlayHandle PlaySegment(uint segmentId, float volumeScale, Action onFinished, bool isLoop = false) { MusicSegment segment = this.m_segmentConfig.QueryById(segmentId); if (segment == null) @@ -333,7 +353,12 @@ namespace OCES.Audio source.volume = volumeScale; source.Play(); - var handle = new ContainerPlayHandle(); + if (isLoop && segment.StartOffset > 0) + { + source.time = (float)segment.StartOffset; + } + + ContainerPlayHandle handle = new(); handle.ActiveSources.Add(source); handle.Coroutine = this.m_coroutineHost.StartCoroutine( WaitSegmentFinish(source, handle, onFinished, segment.EndOffset)); @@ -342,7 +367,7 @@ namespace OCES.Audio IEnumerator WaitSegmentFinish(AudioSource source, ContainerPlayHandle handle, Action onFinished, double endOffset) { - double effectiveTime = endOffset > 0f ? source.clip.length - endOffset : 0f; + double effectiveTime = endOffset > 0f ? source.clip.length - endOffset : source.clip.length; // 1. 等待"逻辑结束"(EndOffset 或自然结束) yield return new WaitWhile(() => diff --git a/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicChannelPlayer.cs b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicChannelPlayer.cs index 1f7cd6c..805b2c7 100644 --- a/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicChannelPlayer.cs +++ b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicChannelPlayer.cs @@ -14,6 +14,7 @@ namespace OCES.Audio { readonly MusicContainerConfig m_containerConfig; readonly MusicTransitionConfig m_transitionConfig; + readonly MusicSegmentConfig m_segmentConfig; readonly MonoBehaviour m_coroutineHost; readonly ChannelFader m_fader; readonly BeatClock m_beatClock; @@ -30,6 +31,7 @@ namespace OCES.Audio internal MusicChannelPlayer( MusicContainerConfig containerConfig, + MusicSegmentConfig segmentConfig, MusicTransitionConfig transitionConfig, LongAudioContainerPlayer player, MonoBehaviour coroutineHost, @@ -39,6 +41,7 @@ namespace OCES.Audio { this.m_containerConfig = containerConfig; this.m_transitionConfig = transitionConfig; + this.m_segmentConfig = segmentConfig; this.m_coroutineHost = coroutineHost; this.m_fader = new ChannelFader(player, coroutineHost); this.m_beatClock = new BeatClock(coroutineHost, onBeat, onBar, onGrid); @@ -55,6 +58,7 @@ namespace OCES.Audio /// internal void SwitchTo(uint newContainerId) { + Debug.Log($"[MusicChannelPlayer] SwitchTo({newContainerId}): CurrentContainerId={this.m_fader.CurrentContainerId}, CurrentHandle={this.m_fader.CurrentHandle}"); if (newContainerId == this.m_fader.CurrentContainerId && this.m_fader.CurrentHandle != null) return; // 已经在播目标,无需切换 @@ -110,6 +114,7 @@ namespace OCES.Audio if (syncState.Mode == SyncPoint.SameAsCurrentSegment) { + Debug.Log($"[MusicChannelPlayer] DoTransition L117: CurrentHandle={this.m_fader.CurrentHandle}, CurrentContainerId={this.m_fader.CurrentContainerId}"); // 旧 Container 不存在(如游戏首次启动),静默降级为 Start if (this.m_fader.CurrentHandle == null) { @@ -129,6 +134,7 @@ namespace OCES.Audio syncState.BaseTimeSamples = oldSource.timeSamples; syncState.BaseDspTime = AudioSettings.dspTime; syncState.SampleRate = oldSource.clip.frequency; + syncState.SourceStartOffset = GetEffectiveStartOffset(this.m_currentContainer); } else { @@ -161,23 +167,46 @@ namespace OCES.Audio { MusicContainer container = this.m_containerConfig.QueryById(newContainerId); float bpm = container.Bpm; - - // SyncPoint: BeatClock 用调整后的 dspTime,对齐到音频实际播放位置 + + double newStartOffset = GetEffectiveStartOffset(container); double dspTime; + if (syncState is { Mode: SyncPoint.SameAsCurrentSegment }) { double elapsedSeconds = AudioSettings.dspTime - syncState.BaseDspTime; int elapsedSamples = (int)(elapsedSeconds * syncState.SampleRate); - double audioTime = (double)(syncState.BaseTimeSamples + elapsedSamples) / syncState.SampleRate; - dspTime = AudioSettings.dspTime - audioTime; + double currentAudioTime = (double)(syncState.BaseTimeSamples + elapsedSamples) / syncState.SampleRate; + // 当前的source播到了哪里 + + double currentLogicalTime = Math.Max(0, currentAudioTime - syncState.SourceStartOffset); + // EntryCue之后播了多少秒。要是小于0说明pre-entry还没播完。 + + double newAudioTime = currentLogicalTime + newStartOffset; + // 新Audio应该从多少秒开始播放 + + bool isPlayPreEntry = true; //TODO transition 是否播放pre-entry + syncState.TargetAudioTime = isPlayPreEntry ? currentLogicalTime + newStartOffset : currentLogicalTime; + dspTime = AudioSettings.dspTime - newAudioTime; } else { + double startPlayTime; + if (this.m_currentContainer == null) + { + startPlayTime = 0; + } + else + { + double fadeInTime = transition?.FadeInTime ?? 0f; + startPlayTime = newStartOffset - fadeInTime; + startPlayTime = Math.Clamp(startPlayTime, 0, double.PositiveInfinity); + } + syncState.StartPlayTime = startPlayTime; dspTime = AudioSettings.dspTime; } this.m_currentContainer = container; - this.m_beatClock.Restart(container, bpm, dspTime); + this.m_beatClock.Restart(container, bpm, dspTime, newStartOffset); })); yield return this.m_currentFadeInCoroutine; this.m_currentFadeInCoroutine = null; @@ -227,5 +256,26 @@ namespace OCES.Audio } return best; } + + double GetEffectiveStartOffset(MusicContainer container) + { + if (container.ContainerType == ContainerType.Blend) + { + return 0.0; + } + + if (container.Segments is not { Count: > 0 }) + return 0.0; + uint firstId = container.Segments[0]; + if (firstId < 1000000u) + { + MusicSegment segment = this.m_segmentConfig.QueryById(firstId); + return segment?.StartOffset ?? 0.0; + } + + MusicContainer child = this.m_containerConfig.QueryById(firstId); + return child != null ? GetEffectiveStartOffset(child) : 0.0; + + } } } diff --git a/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicSegmentConfig.cs b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicSegmentConfig.cs new file mode 100644 index 0000000..1fd7132 --- /dev/null +++ b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicSegmentConfig.cs @@ -0,0 +1,10 @@ +namespace OCES.Audio +{ + public partial class MusicSegmentConfig + { + // TODO: 运行前边界验证 + // - MusicSegment.StartOffset <= AudioClip.length + // - MusicSegment.EndOffset <= AudioClip.length + // - MusicSegment.StartOffset + MusicSegment.EndOffset <= AudioClip.length + } +} diff --git a/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicSegmentConfig.cs.meta b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicSegmentConfig.cs.meta new file mode 100644 index 0000000..0d0cea8 --- /dev/null +++ b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicSegmentConfig.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5c388a0ba2794e1ca09ccdde5bd5f99a +timeCreated: 1778049644 \ No newline at end of file diff --git a/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicSystem.cs b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicSystem.cs index 2f94901..d91bc47 100644 --- a/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicSystem.cs +++ b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicSystem.cs @@ -40,7 +40,7 @@ namespace OCES.Audio this.m_stateRouter = new MusicStateRouter(musicPaths, ambiencePaths); this.m_musicChannel = new MusicChannelPlayer( - containers, musicTransitions, longAudioContainerPlayer, this, + containers, segments, musicTransitions, longAudioContainerPlayer, this, id => OnBeat?.Invoke(id), id => OnBar?.Invoke(id), id => OnGrid?.Invoke(id));