Initial commit: AIGame Unity client with URP, HybridCLR, YooAsset and tooling.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
udx
2026-09-21 14:21:07 +08:00
co-authored by Cursor
commit f3f66ab063
931 changed files with 112366 additions and 0 deletions
+22
View File
@@ -0,0 +1,22 @@
#if UNITY_EDITOR
using HybridCLR.Editor.Installer;
public static class SetupHybridClr
{
public static string Install()
{
var c = new InstallerController();
if (c.HasInstalledHybridCLR())
return $"already_installed pkg={c.PackageVersion} local={c.InstalledLibil2cppVersion}";
c.InstallDefaultHybridCLR();
return $"installed pkg={c.PackageVersion} has={c.HasInstalledHybridCLR()} local={c.InstalledLibil2cppVersion}";
}
public static string Status()
{
var c = new InstallerController();
return $"has={c.HasInstalledHybridCLR()} pkg={c.PackageVersion} local={c.InstalledLibil2cppVersion}";
}
}
#endif
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b09764b3bf807f248b2a73e9dc8f04da
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+72
View File
@@ -0,0 +1,72 @@
#if UNITY_EDITOR
using System.Text;
using UnityEditor;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
public static class SetupUrp
{
// Map Quality level name -> URP asset under Assets/Settings/URP
static readonly (string qualityName, string assetPath)[] QualityPipelineMap =
{
("Very Low", "Assets/Settings/URP/UniversalRP-0VeryLowQuality.asset"),
("Low", "Assets/Settings/URP/UniversalRP-1LowQuality.asset"),
("Medium", "Assets/Settings/URP/UniversalRP-2MediumQuality.asset"),
("High", "Assets/Settings/URP/UniversalRP-3HighQuality.asset"),
("Very High", "Assets/Settings/URP/UniversalRP-4VeryHighQuality.asset"),
("Ultra", "Assets/Settings/URP/UniversalRP-4VeryHighQuality.asset"),
};
const string FallbackPipeline = "Assets/Settings/URP/UniversalRP-3HighQuality.asset";
/// <summary>
/// Assign a URP asset to every Quality level and set Graphics default pipeline.
/// Fixes: "platforms have assets in its associated Quality levels that belong to different render pipelines"
/// </summary>
public static string FixQualityPipelines()
{
var log = new StringBuilder();
var names = QualitySettings.names;
UniversalRenderPipelineAsset fallback = AssetDatabase.LoadAssetAtPath<UniversalRenderPipelineAsset>(FallbackPipeline);
if (fallback == null)
return "ERROR: missing fallback URP asset at " + FallbackPipeline;
for (int i = 0; i < names.Length; i++)
{
var path = ResolvePipelinePath(names[i]);
var asset = AssetDatabase.LoadAssetAtPath<UniversalRenderPipelineAsset>(path) ?? fallback;
QualitySettings.SetQualityLevel(i, applyExpensiveChanges: false);
QualitySettings.renderPipeline = asset;
log.AppendLine($"{i}:{names[i]} -> {AssetDatabase.GetAssetPath(asset)}");
}
// Prefer High-tier as project default (Graphics Settings)
GraphicsSettings.renderPipelineAsset =
AssetDatabase.LoadAssetAtPath<UniversalRenderPipelineAsset>(FallbackPipeline) ?? fallback;
// Restore previous current quality if possible, else Ultra/last
int restore = System.Array.IndexOf(names, "Ultra");
if (restore < 0) restore = names.Length - 1;
QualitySettings.SetQualityLevel(restore, applyExpensiveChanges: true);
AssetDatabase.SaveAssets();
EditorUtility.SetDirty(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/QualitySettings.asset")[0]);
log.AppendLine("Graphics default -> " + AssetDatabase.GetAssetPath(GraphicsSettings.renderPipelineAsset));
log.AppendLine("Current quality -> " + QualitySettings.names[QualitySettings.GetQualityLevel()]);
return log.ToString();
}
static string ResolvePipelinePath(string qualityName)
{
foreach (var entry in QualityPipelineMap)
{
if (entry.qualityName == qualityName)
return entry.assetPath;
}
return FallbackPipeline;
}
public static string Execute() => FixQualityPipelines();
}
#endif
+11
View File
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 9e35ed0006e33004a987f71bac5117bf
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: