超大量的更新 修复很多问题,gameplay特效初步

This commit is contained in:
2026-02-14 23:46:20 +08:00
parent ef8eb67259
commit 3a7a0b4669
360 changed files with 85670 additions and 4144 deletions
+110
View File
@@ -3,11 +3,14 @@ using UnityEngine.SceneManagement;
public static class BgmRuntimeBootstrap
{
private const string RuntimeAudioListenerName = "__RuntimeAudioListener";
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
private static void Bootstrap()
{
var mgr = BgmPlaybackManager.EnsureInstance();
mgr.EnsurePlaying();
EnsureAudioListener(SceneManager.GetActiveScene());
// Ensure UI binder exists
if (Object.FindAnyObjectByType<BgmUiBinder>() == null)
@@ -24,6 +27,7 @@ public static class BgmRuntimeBootstrap
private static void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
EnsureAudioListener(scene);
RemoveBgmParticlesInLoadedScenes();
}
@@ -48,4 +52,110 @@ public static class BgmRuntimeBootstrap
Object.Destroy(t.gameObject);
}
}
private static void EnsureAudioListener(Scene scene)
{
if (!scene.IsValid() || !scene.isLoaded)
return;
AudioListener[] allListeners = Object.FindObjectsByType<AudioListener>(FindObjectsInactive.Include, FindObjectsSortMode.None);
AudioListener activeEnabledInScene = null;
AudioListener activeInScene = null;
AudioListener anyInScene = null;
for (int i = 0; i < allListeners.Length; i++)
{
AudioListener listener = allListeners[i];
if (listener == null)
continue;
if (!listener.gameObject.scene.IsValid() || listener.gameObject.scene != scene)
continue;
if (anyInScene == null)
anyInScene = listener;
if (listener.gameObject.activeInHierarchy && activeInScene == null)
activeInScene = listener;
if (listener.gameObject.activeInHierarchy && listener.enabled)
{
activeEnabledInScene = listener;
break;
}
}
if (activeEnabledInScene != null)
return;
if (activeInScene != null)
{
activeInScene.enabled = true;
return;
}
if (anyInScene != null)
{
anyInScene.enabled = true;
return;
}
Camera cameraInScene = FindBestCameraInScene(scene);
if (cameraInScene != null)
{
AudioListener cameraListener = cameraInScene.GetComponent<AudioListener>();
if (cameraListener == null)
cameraListener = cameraInScene.gameObject.AddComponent<AudioListener>();
cameraListener.enabled = true;
return;
}
GameObject listenerRoot = FindNamedObjectInScene(scene, RuntimeAudioListenerName);
if (listenerRoot == null)
{
listenerRoot = new GameObject(RuntimeAudioListenerName);
try { SceneManager.MoveGameObjectToScene(listenerRoot, scene); } catch { }
}
if (listenerRoot.GetComponent<AudioListener>() == null)
listenerRoot.AddComponent<AudioListener>();
}
private static Camera FindBestCameraInScene(Scene scene)
{
Camera[] cameras = Object.FindObjectsByType<Camera>(FindObjectsInactive.Include, FindObjectsSortMode.None);
Camera first = null;
for (int i = 0; i < cameras.Length; i++)
{
Camera cam = cameras[i];
if (cam == null || cam.gameObject.scene != scene)
continue;
if (first == null)
first = cam;
if (cam.gameObject.activeInHierarchy && cam.enabled && cam.CompareTag("MainCamera"))
return cam;
}
if (first != null)
return first;
return null;
}
private static GameObject FindNamedObjectInScene(Scene scene, string objectName)
{
if (string.IsNullOrEmpty(objectName))
return null;
Transform[] all = Object.FindObjectsByType<Transform>(FindObjectsInactive.Include, FindObjectsSortMode.None);
for (int i = 0; i < all.Length; i++)
{
Transform t = all[i];
if (t == null || t.gameObject.scene != scene)
continue;
if (string.Equals(t.name, objectName, System.StringComparison.OrdinalIgnoreCase))
return t.gameObject;
}
return null;
}
}