Add prototype gameplay loop with character/battlefield assets and server game APIs.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
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<AudioClip>(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<AudioSource>();
|
||||
source.clip = clip;
|
||||
source.playOnAwake = false;
|
||||
source.loop = true;
|
||||
source.spatialBlend = 0;
|
||||
source.volume = 1;
|
||||
var player = root.AddComponent<MainMenuMusic>();
|
||||
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<GameObject>(PrefabPath);
|
||||
var audio = prefab.GetComponent<AudioSource>();
|
||||
if (prefab.GetComponent<MainMenuMusic>()?.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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user