commit 9a7b4a57dc1200883222d62b57c36df8da826e0c Author: rudder Date: Wed Aug 12 14:03:44 2026 +0300 Initial commit diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..25a3e27 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,7 @@ +# To learn more about .editorconfig see https://aka.ms/editorconfigdocs + +# All files +[*] +indent_style = space +indent_size = 2 + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7182067 --- /dev/null +++ b/.gitignore @@ -0,0 +1,36 @@ +/[Ll]ibrary/ +/[Tt]emp/ +/[Ll]ogs/ +/[Oo]bj/ +/[Bb]uild/ +/[Bb]uilds/ + +# Visual Studio / Rider +.vs/ +.idea/ +*.csproj +*.sln +*.suo +*.user +*.userprefs +*.pidb +*.booproj +*.svd + +# macOS +.DS_Store + +# Unity crash reports +sysInfo.txt + +# Build artifacts +*.apk +*.unitypackage +ExportedObj/ + +# VSCode +.vscode/settings.json + +# Local Rudder configuration (contains a real project key; copy LiveOpsLocal.asset.example instead) +/Assets/LiveOpsLocal.asset +/Assets/LiveOpsLocal.asset.meta diff --git a/Assets/LiveOpsExamples.meta b/Assets/LiveOpsExamples.meta new file mode 100644 index 0000000..ee1b726 --- /dev/null +++ b/Assets/LiveOpsExamples.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7a3b8c1d9e2f4a5b6c7d8e9f0a1b2c3d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LiveOpsExamples/CozyCollectorSpriteLibrary.asset b/Assets/LiveOpsExamples/CozyCollectorSpriteLibrary.asset new file mode 100644 index 0000000..f21cc14 --- /dev/null +++ b/Assets/LiveOpsExamples/CozyCollectorSpriteLibrary.asset @@ -0,0 +1,20 @@ +%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} diff --git a/Assets/LiveOpsExamples/CozyCollectorSpriteLibrary.asset.meta b/Assets/LiveOpsExamples/CozyCollectorSpriteLibrary.asset.meta new file mode 100644 index 0000000..93cb412 --- /dev/null +++ b/Assets/LiveOpsExamples/CozyCollectorSpriteLibrary.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 06fcf2ebf537145de9bab548922829e1 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LiveOpsExamples/Editor.meta b/Assets/LiveOpsExamples/Editor.meta new file mode 100644 index 0000000..e4b4c24 --- /dev/null +++ b/Assets/LiveOpsExamples/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LiveOpsExamples/Editor/CozyCollectorBake.Assets.cs b/Assets/LiveOpsExamples/Editor/CozyCollectorBake.Assets.cs new file mode 100644 index 0000000..ad5b159 --- /dev/null +++ b/Assets/LiveOpsExamples/Editor/CozyCollectorBake.Assets.cs @@ -0,0 +1,60 @@ +using LiveOpsExamples; +using UnityEditor; +using UnityEngine; + +namespace LiveOpsExamples.Editor +{ + /// + /// Bakes the Cozy Collector ScriptableObject assets. Idempotent: writes to + /// fixed asset paths and overwrites whatever is already there. + /// + 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(SpriteLibraryAssetPath); + if (library == null) + { + library = ScriptableObject.CreateInstance(); + 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(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; + } + } +} diff --git a/Assets/LiveOpsExamples/Editor/CozyCollectorBake.Assets.cs.meta b/Assets/LiveOpsExamples/Editor/CozyCollectorBake.Assets.cs.meta new file mode 100644 index 0000000..ca1eafa --- /dev/null +++ b/Assets/LiveOpsExamples/Editor/CozyCollectorBake.Assets.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 640a29c33f5384caebacc7de21235ab8 \ No newline at end of file diff --git a/Assets/LiveOpsExamples/Editor/CozyCollectorBake.Prefabs.cs b/Assets/LiveOpsExamples/Editor/CozyCollectorBake.Prefabs.cs new file mode 100644 index 0000000..b243ac9 --- /dev/null +++ b/Assets/LiveOpsExamples/Editor/CozyCollectorBake.Prefabs.cs @@ -0,0 +1,166 @@ +using System.IO; +using LiveOpsExamples; +using TMPro; +using UnityEditor; +using UnityEngine; + +namespace LiveOpsExamples.Editor +{ + /// + /// Bakes the Cozy Collector gameplay prefabs. Idempotent: every prefab is + /// rebuilt from code and saved over the same fixed asset path. + /// + 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(); + collider.isTrigger = true; + collider.radius = 0.3f; + + var renderer = go.AddComponent(); + var sprite = AssetDatabase.LoadAssetAtPath(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(); + return go; + } + + private static GameObject BuildScorePopupPrefab() + { + var go = new GameObject("ScorePopup"); + + var label = go.AddComponent(); + AssignDefaultFont(label); + label.text = "+10"; + label.fontSize = 2.5f; + label.alignment = TextAlignmentOptions.Center; + label.color = Color.white; + + var view = go.AddComponent(); + WireObjectFields(view, ("label", label)); + return go; + } + + private static GameObject BuildCollectBurstPrefab() + { + var go = new GameObject("CollectBurst"); + var particles = go.AddComponent(); + + 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(); + renderer.renderMode = ParticleSystemRenderMode.Billboard; + var material = AssetDatabase.GetBuiltinExtraResource("Default-Particle.mat"); + if (material == null) + material = AssetDatabase.GetBuiltinExtraResource("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."); + } + } +} diff --git a/Assets/LiveOpsExamples/Editor/CozyCollectorBake.Prefabs.cs.meta b/Assets/LiveOpsExamples/Editor/CozyCollectorBake.Prefabs.cs.meta new file mode 100644 index 0000000..7d0bebc --- /dev/null +++ b/Assets/LiveOpsExamples/Editor/CozyCollectorBake.Prefabs.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5d0f038b4a90c45a8a95bf4f37221e78 \ No newline at end of file diff --git a/Assets/LiveOpsExamples/Editor/CozyCollectorBake.Scene.cs b/Assets/LiveOpsExamples/Editor/CozyCollectorBake.Scene.cs new file mode 100644 index 0000000..4d4e338 --- /dev/null +++ b/Assets/LiveOpsExamples/Editor/CozyCollectorBake.Scene.cs @@ -0,0 +1,258 @@ +using System.Collections.Generic; +using RudderSdk.Unity; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; + +namespace LiveOpsExamples.Editor +{ + /// + /// Bakes the Cozy Collector demo scene (world + camera + game setup) and saves it + /// to . UI is built by the CozyCollectorBake.Ui part. + /// Re-running overwrites the same scene asset. + /// + 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.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(); + renderer.sortingOrder = -10; + + var sprite = AssetDatabase.LoadAssetAtPath(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(); + + var playerGo = new GameObject("Player"); + playerGo.transform.SetParent(worldGo.transform, false); + playerRenderer = playerGo.AddComponent(); + playerRenderer.sprite = AssetDatabase.LoadAssetAtPath(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(); + body.bodyType = RigidbodyType2D.Kinematic; + body.simulated = true; + body.gravityScale = 0f; + + // Non-trigger collider so the snacks' trigger colliders fire OnTriggerEnter2D. + var collider = playerGo.AddComponent(); + 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(); + + return world; + } + + private static CozyCollectorController BuildSceneGameSetup(GameWorld world) + { + var setupGo = new GameObject("GameSetup"); + + var rudder = setupGo.AddComponent(); + var configuration = AssetDatabase.LoadAssetAtPath(ConfigurationPath); + if (configuration == null) + { + Debug.LogError($"[CozyCollectorBake] RudderConfiguration not found at {ConfigurationPath}."); + } + else + { + SetSceneReference(rudder, "_configuration", configuration); + } + + var controller = setupGo.AddComponent(); + 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(ScorePopupPrefabPath); + if (scorePopupPrefab != null) + { + SetSceneReference(world, "scorePopupPrefab", scorePopupPrefab); + } + + var collectBurstPrefab = LoadScenePrefabComponent(CollectBurstPrefabPath); + if (collectBurstPrefab != null) + { + SetSceneReference(world, "collectBurstPrefab", collectBurstPrefab); + } + } + + private static void WireSceneSpawner(SnackSpawner spawner, Transform snacksParent) + { + var snackPrefab = LoadScenePrefabComponent(SnackPrefabPath); + if (snackPrefab != null) + { + SetSceneReference(spawner, "prefab", snackPrefab); + } + + var library = AssetDatabase.LoadAssetAtPath(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(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(string path) where T : Component + { + var prefab = AssetDatabase.LoadAssetAtPath(path); + var component = prefab != null ? prefab.GetComponent() : 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(); + } + } +} diff --git a/Assets/LiveOpsExamples/Editor/CozyCollectorBake.Scene.cs.meta b/Assets/LiveOpsExamples/Editor/CozyCollectorBake.Scene.cs.meta new file mode 100644 index 0000000..9ce19b4 --- /dev/null +++ b/Assets/LiveOpsExamples/Editor/CozyCollectorBake.Scene.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9b06747933b8c458b8262e8516634b14 \ No newline at end of file diff --git a/Assets/LiveOpsExamples/Editor/CozyCollectorBake.Ui.cs b/Assets/LiveOpsExamples/Editor/CozyCollectorBake.Ui.cs new file mode 100644 index 0000000..f5b03ab --- /dev/null +++ b/Assets/LiveOpsExamples/Editor/CozyCollectorBake.Ui.cs @@ -0,0 +1,144 @@ +using System; +using System.Reflection; +using LiveOpsExamples; +using UnityEditor; +using UnityEngine; +using UnityEngine.UIElements; +using Object = UnityEngine.Object; + +namespace LiveOpsExamples.Editor +{ + /// + /// 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 . + /// + 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(UiDocumentAssetPath); + + var uiGo = new GameObject("UI"); + var panelRenderer = uiGo.AddComponent(); + panelRenderer.panelSettings = panelSettings; + if (visualTree != null) + { + panelRenderer.visualTreeAsset = visualTree; + } + + WirePanel(uiGo.AddComponent(), panelRenderer, controller); + WirePanel(uiGo.AddComponent(), panelRenderer, controller); + + var eventInspector = uiGo.AddComponent(); + WirePanel(eventInspector, panelRenderer, controller); + WireTemplate(eventInspector, "logRowTemplate", UiLogRowTemplatePath); + + var hud = uiGo.AddComponent(); + WirePanel(hud, panelRenderer, controller); + SetSceneReference(hud, "world", world); + + var toasts = uiGo.AddComponent(); + WirePanel(toasts, panelRenderer, controller); + WireTemplate(toasts, "toastTemplate", UiToastTemplatePath); + + WirePanel(uiGo.AddComponent(), panelRenderer, controller); + WirePanel(uiGo.AddComponent(), panelRenderer, controller); + + var shop = uiGo.AddComponent(); + WirePanel(shop, panelRenderer, controller); + WireTemplate(shop, "shopOfferRowTemplate", UiShopOfferRowTemplatePath); + + var backpack = uiGo.AddComponent(); + WirePanel(backpack, panelRenderer, controller); + WireTemplate(backpack, "backpackItemRowTemplate", UiBackpackItemRowTemplatePath); + var spriteLibrary = AssetDatabase.LoadAssetAtPath(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(), panelRenderer, controller); + + var roundResult = uiGo.AddComponent(); + 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(templatePath); + if (template != null) + { + SetSceneReference(panel, fieldName, template); + } + } + + private static T LoadUiAsset(string path) where T : Object + { + var asset = AssetDatabase.LoadAssetAtPath(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(UiPanelSettingsPath); + if (settings != null) + { + return settings; + } + + EnsureAssetFolder(UiFolderPath); + + settings = ScriptableObject.CreateInstance(); + 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; + } + } +} diff --git a/Assets/LiveOpsExamples/Editor/CozyCollectorBake.Ui.cs.meta b/Assets/LiveOpsExamples/Editor/CozyCollectorBake.Ui.cs.meta new file mode 100644 index 0000000..a15e4ea --- /dev/null +++ b/Assets/LiveOpsExamples/Editor/CozyCollectorBake.Ui.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4ffeef7dc98af46a8b8bf186f4e2073b \ No newline at end of file diff --git a/Assets/LiveOpsExamples/LiveOpsCozyCollector.unity b/Assets/LiveOpsExamples/LiveOpsCozyCollector.unity new file mode 100644 index 0000000..76f882e --- /dev/null +++ b/Assets/LiveOpsExamples/LiveOpsCozyCollector.unity @@ -0,0 +1,950 @@ +%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} diff --git a/Assets/LiveOpsExamples/LiveOpsCozyCollector.unity.meta b/Assets/LiveOpsExamples/LiveOpsCozyCollector.unity.meta new file mode 100644 index 0000000..c76479c --- /dev/null +++ b/Assets/LiveOpsExamples/LiveOpsCozyCollector.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c8998a66d411a4e8d9ef54b6f261d320 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LiveOpsExamples/Prefabs.meta b/Assets/LiveOpsExamples/Prefabs.meta new file mode 100644 index 0000000..b489069 --- /dev/null +++ b/Assets/LiveOpsExamples/Prefabs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7de8ad00c34c14cdcb7a9bafc3250035 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LiveOpsExamples/Prefabs/CollectBurst.prefab b/Assets/LiveOpsExamples/Prefabs/CollectBurst.prefab new file mode 100644 index 0000000..d855da7 --- /dev/null +++ b/Assets/LiveOpsExamples/Prefabs/CollectBurst.prefab @@ -0,0 +1,4896 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &5032589694762663266 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5001759733890026992} + - component: {fileID: 4700352299658891627} + - component: {fileID: 6896765968463793040} + m_Layer: 0 + m_Name: CollectBurst + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5001759733890026992 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5032589694762663266} + 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!198 &4700352299658891627 +ParticleSystem: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5032589694762663266} + serializedVersion: 8 + lengthInSec: 0.5 + simulationSpeed: 1 + stopAction: 2 + cullingMode: 0 + ringBufferMode: 0 + ringBufferLoopRange: {x: 0, y: 1} + emitterVelocityMode: 1 + looping: 0 + prewarm: 0 + playOnAwake: 1 + useUnscaledTime: 0 + autoRandomSeed: 1 + startDelay: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + moveWithTransform: 0 + moveWithCustomTransform: {fileID: 0} + scalingMode: 1 + randomSeed: 0 + InitialModule: + serializedVersion: 3 + enabled: 1 + startLifetime: + serializedVersion: 2 + minMaxState: 0 + scalar: 0.45 + minScalar: 5 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startSpeed: + serializedVersion: 2 + minMaxState: 0 + scalar: 2 + minScalar: 5 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startColor: + serializedVersion: 2 + minMaxState: 0 + minColor: {r: 1, g: 1, b: 1, a: 1} + maxColor: {r: 1, g: 0.8235294, b: 0.49019608, a: 1} + maxGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + minGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + startSize: + serializedVersion: 2 + minMaxState: 0 + scalar: 0.15 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startSizeY: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startSizeZ: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startRotationX: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startRotationY: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startRotation: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + randomizeRotationDirection: 0 + gravitySource: 0 + maxNumParticles: 1000 + customEmitterVelocity: {x: 0, y: 0, z: 0} + size3D: 0 + rotation3D: 0 + gravityModifier: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + ShapeModule: + serializedVersion: 6 + enabled: 1 + type: 0 + angle: 25 + length: 5 + boxThickness: {x: 0, y: 0, z: 0} + radiusThickness: 1 + donutRadius: 0.2 + m_Position: {x: 0, y: 0, z: 0} + m_Rotation: {x: 0, y: 0, z: 0} + m_Scale: {x: 1, y: 1, z: 1} + placementMode: 0 + m_MeshMaterialIndex: 0 + m_MeshNormalOffset: 0 + m_MeshSpawn: + mode: 0 + spread: 0 + speed: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + m_Mesh: {fileID: 0} + m_MeshRenderer: {fileID: 0} + m_SkinnedMeshRenderer: {fileID: 0} + m_Sprite: {fileID: 0} + m_SpriteRenderer: {fileID: 0} + m_UseMeshMaterialIndex: 0 + m_UseMeshColors: 1 + alignToDirection: 0 + m_Texture: {fileID: 0} + m_TextureClipChannel: 3 + m_TextureClipThreshold: 0 + m_TextureUVChannel: 0 + m_TextureColorAffectsParticles: 1 + m_TextureAlphaAffectsParticles: 1 + m_TextureBilinearFiltering: 0 + randomDirectionAmount: 0 + sphericalDirectionAmount: 0 + randomPositionAmount: 0 + radius: + value: 0.1 + mode: 0 + spread: 0 + speed: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + arc: + value: 360 + mode: 0 + spread: 0 + speed: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + EmissionModule: + enabled: 1 + serializedVersion: 4 + rateOverTime: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 10 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + rateOverDistance: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + m_BurstCount: 1 + m_Bursts: + - serializedVersion: 2 + time: 0 + countCurve: + serializedVersion: 2 + minMaxState: 0 + scalar: 9 + minScalar: 30 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + cycleCount: 1 + repeatInterval: 0.01 + probability: 1 + SizeModule: + enabled: 0 + curve: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + y: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + z: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + separateAxes: 0 + RotationModule: + enabled: 0 + x: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + y: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curve: + serializedVersion: 2 + minMaxState: 0 + scalar: 0.7853982 + minScalar: 0.7853982 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + separateAxes: 0 + ColorModule: + enabled: 0 + gradient: + serializedVersion: 2 + minMaxState: 1 + minColor: {r: 1, g: 1, b: 1, a: 1} + maxColor: {r: 1, g: 1, b: 1, a: 1} + maxGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + minGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + UVModule: + serializedVersion: 2 + enabled: 0 + mode: 0 + timeMode: 0 + fps: 30 + frameOverTime: + serializedVersion: 2 + minMaxState: 1 + scalar: 0.9999 + minScalar: 0.9999 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + startFrame: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + speedRange: {x: 0, y: 1} + tilesX: 1 + tilesY: 1 + animationType: 0 + rowIndex: 0 + cycles: 1 + uvChannelMask: -1 + rowMode: 1 + sprites: + - sprite: {fileID: 0} + flipU: 0 + flipV: 0 + VelocityModule: + enabled: 0 + x: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + y: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + z: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + orbitalX: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + orbitalY: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + orbitalZ: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + orbitalOffsetX: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + orbitalOffsetY: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + orbitalOffsetZ: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + radial: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + speedModifier: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + inWorldSpace: 0 + InheritVelocityModule: + enabled: 0 + m_Mode: 0 + m_Curve: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + LifetimeByEmitterSpeedModule: + enabled: 0 + m_Curve: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: -0.8 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0.2 + inSlope: -0.8 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + m_Range: {x: 0, y: 1} + ForceModule: + enabled: 0 + x: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + y: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + z: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + inWorldSpace: 0 + randomizePerFrame: 0 + ExternalForcesModule: + serializedVersion: 2 + enabled: 0 + multiplierCurve: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + influenceFilter: 0 + influenceMask: + serializedVersion: 2 + m_Bits: 4294967295 + influenceList: [] + ClampVelocityModule: + enabled: 0 + x: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + y: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + z: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + magnitude: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + separateAxis: 0 + inWorldSpace: 0 + multiplyDragByParticleSize: 1 + multiplyDragByParticleVelocity: 1 + dampen: 0 + drag: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + NoiseModule: + enabled: 0 + strength: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + strengthY: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + strengthZ: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + separateAxes: 0 + frequency: 0.5 + damping: 1 + octaves: 1 + octaveMultiplier: 0.5 + octaveScale: 2 + quality: 1 + scrollSpeed: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + remap: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -1 + inSlope: 0 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 2 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + remapY: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -1 + inSlope: 0 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 2 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + remapZ: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: -1 + inSlope: 0 + outSlope: 2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 2 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + remapEnabled: 0 + positionAmount: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + rotationAmount: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + sizeAmount: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + SizeBySpeedModule: + enabled: 0 + curve: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + y: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + z: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + range: {x: 0, y: 1} + separateAxes: 0 + RotationBySpeedModule: + enabled: 0 + x: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + y: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + curve: + serializedVersion: 2 + minMaxState: 0 + scalar: 0.7853982 + minScalar: 0.7853982 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + separateAxes: 0 + range: {x: 0, y: 1} + ColorBySpeedModule: + enabled: 0 + gradient: + serializedVersion: 2 + minMaxState: 1 + minColor: {r: 1, g: 1, b: 1, a: 1} + maxColor: {r: 1, g: 1, b: 1, a: 1} + maxGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + minGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + range: {x: 0, y: 1} + CollisionModule: + enabled: 0 + serializedVersion: 4 + type: 0 + collisionMode: 0 + colliderForce: 0 + multiplyColliderForceByParticleSize: 0 + multiplyColliderForceByParticleSpeed: 0 + multiplyColliderForceByCollisionAngle: 1 + m_Planes: [] + m_Dampen: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + m_Bounce: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + m_EnergyLossOnCollision: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minKillSpeed: 0 + maxKillSpeed: 10000 + radiusScale: 1 + collidesWith: + serializedVersion: 2 + m_Bits: 4294967295 + maxCollisionShapes: 256 + quality: 0 + voxelSize: 0.5 + collisionMessages: 0 + collidesWithDynamic: 1 + interiorCollisions: 0 + TriggerModule: + enabled: 0 + serializedVersion: 2 + inside: 1 + outside: 0 + enter: 0 + exit: 0 + colliderQueryMode: 0 + radiusScale: 1 + primitives: [] + SubModule: + serializedVersion: 2 + enabled: 0 + subEmitters: + - serializedVersion: 3 + emitter: {fileID: 0} + type: 0 + properties: 0 + emitProbability: 1 + LightsModule: + enabled: 0 + ratio: 0 + light: {fileID: 0} + randomDistribution: 1 + color: 1 + range: 1 + intensity: 1 + rangeCurve: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + intensityCurve: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + maxLights: 20 + TrailModule: + enabled: 0 + mode: 0 + ratio: 1 + lifetime: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minVertexDistance: 0.2 + textureMode: 0 + textureScale: {x: 1, y: 1} + ribbonCount: 1 + shadowBias: 0.5 + worldSpace: 0 + dieWithParticles: 1 + sizeAffectsWidth: 1 + sizeAffectsLifetime: 0 + inheritParticleColor: 1 + generateLightingData: 0 + splitSubEmitterRibbons: 0 + attachRibbonsToTransform: 0 + colorOverLifetime: + serializedVersion: 2 + minMaxState: 0 + minColor: {r: 1, g: 1, b: 1, a: 1} + maxColor: {r: 1, g: 1, b: 1, a: 1} + maxGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + minGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + widthOverTrail: + serializedVersion: 2 + minMaxState: 0 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + colorOverTrail: + serializedVersion: 2 + minMaxState: 0 + minColor: {r: 1, g: 1, b: 1, a: 1} + maxColor: {r: 1, g: 1, b: 1, a: 1} + maxGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + minGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + CustomDataModule: + enabled: 0 + mode0: 0 + vectorComponentCount0: 4 + color0: + serializedVersion: 2 + minMaxState: 0 + minColor: {r: 1, g: 1, b: 1, a: 1} + maxColor: {r: 1, g: 1, b: 1, a: 1} + maxGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + minGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + colorLabel0: Color + vector0_0: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel0_0: X + vector0_1: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel0_1: Y + vector0_2: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel0_2: Z + vector0_3: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel0_3: W + mode1: 0 + vectorComponentCount1: 4 + color1: + serializedVersion: 2 + minMaxState: 0 + minColor: {r: 1, g: 1, b: 1, a: 1} + maxColor: {r: 1, g: 1, b: 1, a: 1} + maxGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + minGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + colorLabel1: Color + vector1_0: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel1_0: X + vector1_1: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel1_1: Y + vector1_2: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel1_2: Z + vector1_3: + serializedVersion: 2 + minMaxState: 0 + scalar: 0 + minScalar: 0 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + minCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + vectorLabel1_3: W +--- !u!199 &6896765968463793040 +ParticleSystemRenderer: + serializedVersion: 7 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5032589694762663266} + 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: 10301, 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: 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_RenderMode: 0 + m_MeshDistribution: 0 + m_SortMode: 0 + m_MinParticleSize: 0 + m_MaxParticleSize: 0.5 + m_CameraVelocityScale: 0 + m_VelocityScale: 0 + m_LengthScale: 2 + m_SortingFudge: 0 + m_NormalDirection: 1 + m_ShadowBias: 0 + m_RenderAlignment: 0 + m_Pivot: {x: 0, y: 0, z: 0} + m_Flip: {x: 0, y: 0, z: 0} + m_EnableGPUInstancing: 1 + m_ApplyActiveColorSpace: 1 + m_AllowRoll: 1 + m_FreeformStretching: 0 + m_RotateWithStretchDirection: 1 + m_UseCustomVertexStreams: 0 + m_VertexStreams: 00010304 + m_UseCustomTrailVertexStreams: 0 + m_TrailVertexStreams: 00010304 + m_Mesh: {fileID: 0} + m_Mesh1: {fileID: 0} + m_Mesh2: {fileID: 0} + m_Mesh3: {fileID: 0} + m_MeshWeighting: 1 + m_MeshWeighting1: 1 + m_MeshWeighting2: 1 + m_MeshWeighting3: 1 diff --git a/Assets/LiveOpsExamples/Prefabs/CollectBurst.prefab.meta b/Assets/LiveOpsExamples/Prefabs/CollectBurst.prefab.meta new file mode 100644 index 0000000..596979c --- /dev/null +++ b/Assets/LiveOpsExamples/Prefabs/CollectBurst.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9f08d0082395f4a36b1a41e5e929c33f +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LiveOpsExamples/Prefabs/ScorePopup.prefab b/Assets/LiveOpsExamples/Prefabs/ScorePopup.prefab new file mode 100644 index 0000000..325804b --- /dev/null +++ b/Assets/LiveOpsExamples/Prefabs/ScorePopup.prefab @@ -0,0 +1,197 @@ +%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} diff --git a/Assets/LiveOpsExamples/Prefabs/ScorePopup.prefab.meta b/Assets/LiveOpsExamples/Prefabs/ScorePopup.prefab.meta new file mode 100644 index 0000000..070cbd3 --- /dev/null +++ b/Assets/LiveOpsExamples/Prefabs/ScorePopup.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 77687e92645dc450d8f79fbb91face30 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LiveOpsExamples/Prefabs/Snack.prefab b/Assets/LiveOpsExamples/Prefabs/Snack.prefab new file mode 100644 index 0000000..1dfb838 --- /dev/null +++ b/Assets/LiveOpsExamples/Prefabs/Snack.prefab @@ -0,0 +1,144 @@ +%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 diff --git a/Assets/LiveOpsExamples/Prefabs/Snack.prefab.meta b/Assets/LiveOpsExamples/Prefabs/Snack.prefab.meta new file mode 100644 index 0000000..8115f2a --- /dev/null +++ b/Assets/LiveOpsExamples/Prefabs/Snack.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b6f2ca858be534f3ab055e0b878ae13f +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LiveOpsExamples/Scripts.meta b/Assets/LiveOpsExamples/Scripts.meta new file mode 100644 index 0000000..dce0aa7 --- /dev/null +++ b/Assets/LiveOpsExamples/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LiveOpsExamples/Scripts/CozyCollectorConsts.cs b/Assets/LiveOpsExamples/Scripts/CozyCollectorConsts.cs new file mode 100644 index 0000000..040387b --- /dev/null +++ b/Assets/LiveOpsExamples/Scripts/CozyCollectorConsts.cs @@ -0,0 +1,60 @@ +using UnityEngine; + +namespace LiveOpsExamples +{ + /// + /// 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. + /// + 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 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 CapabilitySystem = "system"; + + /// Color used by the event inspector to tag a capability line. + 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); + default: return new Color(0.75f, 0.75f, 0.75f); + } + } + } +} diff --git a/Assets/LiveOpsExamples/Scripts/CozyCollectorConsts.cs.meta b/Assets/LiveOpsExamples/Scripts/CozyCollectorConsts.cs.meta new file mode 100644 index 0000000..b5904e7 --- /dev/null +++ b/Assets/LiveOpsExamples/Scripts/CozyCollectorConsts.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f0f8000a396a64ea7890de20a70265ce \ No newline at end of file diff --git a/Assets/LiveOpsExamples/Scripts/CozyCollectorController.cs b/Assets/LiveOpsExamples/Scripts/CozyCollectorController.cs new file mode 100644 index 0000000..d56c318 --- /dev/null +++ b/Assets/LiveOpsExamples/Scripts/CozyCollectorController.cs @@ -0,0 +1,1065 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Threading.Tasks; +using RudderSdk.Core; +using RudderSdk.Core.Models.Inventory; +using RudderSdk.Core.Models.Leaderboards; +using RudderSdk.Core.Models.Player; +using RudderSdk.Core.Models.Storage; +using RudderSdk.Core.Models.Stores; +using RudderSdk.Unity; +using UnityEngine; + +namespace LiveOpsExamples +{ + [Serializable] + public class CozyIdentity + { + public string PlayerId; + public string Nickname; + public string DeviceId; + public string ProjectKey; + public string Region; + } + + [Serializable] + public class CozyWallet + { + public string Currency; + public double Balance; + } + + [Serializable] + public class CozyTuning + { + public float RoundSeconds; + public float PlayerSpeed; + public float SpawnIntervalMs; + public float CollectibleScore; + } + + [Serializable] + public class CozySave + { + public int BestScore; + public int LastScore; + public int RoundsPlayed; + public int TotalCollected; + } + + [Serializable] + public class CozyLogEntry + { + public string Capability; + public string Message; + public string Detail; + public DateTime Timestamp; + } + + [Serializable] + public class CozyShopOffer + { + public string StoreSlug; + public string OfferId; + public string Name; + public double Price; + public string Currency; + } + + [Serializable] + public class CozyBackpackItem + { + public string Slug; + public string Name; + public int Amount; + } + + [Serializable] + public class CozyLeaderboardEntry + { + public string PlayerName; + public int Rank; + public int Score; + } + + [Serializable] + public class CozyRoundResult + { + public int Score; + public int Best; + public int Collected; + public List TopEntries; + } + + [Serializable] + public class CozyOfferInfo + { + public string StoreSlug; + public string StoreName; + public List Offers; + } + + public enum CozyPhase + { + Booting, + Connecting, + Ready, + Setup + } + + public enum CozyModal + { + None, + Shop, + Backpack, + Offer, + RoundResult + } + + public enum CozyToastTone + { + Info, + Success, + Error + } + + /// + /// Session/bootstrap hub for the Cozy Collector demo — the Unity port of the + /// Phaser demo's liveops.ts + store.ts. Owns every SDK call: login, remote + /// config (initial load, 10 s poll and scenario overrides), storage save, + /// profile/wallets, store catalog, inventory, leaderboard and scenario effects. + /// The UI layer binds to the public properties/events. + /// + public class CozyCollectorController : MonoBehaviour + { + private const int MaxLogEntries = 200; + private const float ConfigPollSeconds = 10f; + private const float NotificationAutoCompleteSeconds = 2.6f; + + [SerializeField] private GameWorld world; + + private readonly List _wallets = new List(); + private readonly List _logEntries = new List(); + private readonly List _shopOffers = new List(); + private readonly List _backpackItems = new List(); + private readonly CozyTuning _tuning = new CozyTuning + { + RoundSeconds = CozyCollectorConsts.DefaultRoundSeconds, + PlayerSpeed = CozyCollectorConsts.DefaultPlayerSpeed, + SpawnIntervalMs = CozyCollectorConsts.DefaultSpawnIntervalMs, + CollectibleScore = CozyCollectorConsts.DefaultCollectibleScore + }; + private readonly CozySave _save = new CozySave(); + + private CozyPhase _phase = CozyPhase.Booting; + private string _statusMessage = "Starting…"; + private string _setupError; + private CozyIdentity _identity; + private CozyModal _activeModal = CozyModal.None; + private CozyRoundResult _roundResult; + private CozyOfferInfo _currentOffer; + private string _deviceId; + private string _nickname; + private StoreOfferSession _storeSession; + private LeaderboardSession _leaderboardSession; + private bool _scenarioHandlersRegistered; + + public CozyPhase Phase => _phase; + public string StatusMessage => _statusMessage; + public string SetupError => _setupError; + public CozyIdentity Identity => _identity; + public IReadOnlyList Wallets => _wallets; + public CozyTuning Tuning => _tuning; + public CozySave Save => _save; + public IReadOnlyList LogEntries => _logEntries; + public CozyModal ActiveModal => _activeModal; + public IReadOnlyList ShopOffers => _shopOffers; + public IReadOnlyList BackpackItems => _backpackItems; + public CozyRoundResult RoundResult => _roundResult; + public CozyOfferInfo CurrentOffer => _currentOffer; + + public event Action PhaseChanged; + public event Action ModalChanged; + public event Action WalletsChanged; + public event Action TuningChanged; + public event Action LogAdded; + public event Action ShopChanged; + public event Action BackpackChanged; + public event Action RoundResultChanged; + public event Action OfferChanged; + public event Action ToastRequested; + + // --------------------------------------------------------------- + // Boot phase machine + // --------------------------------------------------------------- + + private void Awake() + { + world.RoundFinished += OnRoundFinished; + } + + private void Start() + { + _ = BootAsync(); + } + + private void OnDestroy() + { + world.RoundFinished -= OnRoundFinished; + UnregisterScenarioHandlers(); + } + + private async Task BootAsync() + { + SetPhase(CozyPhase.Booting, "Starting…"); + + try + { + await Rudder.Ready; + } + catch (Exception exception) + { + _setupError = "Rudder is not initialized. Add the Rudder component to the scene " + + "and assign a RudderConfiguration asset with a valid ProjectKey. " + + exception.Message; + SetPhase(CozyPhase.Setup, "Setup required"); + Log(CozyCollectorConsts.CapabilitySystem, "Setup required", _setupError); + return; + } + + SetPhase(CozyPhase.Connecting, "Connecting to LiveOps…"); + RegisterScenarioHandlers(); + + try + { + _deviceId = SystemInfo.deviceUniqueIdentifier; + _nickname = GetOrCreateNickname(_deviceId); + Log(CozyCollectorConsts.CapabilityAuth, "loginWithDevice", _nickname + " · " + ShortId(_deviceId)); + await Rudder.Client.Auth.LoginWithDeviceAsync( + CozyCollectorConsts.Region, + CozyCollectorConsts.Language, + _nickname); + + await Rudder.Client.RemoteConfig.LoadAsync(); + RefreshTuning(false); + + await LoadSaveAsync(); + await RefreshProfileAsync(); + await RefreshStoresAsync(); + await RefreshInventoryAsync(); + + try + { + await Rudder.Client.Scenario.TriggerAsync("player_login"); + } + catch (Exception exception) + { + Log(CozyCollectorConsts.CapabilityScenario, "Trigger failed", exception.Message); + } + + SetPhase(CozyPhase.Ready, "Connected"); + world.RestartRound(); + StartCoroutine(PollConfigLoop()); + } + catch (Exception exception) + { + _setupError = exception.Message; + SetPhase(CozyPhase.Setup, "Setup required"); + Log(CozyCollectorConsts.CapabilitySystem, "Login failed", exception.Message); + } + } + + // --------------------------------------------------------------- + // Remote config + // --------------------------------------------------------------- + + private IEnumerator PollConfigLoop() + { + var wait = new WaitForSeconds(ConfigPollSeconds); + while (true) + { + yield return wait; + _ = PollConfigAsync(); + } + } + + private async Task PollConfigAsync() + { + try + { + await Rudder.Client.RemoteConfig.LoadAsync(); + RefreshTuning(true); + } + catch (Exception exception) + { + Log(CozyCollectorConsts.CapabilityConfig, "Config poll failed", exception.Message); + } + } + + private void RefreshTuning(bool announce) + { + var next = new CozyTuning + { + RoundSeconds = ReadConfigFloat(CozyCollectorConsts.ConfigRoundSeconds, CozyCollectorConsts.DefaultRoundSeconds), + PlayerSpeed = ReadConfigFloat(CozyCollectorConsts.ConfigPlayerSpeed, CozyCollectorConsts.DefaultPlayerSpeed), + SpawnIntervalMs = ReadConfigFloat(CozyCollectorConsts.ConfigSpawnIntervalMs, CozyCollectorConsts.DefaultSpawnIntervalMs), + CollectibleScore = ReadConfigFloat(CozyCollectorConsts.ConfigCollectibleScore, CozyCollectorConsts.DefaultCollectibleScore) + }; + + var changedKeys = new List(); + if (!Mathf.Approximately(_tuning.RoundSeconds, next.RoundSeconds)) + changedKeys.Add(CozyCollectorConsts.ConfigRoundSeconds); + if (!Mathf.Approximately(_tuning.PlayerSpeed, next.PlayerSpeed)) + changedKeys.Add(CozyCollectorConsts.ConfigPlayerSpeed); + if (!Mathf.Approximately(_tuning.SpawnIntervalMs, next.SpawnIntervalMs)) + changedKeys.Add(CozyCollectorConsts.ConfigSpawnIntervalMs); + if (!Mathf.Approximately(_tuning.CollectibleScore, next.CollectibleScore)) + changedKeys.Add(CozyCollectorConsts.ConfigCollectibleScore); + + _tuning.RoundSeconds = next.RoundSeconds; + _tuning.PlayerSpeed = next.PlayerSpeed; + _tuning.SpawnIntervalMs = next.SpawnIntervalMs; + _tuning.CollectibleScore = next.CollectibleScore; + + if (!announce || changedKeys.Count > 0) + { + Log( + CozyCollectorConsts.CapabilityConfig, + "Remote config loaded", + $"speed {Mathf.RoundToInt(_tuning.PlayerSpeed)} · spawn {Mathf.RoundToInt(_tuning.SpawnIntervalMs)}ms · " + + $"+{Mathf.RoundToInt(_tuning.CollectibleScore)} · {Mathf.RoundToInt(_tuning.RoundSeconds)}s"); + } + + foreach (var key in changedKeys) + { + TuningChanged?.Invoke(key); + if (announce) + { + Log(CozyCollectorConsts.CapabilityConfig, "Config changed live", key); + Toast("Remote config updated", key + " applied live", CozyToastTone.Success); + } + } + } + + private static float ReadConfigFloat(string key, float fallback) + { + return Rudder.Client.RemoteConfig.Get(key, fallback); + } + + // --------------------------------------------------------------- + // Profile / wallets / stores / inventory (pull-based freshness) + // --------------------------------------------------------------- + + private async Task RefreshProfileAsync() + { + var profile = await Rudder.Client.Player.GetProfileAsync(); + var player = profile?.Player; + + _identity = new CozyIdentity + { + PlayerId = player?.Id ?? "unknown", + Nickname = _nickname, + DeviceId = _deviceId, + ProjectKey = Rudder.Client.ProjectKey, + Region = player?.Region + }; + Log( + CozyCollectorConsts.CapabilityAuth, + "Authenticated", + _identity.Nickname + " · " + ShortId(_identity.PlayerId)); + + ApplyWallets(profile); + } + + private async Task RefreshWalletsAsync() + { + var profile = await Rudder.Client.Player.GetProfileAsync(); + ApplyWallets(profile); + } + + private void ApplyWallets(PlayerProfile profile) + { + _wallets.Clear(); + if (profile?.Wallets != null) + { + foreach (var wallet in profile.Wallets) + { + _wallets.Add(new CozyWallet + { + Currency = wallet.Currency ?? string.Empty, + Balance = wallet.Balance + }); + } + } + + Log(CozyCollectorConsts.CapabilityWallet, "Wallet loaded", WalletSummary()); + WalletsChanged?.Invoke(); + } + + private async Task RefreshStoresAsync() + { + var stores = await Rudder.Client.Stores.ListAsync(); + + _shopOffers.Clear(); + if (stores != null) + { + foreach (var store in stores) + { + if (store?.Offers == null) + continue; + + foreach (var offer in store.Offers) + { + _shopOffers.Add(MapOffer(store.Slug, offer)); + } + } + } + + Log(CozyCollectorConsts.CapabilityStore, "Store catalog loaded", _shopOffers.Count + " offer(s)"); + ShopChanged?.Invoke(); + } + + private async Task RefreshInventoryAsync() + { + var items = await Rudder.Client.Inventory.GetAsync(); + + _backpackItems.Clear(); + if (items != null) + { + foreach (var item in items) + { + var slug = item.Slug ?? string.Empty; + _backpackItems.Add(new CozyBackpackItem + { + Slug = slug, + Name = string.IsNullOrEmpty(item.NameOverride) ? slug : item.NameOverride, + Amount = (int)item.Amount + }); + } + } + + Log(CozyCollectorConsts.CapabilityInventory, "Inventory loaded", _backpackItems.Count + " item(s)"); + BackpackChanged?.Invoke(); + } + + private async Task RefreshPurchasablesAsync() + { + // Purchases mutate wallets, catalog stock and inventory server-side; + // the C# SDK has no onChange, so freshness is pull-based. + try { await RefreshWalletsAsync(); } + catch (Exception exception) { Log(CozyCollectorConsts.CapabilityWallet, "Wallet refresh failed", exception.Message); } + + try { await RefreshStoresAsync(); } + catch (Exception exception) { Log(CozyCollectorConsts.CapabilityStore, "Store refresh failed", exception.Message); } + + try { await RefreshInventoryAsync(); } + catch (Exception exception) { Log(CozyCollectorConsts.CapabilityInventory, "Inventory refresh failed", exception.Message); } + } + + // --------------------------------------------------------------- + // Storage save + // --------------------------------------------------------------- + + // Storage payload mirrors the Phaser saveRound JSON shape (camelCase keys). + [Serializable] + private class SavePayload + { + public int bestScore; + public int lastScore; + public int roundsPlayed; + public int totalCollected; + public string updatedAt; + } + + private async Task LoadSaveAsync() + { + var response = await Rudder.Client.Storage.GetAsync(); + var item = response?.Items?.Find( + candidate => candidate.Type == CozyCollectorConsts.StorageType && candidate.Id == CozyCollectorConsts.StorageId); + + if (item == null || string.IsNullOrEmpty(item.Data)) + { + Log(CozyCollectorConsts.CapabilityStorage, "No saved progress yet", CozyCollectorConsts.StorageType); + return; + } + + try + { + var payload = JsonUtility.FromJson(item.Data); + _save.BestScore = payload.bestScore; + _save.LastScore = payload.lastScore; + _save.RoundsPlayed = payload.roundsPlayed; + _save.TotalCollected = payload.totalCollected; + Log( + CozyCollectorConsts.CapabilityStorage, + "Loaded progress", + $"best {_save.BestScore} · rounds {_save.RoundsPlayed}"); + } + catch (Exception exception) + { + Log(CozyCollectorConsts.CapabilityStorage, "Save data unreadable", exception.Message); + } + } + + private async Task SaveRoundAsync(int score, int collected) + { + _save.BestScore = Math.Max(_save.BestScore, score); + _save.LastScore = score; + _save.RoundsPlayed += 1; + _save.TotalCollected += collected; + + var payload = new SavePayload + { + bestScore = _save.BestScore, + lastScore = _save.LastScore, + roundsPlayed = _save.RoundsPlayed, + totalCollected = _save.TotalCollected, + updatedAt = DateTime.UtcNow.ToString("o", CultureInfo.InvariantCulture) + }; + + await Rudder.Client.Storage.SaveAsync(new[] + { + new StorageItem + { + Type = CozyCollectorConsts.StorageType, + Id = CozyCollectorConsts.StorageId, + Data = JsonUtility.ToJson(payload) + } + }); + + Log( + CozyCollectorConsts.CapabilityStorage, + "Saved progress", + $"best {_save.BestScore} · rounds {_save.RoundsPlayed}"); + } + + // --------------------------------------------------------------- + // Leaderboard + // --------------------------------------------------------------- + + private async Task> SubmitLeaderboardAsync(int score) + { + var leaderboard = Rudder.Client.Leaderboards.FindBySlug(CozyCollectorConsts.LeaderboardSlug); + await leaderboard.SubmitAsync(score); + var entries = await leaderboard.ListAsync(10); + Log(CozyCollectorConsts.CapabilityLeaderboard, $"Submitted score {score}", CozyCollectorConsts.LeaderboardSlug); + return MapEntries(entries); + } + + private async Task> ListLeaderboardAsync() + { + var entries = await Rudder.Client.Leaderboards.FindBySlug(CozyCollectorConsts.LeaderboardSlug).ListAsync(10); + return MapEntries(entries); + } + + private static List MapEntries(IReadOnlyList entries) + { + var mapped = new List(); + if (entries == null) + return mapped; + + foreach (var entry in entries) + { + mapped.Add(new CozyLeaderboardEntry + { + PlayerName = entry.PlayerName ?? entry.PlayerId ?? "(unknown)", + Rank = (int)entry.Rank, + Score = (int)entry.Score + }); + } + + return mapped; + } + + // --------------------------------------------------------------- + // Round flow + // --------------------------------------------------------------- + + private void OnRoundFinished(int score, int collected) + { + SyncWorldPause(); + _ = FinishRoundAsync(score, collected); + } + + private async Task FinishRoundAsync(int score, int collected) + { + try + { + await SaveRoundAsync(score, collected); + } + catch (Exception exception) + { + Toast("Save failed", exception.Message, CozyToastTone.Error); + Log(CozyCollectorConsts.CapabilityStorage, "Save failed", exception.Message); + } + + var entries = new List(); + try + { + entries = await SubmitLeaderboardAsync(score); + } + catch (Exception exception) + { + Toast("Leaderboard failed", exception.Message, CozyToastTone.Error); + Log(CozyCollectorConsts.CapabilityLeaderboard, "Submit failed", exception.Message); + } + + _roundResult = new CozyRoundResult + { + Score = score, + Best = _save.BestScore, + Collected = collected, + TopEntries = entries + }; + RoundResultChanged?.Invoke(); + SetModal(CozyModal.RoundResult); + + + try + { + await Rudder.Client.Scenario.TriggerAsync("demo_round_finished"); + } + catch (Exception exception) + { + Log(CozyCollectorConsts.CapabilityScenario, "Trigger failed", exception.Message); + } + } + + public void PlayAgain() + { + SetModal(CozyModal.None); + world.RestartRound(); + SyncWorldPause(); + } + + // --------------------------------------------------------------- + // Modals + // --------------------------------------------------------------- + + public void OpenModal(CozyModal modal) + { + SetModal(modal); + } + + public void CloseModal() + { + // Scenario offers must be bought or declined, same as the Phaser store. + if (_activeModal == CozyModal.Offer) + return; + + SetModal(CozyModal.None); + } + + private void SetModal(CozyModal modal) + { + if (_activeModal == modal) + return; + + _activeModal = modal; + ModalChanged?.Invoke(); + SyncWorldPause(); + } + + private void SyncWorldPause() + { + world.SetPaused(_activeModal != CozyModal.None || !world.RoundActive); + } + + // --------------------------------------------------------------- + // Shop + // --------------------------------------------------------------- + + public void BuyShopOffer(string offerId) + { + _ = BuyShopOfferAsync(offerId); + } + + private async Task BuyShopOfferAsync(string offerId) + { + var offer = _shopOffers.Find(candidate => candidate.OfferId == offerId); + if (offer == null) + { + Toast("Purchase failed", "Unknown offer " + offerId, CozyToastTone.Error); + return; + } + + try + { + var response = await Rudder.Client.Stores.PurchaseAsync( + offer.StoreSlug, + offer.OfferId, + "demo-shop-" + offer.OfferId + "-" + DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()); + + if (response != null && !response.Success) + { + Toast("Purchase failed", response.Error ?? "The store rejected the purchase.", CozyToastTone.Error); + Log(CozyCollectorConsts.CapabilityStore, "Purchase rejected", response.Error); + return; + } + } + catch (Exception exception) + { + Toast("Purchase failed", exception.Message, CozyToastTone.Error); + Log(CozyCollectorConsts.CapabilityStore, "Purchase failed", exception.Message); + return; + } + + Toast("Purchase complete", offer.Name, CozyToastTone.Success); + Log(CozyCollectorConsts.CapabilityStore, "Purchased offer", offer.Name + " · " + offer.StoreSlug); + await RefreshPurchasablesAsync(); + } + + // --------------------------------------------------------------- + // Scenario store offer + // --------------------------------------------------------------- + + public void BuyScenarioOffer() + { + _ = BuyScenarioOfferAsync(); + } + + private async Task BuyScenarioOfferAsync() + { + var session = _storeSession; + var offerInfo = _currentOffer; + if (session == null || offerInfo == null || offerInfo.Offers == null || offerInfo.Offers.Count == 0) + return; + + // Mirror the Phaser OfferModal: prefer the configured offer, fall back to the first. + var offer = offerInfo.Offers.Find(candidate => candidate.OfferId == CozyCollectorConsts.OfferId) + ?? offerInfo.Offers[0]; + + try + { + var response = await Rudder.Client.Stores.PurchaseAsync( + offer.StoreSlug, + offer.OfferId, + "demo-offer-" + DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()); + + if (response != null && !response.Success) + { + Toast("Offer failed", response.Error ?? "The store rejected the purchase.", CozyToastTone.Error); + Log(CozyCollectorConsts.CapabilityStore, "Offer purchase rejected", response.Error); + return; + } + + session.Purchase(); + } + catch (Exception exception) + { + Toast("Offer failed", exception.Message, CozyToastTone.Error); + Log(CozyCollectorConsts.CapabilityStore, "Offer purchase failed", exception.Message); + return; + } + + _storeSession = null; + _currentOffer = null; + OfferChanged?.Invoke(); + SetModal(CozyModal.None); + Toast("Offer purchased", "Waiting for the scenario reward…", CozyToastTone.Success); + Log(CozyCollectorConsts.CapabilityStore, "Scenario offer purchased", offer.Name); + await RefreshPurchasablesAsync(); + } + + public void DeclineScenarioOffer() + { + var session = _storeSession; + if (session == null) + return; + + session.Decline(); + _storeSession = null; + _currentOffer = null; + OfferChanged?.Invoke(); + SetModal(CozyModal.None); + Toast("Offer declined", "The camp merchant will return later.", CozyToastTone.Info); + Log(CozyCollectorConsts.CapabilityStore, "Scenario offer declined", null); + } + + // --------------------------------------------------------------- + // Scenario leaderboard (dormant path, driven from the result modal) + // --------------------------------------------------------------- + + public void ClaimScenarioLeaderboardReward() + { + if (_leaderboardSession == null) + return; + + _leaderboardSession.RewardClaimed(); + _leaderboardSession = null; + Log(CozyCollectorConsts.CapabilityLeaderboard, "Scenario reward claimed", null); + } + + public void EndScenarioLeaderboard() + { + if (_leaderboardSession == null) + return; + + _leaderboardSession.End(); + _leaderboardSession = null; + Log(CozyCollectorConsts.CapabilityLeaderboard, "Scenario leaderboard ended", null); + } + + // --------------------------------------------------------------- + // Scenario handlers + // --------------------------------------------------------------- + + private void RegisterScenarioHandlers() + { + if (_scenarioHandlersRegistered || Rudder.State != RudderState.Ready) + return; + + Rudder.Client.Scenario.OnNotification += OnScenarioNotification; + Rudder.Client.Scenario.OnWait += OnScenarioWait; + Rudder.Client.Scenario.OnStoreOffer += OnScenarioStoreOffer; + Rudder.Client.Scenario.OnConfigChanged += OnScenarioConfigChanged; + Rudder.Client.Scenario.OnQuest += OnScenarioQuest; + Rudder.Client.Scenario.OnLeaderboard += OnScenarioLeaderboard; + Rudder.Client.Scenario.OnBattlePass += OnScenarioBattlePass; + Rudder.Client.Scenario.OnBattlePassLevel += OnScenarioBattlePassLevel; + Rudder.Client.Scenario.OnScenarioCompleted += OnScenarioCompleted; + Rudder.Client.Scenario.OnScenarioFailed += OnScenarioFailed; + _scenarioHandlersRegistered = true; + } + + private void UnregisterScenarioHandlers() + { + if (!_scenarioHandlersRegistered || Rudder.State != RudderState.Ready) + return; + + Rudder.Client.Scenario.OnNotification -= OnScenarioNotification; + Rudder.Client.Scenario.OnWait -= OnScenarioWait; + Rudder.Client.Scenario.OnStoreOffer -= OnScenarioStoreOffer; + Rudder.Client.Scenario.OnConfigChanged -= OnScenarioConfigChanged; + Rudder.Client.Scenario.OnQuest -= OnScenarioQuest; + Rudder.Client.Scenario.OnLeaderboard -= OnScenarioLeaderboard; + Rudder.Client.Scenario.OnBattlePass -= OnScenarioBattlePass; + Rudder.Client.Scenario.OnBattlePassLevel -= OnScenarioBattlePassLevel; + Rudder.Client.Scenario.OnScenarioCompleted -= OnScenarioCompleted; + Rudder.Client.Scenario.OnScenarioFailed -= OnScenarioFailed; + _scenarioHandlersRegistered = false; + } + + private void OnScenarioNotification(NotificationSession session) + { + var title = session.Get("title", ""); + var message = session.Get("message", ""); + Log(CozyCollectorConsts.CapabilityScenario, "Notification effect", string.IsNullOrEmpty(title) ? message : title); + Toast(string.IsNullOrEmpty(title) ? "LiveOps" : title, message, CozyToastTone.Info); + StartCoroutine(CompleteNotificationAfterDelay(session)); + } + + private IEnumerator CompleteNotificationAfterDelay(NotificationSession session) + { + yield return new WaitForSeconds(NotificationAutoCompleteSeconds); + session.Complete(); + _ = RefreshWalletsAfterNotificationAsync(); + } + + private async Task RefreshWalletsAfterNotificationAsync() + { + // Notification rewards may have landed on the wallet; pull fresh state. + try + { + await RefreshWalletsAsync(); + } + catch (Exception exception) + { + Log(CozyCollectorConsts.CapabilityWallet, "Wallet refresh failed", exception.Message); + } + } + + private void OnScenarioWait(WaitSession session) + { + Log(CozyCollectorConsts.CapabilityScenario, "Scenario wait", session.DeadlineUtc.ToString("O")); + } + + private void OnScenarioStoreOffer(StoreOfferSession session) + { + var storeSlug = session.Get("storeSlug", CozyCollectorConsts.StoreSlug); + Log(CozyCollectorConsts.CapabilityScenario, "Store-offer effect", storeSlug); + _ = PresentStoreOfferAsync(session, storeSlug); + } + + private async Task PresentStoreOfferAsync(StoreOfferSession session, string storeSlug) + { + try + { + var store = await Rudder.Client.Stores.GetAsync(storeSlug); + var offers = new List(); + if (store?.Offers != null) + { + foreach (var offer in store.Offers) + { + offers.Add(MapOffer(store.Slug, offer)); + } + } + + _storeSession = session; + _currentOffer = new CozyOfferInfo + { + StoreSlug = store?.Slug ?? storeSlug, + StoreName = store?.Name ?? storeSlug, + Offers = offers + }; + OfferChanged?.Invoke(); + OpenModal(CozyModal.Offer); + } + catch (Exception exception) + { + Log(CozyCollectorConsts.CapabilityStore, "Store offer unavailable", exception.Message); + Toast("Offer unavailable", exception.Message, CozyToastTone.Error); + session.Decline(); + } + } + + private void OnScenarioConfigChanged(ConfigChangedSession session) + { + // The SDK dispatch already applied the patches to the remote-config cache. + Log(CozyCollectorConsts.CapabilityScenario, "Remote config override applied", session.Context.NodeId); + RefreshTuning(true); + } + + private void OnScenarioQuest(QuestSession session) + { + Log(CozyCollectorConsts.CapabilityScenario, "Scenario quest node", session.Context.NodeId); + } + + private void OnScenarioLeaderboard(LeaderboardSession session) + { + // Dormant until a scenario emits a leaderboard node; shares the round-result modal. + _leaderboardSession = session; + Log(CozyCollectorConsts.CapabilityLeaderboard, "Leaderboard effect (scenario)", session.Context.NodeId); + _ = PresentScenarioLeaderboardAsync(); + } + + private async Task PresentScenarioLeaderboardAsync() + { + var entries = new List(); + try + { + entries = await ListLeaderboardAsync(); + } + catch (Exception exception) + { + Log(CozyCollectorConsts.CapabilityLeaderboard, "List failed", exception.Message); + } + + _roundResult = new CozyRoundResult + { + Score = _save.LastScore, + Best = _save.BestScore, + Collected = 0, + TopEntries = entries + }; + RoundResultChanged?.Invoke(); + SetModal(CozyModal.RoundResult); + } + + private void OnScenarioBattlePass(BattlePassSession session) + { + Log(CozyCollectorConsts.CapabilityScenario, "Scenario battlepass node", session.Context.NodeId); + } + + private void OnScenarioBattlePassLevel(BattlePassLevelSession session) + { + Log(CozyCollectorConsts.CapabilityScenario, "Scenario battlepass level node", session.Context.NodeId); + } + + private void OnScenarioCompleted(PlanRun run) + { + Log(CozyCollectorConsts.CapabilityScenario, "Scenario run completed", run.RunId); + } + + private void OnScenarioFailed(ScenarioFailedEvent failed) + { + Log(CozyCollectorConsts.CapabilityScenario, "Scenario run failed", failed.NodeId + ": " + failed.Exception.Message); + } + + // --------------------------------------------------------------- + // Inspector log / toasts + // --------------------------------------------------------------- + + public void Log(string capability, string message, string detail = null) + { + _logEntries.Insert(0, new CozyLogEntry + { + Capability = capability, + Message = message, + Detail = detail, + Timestamp = DateTime.Now + }); + if (_logEntries.Count > MaxLogEntries) + _logEntries.RemoveAt(_logEntries.Count - 1); + + LogAdded?.Invoke(); + } + + public void Toast(string title, string message, CozyToastTone tone) + { + ToastRequested?.Invoke(title, message, tone); + } + + // --------------------------------------------------------------- + // Helpers + // --------------------------------------------------------------- + + private void SetPhase(CozyPhase phase, string statusMessage) + { + if (_phase == phase && _statusMessage == statusMessage) + return; + + _phase = phase; + _statusMessage = statusMessage; + PhaseChanged?.Invoke(); + } + + private string WalletSummary() + { + if (_wallets.Count == 0) + return "empty"; + + var parts = new List(); + foreach (var wallet in _wallets) + { + parts.Add((wallet.Balance + " " + wallet.Currency).Trim()); + } + + return string.Join(" · ", parts); + } + + private static CozyShopOffer MapOffer(string storeSlug, Offer offer) + { + return new CozyShopOffer + { + StoreSlug = storeSlug, + OfferId = offer.Id, + Name = string.IsNullOrEmpty(offer.Name) ? offer.Id : offer.Name, + Price = offer.Price?.Amount ?? 0, + Currency = offer.Price?.Currency ?? string.Empty + }; + } + + private static string GetOrCreateNickname(string deviceId) + { + var existing = PlayerPrefs.GetString(CozyCollectorConsts.NicknamePrefsKey, string.Empty); + if (!string.IsNullOrEmpty(existing)) + return existing; + + // Nickname is generated locally once and passed to LoginWithDeviceAsync. + var compact = deviceId.Replace("-", string.Empty); + var suffix = compact.Length > 4 ? compact.Substring(0, 4) : compact; + var nickname = "Player-" + suffix; + PlayerPrefs.SetString(CozyCollectorConsts.NicknamePrefsKey, nickname); + PlayerPrefs.Save(); + return nickname; + } + + private static string ShortId(string value) + { + return value != null && value.Length > 10 ? value.Substring(0, 8) + "…" : value; + } + } +} diff --git a/Assets/LiveOpsExamples/Scripts/CozyCollectorController.cs.meta b/Assets/LiveOpsExamples/Scripts/CozyCollectorController.cs.meta new file mode 100644 index 0000000..edb2657 --- /dev/null +++ b/Assets/LiveOpsExamples/Scripts/CozyCollectorController.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 05ab47060c2ef4476800002c4a956b85 \ No newline at end of file diff --git a/Assets/LiveOpsExamples/Scripts/CozyCollectorSpriteLibrary.cs b/Assets/LiveOpsExamples/Scripts/CozyCollectorSpriteLibrary.cs new file mode 100644 index 0000000..5de8748 --- /dev/null +++ b/Assets/LiveOpsExamples/Scripts/CozyCollectorSpriteLibrary.cs @@ -0,0 +1,42 @@ +using UnityEngine; + +namespace LiveOpsExamples +{ + /// + /// Baked sprite references for the Cozy Collector demo. Mirrors the Phaser + /// texture keys; falls back to the star sprite for + /// unknown slugs, same as the Phaser backpack icon mapping. + /// + [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; + } + } + } +} diff --git a/Assets/LiveOpsExamples/Scripts/CozyCollectorSpriteLibrary.cs.meta b/Assets/LiveOpsExamples/Scripts/CozyCollectorSpriteLibrary.cs.meta new file mode 100644 index 0000000..e1ab539 --- /dev/null +++ b/Assets/LiveOpsExamples/Scripts/CozyCollectorSpriteLibrary.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8cd851b86da394b9ca06595f889a49b3 \ No newline at end of file diff --git a/Assets/LiveOpsExamples/Scripts/GameWorld.cs b/Assets/LiveOpsExamples/Scripts/GameWorld.cs new file mode 100644 index 0000000..196f176 --- /dev/null +++ b/Assets/LiveOpsExamples/Scripts/GameWorld.cs @@ -0,0 +1,149 @@ +using System; +using UnityEngine; + +namespace LiveOpsExamples +{ + /// + /// 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 . + /// + /// 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. + /// + 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 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); + } + } +} diff --git a/Assets/LiveOpsExamples/Scripts/GameWorld.cs.meta b/Assets/LiveOpsExamples/Scripts/GameWorld.cs.meta new file mode 100644 index 0000000..444608e --- /dev/null +++ b/Assets/LiveOpsExamples/Scripts/GameWorld.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 952f52af0af8546eeab332b11e2e4bb7 \ No newline at end of file diff --git a/Assets/LiveOpsExamples/Scripts/ScorePopupView.cs b/Assets/LiveOpsExamples/Scripts/ScorePopupView.cs new file mode 100644 index 0000000..660816a --- /dev/null +++ b/Assets/LiveOpsExamples/Scripts/ScorePopupView.cs @@ -0,0 +1,43 @@ +using System.Collections; +using TMPro; +using UnityEngine; + +namespace LiveOpsExamples +{ + /// + /// 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. + /// + 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); + } + } +} diff --git a/Assets/LiveOpsExamples/Scripts/ScorePopupView.cs.meta b/Assets/LiveOpsExamples/Scripts/ScorePopupView.cs.meta new file mode 100644 index 0000000..dd4356f --- /dev/null +++ b/Assets/LiveOpsExamples/Scripts/ScorePopupView.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b1db4bf03192148bf95ea374d128f349 \ No newline at end of file diff --git a/Assets/LiveOpsExamples/Scripts/Snack.cs b/Assets/LiveOpsExamples/Scripts/Snack.cs new file mode 100644 index 0000000..93df104 --- /dev/null +++ b/Assets/LiveOpsExamples/Scripts/Snack.cs @@ -0,0 +1,45 @@ +using System; +using UnityEngine; + +namespace LiveOpsExamples +{ + /// + /// A collectible snack. Bobs gently (sine, 0.08 world units amplitude, 650 ms + /// half-period — mirrors the Phaser yoyo tween) and raises + /// when the player overlaps its trigger, then destroys itself. + /// + [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 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); + } + } +} diff --git a/Assets/LiveOpsExamples/Scripts/Snack.cs.meta b/Assets/LiveOpsExamples/Scripts/Snack.cs.meta new file mode 100644 index 0000000..9927319 --- /dev/null +++ b/Assets/LiveOpsExamples/Scripts/Snack.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 36b117cefc78541b9b42188266102562 \ No newline at end of file diff --git a/Assets/LiveOpsExamples/Scripts/SnackSpawner.cs b/Assets/LiveOpsExamples/Scripts/SnackSpawner.cs new file mode 100644 index 0000000..8a198e7 --- /dev/null +++ b/Assets/LiveOpsExamples/Scripts/SnackSpawner.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace LiveOpsExamples +{ + /// + /// 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). + /// + 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 _spawned = new List(); + + public SpriteRenderer Player { get; set; } + + public event Action 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().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().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); + } + } +} diff --git a/Assets/LiveOpsExamples/Scripts/SnackSpawner.cs.meta b/Assets/LiveOpsExamples/Scripts/SnackSpawner.cs.meta new file mode 100644 index 0000000..c21de8b --- /dev/null +++ b/Assets/LiveOpsExamples/Scripts/SnackSpawner.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ec58b83d93d5b435abaaa64ecc05fe1a \ No newline at end of file diff --git a/Assets/LiveOpsExamples/Scripts/UI.meta b/Assets/LiveOpsExamples/Scripts/UI.meta new file mode 100644 index 0000000..37c7f8f --- /dev/null +++ b/Assets/LiveOpsExamples/Scripts/UI.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c21c943a5e1bd4f79a2d6bcb2e3f30fb +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/LiveOpsExamples/Scripts/UI/BackpackModalPanel.cs b/Assets/LiveOpsExamples/Scripts/UI/BackpackModalPanel.cs new file mode 100644 index 0000000..4669826 --- /dev/null +++ b/Assets/LiveOpsExamples/Scripts/UI/BackpackModalPanel.cs @@ -0,0 +1,81 @@ +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("backpack-modal"); + _itemsScroll = _root.Q("backpack-items-scroll"); + _emptyNote = _root.Q("backpack-empty"); + _closeButton = _root.Q