using System; using System.IO; using HotUpdate.Gameplay; using Newtonsoft.Json; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; using UnityEngine.SceneManagement; using YooAsset.Editor; public static class BuildMainMenuMusic { public const string PrefabPath = "Assets/Bundles/Sound/Prefab/MainMenuMusic.prefab"; const string ClipPath = "Assets/Bundles/Sound/BGM/MeadowBreeze_MainMenu_Loop.ogg"; public static string Build() { if (EditorApplication.isPlaying) throw new Exception("Build music in Edit Mode"); var clip = AssetDatabase.LoadAssetAtPath(ClipPath); if (clip == null) throw new Exception("Selected BGM missing"); if (!AssetDatabase.IsValidFolder("Assets/Bundles/Sound/Prefab")) AssetDatabase.CreateFolder("Assets/Bundles/Sound", "Prefab"); var original = SceneManager.GetActiveScene(); var temporary = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Additive); try { SceneManager.SetActiveScene(temporary); var root = new GameObject(MainMenuMusic.PrefabName); var source = root.AddComponent(); source.clip = clip; source.playOnAwake = false; source.loop = true; source.spatialBlend = 0; source.volume = 1; var player = root.AddComponent(); var serialized = new SerializedObject(player); serialized.FindProperty("_source").objectReferenceValue = source; serialized.ApplyModifiedPropertiesWithoutUndo(); PrefabUtility.SaveAsPrefabAsset(root, PrefabPath); } finally { SceneManager.SetActiveScene(original); EditorSceneManager.CloseScene(temporary, true); } var package = BundleCollectorSettingData.Setting.Packages.Find(p => p.PackageName == "Art"); var group = package?.Groups.Find(g => g.GroupName == "Sound"); if (group == null) throw new Exception("Existing Art/Sound group missing"); const string folder = "Assets/Bundles/Sound/Prefab"; if (!group.Collectors.Exists(c => c.CollectPath == folder)) BundleCollectorSettingData.CreateCollector(group, new BundleCollector { CollectPath = folder, CollectorGUID = AssetDatabase.AssetPathToGUID(folder), CollectorType = ECollectorType.MainAssetCollector, AddressRuleName = nameof(AddressByFileName), PackRuleName = nameof(PackSeparately), FilterRuleName = nameof(CollectAll), AssetTags = "art" }); package.CheckConfigError(); BundleCollectorSettingData.SaveFile(); var prefab = AssetDatabase.LoadAssetAtPath(PrefabPath); var audio = prefab.GetComponent(); if (prefab.GetComponent()?.Source != audio || audio.clip != clip || !audio.loop || audio.playOnAwake || audio.spatialBlend != 0 || audio.volume != 1) throw new Exception("Music prefab configuration invalid"); string report = JsonConvert.SerializeObject(new { selected = ClipPath, prefab = PrefabPath, address = MainMenuMusic.PrefabName, package = "Art", group = "Sound", loop = audio.loop, volume = audio.volume, seconds = clip.length, clip.channels, clip.frequency, independentMusicToggle = true, runtimePlaybackWired = true, bundleBuilt = false, verifiedUtc = DateTime.UtcNow.ToString("o") }, Formatting.Indented); string repo = Directory.GetParent(Application.dataPath).Parent.FullName; File.WriteAllText(Path.Combine(repo, "Doc/Design/Sound/MainMenuSoft/playback_assets.json"), report); return report; } }