Replace CozyCollector examples with imported Rudder SDK samples; rebuild Rudder.Core.dll with effects reconcile
CI / check (push) Successful in 3s
CI / publish (push) Has been skipped

This commit is contained in:
edmand46
2026-09-06 09:53:46 +03:00
parent 16e6328aa1
commit 01e27bde2c
105 changed files with 5 additions and 11589 deletions
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 7a3b8c1d9e2f4a5b6c7d8e9f0a1b2c3d
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,20 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 8cd851b86da394b9ca06595f889a49b3, type: 3}
m_Name: CozyCollectorSpriteLibrary
m_EditorClassIdentifier: Assembly-CSharp::LiveOpsExamples.CozyCollectorSpriteLibrary
background: {fileID: 21300000, guid: e8139865590c408789e137275b78e239, type: 3}
player: {fileID: 21300000, guid: 695606af95a0452790cf9228c0cc9f76, type: 3}
moonberry: {fileID: 21300000, guid: 8b3f9a4a409e412780aa51d52bfdb7b0, type: 3}
acorn: {fileID: 21300000, guid: ca0ac79e8cb24691b33208b45e68fe13, type: 3}
star: {fileID: 21300000, guid: b0d70332788c4ff7831161da4a2e71ff, type: 3}
snack: {fileID: 21300000, guid: c41fcc3b35c944ffa18a34b6c4dc2cd6, type: 3}
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 06fcf2ebf537145de9bab548922829e1
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,60 +0,0 @@
using LiveOpsExamples;
using UnityEditor;
using UnityEngine;
namespace LiveOpsExamples.Editor
{
/// <summary>
/// Bakes the Cozy Collector ScriptableObject assets. Idempotent: writes to
/// fixed asset paths and overwrites whatever is already there.
/// </summary>
public static partial class CozyCollectorBake
{
private const string SpriteLibraryAssetPath = "Assets/LiveOpsExamples/CozyCollectorSpriteLibrary.asset";
private const string SpriteFolderPath = "Assets/LiveOpsExamples/Sprites";
[MenuItem("Tools/LiveOps/Bake Cozy Collector Assets")]
public static void BakeAssets()
{
var library = AssetDatabase.LoadAssetAtPath<CozyCollectorSpriteLibrary>(SpriteLibraryAssetPath);
if (library == null)
{
library = ScriptableObject.CreateInstance<CozyCollectorSpriteLibrary>();
AssetDatabase.CreateAsset(library, SpriteLibraryAssetPath);
}
var serialized = new SerializedObject(library);
AssignLibrarySprite(serialized, "background", "cozy-camp-bg.png");
AssignLibrarySprite(serialized, "player", "player.png");
AssignLibrarySprite(serialized, "moonberry", "moonberry.png");
AssignLibrarySprite(serialized, "acorn", "acorn.png");
AssignLibrarySprite(serialized, "star", "star.png");
AssignLibrarySprite(serialized, "snack", "snack.png");
serialized.ApplyModifiedPropertiesWithoutUndo();
EditorUtility.SetDirty(library);
AssetDatabase.SaveAssets();
Debug.Log($"Cozy Collector sprite library baked: {SpriteLibraryAssetPath}");
}
private static void AssignLibrarySprite(SerializedObject serialized, string fieldName, string fileName)
{
var spritePath = $"{SpriteFolderPath}/{fileName}";
var sprite = AssetDatabase.LoadAssetAtPath<Sprite>(spritePath);
if (sprite == null)
{
Debug.LogError($"CozyCollectorBake: sprite not found at {spritePath}");
return;
}
var property = serialized.FindProperty(fieldName);
if (property == null)
{
Debug.LogError($"CozyCollectorBake: field '{fieldName}' not found on {nameof(CozyCollectorSpriteLibrary)}");
return;
}
property.objectReferenceValue = sprite;
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 640a29c33f5384caebacc7de21235ab8
@@ -1,166 +0,0 @@
using System.IO;
using LiveOpsExamples;
using TMPro;
using UnityEditor;
using UnityEngine;
namespace LiveOpsExamples.Editor
{
/// <summary>
/// Bakes the Cozy Collector gameplay prefabs. Idempotent: every prefab is
/// rebuilt from code and saved over the same fixed asset path.
/// </summary>
public static partial class CozyCollectorBake
{
private const string PrefabFolderPath = "Assets/LiveOpsExamples/Prefabs";
private const string SnackSpritePath = "Assets/LiveOpsExamples/Sprites/snack.png";
private static readonly Color AccentColor = ParseHexColor("#FFD27D");
[MenuItem("Tools/LiveOps/Bake Cozy Collector Prefabs")]
public static void BakePrefabs()
{
EnsureAssetFolder(PrefabFolderPath);
SaveBakedPrefab(BuildSnackPrefab(), $"{PrefabFolderPath}/Snack.prefab");
SaveBakedPrefab(BuildScorePopupPrefab(), $"{PrefabFolderPath}/ScorePopup.prefab");
SaveBakedPrefab(BuildCollectBurstPrefab(), $"{PrefabFolderPath}/CollectBurst.prefab");
AssetDatabase.SaveAssets();
Debug.Log($"Cozy Collector prefabs baked under {PrefabFolderPath}");
}
private static GameObject BuildSnackPrefab()
{
var go = new GameObject("Snack");
var collider = go.AddComponent<CircleCollider2D>();
collider.isTrigger = true;
collider.radius = 0.3f;
var renderer = go.AddComponent<SpriteRenderer>();
var sprite = AssetDatabase.LoadAssetAtPath<Sprite>(SnackSpritePath);
if (sprite == null)
{
Debug.LogError($"CozyCollectorBake: sprite not found at {SnackSpritePath}");
}
else
{
renderer.sprite = sprite;
// Phaser setDisplaySize(52, 52) at 100 PPU -> 0.52 x 0.52 world units.
var scale = new Vector3(
0.52f / sprite.bounds.size.x,
0.52f / sprite.bounds.size.y,
1f);
go.transform.localScale = scale;
// Phaser pickup radius = 0.42 * 52px ~= 0.22 world units; a circle
// collider's world radius scales by the largest transform axis.
collider.radius = 0.22f / Mathf.Max(scale.x, scale.y);
}
go.AddComponent<Snack>();
return go;
}
private static GameObject BuildScorePopupPrefab()
{
var go = new GameObject("ScorePopup");
var label = go.AddComponent<TextMeshPro>();
AssignDefaultFont(label);
label.text = "+10";
label.fontSize = 2.5f;
label.alignment = TextAlignmentOptions.Center;
label.color = Color.white;
var view = go.AddComponent<ScorePopupView>();
WireObjectFields(view, ("label", label));
return go;
}
private static GameObject BuildCollectBurstPrefab()
{
var go = new GameObject("CollectBurst");
var particles = go.AddComponent<ParticleSystem>();
var main = particles.main;
main.duration = 0.5f;
main.loop = false;
main.playOnAwake = true;
main.startLifetime = 0.45f;
main.startSpeed = 2f;
main.startSize = 0.15f;
main.gravityModifier = 0f;
main.startColor = AccentColor;
main.stopAction = ParticleSystemStopAction.Destroy;
var emission = particles.emission;
emission.rateOverTime = 0f;
emission.SetBursts(new[] { new ParticleSystem.Burst(0f, 9) });
var shape = particles.shape;
shape.shapeType = ParticleSystemShapeType.Sphere;
shape.radius = 0.1f;
var renderer = particles.GetComponent<ParticleSystemRenderer>();
renderer.renderMode = ParticleSystemRenderMode.Billboard;
var material = AssetDatabase.GetBuiltinExtraResource<Material>("Default-Particle.mat");
if (material == null)
material = AssetDatabase.GetBuiltinExtraResource<Material>("Sprites-Default.mat");
if (material == null)
Debug.LogWarning("CozyCollectorBake: no builtin particle material resolved, assign one manually.");
else
renderer.sharedMaterial = material;
return go;
}
private static Color ParseHexColor(string hex)
{
return ColorUtility.TryParseHtmlString(hex, out var color) ? color : Color.magenta;
}
private static void EnsureAssetFolder(string folderPath)
{
if (AssetDatabase.IsValidFolder(folderPath))
return;
var parent = Path.GetDirectoryName(folderPath)?.Replace('\\', '/');
if (!string.IsNullOrEmpty(parent))
EnsureAssetFolder(parent);
AssetDatabase.CreateFolder(parent, Path.GetFileName(folderPath));
}
private static void SaveBakedPrefab(GameObject go, string path)
{
PrefabUtility.SaveAsPrefabAsset(go, path);
Object.DestroyImmediate(go);
}
private static void WireObjectFields(Object component, params (string Field, Object Value)[] fields)
{
var serialized = new SerializedObject(component);
foreach (var (field, value) in fields)
{
var property = serialized.FindProperty(field);
if (property == null)
{
Debug.LogError($"CozyCollectorBake: field '{field}' not found on {component.GetType().Name}");
continue;
}
property.objectReferenceValue = value;
}
serialized.ApplyModifiedPropertiesWithoutUndo();
}
private static void AssignDefaultFont(TMP_Text text)
{
if (TMP_Settings.defaultFontAsset != null)
text.font = TMP_Settings.defaultFontAsset;
else
Debug.LogWarning("CozyCollectorBake: TMP default font asset is not set, assign a font manually.");
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 5d0f038b4a90c45a8a95bf4f37221e78
@@ -1,258 +0,0 @@
using System.Collections.Generic;
using RudderSdk.Unity;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
namespace LiveOpsExamples.Editor
{
/// <summary>
/// Bakes the Cozy Collector demo scene (world + camera + game setup) and saves it
/// to <see cref="ScenePath"/>. UI is built by the CozyCollectorBake.Ui part.
/// Re-running overwrites the same scene asset.
/// </summary>
public static partial class CozyCollectorBake
{
private const string ScenePath = "Assets/LiveOpsExamples/LiveOpsCozyCollector.unity";
private const string BackgroundSpritePath = "Assets/LiveOpsExamples/Sprites/cozy-camp-bg.png";
private const string PlayerSpritePath = "Assets/LiveOpsExamples/Sprites/player.png";
private const string ConfigurationPath = "Assets/LiveOpsLocal.asset";
private const string SpriteLibraryPath = "Assets/LiveOpsExamples/CozyCollectorSpriteLibrary.asset";
private const string SnackPrefabPath = "Assets/LiveOpsExamples/Prefabs/Snack.prefab";
private const string ScorePopupPrefabPath = "Assets/LiveOpsExamples/Prefabs/ScorePopup.prefab";
private const string CollectBurstPrefabPath = "Assets/LiveOpsExamples/Prefabs/CollectBurst.prefab";
// The Phaser field is 1280x720 px at 100 PPU -> 12.8x7.2 world units.
private const float FieldWidthUnits = 12.8f;
private const float FieldHeightUnits = 7.2f;
private static readonly Color CameraBackgroundColor = new Color(0.10f, 0.08f, 0.13f);
[MenuItem("Tools/LiveOps/Bake Cozy Collector (All)")]
public static void BakeAll()
{
BakeAssets();
BakePrefabs();
BakeScene();
AssetDatabase.SaveAssets();
}
[MenuItem("Tools/LiveOps/Bake Cozy Collector Scene")]
public static void BakeScene()
{
var scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single);
BuildSceneCamera();
BuildSceneBackground();
var world = BuildSceneWorld(out var playerRenderer, out var spawner, out var snacksParent);
var controller = BuildSceneGameSetup(world);
WireSceneWorld(world, playerRenderer, spawner, controller);
WireSceneSpawner(spawner, snacksParent);
BuildUi(controller, world);
EditorSceneManager.SaveScene(scene, ScenePath);
AddSceneToBuildSettings();
AssetDatabase.SaveAssets();
Debug.Log($"[CozyCollectorBake] Scene saved to {ScenePath}.");
}
private static void BuildSceneCamera()
{
var cameraGo = new GameObject("Main Camera");
cameraGo.tag = "MainCamera";
cameraGo.transform.position = new Vector3(0f, 0f, -10f);
var camera = cameraGo.AddComponent<Camera>();
camera.orthographic = true;
camera.orthographicSize = FieldHeightUnits / 2f;
camera.clearFlags = CameraClearFlags.SolidColor;
camera.backgroundColor = CameraBackgroundColor;
// Game field occupies the left 75% of the screen; the right side hosts the UI rail.
camera.rect = new Rect(0f, 0f, 0.75f, 1f);
}
private static void BuildSceneBackground()
{
var backgroundGo = new GameObject("Background");
var renderer = backgroundGo.AddComponent<SpriteRenderer>();
renderer.sortingOrder = -10;
var sprite = AssetDatabase.LoadAssetAtPath<Sprite>(BackgroundSpritePath);
if (sprite == null)
{
Debug.LogError($"[CozyCollectorBake] Background sprite not found at {BackgroundSpritePath}.");
return;
}
renderer.sprite = sprite;
var size = sprite.bounds.size;
backgroundGo.transform.localScale = new Vector3(
size.x > 0f ? FieldWidthUnits / size.x : 1f,
size.y > 0f ? FieldHeightUnits / size.y : 1f,
1f);
}
private static GameWorld BuildSceneWorld(
out SpriteRenderer playerRenderer,
out SnackSpawner spawner,
out Transform snacksParent)
{
var worldGo = new GameObject("World");
var world = worldGo.AddComponent<GameWorld>();
var playerGo = new GameObject("Player");
playerGo.transform.SetParent(worldGo.transform, false);
playerRenderer = playerGo.AddComponent<SpriteRenderer>();
playerRenderer.sprite = AssetDatabase.LoadAssetAtPath<Sprite>(PlayerSpritePath);
var colliderRadius = 0.3f;
if (playerRenderer.sprite == null)
{
Debug.LogError($"[CozyCollectorBake] Player sprite not found at {PlayerSpritePath}.");
}
else
{
// Phaser setDisplaySize(82, 108) at 100 PPU -> 0.82 x 1.08 world units.
var bounds = playerRenderer.sprite.bounds.size;
var scale = new Vector3(0.82f / bounds.x, 1.08f / bounds.y, 1f);
playerGo.transform.localScale = scale;
// Phaser body is ~0.45x0.55 world units; a circle collider's world
// radius scales by the largest transform axis.
colliderRadius = 0.24f / Mathf.Max(scale.x, scale.y);
}
var body = playerGo.AddComponent<Rigidbody2D>();
body.bodyType = RigidbodyType2D.Kinematic;
body.simulated = true;
body.gravityScale = 0f;
// Non-trigger collider so the snacks' trigger colliders fire OnTriggerEnter2D.
var collider = playerGo.AddComponent<CircleCollider2D>();
collider.radius = colliderRadius;
collider.isTrigger = false;
var snacksGo = new GameObject("Snacks");
snacksGo.transform.SetParent(worldGo.transform, false);
snacksParent = snacksGo.transform;
var spawnerGo = new GameObject("Spawner");
spawnerGo.transform.SetParent(worldGo.transform, false);
spawner = spawnerGo.AddComponent<SnackSpawner>();
return world;
}
private static CozyCollectorController BuildSceneGameSetup(GameWorld world)
{
var setupGo = new GameObject("GameSetup");
var rudder = setupGo.AddComponent<Rudder>();
var configuration = AssetDatabase.LoadAssetAtPath<RudderConfiguration>(ConfigurationPath);
if (configuration == null)
{
Debug.LogError($"[CozyCollectorBake] RudderConfiguration not found at {ConfigurationPath}.");
}
else
{
SetSceneReference(rudder, "_configuration", configuration);
}
var controller = setupGo.AddComponent<CozyCollectorController>();
SetSceneReference(controller, "world", world);
return controller;
}
private static void WireSceneWorld(
GameWorld world,
SpriteRenderer playerRenderer,
SnackSpawner spawner,
CozyCollectorController controller)
{
SetSceneReference(world, "player", playerRenderer);
SetSceneReference(world, "spawner", spawner);
SetSceneReference(world, "controller", controller);
// moveMin/moveMax keep the component defaults (-6,-3.2)/(6,3.2).
var scorePopupPrefab = LoadScenePrefabComponent<ScorePopupView>(ScorePopupPrefabPath);
if (scorePopupPrefab != null)
{
SetSceneReference(world, "scorePopupPrefab", scorePopupPrefab);
}
var collectBurstPrefab = LoadScenePrefabComponent<ParticleSystem>(CollectBurstPrefabPath);
if (collectBurstPrefab != null)
{
SetSceneReference(world, "collectBurstPrefab", collectBurstPrefab);
}
}
private static void WireSceneSpawner(SnackSpawner spawner, Transform snacksParent)
{
var snackPrefab = LoadScenePrefabComponent<Snack>(SnackPrefabPath);
if (snackPrefab != null)
{
SetSceneReference(spawner, "prefab", snackPrefab);
}
var library = AssetDatabase.LoadAssetAtPath<CozyCollectorSpriteLibrary>(SpriteLibraryPath);
if (library == null)
{
Debug.LogError($"[CozyCollectorBake] Sprite library not found at {SpriteLibraryPath}. " +
"Run Tools/LiveOps/Bake Cozy Collector (All) first.");
}
else
{
SetSceneReference(spawner, "library", library);
}
SetSceneReference(spawner, "parent", snacksParent);
// spawnMin/spawnMax keep the component defaults.
}
private static void AddSceneToBuildSettings()
{
var scenes = new List<EditorBuildSettingsScene>(EditorBuildSettings.scenes);
foreach (var entry in scenes)
{
if (entry.path == ScenePath)
{
return;
}
}
scenes.Add(new EditorBuildSettingsScene(ScenePath, true));
EditorBuildSettings.scenes = scenes.ToArray();
}
private static T LoadScenePrefabComponent<T>(string path) where T : Component
{
var prefab = AssetDatabase.LoadAssetAtPath<GameObject>(path);
var component = prefab != null ? prefab.GetComponent<T>() : null;
if (component == null)
{
Debug.LogError($"[CozyCollectorBake] Prefab with {typeof(T).Name} not found at {path}. " +
"Run Tools/LiveOps/Bake Cozy Collector (All) first; the scene is saved with empty references.");
}
return component;
}
private static void SetSceneReference(Object target, string propertyName, Object value)
{
var serialized = new SerializedObject(target);
var property = serialized.FindProperty(propertyName);
if (property == null)
{
Debug.LogError($"[CozyCollectorBake] Property '{propertyName}' not found on {target.GetType().Name}.");
return;
}
property.objectReferenceValue = value;
serialized.ApplyModifiedPropertiesWithoutUndo();
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 9b06747933b8c458b8262e8516634b14
@@ -1,144 +0,0 @@
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;
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 4ffeef7dc98af46a8b8bf186f4e2073b
@@ -1,950 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!29 &1
OcclusionCullingSettings:
m_ObjectHideFlags: 0
serializedVersion: 2
m_OcclusionBakeSettings:
smallestOccluder: 5
smallestHole: 0.25
backfaceThreshold: 100
m_SceneGUID: 00000000000000000000000000000000
m_OcclusionCullingData: {fileID: 0}
--- !u!104 &2
RenderSettings:
m_ObjectHideFlags: 0
serializedVersion: 10
m_Fog: 0
m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
m_FogMode: 3
m_FogDensity: 0.01
m_LinearFogStart: 0
m_LinearFogEnd: 300
m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
m_AmbientIntensity: 1
m_AmbientMode: 0
m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
m_HaloStrength: 0.5
m_FlareStrength: 1
m_FlareFadeSpeed: 3
m_HaloTexture: {fileID: 0}
m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
m_DefaultReflectionMode: 0
m_DefaultReflectionResolution: 128
m_ReflectionBounces: 1
m_ReflectionIntensity: 1
m_CustomReflection: {fileID: 0}
m_Sun: {fileID: 0}
m_UseRadianceAmbientProbe: 0
--- !u!157 &3
LightmapSettings:
m_ObjectHideFlags: 0
serializedVersion: 13
m_BakeOnSceneLoad: 0
m_GISettings:
serializedVersion: 2
m_BounceScale: 1
m_IndirectOutputScale: 1
m_AlbedoBoost: 1
m_EnvironmentLightingMode: 0
m_EnableBakedLightmaps: 1
m_EnableRealtimeLightmaps: 0
m_LightmapEditorSettings:
serializedVersion: 12
m_Resolution: 2
m_BakeResolution: 40
m_AtlasSize: 1024
m_AO: 0
m_AOMaxDistance: 1
m_CompAOExponent: 1
m_CompAOExponentDirect: 0
m_ExtractAmbientOcclusion: 0
m_Padding: 2
m_LightmapParameters: {fileID: 0}
m_LightmapsBakeMode: 1
m_TextureCompression: 1
m_ReflectionCompression: 2
m_MixedBakeMode: 2
m_BakeBackend: 2
m_PVRSampling: 1
m_PVRDirectSampleCount: 32
m_PVRSampleCount: 512
m_PVRBounces: 2
m_PVREnvironmentSampleCount: 256
m_PVREnvironmentReferencePointCount: 2048
m_PVRFilteringMode: 1
m_PVRDenoiserTypeDirect: 1
m_PVRDenoiserTypeIndirect: 1
m_PVRDenoiserTypeAO: 1
m_PVRFilterTypeDirect: 0
m_PVRFilterTypeIndirect: 0
m_PVRFilterTypeAO: 0
m_PVREnvironmentMIS: 1
m_PVRCulling: 1
m_PVRFilteringGaussRadiusDirect: 1
m_PVRFilteringGaussRadiusIndirect: 1
m_PVRFilteringGaussRadiusAO: 1
m_PVRFilteringAtrousPositionSigmaDirect: 0.5
m_PVRFilteringAtrousPositionSigmaIndirect: 2
m_PVRFilteringAtrousPositionSigmaAO: 1
m_ExportTrainingData: 0
m_TrainingDataDestination: TrainingData
m_LightProbeSampleCountMultiplier: 4
m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0}
m_LightingSettings: {fileID: 0}
--- !u!196 &4
NavMeshSettings:
serializedVersion: 2
m_ObjectHideFlags: 0
m_BuildSettings:
serializedVersion: 3
agentTypeID: 0
agentRadius: 0.5
agentHeight: 2
agentSlope: 45
agentClimb: 0.4
ledgeDropHeight: 0
maxJumpAcrossDistance: 0
minRegionArea: 2
manualCellSize: 0
cellSize: 0.16666667
manualTileSize: 0
tileSize: 256
buildHeightMesh: 0
maxJobWorkers: 0
preserveTilesOutsideBounds: 0
debug:
m_Flags: 0
m_NavMeshData: {fileID: 0}
--- !u!1 &329179444
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 329179445}
m_Layer: 0
m_Name: Snacks
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &329179445
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 329179444}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 616881063}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &616881061
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 616881063}
- component: {fileID: 616881062}
m_Layer: 0
m_Name: World
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &616881062
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 616881061}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 952f52af0af8546eeab332b11e2e4bb7, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::LiveOpsExamples.GameWorld
player: {fileID: 1781499121}
spawner: {fileID: 1544944037}
controller: {fileID: 853162496}
scorePopupPrefab: {fileID: 2163815420330336319, guid: 77687e92645dc450d8f79fbb91face30,
type: 3}
collectBurstPrefab: {fileID: 4700352299658891627, guid: 9f08d0082395f4a36b1a41e5e929c33f,
type: 3}
moveMin: {x: -6, y: -3.2}
moveMax: {x: 6, y: 3.2}
--- !u!4 &616881063
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 616881061}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1781499118}
- {fileID: 329179445}
- {fileID: 1544944038}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &853162495
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 853162498}
- component: {fileID: 853162497}
- component: {fileID: 853162496}
m_Layer: 0
m_Name: GameSetup
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &853162496
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 853162495}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 05ab47060c2ef4476800002c4a956b85, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::LiveOpsExamples.CozyCollectorController
world: {fileID: 616881062}
--- !u!114 &853162497
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 853162495}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: efb778515f4ca44289f365faa2acecd7, type: 3}
m_Name:
m_EditorClassIdentifier: Rudder.Unity::RudderSdk.Unity.Rudder
_configuration: {fileID: 11400000, guid: 98d531126f0d748ceacfb85bdd959e81, type: 2}
--- !u!4 &853162498
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 853162495}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &865861683
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 865861685}
- component: {fileID: 865861684}
m_Layer: 0
m_Name: Main Camera
m_TagString: MainCamera
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!20 &865861684
Camera:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 865861683}
m_Enabled: 1
serializedVersion: 2
m_ClearFlags: 2
m_BackGroundColor: {r: 0.1, g: 0.08, b: 0.13, a: 1}
m_projectionMatrixMode: 1
m_GateFitMode: 2
m_FOVAxisMode: 0
m_Iso: 200
m_ShutterSpeed: 0.005
m_Aperture: 16
m_FocusDistance: 10
m_FocalLength: 50
m_BladeCount: 5
m_Curvature: {x: 2, y: 11}
m_BarrelClipping: 0.25
m_Anamorphism: 0
m_SensorSize: {x: 36, y: 24}
m_LensShift: {x: 0, y: 0}
m_NormalizedViewPortRect:
serializedVersion: 2
x: 0
y: 0
width: 0.75
height: 1
near clip plane: 0.3
far clip plane: 1000
field of view: 60
orthographic: 1
orthographic size: 3.6
m_Depth: 0
m_CullingMask:
serializedVersion: 2
m_Bits: 4294967295
m_RenderingPath: -1
m_TargetTexture: {fileID: 0}
m_TargetDisplay: 0
m_TargetEye: 3
m_HDR: 1
m_AllowMSAA: 1
m_AllowDynamicResolution: 0
m_ForceIntoRT: 0
m_OcclusionCulling: 1
m_StereoConvergence: 10
m_StereoSeparation: 0.022
--- !u!4 &865861685
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 865861683}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: -10}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1077348680
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1077348682}
- component: {fileID: 1077348681}
m_Layer: 0
m_Name: Background
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!212 &1077348681
SpriteRenderer:
serializedVersion: 3
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1077348680}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 0
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 0
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: -10
m_MaskInteraction: 0
m_Sprite: {fileID: 21300000, guid: e8139865590c408789e137275b78e239, type: 3}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_FlipX: 0
m_FlipY: 0
m_DrawMode: 0
m_Size: {x: 16.72, y: 9.41}
m_AdaptiveModeThreshold: 0.5
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_SpriteSortPoint: 0
m_BlendShapeWeights: []
--- !u!4 &1077348682
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1077348680}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.76555026, y: 0.76514345, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1544944036
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1544944038}
- component: {fileID: 1544944037}
m_Layer: 0
m_Name: Spawner
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &1544944037
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1544944036}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ec58b83d93d5b435abaaa64ecc05fe1a, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::LiveOpsExamples.SnackSpawner
prefab: {fileID: 1945811876929841169, guid: b6f2ca858be534f3ab055e0b878ae13f, type: 3}
library: {fileID: 11400000, guid: 06fcf2ebf537145de9bab548922829e1, type: 2}
spawnMin: {x: -5.25, y: -2.65}
spawnMax: {x: 5.25, y: 2.42}
parent: {fileID: 329179445}
--- !u!4 &1544944038
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1544944036}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 616881063}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1764811299
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1764811312}
- component: {fileID: 1764811311}
- component: {fileID: 1764811310}
- component: {fileID: 1764811309}
- component: {fileID: 1764811308}
- component: {fileID: 1764811307}
- component: {fileID: 1764811306}
- component: {fileID: 1764811305}
- component: {fileID: 1764811304}
- component: {fileID: 1764811303}
- component: {fileID: 1764811302}
- component: {fileID: 1764811301}
- component: {fileID: 1764811300}
- component: {fileID: 1764811313}
m_Layer: 0
m_Name: UI
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &1764811300
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1764811299}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6f3916e69e6ce4c78b909c659160ad95, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::LiveOpsExamples.RoundResultModalPanel
uiDocument: {fileID: 1764811311}
controller: {fileID: 853162496}
leaderboardRowTemplate: {fileID: 9197481963319205126, guid: e171bce5673384061b0cb20cbe5082d1,
type: 3}
--- !u!114 &1764811301
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1764811299}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b996708622cc54d328cac546b893e111, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::LiveOpsExamples.OfferModalPanel
uiDocument: {fileID: 1764811311}
controller: {fileID: 853162496}
--- !u!114 &1764811302
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1764811299}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0c73aae57f5c749b88f5bf2c22538af5, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::LiveOpsExamples.BackpackModalPanel
uiDocument: {fileID: 1764811311}
controller: {fileID: 853162496}
backpackItemRowTemplate: {fileID: 9197481963319205126, guid: 29a6c5a5b6bb94220b5c2378923d4047,
type: 3}
spriteLibrary: {fileID: 11400000, guid: 06fcf2ebf537145de9bab548922829e1, type: 2}
--- !u!114 &1764811303
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1764811299}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 36789e549043d400a92f3a84849b4038, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::LiveOpsExamples.ShopModalPanel
uiDocument: {fileID: 1764811311}
controller: {fileID: 853162496}
shopOfferRowTemplate: {fileID: 9197481963319205126, guid: 85424ff7d38f94ed08f809972c61617c,
type: 3}
--- !u!114 &1764811304
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1764811299}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6de014257693b4ced830566d18e49444, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::LiveOpsExamples.SetupOverlayPanel
uiDocument: {fileID: 1764811311}
controller: {fileID: 853162496}
--- !u!114 &1764811305
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1764811299}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f54172384bff5402686bb558e2abb5b7, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::LiveOpsExamples.BootOverlayPanel
uiDocument: {fileID: 1764811311}
controller: {fileID: 853162496}
--- !u!114 &1764811306
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1764811299}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 57e0ed949960344bd80072dd54a52c4f, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::LiveOpsExamples.ToastsPanel
uiDocument: {fileID: 1764811311}
controller: {fileID: 853162496}
toastTemplate: {fileID: 9197481963319205126, guid: 3a2038228118b4a09a3a242b8a1fc1d4,
type: 3}
--- !u!114 &1764811307
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1764811299}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2e5e5cb2ad54545a6847ad8c90d1f7d8, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::LiveOpsExamples.HudPanel
uiDocument: {fileID: 1764811311}
controller: {fileID: 853162496}
world: {fileID: 616881062}
--- !u!114 &1764811308
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1764811299}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a134e625b6e114c4b80b9f55a14e48b3, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::LiveOpsExamples.EventInspectorPanel
uiDocument: {fileID: 1764811311}
controller: {fileID: 853162496}
logRowTemplate: {fileID: 9197481963319205126, guid: 94171891e540744b3a0f55b254cbe18b,
type: 3}
--- !u!114 &1764811309
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1764811299}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1d57e6a031317461cb98e41f6940c8d3, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::LiveOpsExamples.RemoteConfigPanel
uiDocument: {fileID: 1764811311}
controller: {fileID: 853162496}
--- !u!114 &1764811310
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1764811299}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 900b9e31987914b56a3bba037e2a830c, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::LiveOpsExamples.SessionCardPanel
uiDocument: {fileID: 1764811311}
controller: {fileID: 853162496}
--- !u!114 &1764811311
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1764811299}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 19102, guid: 0000000000000000e000000000000000, type: 0}
m_Name:
m_EditorClassIdentifier: UnityEngine.dll::UnityEngine.UIElements.UIDocument
m_PanelSettings: {fileID: 11400000, guid: 728073018ae96457c9d67e8cc2652ac8, type: 2}
m_ParentUI: {fileID: 0}
sourceAsset: {fileID: 9197481963319205126, guid: 766f5cae1f4354e20b4043cf1c6756bf,
type: 3}
m_SortingOrder: 0
m_Position: 0
m_WorldSpaceSizeMode: 1
m_WorldSpaceWidth: 1920
m_WorldSpaceHeight: 1080
m_PivotReferenceSize: 0
m_Pivot: 0
m_WorldSpaceCollider: {fileID: 0}
--- !u!4 &1764811312
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1764811299}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1931382934 &1764811313
PanelRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1764811299}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 0
m_ReflectionProbeUsage: 0
m_RayTracingMode: 0
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 0}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
serializedVersion: 1
m_PanelSettings: {fileID: 11400000, guid: 728073018ae96457c9d67e8cc2652ac8, type: 2}
sourceAsset: {fileID: 9197481963319205126, guid: 766f5cae1f4354e20b4043cf1c6756bf,
type: 3}
m_ParentUI: {fileID: 0}
m_WorldSpaceSizeMode: 1
m_WorldSpaceWidth: 1920
m_WorldSpaceHeight: 1080
m_PivotReferenceSize: 0
m_Pivot: 0
m_Position: 0
--- !u!1 &1781499117
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1781499118}
- component: {fileID: 1781499121}
- component: {fileID: 1781499120}
- component: {fileID: 1781499119}
m_Layer: 0
m_Name: Player
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1781499118
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1781499117}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.23768115, y: 0.24053454, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 616881063}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!58 &1781499119
CircleCollider2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1781499117}
m_Enabled: 1
serializedVersion: 3
m_Density: 1
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_ForceSendLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ForceReceiveLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ContactCaptureLayers:
serializedVersion: 2
m_Bits: 4294967295
m_CallbackLayers:
serializedVersion: 2
m_Bits: 4294967295
m_IsTrigger: 0
m_UsedByEffector: 0
m_CompositeOperation: 0
m_CompositeOrder: 0
m_Offset: {x: 0, y: 0}
m_Radius: 0.99777764
--- !u!50 &1781499120
Rigidbody2D:
serializedVersion: 5
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1781499117}
m_BodyType: 1
m_Simulated: 1
m_UseFullKinematicContacts: 0
m_UseAutoMass: 0
m_Mass: 1
m_LinearDamping: 0
m_AngularDamping: 0.05
m_GravityScale: 0
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_Interpolate: 0
m_SleepingMode: 1
m_CollisionDetection: 0
m_Constraints: 0
--- !u!212 &1781499121
SpriteRenderer:
serializedVersion: 3
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1781499117}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 0
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 0
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_Sprite: {fileID: 21300000, guid: 695606af95a0452790cf9228c0cc9f76, type: 3}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_FlipX: 0
m_FlipY: 0
m_DrawMode: 0
m_Size: {x: 3.45, y: 4.49}
m_AdaptiveModeThreshold: 0.5
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_SpriteSortPoint: 0
m_BlendShapeWeights: []
--- !u!1660057539 &9223372036854775807
SceneRoots:
m_ObjectHideFlags: 0
m_Roots:
- {fileID: 865861685}
- {fileID: 1077348682}
- {fileID: 616881063}
- {fileID: 853162498}
- {fileID: 1764811312}
@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: c8998a66d411a4e8d9ef54b6f261d320
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
File diff suppressed because it is too large Load Diff
@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 9f08d0082395f4a36b1a41e5e929c33f
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,197 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &4320980148611362106
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3111624587611009095}
- component: {fileID: 593893284932781451}
- component: {fileID: 1452460269697210593}
- component: {fileID: 2163815420330336319}
m_Layer: 0
m_Name: ScorePopup
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3111624587611009095
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4320980148611362106}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 20, y: 5}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!23 &593893284932781451
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4320980148611362106}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!114 &1452460269697210593
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4320980148611362106}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshPro
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: +10
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4294967295
m_fontColor: {r: 1, g: 1, b: 1, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: 0
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 2.5
m_fontSizeBase: 2.5
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 0
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
_SortingLayer: 0
_SortingLayerID: 0
_SortingOrder: 0
m_hasFontAssetChanged: 0
m_renderer: {fileID: 593893284932781451}
m_maskType: 0
--- !u!114 &2163815420330336319
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4320980148611362106}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b1db4bf03192148bf95ea374d128f349, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::LiveOpsExamples.ScorePopupView
label: {fileID: 1452460269697210593}
@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 77687e92645dc450d8f79fbb91face30
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
-144
View File
@@ -1,144 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &4123410791617310354
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5962299478407506369}
- component: {fileID: 2996539449734302674}
- component: {fileID: 5031039985352295968}
- component: {fileID: 1945811876929841169}
m_Layer: 0
m_Name: Snack
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &5962299478407506369
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4123410791617310354}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.16149068, y: 0.12807882, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!58 &2996539449734302674
CircleCollider2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4123410791617310354}
m_Enabled: 1
serializedVersion: 3
m_Density: 1
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_ForceSendLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ForceReceiveLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ContactCaptureLayers:
serializedVersion: 2
m_Bits: 4294967295
m_CallbackLayers:
serializedVersion: 2
m_Bits: 4294967295
m_IsTrigger: 1
m_UsedByEffector: 0
m_CompositeOperation: 0
m_CompositeOrder: 0
m_Offset: {x: 0, y: 0}
m_Radius: 1.3623077
--- !u!212 &5031039985352295968
SpriteRenderer:
serializedVersion: 3
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4123410791617310354}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 0
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 0
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_Sprite: {fileID: 21300000, guid: c41fcc3b35c944ffa18a34b6c4dc2cd6, type: 3}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_FlipX: 0
m_FlipY: 0
m_DrawMode: 0
m_Size: {x: 3.22, y: 4.06}
m_AdaptiveModeThreshold: 0.5
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_SpriteSortPoint: 0
m_BlendShapeWeights: []
--- !u!114 &1945811876929841169
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4123410791617310354}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 36b117cefc78541b9b42188266102562, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::LiveOpsExamples.Snack
@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: b6f2ca858be534f3ab055e0b878ae13f
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,63 +0,0 @@
using UnityEngine;
namespace LiveOpsExamples
{
/// <summary>
/// Shared constants for the Cozy Collector demo: remote config keys with their
/// defaults, LiveOps slugs, and the inspector capability palette.
/// Mirrors liveops-phaser-demo/src/config.ts.
/// </summary>
public static class CozyCollectorConsts
{
// Remote config keys (mirror DemoRemoteConfig in the Phaser demo).
public const string ConfigRoundSeconds = "demo_round_seconds";
public const string ConfigPlayerSpeed = "demo_player_speed";
public const string ConfigSpawnIntervalMs = "demo_spawn_interval_ms";
public const string ConfigCollectibleScore = "demo_collectible_score";
public const float DefaultRoundSeconds = 150f;
public const float DefaultPlayerSpeed = 260f;
public const float DefaultSpawnIntervalMs = 900f;
public const float DefaultCollectibleScore = 10f;
public const string LeaderboardSlug = "cozy-collector-score";
public const string StoreSlug = "cozy-camp-shop";
public const string OfferId = "moonberry-boost";
public const string QuestMetricCollectibles = "cozy_collectibles";
public const string StorageType = "cozy_fantasy_save";
public const string StorageId = "main";
public const string NicknamePrefsKey = "rudder_demo_nickname";
public const string Region = "global";
public const string Language = "en";
// Inspector capability tags (same tags as the Phaser demo).
public const string CapabilityAuth = "auth";
public const string CapabilityConfig = "config";
public const string CapabilityScenario = "scenario";
public const string CapabilityStore = "store";
public const string CapabilityLeaderboard = "leaderboard";
public const string CapabilityStorage = "storage";
public const string CapabilityInventory = "inventory";
public const string CapabilityWallet = "wallet";
public const string CapabilityQuests = "quests";
public const string CapabilitySystem = "system";
/// <summary>Color used by the event inspector to tag a capability line.</summary>
public static Color CapabilityColor(string capability)
{
switch (capability)
{
case CapabilityAuth: return new Color(0.55f, 0.76f, 1.00f);
case CapabilityConfig: return new Color(0.61f, 0.90f, 0.69f);
case CapabilityScenario: return new Color(0.85f, 0.68f, 1.00f);
case CapabilityStore: return new Color(1.00f, 0.82f, 0.51f);
case CapabilityLeaderboard: return new Color(1.00f, 0.72f, 0.58f);
case CapabilityStorage: return new Color(0.56f, 0.87f, 0.87f);
case CapabilityInventory: return new Color(0.78f, 0.86f, 0.55f);
case CapabilityWallet: return new Color(1.00f, 0.88f, 0.63f);
case CapabilityQuests: return new Color(0.71f, 0.80f, 1.00f);
default: return new Color(0.75f, 0.75f, 0.75f);
}
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: f0f8000a396a64ea7890de20a70265ce
File diff suppressed because it is too large Load Diff
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 05ab47060c2ef4476800002c4a956b85
@@ -1,42 +0,0 @@
using UnityEngine;
namespace LiveOpsExamples
{
/// <summary>
/// Baked sprite references for the Cozy Collector demo. Mirrors the Phaser
/// texture keys; <see cref="ForSlug"/> falls back to the star sprite for
/// unknown slugs, same as the Phaser backpack icon mapping.
/// </summary>
[CreateAssetMenu(menuName = "LiveOps Examples/Cozy Collector Sprite Library")]
public class CozyCollectorSpriteLibrary : ScriptableObject
{
[SerializeField] private Sprite background;
[SerializeField] private Sprite player;
[SerializeField] private Sprite moonberry;
[SerializeField] private Sprite acorn;
[SerializeField] private Sprite star;
[SerializeField] private Sprite snack;
public Sprite Background => background;
public Sprite Player => player;
public Sprite Moonberry => moonberry;
public Sprite Acorn => acorn;
public Sprite Star => star;
public Sprite Snack => snack;
public Sprite ForSlug(string slug)
{
switch (slug)
{
case "background":
case "camp-bg": return background;
case "player": return player;
case "moonberry": return moonberry;
case "acorn": return acorn;
case "snack": return snack;
case "star":
default: return star;
}
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 8cd851b86da394b9ca06595f889a49b3
-149
View File
@@ -1,149 +0,0 @@
using System;
using UnityEngine;
namespace LiveOpsExamples
{
/// <summary>
/// Gameplay world for the Cozy Collector demo — the Unity port of the Phaser
/// GameScene.ts. Renders only the game world: player movement (WASD/arrows),
/// round timer, spawn cadence and pickups. All chrome lives in the UI panels,
/// all SDK calls in <see cref="CozyCollectorController"/>.
///
/// The Phaser field is 1280×720 px at 100 PPU, i.e. 12.8×7.2 world units
/// centered on the origin; tuning speeds/intervals stay in Phaser units
/// (px/s, ms) and are converted here.
/// </summary>
public class GameWorld : MonoBehaviour
{
private const float PixelsPerUnit = 100f;
[SerializeField] private SpriteRenderer player;
[SerializeField] private SnackSpawner spawner;
[SerializeField] private CozyCollectorController controller;
[SerializeField] private ScorePopupView scorePopupPrefab;
[SerializeField] private ParticleSystem collectBurstPrefab;
[SerializeField] private Vector2 moveMin = new Vector2(-6.0f, -3.2f);
[SerializeField] private Vector2 moveMax = new Vector2(6.0f, 3.2f);
private bool _paused;
private float _spawnElapsedMs;
private int _lastSecond = -1;
private bool _finishRaised;
public int Score { get; private set; }
public int Collected { get; private set; }
public float TimeLeftSeconds { get; private set; }
public bool RoundActive { get; private set; }
public event Action StateChanged;
public event Action<int, int> RoundFinished;
private void Awake()
{
spawner.Player = player;
spawner.Collected += OnSnackCollected;
}
private void OnDestroy()
{
spawner.Collected -= OnSnackCollected;
}
private void Update()
{
MovePlayer(_paused || !RoundActive);
if (!RoundActive || _paused)
return;
TimeLeftSeconds = Mathf.Max(0f, TimeLeftSeconds - Time.deltaTime);
_spawnElapsedMs += Time.deltaTime * 1000f;
if (_spawnElapsedMs >= controller.Tuning.SpawnIntervalMs)
{
_spawnElapsedMs = 0f;
spawner.Spawn();
}
var second = Mathf.CeilToInt(TimeLeftSeconds);
if (second != _lastSecond)
{
_lastSecond = second;
StateChanged?.Invoke();
}
if (TimeLeftSeconds <= 0f)
FinishRound();
}
public void SetPaused(bool paused)
{
_paused = paused;
}
public void RestartRound()
{
Score = 0;
Collected = 0;
TimeLeftSeconds = controller.Tuning.RoundSeconds;
_spawnElapsedMs = 0f;
_lastSecond = -1;
_finishRaised = false;
spawner.Clear();
RoundActive = true;
spawner.Spawn();
StateChanged?.Invoke();
}
private void MovePlayer(bool frozen)
{
if (frozen)
return;
var vx = (Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.A) ? -1 : 0) +
(Input.GetKey(KeyCode.RightArrow) || Input.GetKey(KeyCode.D) ? 1 : 0);
var vy = (Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.S) ? -1 : 0) +
(Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.W) ? 1 : 0);
if (vx == 0 && vy == 0)
return;
var direction = new Vector2(vx, vy).normalized;
var speed = controller.Tuning.PlayerSpeed / PixelsPerUnit;
var position = player.transform.position;
position += (Vector3)(direction * speed * Time.deltaTime);
position.x = Mathf.Clamp(position.x, moveMin.x, moveMax.x);
position.y = Mathf.Clamp(position.y, moveMin.y, moveMax.y);
player.transform.position = position;
if (vx != 0)
player.flipX = vx < 0;
}
private void OnSnackCollected(Snack snack)
{
var position = snack.transform.position;
var gain = Mathf.RoundToInt(controller.Tuning.CollectibleScore);
Score += gain;
Collected += 1;
var popup = Instantiate(scorePopupPrefab, position, Quaternion.identity);
popup.Set(gain);
Instantiate(collectBurstPrefab, position, Quaternion.identity);
StateChanged?.Invoke();
}
private void FinishRound()
{
if (_finishRaised)
return;
_finishRaised = true;
RoundActive = false;
spawner.Clear();
StateChanged?.Invoke();
RoundFinished?.Invoke(Score, Collected);
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 952f52af0af8546eeab332b11e2e4bb7
@@ -1,43 +0,0 @@
using System.Collections;
using TMPro;
using UnityEngine;
namespace LiveOpsExamples
{
/// <summary>
/// World-space "+N" score popup. Floats up ~0.5 world units and fades out over
/// 0.7 s (Cubic.easeOut, like the Phaser floatScore tween), then destroys itself.
/// </summary>
public class ScorePopupView : MonoBehaviour
{
private const float FloatDistance = 0.5f;
private const float LifetimeSeconds = 0.7f;
[SerializeField] private TextMeshPro label;
public void Set(int gain)
{
label.text = "+" + gain;
StartCoroutine(Animate());
}
private IEnumerator Animate()
{
var start = transform.position;
var color = label.color;
var elapsed = 0f;
while (elapsed < LifetimeSeconds)
{
elapsed += Time.deltaTime;
var t = Mathf.Clamp01(elapsed / LifetimeSeconds);
var eased = 1f - Mathf.Pow(1f - t, 3f);
transform.position = start + new Vector3(0f, FloatDistance * eased, 0f);
label.color = new Color(color.r, color.g, color.b, color.a * (1f - eased));
yield return null;
}
Destroy(gameObject);
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: b1db4bf03192148bf95ea374d128f349
-45
View File
@@ -1,45 +0,0 @@
using System;
using UnityEngine;
namespace LiveOpsExamples
{
/// <summary>
/// A collectible snack. Bobs gently (sine, 0.08 world units amplitude, 650 ms
/// half-period — mirrors the Phaser yoyo tween) and raises <see cref="Collected"/>
/// when the player overlaps its trigger, then destroys itself.
/// </summary>
[RequireComponent(typeof(SpriteRenderer))]
public class Snack : MonoBehaviour
{
private const float BobAmplitude = 0.08f;
private const float BobHalfPeriodSeconds = 0.65f;
public SpriteRenderer Player { get; set; }
public event Action<Snack> Collected;
private Vector3 _basePosition;
private float _elapsed;
private void Start()
{
_basePosition = transform.position;
}
private void Update()
{
_elapsed += Time.deltaTime;
var offset = Mathf.Sin(_elapsed * Mathf.PI / BobHalfPeriodSeconds) * BobAmplitude;
transform.position = _basePosition + new Vector3(0f, offset, 0f);
}
private void OnTriggerEnter2D(Collider2D other)
{
if (Player == null || other.gameObject != Player.gameObject)
return;
Collected?.Invoke(this);
Destroy(gameObject);
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 36b117cefc78541b9b42188266102562
@@ -1,76 +0,0 @@
using System;
using System.Collections.Generic;
using UnityEngine;
namespace LiveOpsExamples
{
/// <summary>
/// Spawns collectible snacks at random positions inside the configured bounds,
/// picking a random collectible slug (moonberry/acorn/star/snack) and applying
/// its sprite from the library. Mirrors GameScene.spawnCollectible.
///
/// Phaser spawn margins x∈[115,1165], y∈[118,625] px on a 1280×720 field at
/// 100 PPU map to x∈[-5.25,5.25], y∈[-2.65,2.42] world units (y is flipped).
/// </summary>
public class SnackSpawner : MonoBehaviour
{
private static readonly string[] CollectibleSlugs = { "moonberry", "acorn", "star", "snack" };
[SerializeField] private Snack prefab;
[SerializeField] private CozyCollectorSpriteLibrary library;
[SerializeField] private Vector2 spawnMin = new Vector2(-5.25f, -2.65f);
[SerializeField] private Vector2 spawnMax = new Vector2(5.25f, 2.42f);
[SerializeField] private Transform parent;
private readonly List<Snack> _spawned = new List<Snack>();
public SpriteRenderer Player { get; set; }
public event Action<Snack> Collected;
public Snack Spawn()
{
var slug = CollectibleSlugs[UnityEngine.Random.Range(0, CollectibleSlugs.Length)];
var position = new Vector3(
UnityEngine.Random.Range(spawnMin.x, spawnMax.x),
UnityEngine.Random.Range(spawnMin.y, spawnMax.y),
0f);
var snack = Instantiate(prefab, position, Quaternion.identity, parent);
var sprite = library.ForSlug(slug);
snack.GetComponent<SpriteRenderer>().sprite = sprite;
// Phaser setDisplaySize(52, 52) at 100 PPU -> 0.52 x 0.52 world units.
var spriteBounds = sprite.bounds.size;
var scale = new Vector3(0.52f / spriteBounds.x, 0.52f / spriteBounds.y, 1f);
snack.transform.localScale = scale;
// The prefab collider radius is tuned to snack.png; a circle collider's
// world radius scales by the largest transform axis, so retune per sprite.
snack.GetComponent<CircleCollider2D>().radius = 0.22f / Mathf.Max(scale.x, scale.y);
snack.Player = Player;
snack.Collected += OnSnackCollected;
_spawned.Add(snack);
return snack;
}
public void Clear()
{
foreach (var snack in _spawned)
{
if (snack == null)
continue;
snack.Collected -= OnSnackCollected;
Destroy(snack.gameObject);
}
_spawned.Clear();
}
private void OnSnackCollected(Snack snack)
{
snack.Collected -= OnSnackCollected;
_spawned.Remove(snack);
Collected?.Invoke(snack);
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: ec58b83d93d5b435abaaa64ecc05fe1a
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: c21c943a5e1bd4f79a2d6bcb2e3f30fb
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,81 +0,0 @@
using UnityEngine;
using UnityEngine.UIElements;
namespace LiveOpsExamples
{
public class BackpackModalPanel : MonoBehaviour
{
[SerializeField] private PanelRenderer panelRenderer;
[SerializeField] private CozyCollectorController controller;
[SerializeField] private VisualTreeAsset backpackItemRowTemplate;
[SerializeField] private CozyCollectorSpriteLibrary spriteLibrary;
private VisualElement _root;
private ScrollView _itemsScroll;
private VisualElement _emptyNote;
private Button _closeButton;
private void OnEnable()
{
panelRenderer.RegisterUIReloadCallback(OnUIReload);
controller.ModalChanged += ApplyVisibility;
controller.BackpackChanged += Rebuild;
}
private void OnDisable()
{
panelRenderer.UnregisterUIReloadCallback(OnUIReload);
controller.ModalChanged -= ApplyVisibility;
controller.BackpackChanged -= Rebuild;
}
private void OnUIReload(PanelRenderer renderer, VisualElement root)
{
_root = root.Q<VisualElement>("backpack-modal");
_itemsScroll = _root.Q<ScrollView>("backpack-items-scroll");
_emptyNote = _root.Q<VisualElement>("backpack-empty");
_closeButton = _root.Q<Button>("backpack-close-button");
_closeButton.clicked -= HandleCloseClicked;
_closeButton.clicked += HandleCloseClicked;
ApplyVisibility();
Rebuild();
}
private void ApplyVisibility()
{
_root.style.display = controller.ActiveModal == CozyModal.Backpack ? DisplayStyle.Flex : DisplayStyle.None;
}
private void Rebuild()
{
_itemsScroll.contentContainer.Clear();
var items = controller.BackpackItems;
_emptyNote.style.display = items == null || items.Count == 0 ? DisplayStyle.Flex : DisplayStyle.None;
if (items == null)
{
return;
}
foreach (var item in items)
{
var rowRoot = backpackItemRowTemplate.CloneTree();
_itemsScroll.contentContainer.Add(rowRoot);
var row = new BackpackItemRowView(rowRoot);
row.Set(
spriteLibrary.ForSlug(item.Slug),
string.IsNullOrEmpty(item.Name) ? item.Slug : item.Name,
item.Slug,
item.Amount);
}
}
private void HandleCloseClicked()
{
controller.CloseModal();
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 0c73aae57f5c749b88f5bf2c22538af5
@@ -1,70 +0,0 @@
using UnityEngine;
using UnityEngine.UIElements;
namespace LiveOpsExamples
{
public class BootOverlayPanel : MonoBehaviour
{
private const float SpinnerDegreesPerSecond = 180f;
[SerializeField] private PanelRenderer panelRenderer;
[SerializeField] private CozyCollectorController controller;
private VisualElement _overlay;
private Label _statusLabel;
private VisualElement _spinner;
private IVisualElementScheduledItem _spinSchedule;
private float _angle;
private float _lastTick;
private void OnEnable()
{
panelRenderer.RegisterUIReloadCallback(OnUIReload);
controller.PhaseChanged += ApplyVisibility;
}
private void OnDisable()
{
panelRenderer.UnregisterUIReloadCallback(OnUIReload);
controller.PhaseChanged -= ApplyVisibility;
_spinSchedule?.Pause();
}
private void OnUIReload(PanelRenderer renderer, VisualElement root)
{
_overlay = root.Q<VisualElement>("boot-overlay");
_statusLabel = root.Q<Label>("boot-status");
_spinner = root.Q<VisualElement>("boot-spinner");
_spinSchedule = _spinner.schedule.Execute(Spin).Every(16);
ApplyVisibility();
}
private void Update()
{
_statusLabel.text = controller.StatusMessage;
}
private void Spin()
{
var now = Time.unscaledTime;
_angle = (_angle + SpinnerDegreesPerSecond * (now - _lastTick)) % 360f;
_lastTick = now;
_spinner.style.rotate = new Rotate(Angle.Degrees(_angle));
}
private void ApplyVisibility()
{
var visible = controller.Phase == CozyPhase.Booting || controller.Phase == CozyPhase.Connecting;
_overlay.style.display = visible ? DisplayStyle.Flex : DisplayStyle.None;
if (visible)
{
_lastTick = Time.unscaledTime;
_spinSchedule.Resume();
}
else
{
_spinSchedule.Pause();
}
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: f54172384bff5402686bb558e2abb5b7
@@ -1,91 +0,0 @@
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
namespace LiveOpsExamples
{
public class EventInspectorPanel : MonoBehaviour
{
private static readonly Dictionary<string, Color> CapabilityColors = new Dictionary<string, Color>
{
{ "auth", new Color(0.486f, 0.769f, 1f) },
{ "config", new Color(0.945f, 0.776f, 0.490f) },
{ "scenario", new Color(0.769f, 0.635f, 1f) },
{ "store", new Color(1f, 0.698f, 0.490f) },
{ "leaderboard", new Color(0.482f, 0.878f, 0.690f) },
{ "storage", new Color(0.624f, 0.690f, 0.769f) },
{ "inventory", new Color(0.898f, 0.604f, 0.796f) },
{ "wallet", new Color(1f, 0.831f, 0.475f) },
{ "quests", new Color(0.710f, 0.800f, 1f) },
{ "system", new Color(0.667f, 0.706f, 0.635f) },
};
private static readonly Dictionary<string, string> CapabilityLabels = new Dictionary<string, string>
{
{ "auth", "Auth" },
{ "config", "Config" },
{ "scenario", "Scenario" },
{ "store", "Store" },
{ "leaderboard", "Board" },
{ "storage", "Storage" },
{ "inventory", "Items" },
{ "wallet", "Wallet" },
{ "quests", "Quests" },
{ "system", "System" },
};
private static readonly Color FallbackColor = new Color(0.667f, 0.706f, 0.635f);
[SerializeField] private PanelRenderer panelRenderer;
[SerializeField] private CozyCollectorController controller;
[SerializeField] private VisualTreeAsset logRowTemplate;
private ScrollView _scroll;
private VisualElement _emptyNote;
private void OnEnable()
{
panelRenderer.RegisterUIReloadCallback(OnUIReload);
controller.LogAdded += Rebuild;
}
private void OnDisable()
{
panelRenderer.UnregisterUIReloadCallback(OnUIReload);
controller.LogAdded -= Rebuild;
}
private void OnUIReload(PanelRenderer renderer, VisualElement root)
{
_scroll = root.Q<ScrollView>("event-log-scroll");
_emptyNote = root.Q("event-log-empty");
Rebuild();
}
private void Rebuild()
{
var container = _scroll.contentContainer;
container.Clear();
var entries = controller.LogEntries;
_emptyNote.style.display = entries == null || entries.Count == 0 ? DisplayStyle.Flex : DisplayStyle.None;
if (entries == null)
{
return;
}
foreach (var entry in entries)
{
var rowRoot = logRowTemplate.CloneTree();
container.Add(rowRoot);
string key = entry.Capability == null ? string.Empty : entry.Capability.ToLowerInvariant();
string label = CapabilityLabels.TryGetValue(key, out var known) ? known : entry.Capability;
Color color = CapabilityColors.TryGetValue(key, out var knownColor) ? knownColor : FallbackColor;
string detail = string.IsNullOrEmpty(entry.Detail) ? string.Empty : $" — {entry.Detail}";
new LogRowView(rowRoot).Set(entry.Timestamp.ToString("HH:mm:ss"), label, color, entry.Message, detail);
}
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: a134e625b6e114c4b80b9f55a14e48b3
@@ -1,119 +0,0 @@
using System.Text;
using UnityEngine;
using UnityEngine.UIElements;
namespace LiveOpsExamples
{
public class HudPanel : MonoBehaviour
{
private const string TimerLowClass = "timer-low";
[SerializeField] private PanelRenderer panelRenderer;
[SerializeField] private CozyCollectorController controller;
[SerializeField] private GameWorld world;
private Label _scoreLabel;
private Label _bestLabel;
private Label _timeLeftLabel;
private VisualElement _timerFill;
private Label _walletLabel;
private Button _shopButton;
private Button _backpackButton;
private void OnEnable()
{
panelRenderer.RegisterUIReloadCallback(OnUIReload);
world.StateChanged += Refresh;
world.RoundFinished += HandleRoundFinished;
controller.WalletsChanged += RefreshWallet;
}
private void OnDisable()
{
panelRenderer.UnregisterUIReloadCallback(OnUIReload);
world.StateChanged -= Refresh;
world.RoundFinished -= HandleRoundFinished;
controller.WalletsChanged -= RefreshWallet;
}
private void OnUIReload(PanelRenderer renderer, VisualElement root)
{
_scoreLabel = root.Q<Label>("hud-score");
_bestLabel = root.Q<Label>("hud-best");
_timeLeftLabel = root.Q<Label>("hud-time-left");
_timerFill = root.Q("hud-timer-fill");
_walletLabel = root.Q<Label>("hud-wallet");
_shopButton = root.Q<Button>("hud-shop-button");
_backpackButton = root.Q<Button>("hud-backpack-button");
_shopButton.clicked -= HandleShopClicked;
_shopButton.clicked += HandleShopClicked;
_backpackButton.clicked -= HandleBackpackClicked;
_backpackButton.clicked += HandleBackpackClicked;
Refresh();
RefreshWallet();
}
private void Update()
{
RefreshTimer();
}
private void Refresh()
{
_scoreLabel.text = world.Score.ToString();
_bestLabel.text = controller.Save != null ? controller.Save.BestScore.ToString() : "0";
RefreshTimer();
}
private void RefreshTimer()
{
float roundSeconds = controller.Tuning != null ? Mathf.Max(1f, controller.Tuning.RoundSeconds) : 1f;
float fraction = Mathf.Clamp01(world.TimeLeftSeconds / roundSeconds);
_timeLeftLabel.text = $"{Mathf.CeilToInt(Mathf.Max(0f, world.TimeLeftSeconds))}s";
_timerFill.style.width = Length.Percent(fraction * 100f);
_timerFill.EnableInClassList(TimerLowClass, fraction <= 0.2f);
}
private void RefreshWallet()
{
_walletLabel.text = WalletLabel();
}
private string WalletLabel()
{
var wallets = controller.Wallets;
if (wallets == null || wallets.Count == 0)
{
return "—";
}
var builder = new StringBuilder();
foreach (var wallet in wallets)
{
if (builder.Length > 0)
{
builder.Append(" · ");
}
builder.Append($"{wallet.Balance:0.##} {wallet.Currency}".TrimEnd());
}
return builder.ToString();
}
private void HandleRoundFinished(int score, int collected)
{
Refresh();
}
private void HandleShopClicked()
{
controller.OpenModal(CozyModal.Shop);
}
private void HandleBackpackClicked()
{
controller.OpenModal(CozyModal.Backpack);
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 2e5e5cb2ad54545a6847ad8c90d1f7d8
@@ -1,102 +0,0 @@
using UnityEngine;
using UnityEngine.UIElements;
namespace LiveOpsExamples
{
public class OfferModalPanel : MonoBehaviour
{
[SerializeField] private PanelRenderer panelRenderer;
[SerializeField] private CozyCollectorController controller;
private VisualElement root;
private Label titleLabel;
private Label nameLabel;
private Label priceLabel;
private Button buyButton;
private Button declineButton;
private Button closeButton;
private void OnEnable()
{
panelRenderer.RegisterUIReloadCallback(OnUIReload);
controller.ModalChanged += ApplyVisibility;
controller.OfferChanged += Refresh;
}
private void OnDisable()
{
panelRenderer.UnregisterUIReloadCallback(OnUIReload);
controller.ModalChanged -= ApplyVisibility;
controller.OfferChanged -= Refresh;
}
private void OnUIReload(PanelRenderer renderer, VisualElement root)
{
this.root = root.Q<VisualElement>("offer-modal");
titleLabel = this.root.Q<Label>("offer-title");
nameLabel = this.root.Q<Label>("offer-name");
priceLabel = this.root.Q<Label>("offer-price");
buyButton = this.root.Q<Button>("offer-buy-button");
declineButton = this.root.Q<Button>("offer-decline-button");
closeButton = this.root.Q<Button>("offer-close-button");
buyButton.clicked -= HandleBuyClicked;
buyButton.clicked += HandleBuyClicked;
declineButton.clicked -= HandleDeclineClicked;
declineButton.clicked += HandleDeclineClicked;
closeButton.clicked -= HandleCloseClicked;
closeButton.clicked += HandleCloseClicked;
ApplyVisibility();
Refresh();
}
private void ApplyVisibility()
{
root.style.display = controller.ActiveModal == CozyModal.Offer ? DisplayStyle.Flex : DisplayStyle.None;
}
private void Refresh()
{
var offerInfo = controller.CurrentOffer;
if (offerInfo == null)
{
titleLabel.text = "Offer";
nameLabel.text = "—";
priceLabel.text = string.Empty;
buyButton.SetEnabled(false);
return;
}
titleLabel.text = string.IsNullOrEmpty(offerInfo.StoreName) ? offerInfo.StoreSlug : offerInfo.StoreName;
var offer = offerInfo.Offers != null && offerInfo.Offers.Count > 0 ? offerInfo.Offers[0] : null;
if (offer == null)
{
nameLabel.text = "—";
priceLabel.text = string.Empty;
buyButton.SetEnabled(false);
return;
}
nameLabel.text = string.IsNullOrEmpty(offer.Name) ? offer.OfferId : offer.Name;
priceLabel.text = ShopModalPanel.PriceLabel(offer.Price, offer.Currency);
buyButton.SetEnabled(true);
}
private void HandleBuyClicked()
{
controller.BuyScenarioOffer();
}
private void HandleDeclineClicked()
{
controller.DeclineScenarioOffer();
}
private void HandleCloseClicked()
{
controller.CloseModal();
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: b996708622cc54d328cac546b893e111
@@ -1,92 +0,0 @@
using UnityEngine;
using UnityEngine.UIElements;
namespace LiveOpsExamples
{
public class RemoteConfigPanel : MonoBehaviour
{
private const string FlashClass = "flash";
private const long FlashMilliseconds = 600;
[SerializeField] private PanelRenderer panelRenderer;
[SerializeField] private CozyCollectorController controller;
private Label _playerSpeedValue;
private Label _spawnIntervalValue;
private Label _collectibleScoreValue;
private Label _roundSecondsValue;
private VisualElement _playerSpeedRow;
private VisualElement _spawnIntervalRow;
private VisualElement _collectibleScoreRow;
private VisualElement _roundSecondsRow;
private void OnEnable()
{
panelRenderer.RegisterUIReloadCallback(OnUIReload);
controller.TuningChanged += HandleTuningChanged;
}
private void OnDisable()
{
panelRenderer.UnregisterUIReloadCallback(OnUIReload);
controller.TuningChanged -= HandleTuningChanged;
}
private void OnUIReload(PanelRenderer renderer, VisualElement root)
{
_playerSpeedValue = root.Q<Label>("rc-value-player-speed");
_spawnIntervalValue = root.Q<Label>("rc-value-spawn-interval");
_collectibleScoreValue = root.Q<Label>("rc-value-collectible-score");
_roundSecondsValue = root.Q<Label>("rc-value-round-seconds");
_playerSpeedRow = root.Q("rc-row-player-speed");
_spawnIntervalRow = root.Q("rc-row-spawn-interval");
_collectibleScoreRow = root.Q("rc-row-collectible-score");
_roundSecondsRow = root.Q("rc-row-round-seconds");
Refresh();
}
private void Refresh()
{
var tuning = controller.Tuning;
if (tuning == null)
{
return;
}
_playerSpeedValue.text = $"{Mathf.RoundToInt(tuning.PlayerSpeed)}";
_spawnIntervalValue.text = $"{Mathf.RoundToInt(tuning.SpawnIntervalMs)} ms";
_collectibleScoreValue.text = $"+{Mathf.RoundToInt(tuning.CollectibleScore)}";
_roundSecondsValue.text = $"{Mathf.RoundToInt(tuning.RoundSeconds)} s";
}
private void HandleTuningChanged(string key)
{
Refresh();
string normalized = key == null ? string.Empty : key.ToLowerInvariant().Replace("_", string.Empty).Replace("-", string.Empty).Replace(" ", string.Empty);
if (normalized.Contains("playerspeed"))
{
Flash(_playerSpeedRow);
}
else if (normalized.Contains("spawninterval"))
{
Flash(_spawnIntervalRow);
}
else if (normalized.Contains("collectiblescore"))
{
Flash(_collectibleScoreRow);
}
else if (normalized.Contains("roundseconds"))
{
Flash(_roundSecondsRow);
}
}
private static void Flash(VisualElement row)
{
row.AddToClassList(FlashClass);
row.schedule.Execute(() => row.RemoveFromClassList(FlashClass)).StartingIn(FlashMilliseconds);
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 1d57e6a031317461cb98e41f6940c8d3
@@ -1,117 +0,0 @@
using UnityEngine;
using UnityEngine.UIElements;
namespace LiveOpsExamples
{
public class RoundResultModalPanel : MonoBehaviour
{
private const int MaxLeaderboardRows = 10;
[SerializeField] private PanelRenderer panelRenderer;
[SerializeField] private CozyCollectorController controller;
[SerializeField] private VisualTreeAsset leaderboardRowTemplate;
private VisualElement root;
private Label scoreLabel;
private Label bestLabel;
private Label collectedLabel;
private ScrollView leaderboardScroll;
private VisualElement emptyNote;
private Button playAgainButton;
private Button claimButton;
private Button endButton;
private Button closeButton;
private void OnEnable()
{
panelRenderer.RegisterUIReloadCallback(OnUIReload);
controller.ModalChanged += ApplyVisibility;
controller.RoundResultChanged += Refresh;
}
private void OnDisable()
{
panelRenderer.UnregisterUIReloadCallback(OnUIReload);
controller.ModalChanged -= ApplyVisibility;
controller.RoundResultChanged -= Refresh;
}
private void OnUIReload(PanelRenderer renderer, VisualElement root)
{
this.root = root.Q<VisualElement>("round-result-modal");
scoreLabel = this.root.Q<Label>("rr-score");
bestLabel = this.root.Q<Label>("rr-best");
collectedLabel = this.root.Q<Label>("rr-collected");
leaderboardScroll = this.root.Q<ScrollView>("rr-leaderboard-scroll");
emptyNote = this.root.Q<VisualElement>("rr-empty");
playAgainButton = this.root.Q<Button>("rr-play-again-button");
claimButton = this.root.Q<Button>("rr-claim-button");
endButton = this.root.Q<Button>("rr-end-button");
closeButton = this.root.Q<Button>("rr-close-button");
playAgainButton.clicked -= HandlePlayAgainClicked;
playAgainButton.clicked += HandlePlayAgainClicked;
claimButton.clicked -= HandleClaimClicked;
claimButton.clicked += HandleClaimClicked;
endButton.clicked -= HandleEndClicked;
endButton.clicked += HandleEndClicked;
closeButton.clicked -= HandleCloseClicked;
closeButton.clicked += HandleCloseClicked;
ApplyVisibility();
Refresh();
}
private void ApplyVisibility()
{
root.style.display = controller.ActiveModal == CozyModal.RoundResult ? DisplayStyle.Flex : DisplayStyle.None;
}
private void Refresh()
{
var result = controller.RoundResult;
scoreLabel.text = result != null ? result.Score.ToString() : "0";
bestLabel.text = result != null ? result.Best.ToString() : "0";
collectedLabel.text = result != null ? result.Collected.ToString() : "0";
leaderboardScroll.Clear();
var entries = result != null ? result.TopEntries : null;
emptyNote.style.display = entries == null || entries.Count == 0 ? DisplayStyle.Flex : DisplayStyle.None;
if (entries == null)
{
return;
}
int count = Mathf.Min(entries.Count, MaxLeaderboardRows);
for (int i = 0; i < count; i++)
{
var entry = entries[i];
var rowRoot = leaderboardRowTemplate.CloneTree();
var row = new LeaderboardRowView(rowRoot);
row.Set(entry.Rank, string.IsNullOrEmpty(entry.PlayerName) ? "player" : entry.PlayerName, entry.Score);
leaderboardScroll.Add(rowRoot);
}
}
private void HandlePlayAgainClicked()
{
controller.PlayAgain();
}
private void HandleClaimClicked()
{
controller.ClaimScenarioLeaderboardReward();
}
private void HandleEndClicked()
{
controller.EndScenarioLeaderboard();
}
private void HandleCloseClicked()
{
controller.CloseModal();
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 6f3916e69e6ce4c78b909c659160ad95
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: cde562fa676ee420795c27bd66549cab
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,29 +0,0 @@
using UnityEngine;
using UnityEngine.UIElements;
namespace LiveOpsExamples
{
public class BackpackItemRowView
{
private readonly VisualElement _icon;
private readonly Label _nameLabel;
private readonly Label _metaLabel;
private readonly Label _amountLabel;
public BackpackItemRowView(VisualElement root)
{
_icon = root.Q<VisualElement>("item-icon");
_nameLabel = root.Q<Label>("item-name");
_metaLabel = root.Q<Label>("item-meta");
_amountLabel = root.Q<Label>("item-amount");
}
public void Set(Sprite icon, string itemName, string slug, int amount)
{
_icon.style.backgroundImage = new StyleBackground(icon);
_nameLabel.text = itemName;
_metaLabel.text = slug;
_amountLabel.text = $"×{amount}";
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: d7a25568da97f48f3b07abf321ad2f82
@@ -1,25 +0,0 @@
using UnityEngine.UIElements;
namespace LiveOpsExamples
{
public class LeaderboardRowView
{
private readonly Label rankLabel;
private readonly Label playerLabel;
private readonly Label scoreLabel;
public LeaderboardRowView(VisualElement root)
{
rankLabel = root.Q<Label>("lb-rank");
playerLabel = root.Q<Label>("lb-player");
scoreLabel = root.Q<Label>("lb-score");
}
public void Set(int rank, string playerName, int score)
{
rankLabel.text = rank > 0 ? $"#{rank}" : "—";
playerLabel.text = playerName;
scoreLabel.text = score.ToString();
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 29788c49080d642ff919c1d25b5dd979
@@ -1,31 +0,0 @@
using UnityEngine;
using UnityEngine.UIElements;
namespace LiveOpsExamples
{
public class LogRowView
{
private readonly Label _timeLabel;
private readonly Label _tagLabel;
private readonly Label _messageLabel;
private readonly Label _detailLabel;
public LogRowView(VisualElement root)
{
_timeLabel = root.Q<Label>("log-time");
_tagLabel = root.Q<Label>("log-tag");
_messageLabel = root.Q<Label>("log-message");
_detailLabel = root.Q<Label>("log-detail");
}
public void Set(string time, string tag, Color tagColor, string message, string detail)
{
_timeLabel.text = time;
_tagLabel.text = tag;
_tagLabel.style.color = tagColor;
_tagLabel.style.backgroundColor = new Color(tagColor.r, tagColor.g, tagColor.b, 0.18f);
_messageLabel.text = message;
_detailLabel.text = detail;
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: ffa213acafee84d818a3cf631f0bb01b
@@ -1,26 +0,0 @@
using UnityEngine.UIElements;
namespace LiveOpsExamples
{
public class ShopOfferRowView
{
private readonly Label _nameLabel;
private readonly Label _priceLabel;
private readonly Button _buyButton;
public Button BuyButton => _buyButton;
public ShopOfferRowView(VisualElement root)
{
_nameLabel = root.Q<Label>("offer-name");
_priceLabel = root.Q<Label>("offer-price");
_buyButton = root.Q<Button>("offer-buy-button");
}
public void Set(string offerName, string price)
{
_nameLabel.text = offerName;
_priceLabel.text = price;
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 94bf1e4d6fb50418487ed96aa4d65d4b
@@ -1,32 +0,0 @@
using UnityEngine.UIElements;
namespace LiveOpsExamples
{
public class ToastView
{
private const string ToneInfoClass = "tone-info";
private const string ToneSuccessClass = "tone-success";
private const string ToneErrorClass = "tone-error";
private readonly Label _titleLabel;
private readonly Label _messageLabel;
public ToastView(VisualElement root)
{
Root = root;
_titleLabel = root.Q<Label>("toast-title");
_messageLabel = root.Q<Label>("toast-message");
}
public VisualElement Root { get; }
public void Set(string title, string message, CozyToastTone tone)
{
_titleLabel.text = title;
_messageLabel.text = message;
Root.EnableInClassList(ToneInfoClass, tone == CozyToastTone.Info);
Root.EnableInClassList(ToneSuccessClass, tone == CozyToastTone.Success);
Root.EnableInClassList(ToneErrorClass, tone == CozyToastTone.Error);
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 5d468efab7b7645f78186c03b82f5d32
@@ -1,87 +0,0 @@
using System.Text;
using UnityEngine;
using UnityEngine.UIElements;
namespace LiveOpsExamples
{
public class SessionCardPanel : MonoBehaviour
{
[SerializeField] private PanelRenderer panelRenderer;
[SerializeField] private CozyCollectorController controller;
private Label _nicknameLabel;
private Label _playerIdLabel;
private Label _deviceIdLabel;
private Label _regionLabel;
private Label _projectKeyLabel;
private Label _walletsLabel;
private void OnEnable()
{
panelRenderer.RegisterUIReloadCallback(OnUIReload);
controller.PhaseChanged += Refresh;
controller.WalletsChanged += RefreshWallets;
}
private void OnDisable()
{
panelRenderer.UnregisterUIReloadCallback(OnUIReload);
controller.PhaseChanged -= Refresh;
controller.WalletsChanged -= RefreshWallets;
}
private void OnUIReload(PanelRenderer renderer, VisualElement root)
{
_nicknameLabel = root.Q<Label>("session-nickname");
_playerIdLabel = root.Q<Label>("session-player-id");
_deviceIdLabel = root.Q<Label>("session-device-id");
_regionLabel = root.Q<Label>("session-region");
_projectKeyLabel = root.Q<Label>("session-project-key");
_walletsLabel = root.Q<Label>("session-wallets");
Refresh();
}
private void Refresh()
{
var identity = controller.Identity;
if (identity == null)
{
_nicknameLabel.text = "—";
_playerIdLabel.text = "—";
_deviceIdLabel.text = "—";
_regionLabel.text = "—";
_projectKeyLabel.text = "—";
}
else
{
_nicknameLabel.text = string.IsNullOrEmpty(identity.Nickname)
? $"Player {identity.PlayerId.Substring(0, Mathf.Min(6, identity.PlayerId.Length))}"
: identity.Nickname;
_playerIdLabel.text = identity.PlayerId;
_deviceIdLabel.text = identity.DeviceId;
_regionLabel.text = string.IsNullOrEmpty(identity.Region) ? "global" : identity.Region;
_projectKeyLabel.text = identity.ProjectKey;
}
RefreshWallets();
}
private void RefreshWallets()
{
var wallets = controller.Wallets;
if (wallets == null || wallets.Count == 0)
{
_walletsLabel.text = "No wallets";
return;
}
var builder = new StringBuilder();
foreach (var wallet in wallets)
{
builder.AppendLine($"{wallet.Balance:0.##} {wallet.Currency}".TrimEnd());
}
_walletsLabel.text = builder.ToString().TrimEnd();
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 900b9e31987914b56a3bba037e2a830c
@@ -1,43 +0,0 @@
using UnityEngine;
using UnityEngine.UIElements;
namespace LiveOpsExamples
{
public class SetupOverlayPanel : MonoBehaviour
{
[SerializeField] private PanelRenderer panelRenderer;
[SerializeField] private CozyCollectorController controller;
private VisualElement _overlay;
private Label _errorLabel;
private void OnEnable()
{
panelRenderer.RegisterUIReloadCallback(OnUIReload);
controller.PhaseChanged += ApplyVisibility;
}
private void OnDisable()
{
panelRenderer.UnregisterUIReloadCallback(OnUIReload);
controller.PhaseChanged -= ApplyVisibility;
}
private void OnUIReload(PanelRenderer renderer, VisualElement root)
{
_overlay = root.Q<VisualElement>("setup-overlay");
_errorLabel = root.Q<Label>("setup-error");
ApplyVisibility();
}
private void Update()
{
_errorLabel.text = controller.SetupError;
}
private void ApplyVisibility()
{
_overlay.style.display = controller.Phase == CozyPhase.Setup ? DisplayStyle.Flex : DisplayStyle.None;
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 6de014257693b4ced830566d18e49444
@@ -1,115 +0,0 @@
using System.Text;
using UnityEngine;
using UnityEngine.UIElements;
namespace LiveOpsExamples
{
public class ShopModalPanel : MonoBehaviour
{
[SerializeField] private PanelRenderer panelRenderer;
[SerializeField] private CozyCollectorController controller;
[SerializeField] private VisualTreeAsset shopOfferRowTemplate;
private VisualElement _root;
private Label _walletLabel;
private ScrollView _offersScroll;
private VisualElement _emptyNote;
private Button _closeButton;
private void OnEnable()
{
panelRenderer.RegisterUIReloadCallback(OnUIReload);
controller.ModalChanged += ApplyVisibility;
controller.ShopChanged += Rebuild;
controller.WalletsChanged += RefreshWallet;
}
private void OnDisable()
{
panelRenderer.UnregisterUIReloadCallback(OnUIReload);
controller.ModalChanged -= ApplyVisibility;
controller.ShopChanged -= Rebuild;
controller.WalletsChanged -= RefreshWallet;
}
private void OnUIReload(PanelRenderer renderer, VisualElement root)
{
_root = root.Q<VisualElement>("shop-modal");
_walletLabel = _root.Q<Label>("shop-wallet");
_offersScroll = _root.Q<ScrollView>("shop-offers-scroll");
_emptyNote = _root.Q<VisualElement>("shop-empty");
_closeButton = _root.Q<Button>("shop-close-button");
_closeButton.clicked -= HandleCloseClicked;
_closeButton.clicked += HandleCloseClicked;
ApplyVisibility();
RefreshWallet();
Rebuild();
}
private void ApplyVisibility()
{
_root.style.display = controller.ActiveModal == CozyModal.Shop ? DisplayStyle.Flex : DisplayStyle.None;
}
private void RefreshWallet()
{
var wallets = controller.Wallets;
if (wallets == null || wallets.Count == 0)
{
_walletLabel.text = "Wallet: —";
return;
}
var builder = new StringBuilder("Wallet: ");
foreach (var wallet in wallets)
{
if (builder.Length > "Wallet: ".Length)
{
builder.Append(" · ");
}
builder.Append($"{wallet.Balance:0.##} {wallet.Currency}".TrimEnd());
}
_walletLabel.text = builder.ToString();
}
private void Rebuild()
{
_offersScroll.contentContainer.Clear();
var offers = controller.ShopOffers;
_emptyNote.style.display = offers == null || offers.Count == 0 ? DisplayStyle.Flex : DisplayStyle.None;
if (offers == null)
{
return;
}
foreach (var offer in offers)
{
var rowRoot = shopOfferRowTemplate.CloneTree();
_offersScroll.contentContainer.Add(rowRoot);
var row = new ShopOfferRowView(rowRoot);
row.Set(string.IsNullOrEmpty(offer.Name) ? offer.OfferId : offer.Name, PriceLabel(offer.Price, offer.Currency));
string offerId = offer.OfferId;
row.BuyButton.clicked += () => controller.BuyShopOffer(offerId);
}
}
internal static string PriceLabel(double price, string currency)
{
if (price <= 0)
{
return "Free";
}
return $"{price:0.##} {currency}".TrimEnd();
}
private void HandleCloseClicked()
{
controller.CloseModal();
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 36789e549043d400a92f3a84849b4038
@@ -1,78 +0,0 @@
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
namespace LiveOpsExamples
{
public class ToastsPanel : MonoBehaviour
{
private const float ToastLifetimeSeconds = 4.2f;
[SerializeField] private PanelRenderer panelRenderer;
[SerializeField] private CozyCollectorController controller;
[SerializeField] private VisualTreeAsset toastTemplate;
private readonly List<ToastView> _toasts = new List<ToastView>();
private readonly List<float> _dismissAt = new List<float>();
private VisualElement _container;
private void OnEnable()
{
panelRenderer.RegisterUIReloadCallback(OnUIReload);
controller.ToastRequested += HandleToastRequested;
}
private void OnDisable()
{
panelRenderer.UnregisterUIReloadCallback(OnUIReload);
controller.ToastRequested -= HandleToastRequested;
}
private void OnUIReload(PanelRenderer renderer, VisualElement root)
{
_container = root.Q("toasts");
}
private void Update()
{
for (int i = _toasts.Count - 1; i >= 0; i--)
{
if (Time.unscaledTime >= _dismissAt[i])
{
Dismiss(i);
}
}
}
private void HandleToastRequested(string title, string message, CozyToastTone tone)
{
var root = toastTemplate.CloneTree();
_container.Add(root);
var toast = new ToastView(root);
toast.Set(title, message, tone);
toast.Root.RegisterCallback<ClickEvent>(_ => Dismiss(toast));
_toasts.Add(toast);
_dismissAt.Add(Time.unscaledTime + ToastLifetimeSeconds);
}
private void Dismiss(ToastView toast)
{
int index = _toasts.IndexOf(toast);
if (index >= 0)
{
Dismiss(index);
}
}
private void Dismiss(int index)
{
var toast = _toasts[index];
_toasts.RemoveAt(index);
_dismissAt.RemoveAt(index);
toast.Root.RemoveFromHierarchy();
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 57e0ed949960344bd80072dd54a52c4f
@@ -1,134 +0,0 @@
using System.Collections;
using System.Text;
using UnityEngine;
using UnityEngine.UIElements;
namespace LiveOpsExamples
{
public static class UiDebugProbe
{
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
private static void Install()
{
new GameObject("UiDebugProbe").AddComponent<Probe>();
}
private sealed class Probe : MonoBehaviour
{
private PanelRenderer _panelRenderer;
private VisualElement _root;
private IEnumerator Start()
{
yield return null;
yield return null;
_panelRenderer = FindFirstObjectByType<PanelRenderer>();
if (_panelRenderer == null)
{
Debug.Log("[UiProbe] PanelRenderer: NOT FOUND");
}
else
{
_panelRenderer.RegisterUIReloadCallback(OnUIReload);
}
if (_root == null)
{
Dump("after-scene-load");
}
while (true)
{
yield return new WaitForSecondsRealtime(10f);
Dump("periodic");
}
}
private void OnDestroy()
{
if (_panelRenderer != null)
{
_panelRenderer.UnregisterUIReloadCallback(OnUIReload);
}
}
private void OnUIReload(PanelRenderer renderer, VisualElement root)
{
_root = root;
Dump("ui-reload");
}
private void Dump(string tag)
{
var sb = new StringBuilder();
sb.AppendLine($"[UiProbe] --- {tag} ---");
sb.AppendLine($"screen={Screen.width}x{Screen.height}");
if (_panelRenderer == null)
{
sb.AppendLine("PanelRenderer: NOT FOUND");
Debug.Log(sb.ToString());
return;
}
var ps = _panelRenderer.panelSettings;
sb.AppendLine(ps == null
? "panelSettings: NULL"
: $"panelSettings={ps.name} scaleMode={ps.scaleMode} ref={ps.referenceResolution.x}x{ps.referenceResolution.y} match={ps.match} scale={ps.scale}");
if (_root == null)
{
sb.AppendLine("root: NULL (reload callback not fired yet)");
Debug.Log(sb.ToString());
return;
}
sb.AppendLine($"root worldBound={_root.worldBound} children={_root.childCount}");
var uiRoot = _root.childCount > 0 ? _root[0] : null;
sb.AppendLine($"uiRoot={uiRoot?.name} children={uiRoot?.childCount}");
if (uiRoot != null)
{
foreach (var child in uiRoot.Children())
{
Describe(sb, child);
}
}
var renderers = FindObjectsByType<PanelRenderer>(FindObjectsSortMode.None);
sb.AppendLine($"panelRenderers={renderers.Length} panel={(_root.panel == null ? "null" : "ok")}");
Describe(sb, _root.Q("hud-score"));
Describe(sb, _root.Q("hud-timer-fill"));
Describe(sb, _root.Q("session-card"));
Describe(sb, _root.Q("remote-config"));
Describe(sb, _root.Q("event-log-scroll"));
var controller = FindFirstObjectByType<CozyCollectorController>();
sb.AppendLine(controller == null
? "controller: NOT FOUND"
: $"controller phase={controller.Phase} activeModal={controller.ActiveModal} status='{controller.StatusMessage}'");
var cam = Camera.main;
sb.AppendLine(cam == null
? "camera: NOT FOUND"
: $"camera rect={cam.rect} targetTexture={(cam.targetTexture == null ? "null" : cam.targetTexture.name)} enabled={cam.enabled} clearFlags={cam.clearFlags} time={Time.time:0.#} timeScale={Time.timeScale}");
Debug.Log(sb.ToString());
}
private static void Describe(StringBuilder sb, VisualElement element)
{
if (element == null)
{
sb.AppendLine(" <element not found>");
return;
}
var r = element.resolvedStyle;
sb.AppendLine($" {element.name}: display={r.display} visibility={r.visibility} opacity={r.opacity} " +
$"size={r.width:0.#}x{r.height:0.#} worldBound={element.worldBound} classes='{string.Join(",", element.GetClasses())}'");
}
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: b70a6370f0b8b48aabebe030ae087adf
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: e55519d1fbcf4d9e92a3d9a8f7e3b00d
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

Before

Width:  |  Height:  |  Size: 135 KiB

@@ -1,181 +0,0 @@
fileFormatVersion: 2
guid: ca0ac79e8cb24691b33208b45e68fe13
TextureImporter:
internalIDToNameTable:
- first:
213: 21300000
second: acorn
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: -1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 1
swizzle: 50462976
cookieLightType: 1
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
- serializedVersion: 4
buildTarget: iOS
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: acorn
rect:
serializedVersion: 2
x: 0
y: 0
width: 309
height: 392
alignment: 0
pivot: {x: 0.5, y: 0.5}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: 0
bones: []
spriteID: e5cb0c22ba074776864e34d6364f01a5
internalID: 0
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 MiB

@@ -1,181 +0,0 @@
fileFormatVersion: 2
guid: e8139865590c408789e137275b78e239
TextureImporter:
internalIDToNameTable:
- first:
213: 21300000
second: cozy-camp-bg
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: -1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 1
swizzle: 50462976
cookieLightType: 1
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
- serializedVersion: 4
buildTarget: iOS
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: cozy-camp-bg
rect:
serializedVersion: 2
x: 0
y: 0
width: 1672
height: 941
alignment: 0
pivot: {x: 0.5, y: 0.5}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: 0
bones: []
spriteID: d9ccce1352584530bd1d45ff1476f485
internalID: 0
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

@@ -1,181 +0,0 @@
fileFormatVersion: 2
guid: 8b3f9a4a409e412780aa51d52bfdb7b0
TextureImporter:
internalIDToNameTable:
- first:
213: 21300000
second: moonberry
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: -1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 1
swizzle: 50462976
cookieLightType: 1
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
- serializedVersion: 4
buildTarget: iOS
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: moonberry
rect:
serializedVersion: 2
x: 0
y: 0
width: 360
height: 354
alignment: 0
pivot: {x: 0.5, y: 0.5}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: 0
bones: []
spriteID: 07b3b8253d5a40d497c0328a18a5f9c6
internalID: 0
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

Before

Width:  |  Height:  |  Size: 189 KiB

@@ -1,181 +0,0 @@
fileFormatVersion: 2
guid: 695606af95a0452790cf9228c0cc9f76
TextureImporter:
internalIDToNameTable:
- first:
213: 21300000
second: player
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: -1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 1
swizzle: 50462976
cookieLightType: 1
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
- serializedVersion: 4
buildTarget: iOS
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: player
rect:
serializedVersion: 2
x: 0
y: 0
width: 345
height: 449
alignment: 0
pivot: {x: 0.5, y: 0.5}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: 0
bones: []
spriteID: a72427bf101a4b6a84301acd98db55a3
internalID: 0
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

Before

Width:  |  Height:  |  Size: 182 KiB

@@ -1,181 +0,0 @@
fileFormatVersion: 2
guid: c41fcc3b35c944ffa18a34b6c4dc2cd6
TextureImporter:
internalIDToNameTable:
- first:
213: 21300000
second: snack
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: -1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 1
swizzle: 50462976
cookieLightType: 1
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
- serializedVersion: 4
buildTarget: iOS
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: snack
rect:
serializedVersion: 2
x: 0
y: 0
width: 322
height: 406
alignment: 0
pivot: {x: 0.5, y: 0.5}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: 0
bones: []
spriteID: 8a1e24f0bfe74ef28116f0b8735cca60
internalID: 0
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

@@ -1,181 +0,0 @@
fileFormatVersion: 2
guid: b0d70332788c4ff7831161da4a2e71ff
TextureImporter:
internalIDToNameTable:
- first:
213: 21300000
second: star
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: -1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 1
swizzle: 50462976
cookieLightType: 1
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
- serializedVersion: 4
buildTarget: iOS
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 1
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: star
rect:
serializedVersion: 2
x: 0
y: 0
width: 363
height: 366
alignment: 0
pivot: {x: 0.5, y: 0.5}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: 0
bones: []
spriteID: bbed52f8ed774bafafcd92dfe58ab093
internalID: 0
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
@@ -1,10 +0,0 @@
<UXML xmlns="UnityEngine.UIElements">
<VisualElement name="backpack-item-row" class="row" style="flex-direction: row; align-items: center; padding-left: 10px; padding-right: 10px; padding-top: 6px; padding-bottom: 6px;">
<VisualElement name="item-icon" style="width: 40px; height: 40px; border-top-left-radius: 9px; border-top-right-radius: 9px; border-bottom-left-radius: 9px; border-bottom-right-radius: 9px; background-color: rgb(30, 51, 44); margin-right: 10px; flex-shrink: 0;" />
<VisualElement name="item-body" style="flex-grow: 1; flex-shrink: 1;">
<Label name="item-name" text="Item name" style="font-size: 14px; -unity-font-style: bold;" />
<Label name="item-meta" text="slug" class="label-muted" style="font-size: 11px;" />
</VisualElement>
<Label name="item-amount" text="×1" class="value-accent value-mono" style="width: 48px; font-size: 14px; -unity-text-align: middle-right; flex-shrink: 0;" />
</VisualElement>
</UXML>
@@ -1,10 +0,0 @@
fileFormatVersion: 2
guid: 29a6c5a5b6bb94220b5c2378923d4047
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}
-320
View File
@@ -1,320 +0,0 @@
#ui-root {
--bg: #0c1512;
--bg-2: #0f1c18;
--panel: #16241f;
--panel-2: #1b2c26;
--row: #1e332c;
--stroke: #2c463d;
--stroke-soft: #24382f;
--backdrop: rgba(6, 16, 14, 0.62);
--accent: #f1c67d;
--accent-bright: #ffe0a0;
--text: #f6f1e0;
--text-2: #c7cdba;
--muted: #8f9a86;
--primary: #c8863c;
--primary-hover: #dd9a44;
--primary-press: #a96f30;
--primary-fg: #211406;
--danger: #c85a3c;
--danger-hover: #d96f4f;
--success: #6fae5f;
--radius: 14px;
--radius-sm: 9px;
--radius-pill: 999px;
color: var(--text);
font-size: 14px;
flex-grow: 1;
background-color: var(--bg);
}
.panel-fill {
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
}
.card {
background-color: var(--panel);
border-color: var(--stroke-soft);
border-width: 1px;
border-radius: var(--radius);
padding: 14px;
}
.card-title {
font-size: 12px;
-unity-font-style: bold;
letter-spacing: 1.3px;
color: var(--accent);
margin-bottom: 10px;
}
.card-hint {
font-size: 11px;
color: var(--muted);
}
.btn {
border-radius: var(--radius-sm);
border-width: 0;
padding: 10px 18px;
font-size: 14px;
-unity-font-style: bold;
-unity-text-align: middle-center;
transition-property: background-color;
transition-duration: 0.12s;
transition-timing-function: ease;
}
.btn:disabled {
opacity: 0.5;
}
.btn-primary {
background-color: var(--primary);
color: var(--primary-fg);
}
.btn-primary:hover {
background-color: var(--primary-hover);
}
.btn-primary:active {
background-color: var(--primary-press);
}
.btn-secondary {
background-color: var(--panel-2);
color: var(--text);
border-color: var(--stroke);
border-width: 1px;
}
.btn-secondary:hover {
background-color: var(--stroke-soft);
}
.btn-secondary:active {
background-color: var(--panel);
}
.btn-ghost {
background-color: rgba(0, 0, 0, 0);
color: var(--text-2);
border-color: var(--stroke);
border-width: 1px;
}
.btn-ghost:hover {
background-color: rgba(255, 255, 255, 0.06);
}
.btn-ghost:active {
background-color: rgba(255, 255, 255, 0.1);
}
.btn-danger {
background-color: var(--danger);
color: #2a0f06;
}
.btn-danger:hover {
background-color: var(--danger-hover);
}
.btn-danger:active {
background-color: var(--danger);
}
.row {
flex-direction: row;
align-items: center;
background-color: var(--panel-2);
border-color: var(--stroke-soft);
border-width: 1px;
border-radius: var(--radius-sm);
padding: 11px 12px;
margin-bottom: 8px;
transition-property: background-color, border-color;
transition-duration: 0.6s;
transition-timing-function: ease;
}
.pill {
border-radius: var(--radius-pill);
border-color: var(--stroke);
border-width: 1px;
background-color: var(--panel);
padding: 5px 12px;
font-size: 12px;
-unity-font-style: bold;
color: var(--text-2);
}
.tag {
border-radius: var(--radius-pill);
padding: 2px 6px;
font-size: 10px;
-unity-font-style: bold;
letter-spacing: 0.6px;
-unity-text-align: middle-center;
color: var(--bg);
}
.chip {
flex-direction: column;
background-color: rgba(14, 26, 22, 0.78);
border-color: var(--stroke);
border-width: 1px;
border-radius: var(--radius-sm);
padding: 7px 14px;
}
.label-muted {
font-size: 10px;
letter-spacing: 1px;
color: var(--muted);
}
.value-mono {
font-size: 13px;
color: var(--text-2);
}
.value-accent {
font-size: 16px;
-unity-font-style: bold;
color: var(--accent-bright);
}
.modal-overlay {
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
align-items: center;
justify-content: center;
padding: 24px;
background-color: var(--backdrop);
transition-property: opacity;
transition-duration: 0.15s;
transition-timing-function: ease-out;
}
.modal-window {
width: 600px;
max-height: 90%;
background-color: var(--panel);
border-color: var(--stroke);
border-width: 1px;
border-radius: var(--radius);
transition-property: opacity, scale;
transition-duration: 0.18s;
transition-timing-function: ease-out;
}
.modal-title {
font-size: 24px;
-unity-font-style: bold;
color: var(--accent-bright);
}
.modal-subtitle {
margin-top: 3px;
font-size: 13px;
color: var(--text-2);
}
.modal-footer {
flex-direction: row;
justify-content: flex-end;
padding: 14px 20px 18px;
}
.scroll-list {
flex-grow: 1;
flex-shrink: 1;
}
.empty-note {
color: var(--text-2);
font-size: 14px;
-unity-text-align: middle-center;
padding: 24px 8px;
}
.stat-tile {
flex-grow: 1;
flex-basis: 0;
align-items: center;
padding: 10px;
border-radius: var(--radius-sm);
border-color: var(--stroke-soft);
border-width: 1px;
background-color: var(--panel-2);
}
.stat-value {
font-size: 24px;
-unity-font-style: bold;
color: var(--accent-bright);
}
.stat-label {
font-size: 10px;
letter-spacing: 0.8px;
color: var(--muted);
}
#hud-timer-fill {
background-color: var(--accent);
transition-property: background-color;
transition-duration: 0.25s;
}
#hud-timer-fill.timer-low {
background-color: var(--danger);
}
.flash {
background-color: rgba(241, 198, 125, 0.32);
border-color: var(--accent);
transition-property: background-color, border-color;
transition-duration: 0.6s;
transition-timing-function: ease-out;
}
.tone-info #toast-accent {
background-color: var(--accent);
}
.tone-success #toast-accent {
background-color: var(--success);
}
.tone-error #toast-accent {
background-color: var(--danger);
}
.kv-row {
flex-direction: row;
justify-content: space-between;
padding: 4px 0;
transition-property: background-color, border-color;
transition-duration: 0.6s;
transition-timing-function: ease;
}
.kv-key {
font-size: 12px;
color: var(--muted);
}
.kv-value {
font-size: 12px;
color: var(--text-2);
}
@@ -1,12 +0,0 @@
fileFormatVersion: 2
guid: 35fd0b224430d4ac698ff605ce89eb27
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0}
disableValidation: 0
unsupportedSelectorAction: 0
@@ -1,55 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 19101, guid: 0000000000000000e000000000000000, type: 0}
m_Name: CozyCollectorPanelSettings
m_EditorClassIdentifier: UnityEngine.dll::UnityEngine.UIElements.PanelSettings
themeUss: {fileID: 6688696115612101803, guid: 0000000000000000d000000000000000,
type: 0}
m_DisableNoThemeWarning: 0
m_TargetTexture: {fileID: 0}
m_RenderMode: 0
m_ColliderUpdateMode: 0
m_ColliderIsTrigger: 1
m_ScaleMode: 2
m_ReferenceSpritePixelsPerUnit: 100
m_PixelsPerUnit: 100
m_Scale: 1
m_ReferenceDpi: 96
m_FallbackDpi: 96
m_ReferenceResolution: {x: 1600, y: 900}
m_ScreenMatchMode: 0
m_Match: 0.5
m_SortingOrder: 0
m_TargetDisplay: 0
m_BindingLogLevel: 0
m_ClearDepthStencil: 1
m_ClearColor: 0
m_ColorClearValue: {r: 0, g: 0, b: 0, a: 0}
m_VertexBudget: 0
m_TextureSlotCount: 8
m_DynamicAtlasSettings:
m_MinAtlasSize: 64
m_MaxAtlasSize: 4096
m_MaxSubTextureSize: 64
m_ActiveFilters: -1
m_AtlasBlitShader: {fileID: 9101, guid: 0000000000000000f000000000000000, type: 0}
m_DefaultShader: {fileID: 9100, guid: 0000000000000000f000000000000000, type: 0}
m_RuntimeGaussianBlurShader: {fileID: 20300, guid: 0000000000000000f000000000000000,
type: 0}
m_RuntimeColorEffectShader: {fileID: 20301, guid: 0000000000000000f000000000000000,
type: 0}
m_SDFShader: {fileID: 19011, guid: 0000000000000000f000000000000000, type: 0}
m_BitmapShader: {fileID: 9001, guid: 0000000000000000f000000000000000, type: 0}
m_SpriteShader: {fileID: 19012, guid: 0000000000000000f000000000000000, type: 0}
m_ICUDataAsset: {fileID: 20204, guid: 0000000000000000f000000000000000, type: 0}
forceGammaRendering: 0
textSettings: {fileID: 0}
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 728073018ae96457c9d67e8cc2652ac8
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -1,190 +0,0 @@
<UXML xmlns="UnityEngine.UIElements">
<VisualElement name="ui-root" style="flex-grow: 1;">
<Style src="CozyCollector.uss" />
<VisualElement name="hud" style="position: absolute; left: 0; top: 0; bottom: 0; width: 1200px; padding: 16px; flex-direction: column; justify-content: space-between;">
<VisualElement style="flex-direction: row; justify-content: space-between; align-items: flex-start;">
<VisualElement style="flex-direction: row;">
<VisualElement class="chip" style="margin-right: 10px;">
<Label class="label-muted" text="Score" />
<Label name="hud-score" class="value-accent" text="0" />
</VisualElement>
<VisualElement class="chip">
<Label class="label-muted" text="Best" />
<Label name="hud-best" class="value-mono" text="0" />
</VisualElement>
</VisualElement>
<VisualElement class="chip" style="min-width: 140px;">
<Label class="label-muted" text="Time left" />
<Label name="hud-time-left" class="value-mono" text="60s" />
<VisualElement name="hud-timer-bar" style="height: 5px; margin-top: 5px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; background-color: rgba(0, 0, 0, 0.35); overflow: hidden;">
<VisualElement name="hud-timer-fill" style="height: 100%; width: 100%; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px;" />
</VisualElement>
</VisualElement>
</VisualElement>
<VisualElement style="flex-direction: row; justify-content: space-between; align-items: flex-end;">
<VisualElement style="flex-direction: row;">
<Button name="hud-shop-button" class="btn btn-secondary" text="Shop" style="margin-right: 10px;" />
<Button name="hud-backpack-button" class="btn btn-secondary" text="Backpack" />
</VisualElement>
<VisualElement class="chip">
<Label class="label-muted" text="Wallet" />
<Label name="hud-wallet" class="value-accent" text="—" />
</VisualElement>
</VisualElement>
</VisualElement>
<VisualElement name="right-rail" style="position: absolute; right: 0; top: 0; bottom: 0; width: 400px; padding: 14px; flex-direction: column; background-color: #0c1512; border-left-width: 1px; border-left-color: #2c463d;">
<VisualElement name="session-card" class="card" style="margin-bottom: 12px;">
<VisualElement style="flex-direction: row; justify-content: space-between; align-items: center; margin-bottom: 10px;">
<Label class="card-title" text="Session" />
<Label class="card-hint" text="device login" />
</VisualElement>
<Label name="session-nickname" class="value-accent" text="—" style="font-size: 16px; margin-bottom: 8px;" />
<VisualElement class="kv-row">
<Label class="kv-key" text="Player" />
<Label name="session-player-id" class="kv-value" text="—" />
</VisualElement>
<VisualElement class="kv-row">
<Label class="kv-key" text="Device" />
<Label name="session-device-id" class="kv-value" text="—" />
</VisualElement>
<VisualElement class="kv-row">
<Label class="kv-key" text="Region" />
<Label name="session-region" class="kv-value" text="—" />
</VisualElement>
<VisualElement class="kv-row">
<Label class="kv-key" text="Project" />
<Label name="session-project-key" class="kv-value" text="—" />
</VisualElement>
<Label name="session-wallets" class="label-muted" text="No wallets" style="margin-top: 8px;" />
</VisualElement>
<VisualElement name="remote-config" class="card" style="margin-bottom: 12px;">
<VisualElement style="flex-direction: row; justify-content: space-between; align-items: center; margin-bottom: 10px;">
<Label class="card-title" text="Remote Config" />
<Label class="card-hint" text="live · no client build" />
</VisualElement>
<VisualElement name="rc-row-player-speed" class="row" style="flex-direction: row; justify-content: space-between; align-items: center; margin-bottom: 6px;">
<Label class="label-muted" text="player speed" />
<Label name="rc-value-player-speed" class="value-accent" text="—" />
</VisualElement>
<VisualElement name="rc-row-spawn-interval" class="row" style="flex-direction: row; justify-content: space-between; align-items: center; margin-bottom: 6px;">
<Label class="label-muted" text="spawn interval" />
<Label name="rc-value-spawn-interval" class="value-accent" text="—" />
</VisualElement>
<VisualElement name="rc-row-collectible-score" class="row" style="flex-direction: row; justify-content: space-between; align-items: center; margin-bottom: 6px;">
<Label class="label-muted" text="collectible score" />
<Label name="rc-value-collectible-score" class="value-accent" text="—" />
</VisualElement>
<VisualElement name="rc-row-round-seconds" class="row" style="flex-direction: row; justify-content: space-between; align-items: center;">
<Label class="label-muted" text="round seconds" />
<Label name="rc-value-round-seconds" class="value-accent" text="—" />
</VisualElement>
</VisualElement>
<VisualElement name="event-inspector" class="card panel-fill" style="flex-grow: 1; flex-shrink: 1;">
<VisualElement style="flex-direction: row; justify-content: space-between; align-items: center; margin-bottom: 10px;">
<Label class="card-title" text="Event Inspector" />
<Label class="card-hint" text="live" />
</VisualElement>
<ScrollView name="event-log-scroll" class="scroll-list" style="flex-grow: 1; flex-shrink: 1;" />
<Label name="event-log-empty" class="empty-note" text="No events yet" />
</VisualElement>
</VisualElement>
<VisualElement name="toasts" style="position: absolute; left: 864px; bottom: 16px; width: 320px;" />
<VisualElement name="boot-overlay" style="position: absolute; left: 0; right: 0; top: 0; bottom: 0; align-items: center; justify-content: center; background-color: rgba(6, 16, 14, 0.62);">
<VisualElement class="card" style="width: 420px; padding: 30px; align-items: center;">
<VisualElement name="boot-spinner" style="width: 22px; height: 22px; margin-bottom: 14px; border-top-left-radius: 11px; border-top-right-radius: 11px; border-bottom-left-radius: 11px; border-bottom-right-radius: 11px; border-left-width: 3px; border-right-width: 3px; border-top-width: 3px; border-bottom-width: 3px; border-left-color: rgba(241, 198, 125, 0.28); border-right-color: rgba(241, 198, 125, 0.28); border-bottom-color: rgba(241, 198, 125, 0.28); border-top-color: #f1c67d;" />
<Label class="modal-title" text="Cozy Collector" />
<Label name="boot-status" class="label-muted" text="Starting…" style="margin-top: 8px;" />
</VisualElement>
</VisualElement>
<VisualElement name="setup-overlay" style="position: absolute; left: 0; right: 0; top: 0; bottom: 0; align-items: center; justify-content: center; background-color: rgba(6, 16, 14, 0.62);">
<VisualElement class="card" style="width: 480px; padding: 30px; align-items: center;">
<Label class="modal-title" text="Setup required" />
<Label name="setup-error" class="label-muted" text="—" style="margin-top: 12px;" />
</VisualElement>
</VisualElement>
<VisualElement name="shop-modal" class="modal-overlay">
<VisualElement class="modal-window" style="max-height: 80%;">
<VisualElement style="padding: 18px; padding-bottom: 8px;">
<Label class="modal-title" text="Camp Shop" />
<Label name="shop-wallet" class="modal-subtitle" text="Wallet: —" />
</VisualElement>
<ScrollView name="shop-offers-scroll" class="scroll-list" style="flex-grow: 1; flex-shrink: 1; padding-left: 18px; padding-right: 18px;" />
<Label name="shop-empty" class="empty-note" text="No offers available" />
<VisualElement class="modal-footer">
<Button name="shop-close-button" class="btn btn-secondary" text="Close" />
</VisualElement>
</VisualElement>
</VisualElement>
<VisualElement name="backpack-modal" class="modal-overlay">
<VisualElement class="modal-window" style="max-height: 80%;">
<VisualElement style="padding: 18px; padding-bottom: 8px;">
<Label class="modal-title" text="Backpack" />
<Label class="modal-subtitle" text="Server-owned player inventory" />
</VisualElement>
<ScrollView name="backpack-items-scroll" class="scroll-list" style="flex-grow: 1; flex-shrink: 1; padding-left: 18px; padding-right: 18px;" />
<Label name="backpack-empty" class="empty-note" text="Backpack is empty" />
<VisualElement class="modal-footer">
<Button name="backpack-close-button" class="btn btn-secondary" text="Close" />
</VisualElement>
</VisualElement>
</VisualElement>
<VisualElement name="offer-modal" class="modal-overlay">
<VisualElement class="modal-window" style="width: 480px;">
<VisualElement style="padding: 18px; padding-bottom: 8px;">
<Label name="offer-title" class="modal-title" text="Special Offer" />
<Label class="modal-subtitle" text="Delivered by a scenario store-offer node" />
</VisualElement>
<VisualElement style="padding-left: 18px; padding-right: 18px; padding-bottom: 8px;">
<Label name="offer-name" class="value-accent" text="—" style="font-size: 16px;" />
<Label name="offer-price" class="label-muted" text="—" style="margin-top: 4px;" />
</VisualElement>
<VisualElement class="modal-footer">
<Button name="offer-decline-button" class="btn btn-danger" text="Decline" style="margin-right: 10px;" />
<Button name="offer-buy-button" class="btn btn-primary" text="Buy" style="margin-right: 10px;" />
<Button name="offer-close-button" class="btn btn-ghost" text="Close" />
</VisualElement>
</VisualElement>
</VisualElement>
<VisualElement name="round-result-modal" class="modal-overlay">
<VisualElement class="modal-window" style="max-height: 80%;">
<VisualElement style="padding: 18px; padding-bottom: 8px;">
<Label class="modal-title" text="Round Result" />
<Label class="modal-subtitle" text="scenario leaderboard" />
</VisualElement>
<VisualElement style="flex-direction: row; padding-left: 18px; padding-right: 18px; padding-bottom: 12px;">
<VisualElement class="stat-tile" style="flex-grow: 1; margin-right: 10px;">
<Label name="rr-score" class="stat-value" text="0" />
<Label class="stat-label" text="Score" />
</VisualElement>
<VisualElement class="stat-tile" style="flex-grow: 1; margin-right: 10px;">
<Label name="rr-best" class="stat-value" text="0" />
<Label class="stat-label" text="Best" />
</VisualElement>
<VisualElement class="stat-tile" style="flex-grow: 1;">
<Label name="rr-collected" class="stat-value" text="0" />
<Label class="stat-label" text="Collected" />
</VisualElement>
</VisualElement>
<ScrollView name="rr-leaderboard-scroll" class="scroll-list" style="flex-grow: 1; flex-shrink: 1; padding-left: 18px; padding-right: 18px;" />
<Label name="rr-empty" class="empty-note" text="No leaderboard entries" />
<VisualElement class="modal-footer">
<Button name="rr-claim-button" class="btn btn-primary" text="Claim" style="margin-right: 10px;" />
<Button name="rr-play-again-button" class="btn btn-secondary" text="Play Again" style="margin-right: 10px;" />
<Button name="rr-end-button" class="btn btn-ghost" text="End" style="margin-right: 10px;" />
<Button name="rr-close-button" class="btn btn-ghost" text="Close" />
</VisualElement>
</VisualElement>
</VisualElement>
</VisualElement>
</UXML>
@@ -1,10 +0,0 @@
fileFormatVersion: 2
guid: 766f5cae1f4354e20b4043cf1c6756bf
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}
@@ -1,7 +0,0 @@
<UXML xmlns="UnityEngine.UIElements">
<VisualElement name="leaderboard-row" class="row" style="flex-direction: row; align-items: center; padding-left: 10px; padding-right: 10px; padding-top: 6px; padding-bottom: 6px;">
<Label name="lb-rank" text="#1" class="value-accent value-mono" style="width: 44px; font-size: 14px; -unity-font-style: bold; flex-shrink: 0;" />
<Label name="lb-player" text="Player" style="flex-grow: 1; flex-shrink: 1; font-size: 14px;" />
<Label name="lb-score" text="0" class="value-accent value-mono" style="width: 76px; font-size: 14px; -unity-text-align: middle-right; flex-shrink: 0;" />
</VisualElement>
</UXML>
@@ -1,10 +0,0 @@
fileFormatVersion: 2
guid: e171bce5673384061b0cb20cbe5082d1
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}
-10
View File
@@ -1,10 +0,0 @@
<UXML xmlns="UnityEngine.UIElements">
<VisualElement name="log-row" class="row" style="flex-direction: row; align-items: center; padding-left: 8px; padding-right: 8px; padding-top: 4px; padding-bottom: 4px;">
<Label name="log-time" text="12:00:00" class="label-muted value-mono" style="width: 64px; font-size: 11px; flex-shrink: 0;" />
<Label name="log-tag" text="TAG" class="tag" style="width: 90px; margin-left: 8px; margin-right: 8px; font-size: 10px; -unity-font-style: bold; -unity-text-align: middle-center; flex-shrink: 0;" />
<VisualElement name="log-body" style="flex-grow: 1; flex-shrink: 1;">
<Label name="log-message" text="event_name" style="font-size: 12px;" />
<Label name="log-detail" text="{ }" class="label-muted value-mono" style="font-size: 10px;" />
</VisualElement>
</VisualElement>
</UXML>
@@ -1,10 +0,0 @@
fileFormatVersion: 2
guid: 94171891e540744b3a0f55b254cbe18b
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}
@@ -1,7 +0,0 @@
<UXML xmlns="UnityEngine.UIElements">
<VisualElement name="shop-offer-row" class="row" style="flex-direction: row; align-items: center; padding-left: 12px; padding-right: 8px; padding-top: 6px; padding-bottom: 6px;">
<Label name="offer-name" text="Offer name" style="flex-grow: 1; flex-shrink: 1; font-size: 14px;" />
<Label name="offer-price" text="$0.99" class="value-accent" style="width: 72px; font-size: 13px; -unity-text-align: middle-right; flex-shrink: 0;" />
<Button name="offer-buy-button" text="Buy" class="btn btn-primary" style="width: 72px; height: 32px; margin-left: 12px; flex-shrink: 0;" />
</VisualElement>
</UXML>
@@ -1,10 +0,0 @@
fileFormatVersion: 2
guid: 85424ff7d38f94ed08f809972c61617c
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}
-9
View File
@@ -1,9 +0,0 @@
<UXML xmlns="UnityEngine.UIElements">
<VisualElement name="toast-row" class="row tone-info" style="flex-direction: row; align-items: stretch; width: 320px;">
<VisualElement name="toast-accent" style="width: 4px; flex-shrink: 0;" />
<VisualElement name="toast-body" style="flex-grow: 1; flex-shrink: 1; padding-left: 12px; padding-right: 8px; padding-top: 8px; padding-bottom: 8px;">
<Label name="toast-title" text="Toast title" style="font-size: 14px; -unity-font-style: bold;" />
<Label name="toast-message" text="Toast message" class="label-muted" style="font-size: 12px; white-space: normal; margin-top: 2px;" />
</VisualElement>
</VisualElement>
</UXML>
@@ -1,10 +0,0 @@
fileFormatVersion: 2
guid: 3a2038228118b4a09a3a242b8a1fc1d4
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}

Some files were not shown because too many files have changed in this diff Show More