Initial commit: AIGame Unity client with URP, HybridCLR, YooAsset and tooling.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+59
@@ -0,0 +1,59 @@
|
||||
using System.IO;
|
||||
using Unity.Pipeline.Commands;
|
||||
using Unity.Pipeline.Editor;
|
||||
using Unity.Pipeline.Models;
|
||||
using UnityEngine;
|
||||
#if UNITY_6000_5_OR_NEWER
|
||||
using Unity.Scripting.LifecycleManagement;
|
||||
#endif
|
||||
|
||||
namespace Unity.Pipeline.Tests.Editor.ServerLifecyle
|
||||
{
|
||||
/// <summary>
|
||||
/// Isolates server-lifecycle tests from the live editor pipeline server, which shares some global
|
||||
/// state in-process. Call Capture() in [SetUp] and Restore() in [TearDown].
|
||||
///
|
||||
/// It records whether a live server was advertised before the test and restores command discovery
|
||||
/// (RuntimePipelineDriver.Awake switches it to reflection). The main-thread dispatcher is
|
||||
/// per-server now, so there is nothing global to swap.
|
||||
/// </summary>
|
||||
#if UNITY_6000_5_OR_NEWER
|
||||
[NoAutoStaticsCleanup]
|
||||
#endif
|
||||
static class GlobalServerStateGuard
|
||||
{
|
||||
static string s_DescriptorPath;
|
||||
static bool s_HadLiveServer;
|
||||
|
||||
public static void Capture()
|
||||
{
|
||||
var projectPath = Path.GetDirectoryName(Application.dataPath);
|
||||
s_DescriptorPath = InstanceDescriptor.GetDescriptorFilePath(projectPath);
|
||||
// Key off the live server OBJECT, not the descriptor file: a prior test may have left the
|
||||
// live server running while the shared descriptor was already deleted (object/file desync).
|
||||
// Keying off the file would then wrongly skip the restart below.
|
||||
s_HadLiveServer = PipelineServerStartup.Server != null;
|
||||
}
|
||||
|
||||
public static void Restore()
|
||||
{
|
||||
// A server-lifecycle test starts/stops its own EditorPipelineServer on the live port,
|
||||
// which tears down the live listener and deletes the shared `.unity-pipeline-port`
|
||||
// descriptor. Rewriting the descriptor file is NOT enough — it would advertise a port
|
||||
// nothing listens on (the symptom: menu shows "running" but the server is unreachable).
|
||||
// Fully restart the live server so the listener and descriptor are consistent (this also
|
||||
// re-arms the watchdog and auto-tick). Mirrors RuntimePipelineServerTests.TearDown.
|
||||
try
|
||||
{
|
||||
if (s_HadLiveServer)
|
||||
PipelineServerStartup.RestartServer();
|
||||
else if (s_DescriptorPath != null && File.Exists(s_DescriptorPath))
|
||||
File.Delete(s_DescriptorPath); // No live server before the test — clear any stray descriptor.
|
||||
}
|
||||
catch { /* best effort */ }
|
||||
|
||||
// RuntimePipelineDriver.Awake switches discovery to reflection; restore TypeCache.
|
||||
CommandRegistry.SetDiscovery(new TypeCacheCommandDiscovery());
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user