Files
rudder-unity-sdk/Assets/LiveOpsExamples/Editor/CozyCollectorBake.Ui.cs
T
2026-08-12 14:03:44 +03:00

145 lines
5.7 KiB
C#

using System;
using System.Reflection;
using LiveOpsExamples;
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
using Object = UnityEngine.Object;
namespace LiveOpsExamples.Editor
{
/// <summary>
/// Builds the Cozy Collector UI: a GameObject with a PanelRenderer (PanelSettings +
/// CozyCollectorUI.uxml) and all panel components wired through serialized
/// references. The PanelSettings asset is created programmatically when missing.
/// Called from <see cref="CozyCollectorBake.BakeScene"/>.
/// </summary>
public static partial class CozyCollectorBake
{
private const string UiFolderPath = "Assets/LiveOpsExamples/UI";
private const string UiPanelSettingsPath = UiFolderPath + "/CozyCollectorPanelSettings.asset";
private const string UiDocumentAssetPath = UiFolderPath + "/CozyCollectorUI.uxml";
private const string UiLogRowTemplatePath = UiFolderPath + "/LogRow.uxml";
private const string UiToastTemplatePath = UiFolderPath + "/ToastRow.uxml";
private const string UiShopOfferRowTemplatePath = UiFolderPath + "/ShopOfferRow.uxml";
private const string UiBackpackItemRowTemplatePath = UiFolderPath + "/BackpackItemRow.uxml";
private const string UiLeaderboardRowTemplatePath = UiFolderPath + "/LeaderboardRow.uxml";
private static void BuildUi(CozyCollectorController controller, GameWorld world)
{
var panelSettings = GetOrCreatePanelSettings();
var visualTree = LoadUiAsset<VisualTreeAsset>(UiDocumentAssetPath);
var uiGo = new GameObject("UI");
var panelRenderer = uiGo.AddComponent<PanelRenderer>();
panelRenderer.panelSettings = panelSettings;
if (visualTree != null)
{
panelRenderer.visualTreeAsset = visualTree;
}
WirePanel(uiGo.AddComponent<SessionCardPanel>(), panelRenderer, controller);
WirePanel(uiGo.AddComponent<RemoteConfigPanel>(), panelRenderer, controller);
var eventInspector = uiGo.AddComponent<EventInspectorPanel>();
WirePanel(eventInspector, panelRenderer, controller);
WireTemplate(eventInspector, "logRowTemplate", UiLogRowTemplatePath);
var hud = uiGo.AddComponent<HudPanel>();
WirePanel(hud, panelRenderer, controller);
SetSceneReference(hud, "world", world);
var toasts = uiGo.AddComponent<ToastsPanel>();
WirePanel(toasts, panelRenderer, controller);
WireTemplate(toasts, "toastTemplate", UiToastTemplatePath);
WirePanel(uiGo.AddComponent<BootOverlayPanel>(), panelRenderer, controller);
WirePanel(uiGo.AddComponent<SetupOverlayPanel>(), panelRenderer, controller);
var shop = uiGo.AddComponent<ShopModalPanel>();
WirePanel(shop, panelRenderer, controller);
WireTemplate(shop, "shopOfferRowTemplate", UiShopOfferRowTemplatePath);
var backpack = uiGo.AddComponent<BackpackModalPanel>();
WirePanel(backpack, panelRenderer, controller);
WireTemplate(backpack, "backpackItemRowTemplate", UiBackpackItemRowTemplatePath);
var spriteLibrary = AssetDatabase.LoadAssetAtPath<CozyCollectorSpriteLibrary>(SpriteLibraryPath);
if (spriteLibrary == null)
{
Debug.LogError($"[CozyCollectorBake] Sprite library not found at {SpriteLibraryPath}. " +
"Run Tools/LiveOps/Bake Cozy Collector (All) first.");
}
else
{
SetSceneReference(backpack, "spriteLibrary", spriteLibrary);
}
WirePanel(uiGo.AddComponent<OfferModalPanel>(), panelRenderer, controller);
var roundResult = uiGo.AddComponent<RoundResultModalPanel>();
WirePanel(roundResult, panelRenderer, controller);
WireTemplate(roundResult, "leaderboardRowTemplate", UiLeaderboardRowTemplatePath);
}
private static void WirePanel(MonoBehaviour panel, PanelRenderer panelRenderer, CozyCollectorController controller)
{
SetSceneReference(panel, "panelRenderer", panelRenderer);
SetSceneReference(panel, "controller", controller);
}
private static void WireTemplate(MonoBehaviour panel, string fieldName, string templatePath)
{
var template = LoadUiAsset<VisualTreeAsset>(templatePath);
if (template != null)
{
SetSceneReference(panel, fieldName, template);
}
}
private static T LoadUiAsset<T>(string path) where T : Object
{
var asset = AssetDatabase.LoadAssetAtPath<T>(path);
if (asset == null)
{
Debug.LogError($"[CozyCollectorBake] {typeof(T).Name} not found at {path}. " +
"The scene is saved with an empty reference.");
}
return asset;
}
private static PanelSettings GetOrCreatePanelSettings()
{
var settings = AssetDatabase.LoadAssetAtPath<PanelSettings>(UiPanelSettingsPath);
if (settings != null)
{
return settings;
}
EnsureAssetFolder(UiFolderPath);
settings = ScriptableObject.CreateInstance<PanelSettings>();
settings.scaleMode = PanelScaleMode.ScaleWithScreenSize;
settings.referenceResolution = new Vector2Int(1600, 900);
settings.screenMatchMode = PanelScreenMatchMode.MatchWidthOrHeight;
settings.match = 0.5f;
var defaultTheme = LoadDefaultRuntimeTheme();
if (defaultTheme != null)
{
settings.themeStyleSheet = defaultTheme;
}
AssetDatabase.CreateAsset(settings, UiPanelSettingsPath);
return settings;
}
private static ThemeStyleSheet LoadDefaultRuntimeTheme()
{
var themeUtility = Type.GetType("UnityEditor.UIElements.ThemeUtility, UnityEditor.UIElementsModule");
var property = themeUtility?.GetProperty("builtInDefaultRuntimeTheme", BindingFlags.Static | BindingFlags.NonPublic);
return property?.GetValue(null) as ThemeStyleSheet;
}
}
}