From 587fc46f1ab036e2ba1539375f7f233a60575e3b Mon Sep 17 00:00:00 2001 From: Matt F Date: Thu, 25 Jun 2026 18:22:39 -0700 Subject: [PATCH 01/58] Adding Post Processing and lights to the tesla tower --- .../Art/Materials/M_Electrical_Glow.mat | 6 +- Assets/_Project/Scenes/Levels/9Player.unity | 50 ---- .../_Project/Scripts/Combat/TeslaArcVisual.cs | 255 +++++++++++++++--- Assets/_Project/Scripts/Combat/TowerCombat.cs | 2 - .../Settings/DefaultVolumeProfile.asset | 28 +- .../Settings/Render Settings/URP-High.asset | 2 +- .../Settings/Render Settings/URP-Medium.asset | 2 +- .../Settings/Render Settings/URP-Ultra.asset | 2 +- 8 files changed, 241 insertions(+), 106 deletions(-) diff --git a/Assets/_Project/Art/Materials/M_Electrical_Glow.mat b/Assets/_Project/Art/Materials/M_Electrical_Glow.mat index 1dd11fe..558d2db 100644 --- a/Assets/_Project/Art/Materials/M_Electrical_Glow.mat +++ b/Assets/_Project/Art/Materials/M_Electrical_Glow.mat @@ -105,7 +105,7 @@ Material: - _AddPrecomputedVelocity: 0 - _AlphaClip: 0 - _AlphaToMask: 0 - - _Blend: 0 + - _Blend: 2 - _BlendModePreserveSpecular: 1 - _BumpScale: 1 - _ClearCoatMask: 0 @@ -114,8 +114,8 @@ Material: - _Cutoff: 0.5 - _DetailAlbedoMapScale: 1 - _DetailNormalMapScale: 1 - - _DstBlend: 10 - - _DstBlendAlpha: 10 + - _DstBlend: 1 + - _DstBlendAlpha: 1 - _EnvironmentReflections: 1 - _GlossMapScale: 0 - _Glossiness: 0 diff --git a/Assets/_Project/Scenes/Levels/9Player.unity b/Assets/_Project/Scenes/Levels/9Player.unity index 76b7f7f..32942ce 100644 --- a/Assets/_Project/Scenes/Levels/9Player.unity +++ b/Assets/_Project/Scenes/Levels/9Player.unity @@ -12226,55 +12226,6 @@ Mesh: - serializedVersion: 1 m_IndexStart: 0 m_IndexCount: 0 ---- !u!1 &832575517 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 832575519} - - component: {fileID: 832575518} - m_Layer: 0 - m_Name: Global Volume - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &832575518 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 832575517} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 172515602e62fb746b5d573b38a5fe58, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IsGlobal: 1 - priority: 0 - blendDistance: 0 - weight: 1 - sharedProfile: {fileID: 11400000, guid: 10fc4df2da32a41aaa32d77bc913491c, type: 2} ---- !u!4 &832575519 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 832575517} - 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 &839198900 GameObject: m_ObjectHideFlags: 0 @@ -28745,7 +28696,6 @@ SceneRoots: m_ObjectHideFlags: 0 m_Roots: - {fileID: 410087041} - - {fileID: 832575519} - {fileID: 441239881} - {fileID: 167151709} - {fileID: 1507514109} diff --git a/Assets/_Project/Scripts/Combat/TeslaArcVisual.cs b/Assets/_Project/Scripts/Combat/TeslaArcVisual.cs index 20de293..c4e7828 100644 --- a/Assets/_Project/Scripts/Combat/TeslaArcVisual.cs +++ b/Assets/_Project/Scripts/Combat/TeslaArcVisual.cs @@ -6,35 +6,92 @@ namespace TD.Combat { /// /// Local-only electrical-arc visual for - /// towers (Tesla Coil). Subscribes to and draws a - /// jagged line from the tower's emitter point to every enemy hit, flashed for a moment. + /// towers (Tesla Coil). Subscribes to and draws an + /// arced, jittering bolt from the tower's emitter to every enemy hit, re-randomized each + /// frame so it crackles, then hidden after a short flash. /// /// /// Pure visualization — runs on every peer from the replicated fire broadcast; nothing - /// here is networked. Arcs are pooled s reused across ticks. + /// here is networked. Bolts are pooled s reused across ticks. + /// The glow (bloom) comes from the material + an HDR color above the bloom threshold; see + /// and the project's post-processing Volume. /// [RequireComponent(typeof(TowerCombat))] public class TeslaArcVisual : MonoBehaviour { - [Tooltip("Point the arcs originate from — the central top of the coil. " + + [Tooltip("Point the bolts originate from — the central top of the coil. " + "If unset, falls back to one unit above the tower root.")] [SerializeField] private Transform emitter; - [Tooltip("Material for the arc lines. Assign an unlit/additive material for a glow. " + - "If unset, a fallback Sprites/Default material is created at runtime.")] + [Tooltip("Material for the bolts. Use an UNLIT ADDITIVE material for a convincing " + + "glow (a Lit material won't bloom well on a thin line). If unset, a fallback " + + "additive material is created at runtime.")] [SerializeField] private Material arcMaterial; - [SerializeField] private Color arcColor = new Color(0.6f, 0.85f, 1f, 1f); + [Tooltip("Base bolt color. Multiplied by Emission Intensity to push it into HDR so " + + "Bloom picks it up.")] + [ColorUsage(true, true)] + [SerializeField] private Color arcColor = new Color(0.55f, 0.8f, 1f, 1f); + + [Tooltip("HDR multiplier on the color. Must exceed the Bloom threshold (>1) for the " + + "bolt to glow. Raise for a hotter, brighter arc.")] + [SerializeField] private float emissionIntensity = 4f; + [SerializeField] private float arcWidth = 0.06f; - [Tooltip("How long each arc flash stays visible, in seconds.")] + + [Tooltip("How long each flash stays visible, in seconds.")] [SerializeField] private float arcDuration = 0.12f; - [Tooltip("Number of points per arc. More = more jagged detail.")] - [SerializeField] private int segmentsPerArc = 6; - [Tooltip("Random offset applied to interior arc points for the lightning look.")] - [SerializeField] private float jitter = 0.2f; + + [Tooltip("Points per bolt. More = smoother arc and finer crackle. ~12-20 looks good.")] + [SerializeField] private int segmentsPerArc = 16; + + [Tooltip("Overall arc/bow as a fraction of bolt length (0 = straight line). The bolt " + + "lifts toward the middle for an electrical-arc curve.")] + [SerializeField] private float arcHeight = 0.18f; + + [Tooltip("Random crackle displacement (world units) at the middle of the bolt, " + + "tapering to 0 at both ends so it stays anchored to the coil and enemy.")] + [SerializeField] private float jitter = 0.18f; + + [Header("Light flash")] + [Tooltip("Pulse a real point light at the emitter when firing so the bolts actually " + + "illuminate nearby enemies (emission/bloom alone don't cast light).")] + [SerializeField] private bool castLight = true; + + [Tooltip("Color of the flash light.")] + [SerializeField] private Color lightColor = new Color(0.6f, 0.85f, 1f); + + [Tooltip("Peak intensity of the flash. The light flickers between this and ~70% of " + + "it while firing for an electrical pulse.")] + [SerializeField] private float lightIntensity = 8f; + + [Tooltip("Range of the emitter flash light — covers enemies near the coil.")] + [SerializeField] private float lightRange = 12f; + + [Tooltip("Also flash a small light at each bolt's IMPACT point, so enemies struck at " + + "the far edge of range get lit by the bolt — not just those near the coil.")] + [SerializeField] private bool castImpactLight = true; + + [Tooltip("Peak intensity of each impact light (usually lower than the emitter flash).")] + [SerializeField] private float impactLightIntensity = 4f; + + [Tooltip("Range of each impact light — only needs to cover the struck enemy, so keep it small.")] + [SerializeField] private float impactLightRange = 5f; + + [Tooltip("Performance cap on simultaneous impact lights. URP limits how many lights " + + "affect each object, and many towers add up — targets beyond this cap rely on " + + "the emitter flash. Raise carefully.")] + [SerializeField] private int maxImpactLights = 8; private TowerCombat combat; private readonly List pool = new List(); + private Light flashLight; + private readonly List impactLightPool = new List(); + + // Snapshot of the current flash so Update can re-randomize the bolts each frame. + private Vector3[] activeTargets; + private int activeCount; + private bool active; private float hideAt = -1f; private void Awake() => combat = GetComponent(); @@ -51,31 +108,120 @@ namespace TD.Combat private void Update() { - if (hideAt >= 0f && Time.time >= hideAt) + if (!active) return; + + if (Time.time >= hideAt) { - for (int i = 0; i < pool.Count; i++) pool[i].enabled = false; - hideAt = -1f; + HideAll(); + active = false; + return; } + + // Re-draw every frame with fresh jitter so the bolts crackle while visible. + RedrawBolts(); } private void HandleAreaFired(Vector3[] positions) { - if (positions == null) return; + if (positions == null || positions.Length == 0) return; + activeTargets = positions; // RPC hands us a fresh array each call — safe to keep + activeCount = positions.Length; + active = true; + hideAt = Time.time + arcDuration; + + RedrawBolts(); + } + + private void RedrawBolts() + { Vector3 origin = emitter != null ? emitter.position : transform.position + Vector3.up; - for (int i = 0; i < positions.Length; i++) + for (int i = 0; i < activeCount; i++) { var lr = GetLine(i); - DrawArc(lr, origin, positions[i]); + DrawBolt(lr, origin, activeTargets[i]); lr.enabled = true; } - // Disable any leftover lines from a previous, larger tick. - for (int i = positions.Length; i < pool.Count; i++) + // Disable any leftover bolts from a previous, larger tick. + for (int i = activeCount; i < pool.Count; i++) pool[i].enabled = false; - hideAt = Time.time + arcDuration; + // Pulse the emitter light so the coil/source lights nearby enemies. + if (castLight) + { + var fl = GetFlashLight(); + fl.intensity = lightIntensity * Random.Range(0.7f, 1f); // electrical flicker + fl.enabled = true; + } + + // Pulse a light at each bolt's impact point so far-struck enemies get lit by the + // bolt itself. Capped for performance; extra targets rely on the emitter flash. + if (castImpactLight) + { + int lit = Mathf.Min(activeCount, maxImpactLights); + for (int i = 0; i < lit; i++) + { + var il = GetImpactLight(i); + il.transform.position = activeTargets[i]; + il.intensity = impactLightIntensity * Random.Range(0.7f, 1f); + il.enabled = true; + } + for (int i = lit; i < impactLightPool.Count; i++) + impactLightPool[i].enabled = false; + } + } + + private void HideAll() + { + for (int i = 0; i < pool.Count; i++) + pool[i].enabled = false; + + if (flashLight != null) flashLight.enabled = false; + for (int i = 0; i < impactLightPool.Count; i++) + impactLightPool[i].enabled = false; + } + + // Lazily creates a small world-space point light for a bolt's impact point. + private Light GetImpactLight(int index) + { + while (impactLightPool.Count <= index) + { + var go = new GameObject($"ArcImpactLight_{impactLightPool.Count}"); + go.transform.SetParent(transform, worldPositionStays: true); + + var l = go.AddComponent(); + l.type = LightType.Point; + l.color = lightColor; + l.range = impactLightRange; + l.shadows = LightShadows.None; + l.intensity = 0f; + l.enabled = false; + impactLightPool.Add(l); + } + return impactLightPool[index]; + } + + // Lazily creates the point light at the emitter (parented so it tracks the coil). + private Light GetFlashLight() + { + if (flashLight == null) + { + var go = new GameObject("ArcFlashLight"); + Transform parent = emitter != null ? emitter : transform; + go.transform.SetParent(parent, worldPositionStays: false); + go.transform.localPosition = Vector3.zero; + + flashLight = go.AddComponent(); + flashLight.type = LightType.Point; + flashLight.color = lightColor; + flashLight.range = lightRange; + flashLight.shadows = LightShadows.None; // perf: brief flashes don't need shadows + flashLight.intensity = 0f; + flashLight.enabled = false; + } + return flashLight; } private LineRenderer GetLine(int index) @@ -84,33 +230,74 @@ namespace TD.Combat { var go = new GameObject($"Arc_{pool.Count}"); go.transform.SetParent(transform, worldPositionStays: false); + var lr = go.AddComponent(); - lr.useWorldSpace = true; - lr.widthMultiplier = arcWidth; - lr.numCapVertices = 2; - lr.textureMode = LineTextureMode.Stretch; + lr.useWorldSpace = true; + lr.widthMultiplier = arcWidth; + lr.numCapVertices = 4; + lr.numCornerVertices = 4; + lr.alignment = LineAlignment.View; // face the camera, like a billboard + lr.textureMode = LineTextureMode.Stretch; lr.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; - lr.material = arcMaterial != null - ? arcMaterial - : new Material(Shader.Find("Sprites/Default")); - lr.startColor = lr.endColor = arcColor; - lr.enabled = false; + lr.material = arcMaterial != null ? arcMaterial : CreateFallbackMaterial(); + + // HDR color so Bloom in the post stack picks the bolt up as a glow. + Color hdr = arcColor * Mathf.Max(1f, emissionIntensity); + hdr.a = 1f; + lr.startColor = lr.endColor = hdr; + + lr.enabled = false; pool.Add(lr); } return pool[index]; } - private void DrawArc(LineRenderer lr, Vector3 a, Vector3 b) + // Additive unlit fallback so bolts still glow if no material is assigned. Prefer + // assigning a real material in the inspector. + private static Material CreateFallbackMaterial() + { + var shader = Shader.Find("Universal Render Pipeline/Particles/Unlit") + ?? Shader.Find("Sprites/Default"); + return new Material(shader); + } + + // Builds an arced, jagged bolt from a to b. A smooth sine bow gives the overall arc; + // tapered random perpendicular offsets give the electrical crackle. Endpoints stay + // exactly on the coil and the enemy. + private void DrawBolt(LineRenderer lr, Vector3 a, Vector3 b) { int n = Mathf.Max(2, segmentsPerArc); lr.positionCount = n; + + Vector3 delta = b - a; + float len = delta.magnitude; + Vector3 dir = len > 1e-4f ? delta / len : Vector3.forward; + + // Bow toward world-up, projected perpendicular to the bolt (any perpendicular for + // near-vertical bolts), plus a sideways axis for 3D crackle. + Vector3 bowDir = Vector3.up - dir * Vector3.Dot(Vector3.up, dir); + if (bowDir.sqrMagnitude < 1e-4f) bowDir = Vector3.Cross(dir, Vector3.right); + bowDir.Normalize(); + Vector3 sideDir = Vector3.Cross(dir, bowDir); + + float bow = arcHeight * len; + for (int s = 0; s < n; s++) { float t = s / (float)(n - 1); - Vector3 p = Vector3.Lerp(a, b, t); - // Jitter interior points only — endpoints stay anchored to the coil and enemy. + Vector3 p = a + delta * t; + + // Smooth arc — sine peaks at the middle, zero at both ends. + float curve = Mathf.Sin(t * Mathf.PI); + p += bowDir * (bow * curve); + + // Crackle on interior points, tapered to nothing at the ends. if (s != 0 && s != n - 1) - p += Random.insideUnitSphere * jitter; + { + p += bowDir * (Random.Range(-jitter, jitter) * curve); + p += sideDir * (Random.Range(-jitter, jitter) * curve); + } + lr.SetPosition(s, p); } } diff --git a/Assets/_Project/Scripts/Combat/TowerCombat.cs b/Assets/_Project/Scripts/Combat/TowerCombat.cs index 1c37234..25006a3 100644 --- a/Assets/_Project/Scripts/Combat/TowerCombat.cs +++ b/Assets/_Project/Scripts/Combat/TowerCombat.cs @@ -473,8 +473,6 @@ namespace TD.Combat { var multiplier = GetOwnerBuffManager()?.GetMultiplier(BuffStat.Damage) ?? 1f; float effectiveDamage = p.Damage * multiplier; - Debug.Log("multiplier: " + multiplier); - Debug.Log("Effective damage: " + effectiveDamage); target.TakeDamage(effectiveDamage, p.DamageType, owner); ApplyStatusEffect(p, target, owner); } diff --git a/Assets/_Project/Settings/DefaultVolumeProfile.asset b/Assets/_Project/Settings/DefaultVolumeProfile.asset index 66d98de..1c6d468 100644 --- a/Assets/_Project/Settings/DefaultVolumeProfile.asset +++ b/Assets/_Project/Settings/DefaultVolumeProfile.asset @@ -37,13 +37,13 @@ MonoBehaviour: active: 1 shadows: m_OverrideState: 1 - m_Value: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_Value: {r: 0.5458793, g: 0.6841803, b: 0.8207547, a: 1} highlights: m_OverrideState: 1 - m_Value: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_Value: {r: 0.9811321, g: 0.7474893, b: 0.50445, a: 1} balance: m_OverrideState: 1 - m_Value: 0 + m_Value: -25 --- !u!114 &-8104416584915340131 MonoBehaviour: m_ObjectHideFlags: 3 @@ -161,10 +161,10 @@ MonoBehaviour: active: 1 postExposure: m_OverrideState: 1 - m_Value: 0 + m_Value: -0.2 contrast: m_OverrideState: 1 - m_Value: 0 + m_Value: 20 colorFilter: m_OverrideState: 1 m_Value: {r: 1, g: 1, b: 1, a: 1} @@ -173,7 +173,7 @@ MonoBehaviour: m_Value: 0 saturation: m_OverrideState: 1 - m_Value: 0 + m_Value: -25 --- !u!114 &-6288072647309666549 MonoBehaviour: m_ObjectHideFlags: 3 @@ -192,7 +192,7 @@ MonoBehaviour: m_Value: 0 intensity: m_OverrideState: 1 - m_Value: 0 + m_Value: 0.3 response: m_OverrideState: 1 m_Value: 0.8 @@ -214,7 +214,7 @@ MonoBehaviour: active: 1 mode: m_OverrideState: 1 - m_Value: 0 + m_Value: 2 neutralHDRRangeReductionMode: m_OverrideState: 1 m_Value: 2 @@ -363,10 +363,10 @@ MonoBehaviour: m_Value: 1 threshold: m_OverrideState: 1 - m_Value: 0.9 + m_Value: 0.7 intensity: m_OverrideState: 1 - m_Value: 0 + m_Value: 1 scatter: m_OverrideState: 1 m_Value: 0.7 @@ -410,10 +410,10 @@ MonoBehaviour: active: 1 temperature: m_OverrideState: 1 - m_Value: 0 + m_Value: -8 tint: m_OverrideState: 1 - m_Value: 0 + m_Value: 5 --- !u!114 &-581120513425526550 MonoBehaviour: m_ObjectHideFlags: 3 @@ -855,7 +855,7 @@ MonoBehaviour: active: 1 intensity: m_OverrideState: 1 - m_Value: 0 + m_Value: 0.1 --- !u!114 &6940869943325143175 MonoBehaviour: m_ObjectHideFlags: 3 @@ -890,7 +890,7 @@ MonoBehaviour: m_Value: {x: 0.5, y: 0.5} intensity: m_OverrideState: 1 - m_Value: 0 + m_Value: 0.35 smoothness: m_OverrideState: 1 m_Value: 0.2 diff --git a/Assets/_Project/Settings/Render Settings/URP-High.asset b/Assets/_Project/Settings/Render Settings/URP-High.asset index 074ee15..330830a 100644 --- a/Assets/_Project/Settings/Render Settings/URP-High.asset +++ b/Assets/_Project/Settings/Render Settings/URP-High.asset @@ -45,7 +45,7 @@ MonoBehaviour: m_MainLightShadowsSupported: 1 m_MainLightShadowmapResolution: 4096 m_AdditionalLightsRenderingMode: 1 - m_AdditionalLightsPerObjectLimit: 2 + m_AdditionalLightsPerObjectLimit: 6 m_AdditionalLightShadowsSupported: 1 m_AdditionalLightsShadowmapResolution: 4096 m_AdditionalLightsShadowResolutionTierLow: 256 diff --git a/Assets/_Project/Settings/Render Settings/URP-Medium.asset b/Assets/_Project/Settings/Render Settings/URP-Medium.asset index 3b9f2ab..c5c5444 100644 --- a/Assets/_Project/Settings/Render Settings/URP-Medium.asset +++ b/Assets/_Project/Settings/Render Settings/URP-Medium.asset @@ -45,7 +45,7 @@ MonoBehaviour: m_MainLightShadowsSupported: 1 m_MainLightShadowmapResolution: 2048 m_AdditionalLightsRenderingMode: 1 - m_AdditionalLightsPerObjectLimit: 2 + m_AdditionalLightsPerObjectLimit: 4 m_AdditionalLightShadowsSupported: 1 m_AdditionalLightsShadowmapResolution: 2048 m_AdditionalLightsShadowResolutionTierLow: 256 diff --git a/Assets/_Project/Settings/Render Settings/URP-Ultra.asset b/Assets/_Project/Settings/Render Settings/URP-Ultra.asset index 9564d20..46ffed0 100644 --- a/Assets/_Project/Settings/Render Settings/URP-Ultra.asset +++ b/Assets/_Project/Settings/Render Settings/URP-Ultra.asset @@ -45,7 +45,7 @@ MonoBehaviour: m_MainLightShadowsSupported: 1 m_MainLightShadowmapResolution: 8192 m_AdditionalLightsRenderingMode: 1 - m_AdditionalLightsPerObjectLimit: 2 + m_AdditionalLightsPerObjectLimit: 8 m_AdditionalLightShadowsSupported: 1 m_AdditionalLightsShadowmapResolution: 8192 m_AdditionalLightsShadowResolutionTierLow: 256 From 2fbee5fd999d3af707cb4687e53cb744e71ce619 Mon Sep 17 00:00:00 2001 From: Matt F Date: Tue, 30 Jun 2026 10:52:16 -0700 Subject: [PATCH 02/58] updating project context and roadmap files --- Project_Context.md | 18 +++++++++++++----- Project_Roadmap.md | 24 +++++++++++++----------- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/Project_Context.md b/Project_Context.md index b9552bb..3e2c6d5 100644 --- a/Project_Context.md +++ b/Project_Context.md @@ -4,7 +4,7 @@ A snapshot of **where the project is and how it works** — the authoritative reference for current architecture, implemented systems, conventions, and known debt. It pairs with [`Project_Roadmap.md`](Project_Roadmap.md), which is the forward-looking plan. When the two disagree, this document describes *what exists today*; the roadmap describes *what's planned next*. -Last substantial update: 2026-06-23. +Last substantial update: 2026-06-24. --- @@ -52,8 +52,10 @@ Unity **6.4 (6000.4.4f1)**, URP, IL2CPP, .NET Standard 2.1, Linear color space, - `MatchState` (NetworkBehaviour scene singleton): phase (`Lobby`/`CountDown`/`Playing`/`Victory`/`Defeat`), current wave, shared lives. `PlayerMatchState` (per-player): slot allocation, race selection, ready state. Authoritative client-id → `PlayerSlot` mapping. ### Combat & towers -- `TowerCombat` (server targeting loop; `OnTargetAcquired`/`OnTargetLost`/`OnFire` events for future animation), `Projectile`, hitscan + projectile paths, Single/Splash/Chain target types, damage types, range indicator. **Air-targeting** done: `GroundedOnly` towers skip flying enemies. Range checks are **3D**. -- `TowerPlacementManager` (server-validated placement queue), `Builder` build queue with staged construction/pause/cancel/refund, `BuildSiteVisual` ghosts, owner tinting, RTS selection. +- `TowerCombat` (server targeting loop; `OnTargetAcquired`/`OnTargetLost`/`OnFire`/`OnAreaFired` events), `Projectile`, hitscan + projectile paths, target types **Single/Splash/Chain/AllInRange**, damage types incl. **Electric**, range indicator. **Air-targeting** done (`GroundedOnly` skips flyers). Range checks are **3D**. +- `TowerPlacementManager` (server-validated placement queue) — `SpawnTower` now **seats towers flush on the ground from their mesh bounds** (`SeatOnGround`), so any pivot works (replaced the old hard-coded y=0.5). `Builder` build queue with staged construction/pause/cancel/refund, RTS selection, owner tinting. +- **Construction-phase build visuals:** `BuildSiteVisual` swaps between an ordered set of phase prefabs as a tower builds — `ConstructionPhaseSet` SO + optional per-tower `TowerDefinition.ConstructionPhases`, with a project-default set and a legacy cube Y-scale fallback. `BuildSiteVisual` resolves its def via `TowerTypeId` (catalog), like `TowerInstance`. +- **Tesla Coil tower:** Electric, `AllInRange` (zaps every enemy in range each 0.5s tick). `TeslaArcVisual` draws arced, crackling, HDR `LineRenderer` bolts that flicker, plus **real point lights** (emitter flash + per-impact lights at struck enemies, capped) so the electricity actually illuminates the scene — emission/bloom alone don't cast light. ### Enemies & pathfinding - `EnemyHealth` (replicated HP, damage types, `IsFlying`, held state), `EnemyStatus` (lingering effects: slow/DoT), `EnemyMovement` (A* path following, zone-leak attribution, death/sink sequence). @@ -71,7 +73,7 @@ Unity **6.4 (6000.4.4f1)**, URP, IL2CPP, .NET Standard 2.1, Linear color space, ### Roguelike — tower deck & draft (the current focus) - **`PlayerTowerDeck`** (per-player): the growable set of unlocked `TowerTypeId`s. Starts at the base set (seeded by `WaveManager` from `TowerPlacementManager.startingDeck`); placement is gated server-side (`TowerNotInDeck` rejection); the HUD build grid reads the local deck and rebuilds live on change. **Merged to `main`.** - **Draft system (Slice 1 — spine + "new tower"):** `DraftOption` (abstract SO) / `NewTowerDraftOption`, `DraftPool` (scene singleton catalog), `PlayerDraft` (per-player offered set + pick/buy-roll RPCs), `DraftService` (server weighted-random generation + offer/auto-resolve). The **prep phase is the draft window** (wave 1's prep = the match-start draft); unpicked drafts auto-resolve at prep end. Gold **"Buy Roll"** purchases an extra roll any time. Non-modal HUD overlay. **On branch `feature/draft-system`, verified working in-engine; pending commit/merge as of session end.** -- Three base towers exist as data: **Basic Arrow** (ground+air single-target), **Siege Cannon** (ground-only splash), **Wall** (2×2, no damage, maze-shaping). *(Coworkers have begun replacing the placeholder cube visuals with cones.)* +- **Draft Slice 1 is merged** (it's in `main`/the active branch line, not just `feature/draft-system`). Tower content available to draft: **Basic Arrow** (ground+air single), **Siege Cannon** (ground-only splash), **Wall** (2×2 maze-marker), **Tesla Coil** (Electric AllInRange). Arrow/Siege have cone meshes; Tesla is a ProBuilder mesh. So the "new tower" draft finally has real content — starting deck vs. draftable pool is a live tuning knob. ### Paint system (PAUSED) - In-match paint (R/G/B + Reset) recolors owned towers and drives effects (Red=Splash, Green=Poison, Blue=Cold), server-authoritative. **Frozen** pending the roguelike reconciliation decision (it overlaps with systemic damage-type upgrades). @@ -79,6 +81,10 @@ Unity **6.4 (6000.4.4f1)**, URP, IL2CPP, .NET Standard 2.1, Linear color space, ### Level authoring - In-engine `TD.Levels` authoring volumes (player zones, spawners, leak exits, goals) + `LevelData` + a bake pipeline producing walkability/placement/owner grids. +### Rendering & post-processing +- URP with **6 quality-tier RP assets** in `Assets/_Project/Settings/Render Settings/` (Mobile, PC, URP-Low/Medium/High/Ultra). **HDR** must be on per-asset (Quality section) for bloom/glow. +- **Project-wide post-processing** via the `DefaultVolumeProfile` (Edit→Project Settings→Graphics→Default Profile) — a **grimdark grade** (ACES tonemapping, desaturate/contrast, Split Toning, Bloom, Vignette, Film Grain). It has **no per-property checkboxes** (it's the always-on baseline). **Gotcha:** scene Volumes (e.g. the URP-template `SampleSceneProfile` in `9Player`) override the default — remove/redirect them so the default applies everywhere. + ### HUD & dev tools - `HUDController` (UI Toolkit): gold/wave/lives/leaks, scoreboard, minimap, selection portrait + context panel, build/paint command grid, build progress, match-end overlay, chat, buff menu, and the new **draft overlay**. - `DevWaveControls`: **F9 / "Force Next Wave"**, **F8 / "Grant Next Tower"** (dev stand-in for deck growth). @@ -89,7 +95,9 @@ Unity **6.4 (6000.4.4f1)**, URP, IL2CPP, .NET Standard 2.1, Linear color space, - **Visuals are placeholder** throughout (primitive/cone towers, sourced enemy models). See roadmap art TODOs. - **Enemies lack idle animation support** — needs adding across all enemy prefabs. -- **Tower footprint visuals don't fill their 2×2 space** — the cone/mesh sits centered and reads smaller than the tile area it occupies; should visually reflect the full footprint. +- **Tower footprint visuals don't fill their 2×2 space** — meshes read smaller than the tile area they occupy; should visually reflect the full footprint. +- **Grimdark grade is in, but the scene fights it** — the post-processing reads correctly, yet the bright/flat-lit ice map (`9Player`) undercuts the mood. Grimdark needs a **lighting pass** (low ambient, hard moody key) and ultimately darker level art; post alone can't carry it. +- **URP additional-lights budget** now matters — Tesla flash + per-impact lights stack across towers; watch the URP asset's Additional Lights "Per Object Limit" / Per-Pixel setting. - **Tower catalog is now a single source of truth:** `TowerPlacementManager.towerDefinitions[]` (by-index, = `TowerTypeId`). `TowerInstance` replicates that index and resolves via `TowerPlacementManager.GetDefinition`. *(The old by-name `TowerRegistry` was removed 2026-06-24 — add new towers only to `towerDefinitions` + `DraftPool`.)* - **Catalog index 0 is a reserved sentinel** (valid `TowerTypeId`s start at 1) — easy to forget when wiring the catalog in the inspector. - **Catalog-index identifiers aren't session-stable** — blocks cross-match persistence until a stable ID is added. diff --git a/Project_Roadmap.md b/Project_Roadmap.md index 9e9feca..a41edbf 100644 --- a/Project_Roadmap.md +++ b/Project_Roadmap.md @@ -4,7 +4,7 @@ The **forward-looking plan**: what's done, what's next, and the sequencing. Current-state architecture and the full list of implemented systems live in [`Project_Context.md`](Project_Context.md) — read that first for "how things work today." This document focuses on direction and remaining work. -Last substantial update: 2026-06-23 (reorganized around the roguelike pivot). +Last substantial update: 2026-06-24. --- @@ -34,13 +34,13 @@ All players start with the **same three towers** — **Basic Arrow** (ground+air ## Status at a glance -**Done & merged:** functional match loop end-to-end (placement, construction, waves, pathfinding, combat, match-end), HUD, lobby + race selection, economy, enemies + A* pathfinding, **flying enemies + air-targeting**, **per-player tower deck** (roguelike keystone #1). +**Done & merged:** functional match loop end-to-end, HUD, lobby + race selection, economy, enemies + A* pathfinding, **flying enemies + air-targeting**, **per-player tower deck** (keystone #1), **draft Slice 1** (spine + "new tower"), **TowerRegistry removal** (towers replicate by `TowerTypeId`), **per-tower construction-phase build visuals**, **ground-seating from mesh bounds**, **Tesla Coil tower** (Electric + AllInRange + arc VFX with real flash/impact lights). -**Done, pending commit/merge:** **draft system Slice 1** (the draft spine + "new tower" choice), verified working in-engine on branch `feature/draft-system`. +**In progress (branch `feature/post-processing`):** project-wide **grimdark post-processing** grade + HDR; Tesla arc lighting polish. *(This branch was fast-forwarded onto the Tesla work; commit the post-processing assets + the `TeslaArcVisual` light additions.)* -**Paused:** in-match Paint system (overlaps with systemic upgrades — reconcile before building further). +**Paused:** in-match Paint system (overlaps with systemic upgrades). -**Next:** draft Slice 2 (systemic upgrades). +**Next:** draft **Slice 2 (systemic upgrades)**; the **grimdark lighting pass** (see Part C); author 2 more new-tower designs. --- @@ -49,8 +49,8 @@ All players start with the **same three towers** — **Basic Arrow** (ground+air ### A1. Per-player tower deck — ✅ DONE (merged) Towers are unlocked per player, not globally available. See [`Project_Context.md`](Project_Context.md). -### A2. Draft spine + "new tower" (Slice 1) — ✅ DONE (branch `feature/draft-system`) -Server generates 3 weighted options per player each prep phase; players pick via a non-modal HUD overlay; unpicked auto-resolve at prep end; gold "Buy Roll" purchases extra rolls. Only choice type is **New Tower** (grants into `PlayerTowerDeck`). *Commit/merge pending.* +### A2. Draft spine + "new tower" (Slice 1) — ✅ DONE & merged +Server generates 3 weighted options per player each prep phase; players pick via a non-modal HUD overlay; unpicked auto-resolve at prep end; gold "Buy Roll" purchases extra rolls. Only choice type is **New Tower** (grants into `PlayerTowerDeck`). ### A3. Draft Slice 2 — systemic tower upgrades — ⏭ NEXT - Add an upgrade `DraftOption` subclass applying **systemic** modifiers: "all towers of damage-type X gain Y", "all projectile-type X …", "unlock Lv.2 across deck". @@ -65,8 +65,8 @@ Secondary-objective tracking ("place 50 towers in 5 min", "leak 0 for 3 waves") ### A6. Enemy debuffs (draft choice #3) Temporary debuffs purchasable in the draft (weaker / slower / **downgrade a tier**). "Downgrade" implies an **ordered enemy progression** the data doesn't model yet — add that first. -### A7. Tower content beyond the starting three -The "new tower" draft is only meaningful once the pool has towers **beyond** the starting set. Author additional tower types (definitions, prefabs, draft options). *(Until then, the new-tower draft has nothing valid to offer because all towers are starting towers.)* +### A7. Tower content beyond the starting set — IN PROGRESS +The "new tower" draft needs towers beyond the starting set to be meaningful. **Tesla Coil is the first** (Electric, AllInRange, ProBuilder mesh, draftable). The user planned **3 new towers** total so Siege + Wall can return to the starting deck — **2 more designs still pending** from the designer. Each new tower = a `TowerDefinition` + prefab + `NewTowerDraftOption`, added to `towerDefinitions` (catalog) + `DraftPool` (+ network prefab list). ### A8. Cross-match persistence / meta-progression Player profile saving owned content; **win/loss reward pools** drawn server-side at match end; the customization menu. **Requires a session-stable tower/option ID** (catalog indices reset each match — see Context "technical debt"). @@ -91,8 +91,10 @@ Player profile saving owned content; **win/loss reward pools** drawn server-side These are concrete, scheduled-soon visual fixes (placeholders are otherwise point-isolated and swap cleanly): -- **Enemy idle animation support — NEW.** Add idle animation states to **all** enemy prefabs (enemies currently lack an idle; needed for held/spawned and between-waypoint states, and as the foundation for the stepped-animation direction below). -- **Tower footprint visuals fill the full 2×2 — NEW.** Tower meshes (the new cones / placeholder shapes) sit centered and read smaller than the tile area they occupy. Update the visuals so a placed tower clearly fills its entire 2×2 footprint (matters for readability of maze packing and for the Wall especially). +- **Grimdark lighting pass — NEXT.** The post-processing grade is in (ACES/desaturate/contrast/bloom/vignette, project-wide via `DefaultVolumeProfile`), but a brightly-lit ice map undercuts it. Lower the scene **ambient**, add a hard moody **directional key**, raise contrast — post can't carry grimdark without the lighting. (Ultimately the level art needs to go darker/industrial too.) +- **Enemy idle animation support.** Add idle states to **all** enemy prefabs (needed for held/spawned + between-waypoint states; foundation for the stepped-animation direction below). +- **Tower footprint visuals fill the full 2×2.** Meshes read smaller than the tile they occupy; make a placed tower visually fill its footprint (matters for maze readability, esp. the Wall). +- **Done this session:** per-tower **construction-phase build visuals** (`ConstructionPhaseSet`) and **ground-seating** so any-pivot meshes sit flush — both shipped. --- From ce6205cf2cbea5587d627cb9fbcf5cc14f36b92b Mon Sep 17 00:00:00 2001 From: Ben Calegari Date: Tue, 30 Jun 2026 20:04:54 -0700 Subject: [PATCH 03/58] Update rider integration --- Packages/manifest.json | 2 +- Packages/packages-lock.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Packages/manifest.json b/Packages/manifest.json index 6060bba..97b2681 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -4,7 +4,7 @@ "com.unity.cinemachine": "3.1.6", "com.unity.collab-proxy": "2.12.4", "com.unity.entities.graphics": "6.4.0", - "com.unity.ide.rider": "3.0.39", + "com.unity.ide.rider": "3.0.40", "com.unity.ide.visualstudio": "2.0.27", "com.unity.inputsystem": "1.19.0", "com.unity.multiplayer.center": "1.0.1", diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json index 02f3359..9394995 100644 --- a/Packages/packages-lock.json +++ b/Packages/packages-lock.json @@ -86,7 +86,7 @@ "dependencies": {} }, "com.unity.ide.rider": { - "version": "3.0.39", + "version": "3.0.40", "depth": 0, "source": "registry", "dependencies": { From fc4d2adfe6795cdcd3a6ef940d6c3c414bee12b7 Mon Sep 17 00:00:00 2001 From: Ben Calegari Date: Tue, 30 Jun 2026 20:36:13 -0700 Subject: [PATCH 04/58] Rename firerate > attacks per second --- Assets/_Project/Definitions/Towers/BasicArrowTower.asset | 2 +- Assets/_Project/Definitions/Towers/SiegeCannonTower.asset | 2 +- Assets/_Project/Definitions/Towers/TeslaCoilTower.asset | 2 +- Assets/_Project/Definitions/Towers/Wall.asset | 2 +- Assets/_Recovery.meta | 8 ++++++++ .../Packages/com.unity.probuilder/Settings.json | 5 ----- 6 files changed, 12 insertions(+), 9 deletions(-) create mode 100644 Assets/_Recovery.meta diff --git a/Assets/_Project/Definitions/Towers/BasicArrowTower.asset b/Assets/_Project/Definitions/Towers/BasicArrowTower.asset index 7709fe3..3a1c5c4 100644 --- a/Assets/_Project/Definitions/Towers/BasicArrowTower.asset +++ b/Assets/_Project/Definitions/Towers/BasicArrowTower.asset @@ -25,7 +25,7 @@ MonoBehaviour: GroundedOnly: 0 Damage: 10 Range: 20 - FireRate: 5 + AttacksPerSecond: 5 SplashRadius: 0 ChainCount: 0 ChainRange: 0 diff --git a/Assets/_Project/Definitions/Towers/SiegeCannonTower.asset b/Assets/_Project/Definitions/Towers/SiegeCannonTower.asset index 54d91dd..1712099 100644 --- a/Assets/_Project/Definitions/Towers/SiegeCannonTower.asset +++ b/Assets/_Project/Definitions/Towers/SiegeCannonTower.asset @@ -25,7 +25,7 @@ MonoBehaviour: GroundedOnly: 1 Damage: 25 Range: 16 - FireRate: 0.8 + AttacksPerSecond: 0.8 SplashRadius: 3 ChainCount: 0 ChainRange: 0 diff --git a/Assets/_Project/Definitions/Towers/TeslaCoilTower.asset b/Assets/_Project/Definitions/Towers/TeslaCoilTower.asset index 5ee484e..e969989 100644 --- a/Assets/_Project/Definitions/Towers/TeslaCoilTower.asset +++ b/Assets/_Project/Definitions/Towers/TeslaCoilTower.asset @@ -27,7 +27,7 @@ MonoBehaviour: GroundedOnly: 0 Damage: 5 Range: 10 - FireRate: 2 + AttacksPerSecond: 2 SplashRadius: 0 ChainCount: 0 ChainRange: 0 diff --git a/Assets/_Project/Definitions/Towers/Wall.asset b/Assets/_Project/Definitions/Towers/Wall.asset index 8ee63b7..ead40ed 100644 --- a/Assets/_Project/Definitions/Towers/Wall.asset +++ b/Assets/_Project/Definitions/Towers/Wall.asset @@ -24,7 +24,7 @@ MonoBehaviour: GroundedOnly: 0 Damage: 0 Range: 0 - FireRate: 0 + AttacksPerSecond: 0 SplashRadius: 0 ChainCount: 0 ChainRange: 0 diff --git a/Assets/_Recovery.meta b/Assets/_Recovery.meta new file mode 100644 index 0000000..701aa9b --- /dev/null +++ b/Assets/_Recovery.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4da4faa336600407eba8a8b842ddebe1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ProjectSettings/Packages/com.unity.probuilder/Settings.json b/ProjectSettings/Packages/com.unity.probuilder/Settings.json index 9202690..ebf0b37 100644 --- a/ProjectSettings/Packages/com.unity.probuilder/Settings.json +++ b/ProjectSettings/Packages/com.unity.probuilder/Settings.json @@ -135,11 +135,6 @@ "type": "UnityEngine.ProBuilder.RectSelectMode, Unity.ProBuilder, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", "key": "editor.dragSelectRectMode", "value": "{\"m_Value\":0}" - }, - { - "type": "UnityEditor.ProBuilder.Actions.ExportAssetOptions, Unity.ProBuilder.Editor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", - "key": "export.assetOptions", - "value": "{\"m_Value\":{\"makePrefab\":false,\"replaceOriginal\":false}}" } ] } From 28b0e2cdf2248b26ac4a3138a7509d151d4f8ffa Mon Sep 17 00:00:00 2001 From: Matt F Date: Tue, 30 Jun 2026 22:22:58 -0700 Subject: [PATCH 05/58] Adding VFX package, cleaning up texture on terrain slightly, and adding new build FX asset for orbital drop visuals. --- Assets/New Terrain 1.asset | Bin 1958960 -> 1958960 bytes .../Art/VFX/FX_TowerDropReticle.prefab | 321 + .../Art/VFX/FX_TowerDropReticle.prefab.meta | 7 + Assets/_Project/Art/VFX/M_TowerDrop.mat | 67 + Assets/_Project/Art/VFX/M_TowerDrop.mat.meta | 8 + Assets/_Project/Art/VFX/M_TowerDrop_Beam.mat | 60 + .../Art/VFX/M_TowerDrop_Beam.mat.meta | 8 + .../_Project/Art/VFX/SG_TowerDrop.shadergraph | 8104 +++++++++++++++++ .../Art/VFX/SG_TowerDrop.shadergraph.meta | 18 + .../Art/VFX/SG_TowerDrop_Beam.shadergraph | 4158 +++++++++ .../VFX/SG_TowerDrop_Beam.shadergraph.meta | 18 + Assets/_Project/Art/VFX/VFX_BeamMotes.vfx | 2554 ++++++ .../_Project/Art/VFX/VFX_BeamMotes.vfx.meta | 15 + .../Definitions/Towers/SiegeCannonTower.asset | 7 +- .../Definitions/Towers/TeslaCoilTower.asset | 4 +- .../BuildSiteVisual.prefab | 1 + .../Scripts/Gameplay/BuildSiteVisual.cs | 28 + Assets/_Project/Scripts/VFX.meta | 8 + .../_Project/Scripts/VFX/TowerDropReticle.cs | 96 + .../Scripts/VFX/TowerDropReticle.cs.meta | 2 + Packages/manifest.json | 1 + Packages/packages-lock.json | 9 + .../com.unity.probuilder/Settings.json | 22 +- ProjectSettings/VFXManager.asset | 16 +- 24 files changed, 15522 insertions(+), 10 deletions(-) create mode 100644 Assets/_Project/Art/VFX/FX_TowerDropReticle.prefab create mode 100644 Assets/_Project/Art/VFX/FX_TowerDropReticle.prefab.meta create mode 100644 Assets/_Project/Art/VFX/M_TowerDrop.mat create mode 100644 Assets/_Project/Art/VFX/M_TowerDrop.mat.meta create mode 100644 Assets/_Project/Art/VFX/M_TowerDrop_Beam.mat create mode 100644 Assets/_Project/Art/VFX/M_TowerDrop_Beam.mat.meta create mode 100644 Assets/_Project/Art/VFX/SG_TowerDrop.shadergraph create mode 100644 Assets/_Project/Art/VFX/SG_TowerDrop.shadergraph.meta create mode 100644 Assets/_Project/Art/VFX/SG_TowerDrop_Beam.shadergraph create mode 100644 Assets/_Project/Art/VFX/SG_TowerDrop_Beam.shadergraph.meta create mode 100644 Assets/_Project/Art/VFX/VFX_BeamMotes.vfx create mode 100644 Assets/_Project/Art/VFX/VFX_BeamMotes.vfx.meta create mode 100644 Assets/_Project/Scripts/VFX.meta create mode 100644 Assets/_Project/Scripts/VFX/TowerDropReticle.cs create mode 100644 Assets/_Project/Scripts/VFX/TowerDropReticle.cs.meta diff --git a/Assets/New Terrain 1.asset b/Assets/New Terrain 1.asset index c0dd0ee98aa71118599e9ba4ba389c3b8ee2f3ff..1c948f89673d435e1a0e0a5565732492a9b3377c 100644 GIT binary patch delta 32247 zcma)_51fqU{`aq$oxSItS=R1tb}?zJEgM@cmNu6BPb@8#5L$mK2@#5@ED}*EDpyqg z-zrvd_Ujs zHKPqXr)=0cWyWmZZ2#dRw+i%vqlr;#+(M=PG)S*MnwXyc(m!<8>i%ezYLXsuMeV`c&8 z?@FbfR4VfurFLKA?l_%T8Z7xLODXlcQdfR%#OuFSsk@&rIu2W|)Y99P>iLFJUEeVq zH2zYl^7dvCq%7;G)O($ks(D(eo!1&Q(PHtPN+tiORNzdguYA zM0@v#bBQy97Gfs-tS9@e{Jf1f8gVgu@E4`hPAK)~`bO{c@03bBXVhb5R`Z=_SNE9T zS|7~(IZ3HCH!C%AiP3%b{pQA$AC%hAOQ}BV_1j@9Cp`KYrN%tXweHEVwI*1+zll;+ zjg;bp?QN7Qd|jzazBLAm{LL(KQ>ju5CMXp;W4tx-aiv%|>1U+|{mIyE;7dv+{AToC z-^XY&c(r@lvBm{;%BIACUxMW19d=At`;!9tk*JkX_)Ac!yA~;hr?JzP4rbqXyC}up zgir17jUCY*jd||o8b94P*Id7PFqU!8M6FrD!WBb}V_)lSo{5NkIYw&)$H~`kR_e>f zO10Qyl(qk<)V=eKf*9e0wn}}Nuhg`M^^Qy{W)U1O4{%Rp$_6E9O5}JCZjS!N{N3_n zrB0-oh$(nWsUB~d$Gpi(jek-pLJ^J7_JtAVx$a+;I(n&6M`B7HucOq67fhtAy2V77 zb=GK&_2squw`}X-Ula~jsF!2T;EFY#6v5h3(r7QJYg1N857NZg2 z^7ZBJp-$FfV{nXv`!75AhswkWCLoajNEQadFv*@4X5lLinA8pb!>G$O4XRCyA?(v* zOz;zvpEgsf^d=)LFo1c)OhJVw?wjkLE3g&>v%bAVsb-%VSHD$Y493+M2$yy&1E%%* zA}c*gKuw=%f(pqA(pUOnCVfag4`V(Y_g%VszQ~#w%)wqS4=`_nZQwmf1y;7+VN|KS z+N8_fPv~WXtn{oUBbB;kmAQuWy7hS@47qxBrFl$y*sU65Z44IRoW~}aa7X8lTbjTk zJpcp3q@t-(IP>q0$z9YxUDG&s_cdlCsVDnKSWAN?pmnbe#*-L~{36;xc_JOjz)~O* zPyd)~(2MwEL!3d3VVYfe27Ad0Vv@)r&WYKvPnk&KGX!D}*)KtDZRegIO_*S-uP--l zqZ|Uvw>@X-0`=f@|y zN2f{rl@N18GjIUn0?inT3yFF_iyBQSoO_>%XdnpVBWLf|OkpR?fU*HED@EDJ{z9o4 zC4U%v)`La>APWJg;bMIEhgkxGdB6ox4;)YuQ3by7*Sh9!qyhg?i5l=j3fJh;`BpT> z`)5MNL4X@tz$7qu=}qp@`PQOf3DpVf!vathHE-Og)Y|?^QDX5NH=j#1iHj)+6RK&nYh6Kc+K$rXLQfq3kgrtNz zurl0@SXS25wLxE0B%X-I_az&(0jq;gh{fvMumQr*E5GFo<;%@g`I9M7irpRM*3N)!s_{_i8gft|aNcbez zq(5~Apu#>p9(c%*P8Q^EHUbi0c@)EaIqu0j6ZZ$)19gIX{0;?Y@;no*T(YHuemfeB zhw=ugDJuGKn+_3pEmUNe*Iy zYj+y({UTd$%MIp)aT#@Z(qrzq+@NK@-NO1jpeug2WVQCez$Lm`n!yYZ1QrOt8r8k<{+M9J zwef4|Gb14Ux5=vJKLaYjHew^c&e)yUQw%;Mpr5Q1Nh)3nrX(~ZAHjU$8g@vM!L@K7)loOyxU+EsJ3?5DN zODnqjK=7O|1{JyZD(;5fQTSI3b&pmBk0n}YDPx?y)j_{s_m0{D3tWG{ldd`%jD`_{ zC2o68&n&mT)=!pOd;Smq_mNxi*P!k5m(0*r$Aj5^x0|-U3(k+vh-8+q_`6`HuPcK8 z(>Cidi10+C62OYU3hIj&w!DTNklDm1*Y|tnzsm7(99LdC@I%l?Xjh#IM$>T{Dv`@r z9b!A9M2CM2&WVyqEX!7Sh42Ta2K`B&92!d31)Y(D(R6y*w#3s#k>VfUbKsm|;QT z&xCZlv%&N{fQ`WcL;yNM>F~^lXw(8eM-*rcb*X*1fiPT8A4lDxLT|iLZ}!=_79`<~p8B-U-qDFNf7NG( z?J?wcEhQq@EIo6;L^1M$7(an)h_dF_9&R(CGO!%TTLX3Dp9~$YT>pix8RTQ}7 z4!TlMp9{bi2@xk`XD8E=(2meY&nOW`M*T9Q8yT{5viQhTiaHNDzHXc01hmsAwz61n z4%vAYz5UZ;^qG(yb3kX5!NA0fRFAB%y)2i!phh;RHt$1i@gOvrArlJHXOTnnW2bAn zXTo+_;^N++K$s0EEp4{PgRR+FJ5WNAB!&=#Frcm=Fu6h1W?}ja8bA*Q_ck{hc#6@1 z<1uVR+;I;N)&NJyI}a1Qdw3SeD~V?SH}VDy2YLx%A%TfcG^WjBLF&|;sfGo3B^sgw zk0;3?F`xv@8Otz+#(E?LF^xim97=+#8+v7!jo~pDOGZOL8b3BkpG&o)VPctUHeat} zj-74+&b#vBR_yKAz59FY8Z<;1Ho!#`RU(B9JuG`YHP-Y&2+uVLg$J+{kwx!`3yI5f ziSCI-c9qoII`)AQnr(*UNXafdQ}0M)cH}+aiPr=Kz{oB$r<>*+^LW0&&v06@6^XbP z-x3Fy8|~o4>;c)5=e}`*$s67S>I7!+H@5WN=Na3BY^a3~`5XpDWCBKfej-gzt7k_$ z0c^Aq1SUeWCcftyhA0SzJ0RVx4cYbLh3c(-*N2`6W$NmB_CQKv&q1t4q;MxWjq2^T z8W4bsGae^o$wiuV#x-Cv(E(WC81j$MWhWk__b)*iOWWHLqwr`tH@aTBT9_|2Wa=DU znPIn!fo?P$2*3b@T1m%81PRN`X=tYpqPJ&KbFtZ&{eYt2Gy@bOfzJtRo>`BF_nN%A z_b;qE zy2D(^vkhVSYrs8|DYnUiE<#-~9(G|k1g&IZ1q}u}K4_~CHMVm~=o5)W`X|q&o?v7S z#Gk)8H6lx}2aKH8-gO=+pa8Qz;Q5?{CoAGD}-e99%u)i`mB+JTDCo^D;$t%>5vzVH<=5OsX#p@Bmu}kk^pUJS;#gh zA$5;#S-S1>*|r?aK~)$NVir;x^pX;DteG7v0btsf8=v48%02I4HkgSgruU2~C~#D6 z5Rgp?Bj|v44ew!64l3xicpsYNeeS`HK!jW&AJTv^Z}BczF;vW#pY0tSfV$pC)FNI3 zIhY%hZs?`YH@8;}q9&4S9x@{*F6A2BIdp}AAyN#g2`Y@z#-M;Hu4G*L0$30AJ!6Z_xV^kMLP?jV2tOa`u^p4riEaJtY7LUN@*V`Hp~q2OF2n zFbu~tB8p-FDKAe|HfrdQ>o6F27ZCTrLxh@NQ19eWJF2T&+jT9tvXIyFt?f1GR01Fm zOhzHfnw+w2&bOo4U_21Y`*0AhA!ooGFdiJ@UYW_C&$p`*{k!sXRR=pa%0(a<9>78* z2lVKbej<#pO`)%uSQxBk=z%gQK>=Al%!KP*i{QHH>HJN!5OElnM1OL;tRts@mBB#F zYlo=Qtb^g&m#aA4Yx{xT+tIGf^e~IR0?ll81cK_SK%Uf@^c#U%ta z#fta5u^0DX9vx?fXT%c^sujj%UFjhI zTSNSDd|cxm7$62L+0wxjVBnc}WrRgAQJB#KM}m0lO(O=tAU6+K2L|Omf`=;UfeYLR zra{azprz9V#XTDk|FXB9bhCYp#fG8l~!26YX^`1|4q@(~>Om3R=xSP^Y%ctM*)&xE&mCU+ybmVoD9dd*B8s1$3j2_h3I@pHnC>$?FB6(HIv! zdGJ2R8#n=8^q(WBi)lUc5$PXw$ppJeGP2_>HhOW0E?Xq?0HKc}=mh(qf8-LqexjY8 zM?4}D0YVmek8Y0k;J9_BJ|is+~3B_N6Ak2@_8)TuhAdH(@{}1O>d$F+E5{Cj&htxM|e*+~Z2* zCVzjGrOT$;CvOBUSpx*4Y}0l@E0CM(;4_piCXM{fkrmIl7nGsHIcpgky{7v-8+k(_ z;wm%w)G51UtXo|oVG$;J(EV6FojlV{A3<1P0~i49+~X5XNMa|@64!$%z&?n~R0|BD z9b|t7-pB%HL>At|e%{1bMtgH++OfsI*b$wP5(@ZbBvv-lKHZ%T7D3nu{=-y<62BSaq=uXDz*KYtl(^#4ic%0d4p6g{gelIPj~^Sz@Ob5c|*{AcE>fL7@_Y za?oG=1+DOw#dOdyC=}uWXVkd7T_CAN8ot>>Z(L%Z?+QGCVqWn_dYC&)@jmHIcj$G< zyoROYN>U3^JC^;|au|n{B%RS+Tyk)^-OrZ~v&CE#KSp1$3iKlv$uq)&ydp1{&;$Fp z;7~)|PKHAcb(#Y(bSAf69D-i%hLyJMYe#OhFE`1C27G$}Z2$_-K;AR-h3O^>k{ey# z{r}N~b5Zx;OLkkI|NhxJx>m+lj9i(YOnh9oTWe?gkJS^2()EnBc8Y(06Qp}-!&=*y z2l|n;1T2ZmGebjYf+rN8V`Bbhf+=6BI#z1uSS6@TRUv{ehG1T!0gy@x0)zOI=!WFc z`G5d?Nr;M#iFuEdq%5!zhh#hxO0Y`)Ce>N*!bH}6>UH~SUoLl&kHk7-LGFTr(X;WI z7U<%-rha#qH4Ge+()HJ%n9a32_(}*)!1H1)m>%;tT!MVUJPeC55di=dL<7Jc;={MR?o@Y$Oln9bb=|FG74sOM6o+H@7dysbC zYwRhx^xx>?6_Xy*MUg)&>6|K`3t6 zm+u;YN!SeOkqSb9zC3#p@=PC$uizpVdTaN^t#(acCprtbDO3RuQ0mbci-WG@Im2OA zg(A}7U%a|Z+X}ncT?M^f7R5fYTl)O(cG2m(>{ygdAwvibm_ihpel5LS7w)pt!qQkSa6LcBlVgpJC+C4ZeMOTqzo}c19{j8 zL7=#x4VuD1Snx>f|0l5Hd0l;2v>F6LmCP_?&C5k3W-BX*AOMh3mO9ONg_8ORe?+zjM#6A#iF<_S6Q+<_20(30oV?(pNz z7`|C>pWhsGSO3*+4QC zxRB`KHDh-=R*=!FK13Onie4F`6D*8BK~XPv$y;Q`3FI{=59kK6BD0sD7ld+`pS7>? z#lU7<&AS)QZ{iN3YP{E3zC0u+sH34qo-Q2v;4xwnvol?V_3*jZT!NKkBg_ZZ2Gs)8 z$yQV(B7kN}6eNd&!O3^xIp&9#>JGd7HFbHDP(Z)u3;mJ@!chP42A88DLBy8c*$H}h zBJ%v~9qtK#DBmi;6u=E{k^>9@81|8%;3Bbo@r}3}SI~vR$as)Pk4(|yLZPTb(Z-+f zB;J4iR^dcBdS@u~Z4oZQHsm!%1qvY)lwYR}QU*XN6ave=^GR5u%rei1L+Mrt zt%w&V_?6cP;I*I_7SIP@0eXrP-4&Z)e8%9U8`l#jRBH^w=cF4Bqs_y@2n%cB{9*a9 zcpFqJKF*-07A*e1ODCD=v7WA$71LHYjw_@p>+3qC)Cy|f%el%Aul`) z2YY+sMV6vA(@|hFxI6_G!-KwFCrB=np04ROl7 zy8*jV(wO(v-4>J@FL`f-;3>lr++e=m(mK%>Tp-i75S1^U&F@UroxL~Th7l3{yy2$F`FtAD0 zVlPS`zN0VTJx(ymS{h}1LBB;bAU}Blo?}*`k8l;N9~7UKF{MLcU;_o2vSAR?A9{&0 z7z>>B>aE9ZX#WWYA`Pdr37z?;dS73sju7mKwmXG3v}0{(1IELjC;(k&FzXo(QU@LN z{>E7-zv%||Os9}z`Q-r=D`4ucG`4blqS^xB}yMucK9;KGA+Vw(qr3fPdZ;+~UhtSF2Db9w9YOqe}) zo6eQeR}2L39=0czQ4q$AZ^&5c488%IF%niK>|oCr!K=X+uMhv^@Ao>#Yj*E$cEB%~ zy7$h|p~If81&eVI``rD6duVj1(9*q!*?~?VGy%)*-i}C)mS6%X z>M?dc2Oj`GzOsW^Qw-Cg!$Q zwU#P%yNEJE)*Y++Ee(zGKRnGXTN;Yh3LHpR(n9wN-Q)Hv4LueNNUUAPWp3|{p~mC= z^0S6%4a28{@fn;q8upTg+9Kb2TILHx-4#v3+k?s8R}hfmwchT;=5lM6hY6m;unr-G zg|GtHzNLdZzje4W7^B2OpuO4xBC;C&>+)glw2t9?Ul!41pmPC1mk%=u*}mMJJUpE1OQ%rdDOWvf=LZsS+LzgcoW@&VU|&iRy7TC#JjA)53RKIk+3A5eu*(mfX_8 zkUNy|CK42Yd6V7gGsBs_Tz+4HpoAtI1ggrUi+w4|%pfVm02hT*euh&yOUz>tKWqEz zLG!}VWZ;k+5MI16YhF0!%fhJC3_4jv!jHrb7jpE?^KS`~lIiZj`QZnwTo8&@7NdiC zq!8iDg*;$#>;NmL;0TJ%UnmBT|5Szx&;dEU8-7c0D;I^QTb$4qEeYqO6Oc4?6krbz zWpKK9NjU7wLq5`+hKo8!GXSoGZ47p(j~JiRPIkc5^0UYNOT&|`T#6)tKsDk<=o#UM z&B<`|fW3MXn?Kigr>~S;%>fq~cL96g1uN6DQ>xgBU8sj#ch++Euad0Gq*tNn<2WXr zh>KTYFYNR$zdLcQq)86=PJ_dI4<^Y4_y9|Jm`$iM@SQrxtt=JK=D_X9E!ts9H1viL zML&?*GcP;KC~wy55=S{e2`mxwVgyPt&LW1WEZ$A%HupZaa-(2SHgG~O%=i<}Q%=1L zdB&1R@@^M*&O4${7^X+JUi7NFZL_3$HlfJ@f;UV6O=y<5yM4JKFKoa0dUyU-v3EKi z#azh70|;6$!QH)05;BiqC$6d5P$4)03J}IXktZ8BQ36Te)q~|sM&dnwCW9g{cZdl# z_P+f`+7r$!f+?Z2_s)0s@5bIZiMkEHr7d6)c7?ApdV!E(UOLVX+PZW0kzI_&>E*>)pv;Nk(N+toVijL4{MG z9RM_wDMFf^~wAN%4l$4kO42e*xJCH#bGvY!YxDW4vUbHcU_J&^Wf+OK9 zUzqd+v>ut_mK_Z*u!>+fbP%jck%5j7K*T+ig& z?y~Q~QD40HaomqiR~r51tO+W97j#h*{Rg6NfWQLE(gixW)gB^~f{q$l-w7&7E@= zoCAFbW-uEeSOmk$Z+`cl6HnyhHU?TW(BK<3LwC3_0fE)2mUxTTxE0DL4Z?h1Qm!uw zX46r4KNmz4$gn`|et(kKg?a|}#6G|lcZ2@$6x>JcqtAnpL+cqPABnm1LrIc*06Pod zI%G%0zt)Xcfa-A4-By??#Xv`X6*wq0DT^ON&Pq+n@x@r4o&<7_3AvjGi77w6DDEgl z@LMNol$DQ@fD%F)RRJxW1!-b$LLT8+1x+zB8T(1DJEvY!rq4mR_T?tT!GN9D>YNli z%dL(kjkOB#2jvmcOf~_kxPvH!D6>6rLE8-ofMDb;%>e<%_zdsxT7Gc6v|&=RFG?WL zp6~&o4fX@Bds>KXVs3RNJEH)Kk*D4umT`hX&Q|{(KQX8Gs;D00LQmM8~9T3*~#f z=`QM+l;=w(S7DqWi`0evolsiPxPSMgiN0j)h222pACukv1xb@F3%(-Veo>#KLVc=N z@MoR!RUn|BElO(Z5ak>zP(sN7IUqV#lvEYW0&qPc!GB5=5Dz0|J;FyA>9IjcBP|Pj zf3LGH8lIHz7mQypT%tY;P+)mhVR>SL03)Tjo0Atwk)tDIg)lXXQa=7kx9HBKaXtr< zh%!VL?4j>Ew{o;7sPLyV6=FZL|Ec*rIt!=Ykf$){w0hElkP@ zMadJ-CXqroh46d>dx+zc|4NZwQv(SAsAkFF9E`~McvWu-}(emTxR zTAFk^n9Ly@utb*cXzd=|C~x{@l(2uZya>a1aJYahm8>bu{Tj&@a8*juUcUGDIDrxI((F%F`?+zuc`nmvpk0MF5U{%H0vJ zaW3dT6PmltsUeS=@<^6PEqSE4+nm(N5BhgquPE$lNX1Sz;*n z@E1fzL7yIP2!|42sUe1JA^G3&efNB(HQ(=6FHLRh%OCx;K*CTGGJmWv?I%M|%@qxwVl8|-RVE*$q)p|$Tw z=K~%~6E}NwcJtXgoAiNhjAthB{9BpNwQ227{ z-h})sM1uY=%NI%{5HP{!&ITVQND{~Aj(;=GK#Ct~N!fT`5?Q3psc`$ROWl#sot^Pw z^G{4}uDnGkqKMD#`VK>a*!k*x#$4E)TAsI4sLDUYM7xce|8$4XM5{fikT=s$Ve^UCUJ}iq#Q3GaE{|@T8#hX&g67oBXB3D(K`us)@!&+uf zlK{CYHwfO@pR++Cq<~6)(WaGAi4xmpO9f!6Qd2EVFhe` zogi-im))YBk_OqIG?&y9I}$Je8#g!m!~~T(FQj*a$)lS}-J(6IRSCL!L24kA=s=}= z=8G#uJx9U}Z)F`Y;ugH=7FBR{v*W3O7|{&ZCqEIQ%{Jr1y5g(C4Q}D*sfQAD#pcvN z7LI8o$=74TMjmN`yUX|b?<-^$b0=pgFsEbFy4TG-nG!^L*RAY zWL9~0q(P|bL~8jl-5+13F@`*pdYdorT}d8dh|$XXQmZ=2a~p}T7Y9i{E0Wa|D7wKF zl2j@jO`xl^JviW~AfkGWR;%;q` zD(f`!$#-)rPNY8V^PO{7rUu6N-HMZ`GZJ;hIVX@N4p!p)5_vi=|Ky0sqkcc58@8xD zK)yQ_@w=a&NuBMpmkLDii976<)Kf{qq3o2c399wvfO<&oq*0ln7dEuF=oJm^4d(yk z7sVZQMU_}$kLAqvrI8qLOVlO|9v`WaPP@K0g17qJondE&FZoY53yHkfq|pmx$4C;cieM{Zqh+G)OpJecZ zGYyJ9DxgDlUS6d~*Ks-}&l0<4N|KRy>BsfvI?kLJ84mjZs8$Fbw%Q>z{j5nUDayrl zoumE|GML(RWQIY-!7myC=|FHO+5oKZ z`KL$A+4<|jA9tDe3C8wY;z`s%-Lg`eA&GFRT+fZhK5b=js^V3Z`p_j#aWI~6)#eO3+3-8Gl;wyiD(d0j)cu&k38~;cA*pK4i>4JO^9B!j-TEB?Z#Rk+o&}y;N zQ-A|X0BOO9)YY#p|6__oCms3DbkVg1Iw&p~hyFl9`%FA(2B_ObKXkiGGNac9b5R#D zUQUHj9Wg4xyfEB&FL2hl9(cnh;6^|My|mguYsyK(O}=SpzKqZ?!>OH3EOHTyh#(`? zfe#8Xv4la1%6;PY45!LpGJle>9(aibsZ)rLG~{G0*#)&(5Hv)6+=%O_+{7VL6ABX_ zGgyEC)G{y%@4=)P9r*rbw4gD4c&bpL(<)OX{UiZ1$$#=^f44txFC1AFJyYUruy0C2IJMu>n<*w1Ex~ zKxyJRpoXa6LAqco#3WUyV=y)dO0>}>14E3Q8WXy-H&EGI7-oNm;EKa}p1L<#G zEtveSsVsyYB&N@+`sfu-Q7!@?5GnQC2+7gqrWkS^g>~#A<3#+1jlcD}v~v0PeZYR* ztiq9RuxC3nN(gnh1Hwc92t%y(?Cqw;kka@Nxljxr5-_k{?u9lWo2Lje07lauG7;IJ z+I)szxz{hxtVxZMduqq?hA^ej5K!&P_0cPxqUJYB3Q#N{JA^hI6W0+`Jir$U142<8 z{_gsESOWfga-1hirq6&p3-uUhhz@apYv3uw1y!F7TYYHWdt|b44HJef?M+3bt;iAl zMKjU^KE(Yb`#?cc8feytRZAFrWKs$XO2q1~n>sh;!m!{mNC$9%6cAgq^+*)4!@^LG zaSQ(^Abp@KHsYpS=dogH$+{w$)pawm$9=3jd#XtpzP~|QQlg=@xCM*xobinb5zj^8 zf0(#_K+^IuiOqhcdUFeBdKTe^A`CtO6l6k9NIEVf9h-da7PoZH`A43vA)R7S4lJ%U zLH=4VLo*SCss(a&y09R1E3xpCGIAI zFBL4HIbq~a+5&x-$Zjx1q{`c6QWuFBc+mzATc)?QaVBS>1#TvADU7(7`U5Y#Z3(rT zdgB(ib*zM<{f!Nnp_c&B-{h@xly)!)< z!az}EJ=P$#5SGfybtuE@!!ftGgOi?6z(rYK{sCN6mo)=rVk|zyYLqeX0LP;ZK{Z;Q z*?`S?fKlCCUDnx|o(YE|w+YDB9~w(w5iCuM*x^5ZQT4H|=;}P*2`mI}J$n$-v@|RY z_57rnnWYnV=vV8MDTd%N@p;WIz5WJgL1w`lrYyyKfl^}wU=ZUY>d<8u<(2#!XR>{P zv!WfoCq3C7KjH%THt_uA6|!}n3|8_5kYp?P7%>7E;s2sn^!gso{6>@r(2>vB9#kaK zu`t$P`(5sl{O}aN{=Cq6w%v>eMdyPC!4iKlexgo{kQkt-1KFei)ou07W&wH{Y}IOq zF74$kjnW{K+r$Os6A%NqhOBandy9W_Ifm&Yb-7)+@Z=XI&%QSUeK7syo6Ly@{saYK zNIl-rYx+71uBNkL9h!WKqA zs4g69pe|NzI#}GngaUNnBm_);e1cvxz*&$3D9nuL!QjbM2`y z?udbolaP0>7#l#Q$EGoTwU5C-LoJ_6dWA zBVLeOXGnmHq2ZM*g>yhi0-dPnCt8zL5LYZlSn|jfs}P2;y58&c-Z9ST9HJ0Q!$s%` zIEJ}SJcD{T9)u^NI=)8+yCcUs{)Ca_Lh%a2lxYGe0k{a}O!s!rqf$*DkZ=~*$5!OW z^_vYV9K2fGBJLoAL1uD;oTJJD3(!qwkN3{gd&fJYn-g8oS%l_uLY=hWnJE|cH}E0v zVQ0PXu}FQs`+kMH?rx{tKLP+k4L&6nd1hY15e9>}7YCbKj7FFb6kuirm?I$oPB8-= zsp9|`YtTz@j&jply?2tBl6mxt=GxC;8HUznkW0x>QRiim&e#e228vYEP!^+ zK)rX0Gdjv=Se3}edH@K?F?6|Gbe{n5h__s3_0`Oo` zd8`ftZv%l7#O088*1>%gRE$UX*F3Fv-|vibKs43>G64^n*A_hBY_9wAG8O0~gCwqVYdqpSeMyKMAoTvF_k9<5RIk`C zGoDtfogoS7o!&P?L^J^GDL>MTmA>R0ONhcLurpHQ`#65eb9p;m`iis20$JqyQJvN~ zg$dE2%gkH>u%*OMHptW0Z`7r)Ig1<+aOet?zXYhvISV&9`3ZX1U?-4H$s>btBj~Yg z7;e?8-f$K>NDnfMlN2C1vp;tW-gMd}M6oQx7h-_11v6zXY`kBua^*%cjd-VL=BR1- z3vR(Cr&B^Y=?y*L1b(EXHXz@3onG~>vnX2H&%_I93H>CASfu_@x9~mLH3n7?c?1+D ziysn7Cc;5`Zq%h)ocU1#j1wq^E)0S(3Z9bhV-=Q*(pi8pHYcqB4sSRD|LQ6?lCnbC z)_>s4iPCS7-du-EKsijmqm^5@9Xqh|a4|n{%3Pca303(wW!HSDgG~AwiVt-Vevtp6F>IW^ip53z($Adv>6|gN zloTg6QEh-klJKm8&qep<9D$(IJrV<}2bt=`SpozcFW^RIZ6CHWgyf&PV|j3jZg#*) zNro-buz_(+zHkc<;9f{Lfde=Zr<}QP(FbjaP+j`9#PWFY0suxBu+hLZZs9?0#wK`! zAbO?9pmSpZ3;5}Pmvrf2xp}Q5JVy}puGAd)0$*XZ*rN&GFd)tNBHzJ=a#AL0@SP9d z+t}0SPA_@Ce*MqR+++|K+QHW&TI_MVek)G7h6Smn2*R-ibP4+D{7rIdsA%xIDNZj* zp@UolKxg%jy@KO)^#=Jhd9&k^j1UZ_>zD!iamvv56}RBH>~J+YBhBHMX;i51kkR{R z86d9rttp>Xm&rf&qgOTzOp4EAb+hlC8V+^zS_yH;0A1r<3*Ex+MR)5;$@?Lz^nxFp zEZ-^J=kD+n(|9*K<Rxcz_T2J*1cS9-xeowvi(@kL{}*e(3UDNaa!MI3f8)BKEa-o1MBug(IClAE{F zE&RT3i@^%qp&@QIF$TGCzg1bzt{&SA=t^;)0qIX|+x z5oPgGk(WZhaCH9!x$Lt3Vu3nHsy{|JGkW{T7MRS7cj8TJBY+HG-@pNO3B zr5~$nV5*Nujez8I^F40zLisTEn@`TX7RUu+6GC;8jf4e`OS0UVPEz9O&qtiz9EQQ-gp~fE!L+|A>Iyz<*ylSoeH3QeKlo z+NNXFh*)#A{x^5wkx*@)m?=Z|TpHOPlFvjOPFao|PVFV{f2(^wA1Rj?fxulpwLq62 zi?n>Px{*(JTNWu#VFbaBP|f$+sKkGtvrN$4Rzy1Z7mU~QS45^c97T~>C{bSwvuxPE zr5d2St%|fQPX8HE^9BK857~?Zfg7}N_}ENtLFtUgvB#O zES9aPk(|p=h?z7HS*+1!tC?O>3Lzm35CLXpwG?quOaAvekLc%>y4UCq z878$zhQTjhBx|=dk+ww?#;Yp?16LAQvQ?GICpZyDbcGUE*!h+f=9GqOM?GV<4*f$A z=UY=;qklHRbajQ^zb29ur9~iEiO){&%0t$`$`?h?0NpGvO|12Dq)Yw_!%Pn0&aQ8p zf}g+5I16i$92~xMmZjh}4*q@!GgfTwGyn?yE=JNd@5L9z(dYX zbYnQ&-E_0O+4Ro9QxT1J2F7;CZpY zDZTP+!WD5@KL&ialYGxj zN&}h@J}r0a&FdpwQ$e(G;*TC1jbFPz)365rXk24K!3~j~nN(81muTrIhF*M!oY@x} zRHFHAU#2&2h;*ulLs;v!C6ZNQ39p;xhD#ik6U(-E>!E&LtxmE}$q2U{;=iXNuq*VoG9^_$K{^tkk-S`#PL zJSBMXy-+FLv0qvP3AhXixSf$9PWg2Pa#s$K3q)hLtKPgb(lt!?ifY%DyWw4tWxh0; zbb19U8@9$DpLoCHZJfNlwXyJ{6LFs#{#fp*MD30}$BNZ^ zzv_lRVIRT^3?N|{tw2T(>XloQ+9!XIZ{{AnmG_Yw{*>z{h^ygx@IEqvQSpWAcU~h) ziA6_981-B0hWE+!>3qImya@@yn7!V*L6=oVI)w?B$#VdHH~blkqb&8BwkwW{lFo1F z_dkzx4iidrrwtCf;V)RYjRYYB0giTEaptH@H{rC=G1A$Z1w8#5hf_O6x}TKg9Im#Rn&3xqCS z=7ztHtoQjpY^66Jj1+|F3h>$5es1zNku$#VbrK#Zd-vmR^5MuipGEUFV2zu6L_W0$ zqSo8p@So)q|Dasg`b%WcfDk~tyM>T{?HgmgsB2u8*4sg<*+Z53?mSo*Qob53-DU`of1DgyUOdj<#L$gmF{)Z8 zNvKZm7!TuRP-19PHLmNWY6-mdhPMO)B_fYOztcK32w(t+^k$`U5y*kGCF=Q*1AT(w&hL{LsmyT zR=NCuDQVwi$Tw3X5+**wQO+x=1`^PnMFp#-8p$iJqqG24=_;YxJ9#@dItv=T1E_j2(N{i&6MeNTt4~6Jr`Pe1l0K*HzG=;pb0l^f3N&nOW4@yx^F}?aZ(1Nka>7#H z)2Wl<|4zefcw(Zi*)MHCn5?*2j6ZJ@yDm1awr`RIylISTbMw6_XQQK9kxoy$f&OWa zrG@AARE-J$jRnj!3-$3aX^q1@Zc{zSOYTVu$KM<^R^I$DpjzH1!QNZ`OGNQ2$EICn zf1fI2oYtzNUg(ozcel@Oq(|MARwE0qE*K|WL_djDdCeAcC9WU4Ti&a!I+i>rJbLkk zh3-mA$y_}^;6$PpSh-4acA^CCvSKM03F^{e0#Fm@ad9U@RELdAs~;l}?-D~a-6Lm_ zt>kW*P<|$H#(TFutCx;TE6#klz8chC(&dh)QARx4Ts05N0o@KMQiwNgmX3~38yOna zK;3i3r>w(z-uSdB(f(q>{f$gUkySjF+$tG#%LRMfomMw0z@)b2|Idq-3Tle&jeWSN z`^NwMqOl_2W8=A~z^F57f>?6&Bo({=4pmR@t7mtMzwaKOkk%zJamUpv{5LHm`U*X8 zN?IiG!CO>DJW{Tx|FWP!WmKi?X(s>VQI42F;CFjtm9nXYN_nP_{P)2srlh4r9-5#M zJ4-e`)J-*8-b1B6*G<*c8CTY>uT$< zX~pedxmMNrEUM!FoyMP~uUXMU)%>7=s*6{^OWr#xXFUADDGK!m&=x=EIhQM`_3>yQ-|rv8?9SXd z_xyaFbI+X(%QlQ(wqg9lDWNIhDH&5DFJ?ZwG5q3%e%;2*6H#aMqe{)W!C$&HGv#`Z zU#ryZ4=Q!pGfG`QSE)Ov`P+76E{{6B)+#mhw|d6j%(Qdii%OmMie9=mGnMMSMyYl? zlq!Eqsp{V;)%R7Uau4}C_GZ2jt$@O{k1KW4Y^BcLq*TEkrP}OLs_AD+wf)#U*lI5i zC>8%osg{3I>a;JE%J`?h6Z8`hroh?2+&_Y>851e`SOl@uX5CpHOPx3rh8W$;@!Zhh}P?hP~L=N@f3D zsU}C1%KFl<2K%s^IIL9UA4)mLzGHXS@yuCKM}4c5`c~f&b}Gs~{sD6! zUuwTn+zUpJFd}D(<> zO{vl?`i&x|z(E*M?SUepT5D{Coy@_*_A@T@fAfq(RQ^FJ9GwI4V2}HVfryA=wRhHg z#-Gs=j#cqTr8?A`F*pe#!kB#a|61bwBC4NWGE z3geImS?!d_h(9vbneP*u1g*cd%vo?sMq&=4I6B^7O)67~r3%c5aQ9B8t6u+d~GQfh)|9j_^pUXF;I_!<|$y z?t#dRA#6|$!FYkM)Q`8CqjZbEW4Ny3^m|W_A}yJ1K0^cA(((5#<1wacgExROvph{z#KV+7~~%G zPR@}bZss2ujhi46Fu=@EVibn4v%(pyLkS(BH$sXt9AGTKjB#*CNa7NF$Cvrcb+|!| zB&pw3E48;(Fohqz&6yM(jy^cR1Z3oCppwIK!e^-A7FdkjiCdv`W+l!za8?e+7VPo& zP7wdAMKlOl7zbzVVJAjOcrgkjs2i){q*n*30DVv@?o;x?sQ^a}c5(~=1Gu5k^*^61 z;8srTKozAkD;zXFbDe{6C>J$|!`4lA(gje2L!=;XIV{w++2!w@?#znT!WQVjKr1Q} z*n?|4$QVKjU31Us82w`{tV#hu^dOc6TPC-vAT+Tk>VlqF+yDD4=YeP~BH~k4JU&C2 zr||=*F*DaJXPg;tEeNJj$XMt>ncRam9JFpQzKVjeJ{-WQK$riIdCpzYT6Dn7b_S>; zKU6F?JOMQu1>9%6m4GuwKu)3n?$Hh0SWbvN?gMYQ1K=s{mKCs$kK8}rKk<}vNA$Y+ z*O=@FML1wKs~b4r8r*T8>l}8BH94~~BQgWOSO|{LC(c{+iNB-Hsf$*lJO*)*1EQD~ zBOsy`mCtr^h{FKmAxc^!yb!PbHh!0e0<{T&+viqFI%1+#8GRaJc78Kmf5zSY?k)rEZ` zkzzecsjC;5=tob`XHKg}zBf6dSM6}p;n>%*NN_es%kVMu0BNga{1aG0bX)rqOAyUG z?r+=ctd17fcc6wfkc+Yj2c&=q1R0$EvtD(;Nqd%WBnPTHzwPfkAQr27bhJ`qW-2vc zg%RJX1y&ghVQ?Qa<2ESW8ilc_*Q!oZ*uEoDiR*@CnUUeoTxJ#yM61OeMq+!6U}J?@ zfKk6Or49E3ym^6Ap08L`cwUt-%?t5$zB`k4Vde zxB`>G9Fi~*_a!cm$D?)88ejrWAz&YbGyIv-ns9;uXC`GF>fwMHjKOn!XB?9PIi$jA zclw8J$lMn3w>OP$3VReuSOpM5@MeF}E7H+|PS_c{LV~l!8OZaQGfHL2`s4_uzV@%4 zpL=)sg@$%R!@9nMEA(4O*M{}NifBa7FN!vcBNT;smkoM#Q8ZObC5rZ76pY1PEiNzv z-|;vWpRf1u7qp3Njp&CrIzsvM=+1DsL%m*65-lo0!&ZZ6*y0Nu5;I-jG*%NDn-4=H zXG9Gp>P2;-x=-DsI;wY9ToG-E z1`j3w)Y2?j)f{z$nxgJj~ukw{dvRDV*A(xI@MuP2s>0NFQ2 z>$~Wjm6>ka&vTSIo~hJ_XNbT3T-}^gtHxIJRrhsM>J3k+zsc>-^`7SLE&7Y*?uh?y z|D2;61PA^4XQDY7ZRcKZ%Bx!*Hfhh|XU8=vXSq@riQw1%|DCYgoGl_{{qLi0hQmBV zmioJvM^8k<=WO(Mt%@Fsrf;65)FpK$S^!XtZ#ePyt&8r9hOc;9p9s0BIrj_WpKTOf zIuzgTH?z02OX)8TMu+v|hQoU7kW3efdgoqoY%BS-kL#IBocHv?CC>UE{O95N%rpJ^zeL?oSk^H+ zK8u!wrE+ujN2fc0nqcvq{n4V3&JMfT%#p2om${J=qPcN4wxP&%aEu6t2k9{V*ZDi> zhO3;&GuuCphQhZ!q<4G~O{Z{nFp=Yw{&f6sbgIs-cU^ShI)rKd0sUlFZfed55q<69 z=utf|$8pQSTLKSoCZOR5-r$qZ1hR!a>VEz=7_v1BkxN5bxleG#5wpYji=rZ}Ze0?s)j9_$02)>hcf z`jgn`c-UQkCj@M(>G-ATDU7SgTyud zeiM|KfVzv-JYXgl!xx!!)VqyXf352l79pMS@>3F6R=?BTMm@O5y|M^+ zhh4NmU0t(CseA5IiY^%GQvz{wk(=_Y9qr8FfB9b*x$82E>7%n5K>-Jw5TvHT=PBsO z%)@`9cb(yu#z8-f>waU@8KhD84*JNaeW6bj#?rV?SVl++FKASW1V}Kr#2wWi?XmB0 z<*!W}hc*Mi2bLfP4q%LJ0-n&ug*c-c41WGf|3rx^`!b*ig)`{EnR>AI8ojThTaY4j zd#yF#1VE7i@(!K?;!>*=h%ke7@>6bO41p8pd@iP%9uyUEi>(3}Cpx)L4F`Xb3OYyt zryM*7Q&%lCI;HgmBS^qF4&0VP7GL7J1uO!HB}18eD6GEjR*H!G50ZxIJ!DJPBY&D})x&1OoixO0HJb|kO_B4Tx@ zqYU@~DY?dM_%~xtxu;PQisE1#_jm@*IIKtg^r`=;yp-OHzkQI~GL)c{qYFYwb>**h zc!*n6-58``5LIxt{s6-;3WmT00ZK0w(doZfW;jz-3|OI0tZ|D{7zsBgtI-FTbZ>C) z(D-;NNSblng2@Ghw+?Z4RWT7BfYfM<39+V4)LaAXabg%T*nFxsBq(75x)W>v7tJi& z7!}Q2Dw?S!5U*Njk{8CrbU%H{l(BG+nUDxgSdG~;8narnzK#ZA7@x;I(Hf`%Emon8 zwYH|W(zjjip5rhmwclTQxmyq_Lu~LISEOdNSdXK#2?2-1HgS(K~0PY3$)R9}{!kP7LaSgk)H%2)tgLGa3*%^L%}*C5W?mw3|u+_O%mD9_1d^oqE@Qw_X?1&e(a2+cs45%UeyUgQ~#? zGr@lfYa;?20W&R>qiKZZ;5y3UpnG)D@__lmW?2zEWt`jALyL_)R!X{_QlRMiaqiA= z;cmV3RyXAsRm+pc;2yOUJ3hoE&O85_|3$>0owRejh*%C{P!17$1U|rEz0lg!a>aMN z_ssWo`CV?Y?l?l0XC#(K`#H$~ZxYm{l-oGw$!J(!|u0`Q4hG9UgUWryUa zR%D-8kc^tph$7~|&)@4IbCWMfo9V1b(1g)BZ$%=0L#=Qgzju;}1?ea!Cb_8!%Prhv z2(mSvf>b~m2EhA37eaw$HuJRj6m`ZCjMqi_td_4SJ$I6u9WL0T6FIR|IPfJ&^@TTybwV48a)7-N{aSCPPE9*<0c)%?VH{Ykr zA8?Bt*0J(hOzoD8v_pl~ef^^+#OAEe_23*Q;!wIuWg!W_01bayz`7sR;6p5N;RT*> z@HV@IpVFW(2v4(=D3)al33icvLJBM+4L#L4GdRYiEjC0Z9sDd=Nq=lL{wgEArg>$n1u8Nq@U` z2ZnUZnXVg_B}eIFZmI|jqyNLIjQ3XN+@RE=8q<`de;C*$ z6sZ6nc4nWuSSf&U*&wBUeWd}V0He}zS}`=sq#GvLx7c5{$aO<;jDn99eWG{WA`K0( zs~hh3@_&!f?z;YTTD8x(Jwnn3m1XW(OI$Y&01-X$uXN8PZi(!oh@>e!afzEF&7Hz$ zmMw8ZX*|O^KWUbO4pC~q3@-7%taA&US}YALAu^uOIC}U_qyS&UDY``!R5kQJ-|nmw zyD!_?EA?t$a}B2;4lGu1#^I?>$b>{>qq1uDj&@D_h0nW%p*Yqv5yUE~AZVY2e=*^I z($Qa}w%F;ry+fnn7a1DM0uOu#G%+KJz(2^w;NEYC8adeDc=1Bxfye=fHI@SzSnUyd zQb=uf-IPE7B{wHjNmv7SKrk5$L_=CuZX^wsA*~z!of?#}VdEKO`{BR#FuT+778v|i zTDlEu+Mge*%}jU}6$FcN>SeSpkyG`Sn~K8~77!mFBj2T0>`#5mtq2v9I+y?@GdX}oq>@p& zj!Wl!{%;e%D{3l1*|<8vW5wh%hQU}Yw=aE`rMIry;--pe(*flmfgO)p5R7@bcKUXI z`W9iTfWc@8-va#bbEE^71*7O2`)kk6U4|;UiYh)7j%sZ2^L;l!ja1{LCR9t)5ErBD zBi-S!^e=!+fDfm}0pN%PP5~vg?c|T7wsn93!SBU8MCUA@daX5n2WP0msDy4rI{cgA z|BL@g4_{nww@6?TRIraA8I6Lg0>N7}Me?<{K@BfSpES%9Ia-n^6faRoNaqk|t zG*re`EFcf|6LEBn!B6r82*g7ic)0l-tZc(Wmi{li2U|D|e{s8p^pdRHyl7y__S=9@ z+N9;!4%L%dd3^>h9=^qB&E^A`H(<>Gke(41*OixA53P!h zjQE2;cQ=G|=VnqSP4whN$mCyjX)`AssIh{nF%X@68ctaHjt2~UQo2HwB*H9|zjy@x zdd@~&^H^3v@Xq7P!|rF{%NOgXj=1Fo76YyG^1XF~aTEHPN8A!e(nSt}2U{?_KDH_v zD54CXVm8!|{{e5-xhWO+jGci2Y(3&hf9f%}$|QIF{%AMH0r_N}Bgfq`XS8L4Gf@gC z;Rk$%7Kz1<0l*0!>;L3^#z7FbMG)KpsNrBK#F^|SHJU9Xn`rt5`jt@ZXb~%8n&>Ex z;jqp$Olfjn(4p`ThGSiwf<_rC@HrT?EehFqJv1$rN|6z9T;K=hVOUljV`8y%Sc1Va z(ME5G#Xe2hyn$!qTOg-2p@RNV&~Igj$3swrMo2howbwrpkEI;_S%+A5@Iq@Em;`~W zt{BQfciNqL!5(Tlsl!X*2iO7>h!F;(GNwusHn zOkihjW4X2;>(Vx{qTxu5%fc(#U>@eRd@?t3aZr`wrUV~=51)iLW00TEJP#@bg>YK0 zZxh=YzU&$OR8g#GPS|Z0R57S8PRc~^kxxipIacC?rQ9!SA1e>)UnGMPTtMAsb7l~X zn9x2};Mw{d&BA&6ZMvXB)(C-*uWuha>JSpC{bsulZ{j-zAX$_wQ2v(mgk!}{oIt=x z67M}bo?K?s;`21d$;GyAfhXodLac$a;aB(#RUH6ky3^5^*4f{-V(elPtK0D@TniObk(tU@mwC41&Qy2sXMmQot?at^D7`^PKwz#S$Nk}_bA$5D(ic2L061-K5Vq8*0J zgb4~qiMTA+z<%l#6bX!wmH-Y!0vVu(VsUFeN88UTPeb^*Md^}zjSKl;UBDwwR94+L?{7(5Q!GqGbj!+ zx9&Y8)+~kAp~_tvR)o$q^Yxe^v7#XP!YLMpD;yBbVF z5l{xH7Dy*h0RmaML-^~nK<{z&XKXs5;QcNQng|SEtKXD+yaAP=OnL-gw+>j7} zS|XouRFX5tn4+6E3eY`S9>26cgU`V={?p`$_-DDpqd%Xl551OIs@>tSl^)Ao*fc4W zv%htCtf%83w!9%hW_h&G&8~(C>!_rC3=DdJsi+ACaps>-HZN4wU19>~vFpsbg`l7W zAf|aH`BwpoGP8aD{?)PVo~_>TQX)(iFRMq!3JNT^TU)>wo9K_coR0mYiUcYJJ-BrwDreI@rouOWw8TX_9rzf=iba{U(#~cUq^n|-&WxPAI z^sZO|=goJ;b`{~yl*9xF2K&CQS~vKcC&cLn5N4oMz=G@(5*xCsmAF76l&Y)* zYW5*)g#7^YkBXK0tSOpR>aR(q{+#yjofPXC@=(2ffV2GKWb@?Ma3?`VL0?pX!B$s^ z9`Qiz$|6D&I44^Ji>Qm4SPIZ+`bR|XdLXtpzcEp~1eSlNx18^tJ?D6)>*qWeJIgW6 zpaNakT&y=@W^6CHuf)bebe3d`F zTYPIYc-<05lRiz!05|PV>=W-C3i@WyhWozp1x_jX#g+))r`;GiS~t)t@uv@nmxKy% zWJF+M4oko|xxckCF26<;1Z$0$ZI-xjNo9lmd|` z4M0^Alo{o(9x3`sKnFD%W{oPR+z>w_-*bB$8UGamJTsFhMI%| zk+O@RhDU__cdhWKx>=9+)+ zUGWOuXKbq{UM?;8h6(YpPAS1j$YWB3fQD5aY<-``qN^ejr{D@_sYibZrPnCYLI}E)tvgJEzC*amr8= z)hm244Q`DIEj=TbQ6V~zAMZ?`DJs+U6(J!sOLQ+C2VMPGyflSi5CtgML^g!{IgiET zA&(v)yUG;U%qZQ*pri=iM4><7H_VIQBtL>Y=~&nU+gNxrj=}39(t1Y0Qx=Is#i@i4 zBL6_J6k*@T-}#hqRfKwhc@jMt0M1BjHdYArCGoP52f9*qlcZ11VpWytZ?6+ol~M`Y zrm}@kTTC=o7qol4?oWPR%$Tm7X!gjN7`o^d8=ZVV!GC{w{C=l|Y--o&2tpt=Cdo8R z{j0J5)R%-^ot){)OMJ4K;%{0Nf5a)F0;8yeFG8yE!@bs;{Uyf88@1D46GTZF9xN}$ zzVd?q#&z+jPC445WTIxqcPJ6jF>3?D*-|I2fC%;iZ+}plrQ&pDWJCy%SxCOf!ff^- zJPabpgvV9<(ciW)KG`Y7)0vI6HB}` z$ancE@W!n&LkT4}{Ia{s^rTg4R<=+03?X{C@-vh>J`yJnsM86=W$?kqAjb?uvb>tU zafeXvi+|wtz#A(GRuvO#&E^I5AteX$*@h6;kcT3TWGU}O&)5?$4#m+Ll!ford*d^l zYWQRI3{|R4k~F!8^&N>F+t@8?xS;H1%Y@&T;B=@SPFD9(YU4TP?f(7obSO;>Vhgl{ z=L4@Mh4@(1W*|WjjBCVFnJI7tY|~+QtQwf{7q`HD`Ek zR&iMRmy>g|L?Cbn69yZ4CAy)6SLeN~Yn=)n0S|CY7+-!7FK?@00Zp=dVx(b@MG^Hq zx}tad$c_Hg=2=Cd1UBon*4U=cYMppC%d(Wty2+`6F3FM#k)WUu#k?y9P}rEym={&x zm0&S2!ZjAzC=X@xS&Ef;ZL$)fMC%5Fx!jOWabmDr#1g>u8;Y3I%0!^y$hZ{hefCnL zVzxM$12dCx@DtR`dJKr;uCv2J2|2Y> zR)N#dTB$?1EGO@kR>Muf9|zEL%d)Zy2ywyzpe9oQC^#<|7r2G_NyE;vtSL^M{Ve`? z!PXz^(cOf+yq7n%n~>+nAp4q|T>;tRZ5nKW>$w$KEsMZX{FB835NH9I3`ICd$-1o~ z>s}{8u)i=+enrxa_h9tMK3OFWu%0;V&+3y^9!kIwKm;Nbed2HHD^G=g`jkIxK-R6H zphX0%qWxb?@V8ZF-Qfg%y2N2!JtV7Y&Na@LI_INEM9;0x>fvEYW+V#9%CbP+SDm%P z)V`KSOu%Q0%wQ(bKJ>T#zTsKdIRSr?%d4->s$lD3#?|81LG^5_E}phjkQQfS+r4Iy zzjvfihy#p(jeubF4OwGC!4jeI{F14+juu(?8B*oAteWswaldX{RzWCkX*1&1tkq7M zC|Td#tU>puz5^QBf%NO{k|%<_0)P92ta>Lr{bzpNB#9I@`!-L`TIcYqlvxjC9gjNy zh$!`OTYuKftkPK8vcegJBq@<1C*AAsn3uITT19opDap1-!;|WyId}YWrJ$lD)|t{o>;tei@$YUmi!z?s<5pa z;gPjW**pH$tyy26=HXhnFcmu%pzZ zvksl+V2~?+?Y|MvJ{}EEtev*b%a)^w90@s2lOxAp=jGn<^Y9Z_`xOu89?JM}#p@!~ zq~ zQzl5xdqUt$M9dX^MZb|M?`xB`^9~pic%HcDu=%;$GRi(Y-83P4i0VBl2C~GWv9C-H zWL|*mR0s6VY>lz#);v z9MD1*=8~P3nx}JDWt7*}8e+}Ge9lp+4+I#8h%)-E5;J}*5=at2qNGSc?eLSAB>%nU zS3R4%IU`WRuxI6hNI@2FCT<8Y0ADGwbe)k@6Ua)YRnYra&aV|N~Ib5M4)Rh+QCWzSI_*V~>*N=4XY_ab4<+=Sr z&O-vU91zKoyuu*t+f=lJ%c1}(NNhuK zC^0td712;dckyw!umr+lL-z%A6!Q<}D*) zOq3iKqPQHB5DzH6wWy=CUi2eC(RPPly+LB3gwkecolzp_#slaH4iOPAI`ch(%dg&) zyCb8R;s9^4)Ul8!gOHo`2P}8k>{r*z;G&J4jYA_7Q3WeFGiGciri*>$SG}LROMcH; z;YEsXpKgo`vydwkqjnI6(IU9Tb>U;!c453i?5XBnXMzs3WeL*^#6vqs(BY*#z!`O7 z8-QimpdVJ{uH0)w1SUj?F`xpQp;4Tre1lT&m;4~ngknXt2i#C^xiRe5 zAIhDW8T`69|F_~IU7k=Sp{Z)TI!lSj>f5h%o3rySmG?`MVgLQFbEkyddt&NN6;l85 zM;y)lB1_lL@gm7%nM%EsrMks>sTD1A)D~BMy!_vOsQP9!SJ&?l-EDHbDWPU8bS`>c zYFu$S5aiBVR8#Tamj448e?#1x7)m@UxeY+YmZ5+7!?L|Y86Il{(3Z%CZ00e4SdMoj z9IjcYEAzbLX|%=-4h9ju7$|wbuSv?lG)&z%+eF?CkIKU3X@gXe<9c*cuWtfmDiU90 zT6IFNYU)ibfG9r60p44S6L>j?{F-Lo-f#`Y05(Npk|%Z}(Vq9Ri4NR_$PBoXGY$?U zc9%Rrf*3j9Z0TL`YlFdH3n0b#*jGUZrG$VbQ1D;oxNfd2haZ#W&~oEDR&wcg?`q-I zlz`uiCj}5hxGpGRg+LI5`=I>~y6vU{?+4QDzQ`3Rvh#aZt?)}L*gdU z^WgcuNh9zSqz$=`{^85=tAzIqQJhULTt}Xmo_WkYoxXmd!+81e!QRuo>N0FVen*bB z9~s7QSR9ahoMDpB;O3_%mtd!U7*3+p9qYY_t}pQ>){^si2&Ln9FoFf|oNA&h2-lO! z4wx2az|w(I<;-O0(h3x;3Pjl~^2k+Wcze$Z*XVm*;9YPFG*eZz_*Cyb)2r^pXF?lk zInXL5z>Q!4&$rk?DE`e4UFcjN)|*PbhihvVQYFh9qrZ}ubH+;tMVs=7x&wEH`>=3{ zYf&0dE+KVSNk?#pIaxn64in0Rv)?uqF0RTr>o1rLrpV)h1N!3*-X&#M2@}K`>fu0D zRIo@3=bZ6-2=l$mn?C>+r|J6T*s9EXsOH51Mv~5NNmi>f+@d0M9!Mn8!7+y;dZ&V- z2x4u)MM2d#A*<%VMsf|iaSvPeT4RWE&pHDoJD)Kf>m|~)i4?uM zi#MS?kd1m_2F4KB!and#X91kPuO9fz@9KC4^tf3avALA z`}e(_4h?3qwkD)t!ZI!SV_kRej$+mvr*AU~NQma_eS7AaPVe|NJv=9)^0jlt!Gs~} zJZKBXFy-kYHT6Asef1NvaGht;f+Yl=fMDOVk zYZ^ZNL%*iCm&&NLK7z`bfMeV*<<}j9q&aw{2`@Vd>o}IGy;lFHBn1t6^?BaCaS{RM zZn=j|iYiP{JylW8s`;06Az@j`zAOgx3DLki<+#X;5cP(o7}##zq}sQO;)MD zFtN^*tZZ3(@mYQfz4StFdhu-!N=NSnvmT+*iho$`;e?Ep-`Rfey>a28g?_)vo7)rI zX|vNfJ~@!_q$U~!mrLYLzfHP*!;B>`E%(7K{3W?x*A4RKrBMT^1$9v-b7q{hX=(>EwR*yoi~=_N3n2ug55bIim3$jdx0qa0A>0$RZ$_B&2Re}VRMpefNb#SfKY z;V!dRw)P6|o+8RSpqvyR;FLt5#S+{^s^6L`y+lS&dRwRg-vGSOJ+^~-Af`MBK9E7d z7XYhZx9N1m`1x#s-f)$7Q|{e_&hDZD7o6bJlIMu(UU^vOrNohzVKV4*E7LR}w z(_(DG!fJ^8k2b*x+@5hv5Bsc<`n;+)-{_4_u-;$|%vz%4J^f@&Qr-fSIXb+n$K}Z{ z3+}wh`yzZDSW1b~IHd)`h|u)wSzwKxZEVD9X85m#;wmEn<`3LZJdNk!fcy)0Rxt!_ z{(imr7H@PXHnnI}F<)Cza^Sj1fATJrlx)e{xu^TjjrG=s`_g}C9Nvtg zroqpl3^WkRc+{kyOLuUz*_9&oz@eCsm#o6)yrnna=8Z08;m3jx&d7x}wUKA}jK1)= zo@;4ze`nGT`iu8+BmQ%@d+WnBHUQxT&*e-LgPa?{n|$Z8cMr{1YIkM~BWuYJsPcM2LzN@B@_OViD{Q?PVopcGLfH96}i7K;Qt;RG=P z9Sq|${);mn^vvH2<=1H_VcbI|*y;G5BhQm20d$lpxoqRz-WYFTjd3VK4q8nP`<3^2 zr5OqAOj8QamBCYMy^3Z85^zN~147%2#ix{7BKXo-XHWDxCoBSzTE|c0^~$tAYN9tP zBYN{gDpD?`UZ>04)+{GdI(v%OISv`-b-&hC^OFVss3|fybMqO>JyQ=E6zk$=-|s!r zBE~XpRX-`0^p^dR2lc{j(r)Scw0C7js&#`QfTmFnnQmv1U-yi+FC$HHz-o&bFe_Tc zQD5n!>wfFaa&YX(alh|#UR6dKPqk`iFcgV^=c;wx@4ZkEoK|M6e9`Nfk;a>eYLt&>F{6FZmj}r!JiyF> z2;cgZE4{uV^ezJxQF$m}Ign33^|CiB#vfj!YD?tne|s=OuZGvsXPoGlMXs< z_N(ee?jp8Q*-jvZ-#nAoBaET|ahgKiU)Oc-dDBzuE3qU($(RhVk$s-Z_r=zoC@#p2 zEYkUW!=q9d%{Lt-Iy{In`5vWSK2Nr|?~vxb?z1*JUU%H?FQcAU|oji;vwG(CMdITBP?CzfNfmu~mtk-qB zy;+&0**tytDsiHr4PNJr_9zbs;BSxc;G&S3Naqh!0atNbncwn`n-hX+M(3I39%?)aG( zNufjf1!rwJ=?Y>s5v}qwnc>G270bo@c&p-t3r%7p9xi{{ARit~Q{nygN*&dU+C**( z+M2rKK`+~*>ge)@@j$dKUB#+{;sXw;vFvR<<8!Y#bWk6@A#=Q04|n{+YnH%YscCMW zg=6@`zVOO299q3S*XkL6_vEKQf7f+?_vWNno(DlL47U`c!pFtG^@n}Q14MiF5k2D@ zZ$;b=QYZYXqh3u$0-WAi#7;Ryx?c4UZ-)8b0%X8Hy(=;@&t$vaU;3>#E0Ss^%t8Tp zJ9n+I@c3!|ut?s4j1(dw4OyV4+@u38yP(6|ydxP7DW%6czbZTLc!qPPFw|>}UzH3`Q%W3@!^ZfpW$>k&RFa3>l zt|rP}+$1sT_41y?2tjhaXiL^#Ww-w_J$Q0*VF6&$?X4s@_DNa6{cz@@KhweiMOQxB+`jbzSPgGHyUO-*XV)MlTWu}UiT|OLP2!Og8aXj zsAoqLgk;hCdmU<;cb^EjEa4))aJv4}eS{auFh7bIWHc~WAerx=)$ z<%M%q_J0gonCug-y;o0Pn4I7RHL?uE3fY3K3r2j$>Q(xJr;9;lFpksNyXzSTzzlw)%HV9wyq#3GYO0<(JTBL16gaFS7Q}(uTXxNjji;d4F%bK&0 zpifT_GA(gmwBrXNxGveR{HvI}X+PKi1EwG%sCap}RfAD4VTpywBFHQgy-}B}$S)QK zSlKW+>OXsf#YumAxQfB%B1=mS=Mh`kVJhDnfcS>~i-J*&!mM3pd{@l;1*a9OGuf%?!{z9 znqmpRCoR~(Y5S49&NA)0b>eA$*FPk$43!i5Y|eLo&FBMj;r!?alaO|Bd>ohWAkvtJ z^~M#+^3-Kdi#L97$}FVZ4)6LYUwAINK!{MpqLPm9n6eWvz3E};hWx<*zYTWA6ztX; zS3*?$qlYkKL4q=?+j`yUZ22+lvSCT#`=#WFP#KR>cvFaDDJ%e7z0*OKv*+`OY0OZJ zqWg1S(;HVM%M;hnF?Jy6mk#n1FDGY(9CX;@HNE(iWI=ZCR|V(f=51%GpUP^mnf~mR zWJ?DK>-(}Fe>J%-6nQQ#jnw+p$xk!G3xBGg*Rj*J^e0>U|6HG37D`aHp>!19&`Pg* zBiX;nIU7t6pw(w|pP~7!UyxK0(gQanuk`4g!g>%-5)CWP*Q+)p`^Ui{#FX+s{#J59 zDF3P_3@)M?{AAXRBCq{r;~9xHJ9UWu3c8rKcr`=}p(m+`pTz~@c1d&N^y z*DR0<&x~h(1?}RgWt;r?78#$yytEB&nq|_`&?S=PD)s8E$-eRPSD2iU@ee=#9>jkn zYGhsWi#w%#EjJ00<@(k4ljp@Lw9KO3kADDR!u8opWc4w@_)z=zrP#PwuilpInV^Nx zQG~%6Bv-{hU8BX^xk7gOB$@juC(@I^g+=g-OEm&WR<&1@g&+`{Oub@sXW zgL8rSF*8IiF?8aPICW64>9G@IEp%4T{2{scUdsjvFaZvfIYNh8xQ}bMSN_mkK!obA zh1{opx=OdXKh|2xm3y??JAbIRuc;{*K*~ZfCxJ=08 zGl2>pwI0U7n^3-fnHKF(FSdf>qPFT!2>>z)_oA8&HU zG-H_hGi7sB%iBXO^oXkbh?5d;sC>a7uqbQ?FDAC6Da?hv6p^jUfP z<#AaD)+%-6Bqu}iBXJ4?vc`MC+bI$t)iU_{N2T0(TCi>|EC1IfMOrj@{z8*#J4;YL z$6tYyK)hIno+)-kLtyw`J>;^uNO*C6B-UE2M8*D!&b=-80s9m!6=SAuGBp3vc%PTW zhgZqEHz+9Q7(=_4Y>gWLW+~`SB@()EReAl%Kj>j=WX+ zvm5izi1!?)1~wHhJ$JRaIO-<3_`0Jy4;1^CzH@TqP5Ea9ii?czr~2rbA<2Bw0Bxs7 z-JGA@ZqXIeiTSx$ca;2;;Tpk5fq;8NPt$G}RL)aoKca9j7-?D%Z>H4~?UnCONcNI;_@0UgKXI%Yw z5Z&{}tfdzs@uN~DQA~{ z;FkRH>GlF3ADnK2>RV;b6DH%TC-pHlzghE2Npfp@d~eVs`IUsu-I5fkWK6p6O0nYi z##}c?)|wL`RB5CcH7@@w_xd|j!R=!t0`@d_F9@#tpN-4!mzlZdY!&}ZFFGt`@MYuk zlbM%IR)zC)pTYScv)l67i={=-QsunfO?F(n7>?GSsdDQ2svJG!Xl6@YKR!PvdEvno|bU9EEO8=;!%!ZY()>YO|CbDGWXsoLCijVhRZni~FxcB=6HGt`9=w*B>< zH=~96vODv$n_xh6@k(z=J9@}q_eX~NxpFh-S0@qZ`SX5da5M3%HvT^^|r1Z%H*PRLKiub-rH=5|)4ONw+2-(MBi-%+T-yIbme zC*;@ks_UwnZf>m-a3EkDe{6_qvbwEm#`hB^uN{**lJB1;BAG{`Dr0w2xqpkP=x5m> mJ#KyTbEjQ)cfK4cIhxAROpfMqq~&NKM@#>*yIXA^_5T2Kd;MMj diff --git a/Assets/_Project/Art/VFX/FX_TowerDropReticle.prefab b/Assets/_Project/Art/VFX/FX_TowerDropReticle.prefab new file mode 100644 index 0000000..9b9a887 --- /dev/null +++ b/Assets/_Project/Art/VFX/FX_TowerDropReticle.prefab @@ -0,0 +1,321 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &587313432172278041 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3307296712732805768} + - component: {fileID: 6748923292346508847} + - component: {fileID: 2507891176384043687} + m_Layer: 0 + m_Name: Cylinder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3307296712732805768 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 587313432172278041} + serializedVersion: 2 + m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 0, z: 0.5} + m_LocalScale: {x: 0.12, y: 0.5, z: 0.11999997} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5473658900712571368} + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!33 &6748923292346508847 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 587313432172278041} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2507891176384043687 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 587313432172278041} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + 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: 2100000, guid: 12fa78231d5bf3a4f90e4624b9a6a15f, 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!1 &1864447562612895463 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5785595502933998838} + - component: {fileID: 4110617398237858862} + m_Layer: 0 + m_Name: FX_TowerDropReticle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5785595502933998838 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1864447562612895463} + 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: 5473658900712571368} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &4110617398237858862 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1864447562612895463} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: baac389882e721248bb426ee40fbf74f, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.VFX.TowerDropReticle + decal: {fileID: 0} + progressRenderers: [] + progressProperty: _Progress +--- !u!1 &2400385455731221705 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5473658900712571368} + - component: {fileID: 2323768173093437429} + m_Layer: 0 + m_Name: DecalProjector_TowerDrop + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5473658900712571368 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2400385455731221705} + serializedVersion: 2 + m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: 0, y: -0.003, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 3307296712732805768} + - {fileID: 6501670922619832963} + m_Father: {fileID: 5785595502933998838} + m_LocalEulerAnglesHint: {x: -90, y: 0, z: 0} +--- !u!114 &2323768173093437429 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2400385455731221705} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0777d029ed3dffa4692f417d4aba19ca, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Runtime::UnityEngine.Rendering.Universal.DecalProjector + m_Material: {fileID: 2100000, guid: f794f3140d09f724d924caaf96359b81, type: 2} + m_DrawDistance: 1000 + m_FadeScale: 0.9 + m_StartAngleFade: 180 + m_EndAngleFade: 180 + m_UVScale: {x: 1, y: 1} + m_UVBias: {x: 0, y: 0} + m_RenderingLayerMask: + serializedVersion: 0 + m_Bits: 1 + m_ScaleMode: 0 + m_Offset: {x: 0, y: 0, z: 0.5} + m_Size: {x: 2, y: 2, z: 1} + m_FadeFactor: 1 + m_VisibleInScene: 1 + version: 1 + m_DecalLayerMask: 1 +--- !u!1 &6154284915429400602 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6501670922619832963} + - component: {fileID: 3102875668348154800} + - component: {fileID: 339468895080198894} + m_Layer: 0 + m_Name: FX_Motes + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6501670922619832963 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6154284915429400602} + serializedVersion: 2 + m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5473658900712571368} + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!2083052967 &3102875668348154800 +VisualEffect: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6154284915429400602} + m_Enabled: 1 + m_Asset: {fileID: 8926484042661614526, guid: 142a41eb3c31cc3479182408de1b3ffe, type: 3} + m_InitialEventName: OnPlay + m_InitialEventNameOverriden: 0 + m_StartSeed: 0 + m_ResetSeedOnPlay: 1 + m_AllowInstancing: 1 + m_ResourceVersion: 1 + m_PropertySheet: + m_Float: + m_Array: [] + m_Vector2f: + m_Array: [] + m_Vector3f: + m_Array: [] + m_Vector4f: + m_Array: [] + m_Uint: + m_Array: [] + m_Int: + m_Array: [] + m_Matrix4x4f: + m_Array: [] + m_AnimationCurve: + m_Array: [] + m_Gradient: + m_Array: [] + m_NamedObject: + m_Array: [] + m_Bool: + m_Array: [] +--- !u!73398921 &339468895080198894 +VFXRenderer: + serializedVersion: 1 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6154284915429400602} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 0 + 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_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 diff --git a/Assets/_Project/Art/VFX/FX_TowerDropReticle.prefab.meta b/Assets/_Project/Art/VFX/FX_TowerDropReticle.prefab.meta new file mode 100644 index 0000000..bc57b71 --- /dev/null +++ b/Assets/_Project/Art/VFX/FX_TowerDropReticle.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f2a37509f5f2e4d4e86cdaf12f99c6c4 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Art/VFX/M_TowerDrop.mat b/Assets/_Project/Art/VFX/M_TowerDrop.mat new file mode 100644 index 0000000..0427ea9 --- /dev/null +++ b/Assets/_Project/Art/VFX/M_TowerDrop.mat @@ -0,0 +1,67 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-6061037298009385930 +MonoBehaviour: + m_ObjectHideFlags: 11 + 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: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion + version: 10 +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: M_TowerDrop + m_Shader: {fileID: -6465566751694194690, guid: 5a8ebb05602fadb48a72f94a08654006, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: + - MOTIONVECTORS + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _DecalMeshBiasType: 0 + - _DecalMeshDepthBias: 0 + - _DecalMeshViewBias: 0 + - _DrawOrder: 0 + - _LineWidth: 0.02 + - _Progress: 0 + - _QueueControl: 0 + - _QueueOffset: 0 + - _SpinSpeed: 2 + m_Colors: + - _BeamColor: {r: 8, g: 0, b: 0, a: 1} + - _ReticleColor: {r: 8, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] + m_AllowLocking: 1 diff --git a/Assets/_Project/Art/VFX/M_TowerDrop.mat.meta b/Assets/_Project/Art/VFX/M_TowerDrop.mat.meta new file mode 100644 index 0000000..16137b5 --- /dev/null +++ b/Assets/_Project/Art/VFX/M_TowerDrop.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f794f3140d09f724d924caaf96359b81 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Art/VFX/M_TowerDrop_Beam.mat b/Assets/_Project/Art/VFX/M_TowerDrop_Beam.mat new file mode 100644 index 0000000..b50293a --- /dev/null +++ b/Assets/_Project/Art/VFX/M_TowerDrop_Beam.mat @@ -0,0 +1,60 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-6403437066739920421 +MonoBehaviour: + m_ObjectHideFlags: 11 + 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: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion + version: 10 +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: M_TowerDrop_Beam + m_Shader: {fileID: -6465566751694194690, guid: 3a2790546855e2246ae4341f5b791133, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: + - MOTIONVECTORS + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _FlowSpeed: 5 + - _QueueControl: 0 + - _QueueOffset: 0 + m_Colors: + - _BeamColor: {r: 8, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] + m_AllowLocking: 1 diff --git a/Assets/_Project/Art/VFX/M_TowerDrop_Beam.mat.meta b/Assets/_Project/Art/VFX/M_TowerDrop_Beam.mat.meta new file mode 100644 index 0000000..0226bb9 --- /dev/null +++ b/Assets/_Project/Art/VFX/M_TowerDrop_Beam.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 12fa78231d5bf3a4f90e4624b9a6a15f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Art/VFX/SG_TowerDrop.shadergraph b/Assets/_Project/Art/VFX/SG_TowerDrop.shadergraph new file mode 100644 index 0000000..2c6af9e --- /dev/null +++ b/Assets/_Project/Art/VFX/SG_TowerDrop.shadergraph @@ -0,0 +1,8104 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "f2e3e96eef5d4f33a0e1b45aa475f5a5", + "m_Properties": [ + { + "m_Id": "58c406bd628c4ec585141954da771daa" + }, + { + "m_Id": "89881b8a9ebc4d85bb89d77b74c51f58" + }, + { + "m_Id": "80cd78247bdd43549c52f3cdbd08ab44" + }, + { + "m_Id": "a32e2112ddf745b4aaabac4c5c395ed0" + }, + { + "m_Id": "8f2d27dd90f84e3ea7662099a1c86a0d" + } + ], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "b9c411b1b8224017b54a9fd53a5d19a5" + } + ], + "m_Nodes": [ + { + "m_Id": "fe35fc451f8d456cb2f40b0fbe4432f8" + }, + { + "m_Id": "b623c75a206e4cf6b9680d22e8331a34" + }, + { + "m_Id": "3a454318580e46eeb62a5ff9701333ed" + }, + { + "m_Id": "ac103027a06748e99de73b5e09c0a00a" + }, + { + "m_Id": "d3d55fa4da3f4b7f99869c8e0d626cd7" + }, + { + "m_Id": "8be7c1a3c6b14d52a3878fce473473f0" + }, + { + "m_Id": "0b116301444646a4960f3c184c6d95d0" + }, + { + "m_Id": "c3bf01d754fb43f08463495942b7e200" + }, + { + "m_Id": "302f15a7ade0457785a9d1edf6b90111" + }, + { + "m_Id": "cbc59d37546f442d84f3a5d3ab6216fb" + }, + { + "m_Id": "99d7a5ed2cd34fe0bd21ebebf078cb10" + }, + { + "m_Id": "2e4754bae13e4504aa29e2a363b09846" + }, + { + "m_Id": "b6f4cd86d33b4cff80afe0b3b4bc9bd3" + }, + { + "m_Id": "5e71aefcada147958ad7923690234dc3" + }, + { + "m_Id": "cef229b9f0a74e57955cb5fb3a5cab12" + }, + { + "m_Id": "88b194688a9a4d588dfce27e1bd4238f" + }, + { + "m_Id": "df0e928660ac4975b6b1c33a0cfce1d9" + }, + { + "m_Id": "b6fdd8b4d094402ea102dc7abdec9df6" + }, + { + "m_Id": "b44aef604fad49409e9bdd7fb15974cc" + }, + { + "m_Id": "d1450bd323e24888b432c80fad63f3f2" + }, + { + "m_Id": "eca6c38575ba43cb8b09dc650433f27b" + }, + { + "m_Id": "df441deaa6e646c1bcd60a84044cd099" + }, + { + "m_Id": "b9dd614a3315450796510e0a490a77b9" + }, + { + "m_Id": "7d1cfba434a1485cbfaf5ce5617809b7" + }, + { + "m_Id": "3242f790f8a5479981192049b3339c0a" + }, + { + "m_Id": "183a996a1cfd47ce8834beab65cc8182" + }, + { + "m_Id": "22c5aa85f05346f0b6c5fde9224e0ef4" + }, + { + "m_Id": "309f3a009fcc47128c220cc54f381bc7" + }, + { + "m_Id": "0565bd54eda64583aa2f6d25f5c0d006" + }, + { + "m_Id": "0ca19e217a9842298e26f40cd405fcd8" + }, + { + "m_Id": "2bf3ebe5f7c641b9a6d9bd91ea0351df" + }, + { + "m_Id": "a3f27c76b9134af2a663b0a6518d2850" + }, + { + "m_Id": "80e6aacf58c9413da3033deaff2af324" + }, + { + "m_Id": "46ccac4b71c042d28c6e95b1cdd17e50" + }, + { + "m_Id": "8b130bb6b8f84aa0a57135e70ea0807e" + }, + { + "m_Id": "818948d58f524ace992735b76865efd2" + }, + { + "m_Id": "a2a1ac179d5649498fd9f0367b941478" + }, + { + "m_Id": "3fbbd81138f9468695e9dd3a06b7298c" + }, + { + "m_Id": "6a526ed2cd84446596a940a30163a8ce" + }, + { + "m_Id": "41f1e77db2a34589ba2fe6a5db197ac9" + }, + { + "m_Id": "fb3462ef3bf4412b916598df59a5ce02" + }, + { + "m_Id": "1bcfb36c927f4c5ab87a04615a9664b9" + }, + { + "m_Id": "3d192fa06bb44cfb8e2a1afba240adf8" + }, + { + "m_Id": "65c9ab12ae9641e68c6687fd66ad87c4" + }, + { + "m_Id": "98b4c5e0784b4e839a6da017a7b2fa86" + }, + { + "m_Id": "1dff4436c4b3492e86a66b31a37d2989" + }, + { + "m_Id": "aa282ac528cf4fcfa19e6c28b7a997af" + }, + { + "m_Id": "3256cdd6a19e44859552f5382d61c2da" + }, + { + "m_Id": "1c997d48185c4d97a1a50d8acef60f6e" + }, + { + "m_Id": "afc4cd083d4d456786ed28d3f58c955a" + }, + { + "m_Id": "0836a1b2b4da4a64b34cf632c8955ed9" + }, + { + "m_Id": "64e2b7c882214050bd8a440c8e368c4a" + }, + { + "m_Id": "17acb66410fa49d6a4c40be8b3717630" + }, + { + "m_Id": "e18a2983480d425188adf2ad444e356b" + }, + { + "m_Id": "08a6a599941f408f8bc520aaf574e62c" + }, + { + "m_Id": "35ae2b6e225d4e27a403be2b144d5354" + }, + { + "m_Id": "471423a52325497aa4d9cd9a7674f596" + }, + { + "m_Id": "30754650c8334c83ba8eb6c6131862aa" + }, + { + "m_Id": "b2aef32d19a94a678523ee8999f038e9" + }, + { + "m_Id": "ab643bdd863640fb9a80c9299ea3ad0a" + }, + { + "m_Id": "e84a5990e04f4c74b2e641ef88e2c48a" + }, + { + "m_Id": "ada189cd572c4a05b5bea0f192229887" + }, + { + "m_Id": "51bffc1a2d7946a79f296600b6a416aa" + }, + { + "m_Id": "e348e5dacc9d44498cea7f6062b4d449" + } + ], + "m_GroupDatas": [], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "0565bd54eda64583aa2f6d25f5c0d006" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "08a6a599941f408f8bc520aaf574e62c" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "0836a1b2b4da4a64b34cf632c8955ed9" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "e348e5dacc9d44498cea7f6062b4d449" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "08a6a599941f408f8bc520aaf574e62c" + }, + "m_SlotId": 3 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a3f27c76b9134af2a663b0a6518d2850" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "0b116301444646a4960f3c184c6d95d0" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "c3bf01d754fb43f08463495942b7e200" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "0ca19e217a9842298e26f40cd405fcd8" + }, + "m_SlotId": 3 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "0565bd54eda64583aa2f6d25f5c0d006" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "183a996a1cfd47ce8834beab65cc8182" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "0ca19e217a9842298e26f40cd405fcd8" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "1bcfb36c927f4c5ab87a04615a9664b9" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "3d192fa06bb44cfb8e2a1afba240adf8" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "1c997d48185c4d97a1a50d8acef60f6e" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "41f1e77db2a34589ba2fe6a5db197ac9" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "1dff4436c4b3492e86a66b31a37d2989" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "afc4cd083d4d456786ed28d3f58c955a" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "22c5aa85f05346f0b6c5fde9224e0ef4" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "0ca19e217a9842298e26f40cd405fcd8" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "2bf3ebe5f7c641b9a6d9bd91ea0351df" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a3f27c76b9134af2a663b0a6518d2850" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "2e4754bae13e4504aa29e2a363b09846" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "80e6aacf58c9413da3033deaff2af324" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "2e4754bae13e4504aa29e2a363b09846" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "cef229b9f0a74e57955cb5fb3a5cab12" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "302f15a7ade0457785a9d1edf6b90111" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "99d7a5ed2cd34fe0bd21ebebf078cb10" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "30754650c8334c83ba8eb6c6131862aa" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "b2aef32d19a94a678523ee8999f038e9" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "309f3a009fcc47128c220cc54f381bc7" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "183a996a1cfd47ce8834beab65cc8182" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "3242f790f8a5479981192049b3339c0a" + }, + "m_SlotId": 3 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "7d1cfba434a1485cbfaf5ce5617809b7" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "3256cdd6a19e44859552f5382d61c2da" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "41f1e77db2a34589ba2fe6a5db197ac9" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "35ae2b6e225d4e27a403be2b144d5354" + }, + "m_SlotId": 3 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "2bf3ebe5f7c641b9a6d9bd91ea0351df" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "3d192fa06bb44cfb8e2a1afba240adf8" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "65c9ab12ae9641e68c6687fd66ad87c4" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "3fbbd81138f9468695e9dd3a06b7298c" + }, + "m_SlotId": 3 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "1c997d48185c4d97a1a50d8acef60f6e" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "41f1e77db2a34589ba2fe6a5db197ac9" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "1bcfb36c927f4c5ab87a04615a9664b9" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "46ccac4b71c042d28c6e95b1cdd17e50" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "8b130bb6b8f84aa0a57135e70ea0807e" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "471423a52325497aa4d9cd9a7674f596" + }, + "m_SlotId": 3 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "2bf3ebe5f7c641b9a6d9bd91ea0351df" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "51bffc1a2d7946a79f296600b6a416aa" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "08a6a599941f408f8bc520aaf574e62c" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "5e71aefcada147958ad7923690234dc3" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "b6f4cd86d33b4cff80afe0b3b4bc9bd3" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "64e2b7c882214050bd8a440c8e368c4a" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "0836a1b2b4da4a64b34cf632c8955ed9" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "65c9ab12ae9641e68c6687fd66ad87c4" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "aa282ac528cf4fcfa19e6c28b7a997af" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "6a526ed2cd84446596a940a30163a8ce" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "3fbbd81138f9468695e9dd3a06b7298c" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "7d1cfba434a1485cbfaf5ce5617809b7" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "35ae2b6e225d4e27a403be2b144d5354" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "80e6aacf58c9413da3033deaff2af324" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "46ccac4b71c042d28c6e95b1cdd17e50" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "80e6aacf58c9413da3033deaff2af324" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a2a1ac179d5649498fd9f0367b941478" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "818948d58f524ace992735b76865efd2" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "8b130bb6b8f84aa0a57135e70ea0807e" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "88b194688a9a4d588dfce27e1bd4238f" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "df0e928660ac4975b6b1c33a0cfce1d9" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "8b130bb6b8f84aa0a57135e70ea0807e" + }, + "m_SlotId": 3 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "3256cdd6a19e44859552f5382d61c2da" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "8be7c1a3c6b14d52a3878fce473473f0" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "0b116301444646a4960f3c184c6d95d0" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "98b4c5e0784b4e839a6da017a7b2fa86" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "aa282ac528cf4fcfa19e6c28b7a997af" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "99d7a5ed2cd34fe0bd21ebebf078cb10" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "c3bf01d754fb43f08463495942b7e200" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "a2a1ac179d5649498fd9f0367b941478" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "3fbbd81138f9468695e9dd3a06b7298c" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "a3f27c76b9134af2a663b0a6518d2850" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "3d192fa06bb44cfb8e2a1afba240adf8" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "aa282ac528cf4fcfa19e6c28b7a997af" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "0836a1b2b4da4a64b34cf632c8955ed9" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "aa282ac528cf4fcfa19e6c28b7a997af" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "d3d55fa4da3f4b7f99869c8e0d626cd7" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "ab643bdd863640fb9a80c9299ea3ad0a" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "e84a5990e04f4c74b2e641ef88e2c48a" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "ada189cd572c4a05b5bea0f192229887" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "51bffc1a2d7946a79f296600b6a416aa" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "afc4cd083d4d456786ed28d3f58c955a" + }, + "m_SlotId": 3 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "98b4c5e0784b4e839a6da017a7b2fa86" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "b2aef32d19a94a678523ee8999f038e9" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "471423a52325497aa4d9cd9a7674f596" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "b44aef604fad49409e9bdd7fb15974cc" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "b6fdd8b4d094402ea102dc7abdec9df6" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "b6f4cd86d33b4cff80afe0b3b4bc9bd3" + }, + "m_SlotId": 3 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "2e4754bae13e4504aa29e2a363b09846" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "b6fdd8b4d094402ea102dc7abdec9df6" + }, + "m_SlotId": 3 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "d1450bd323e24888b432c80fad63f3f2" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "b9dd614a3315450796510e0a490a77b9" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "eca6c38575ba43cb8b09dc650433f27b" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "c3bf01d754fb43f08463495942b7e200" + }, + "m_SlotId": 3 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "2e4754bae13e4504aa29e2a363b09846" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "cbc59d37546f442d84f3a5d3ab6216fb" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "99d7a5ed2cd34fe0bd21ebebf078cb10" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "cef229b9f0a74e57955cb5fb3a5cab12" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "309f3a009fcc47128c220cc54f381bc7" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "cef229b9f0a74e57955cb5fb3a5cab12" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "88b194688a9a4d588dfce27e1bd4238f" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "cef229b9f0a74e57955cb5fb3a5cab12" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "b9dd614a3315450796510e0a490a77b9" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "cef229b9f0a74e57955cb5fb3a5cab12" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "fb3462ef3bf4412b916598df59a5ce02" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "d1450bd323e24888b432c80fad63f3f2" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "471423a52325497aa4d9cd9a7674f596" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "df0e928660ac4975b6b1c33a0cfce1d9" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "b6fdd8b4d094402ea102dc7abdec9df6" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "df441deaa6e646c1bcd60a84044cd099" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "3242f790f8a5479981192049b3339c0a" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "e84a5990e04f4c74b2e641ef88e2c48a" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "35ae2b6e225d4e27a403be2b144d5354" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "eca6c38575ba43cb8b09dc650433f27b" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "3242f790f8a5479981192049b3339c0a" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "fb3462ef3bf4412b916598df59a5ce02" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "1bcfb36c927f4c5ab87a04615a9664b9" + }, + "m_SlotId": 1 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": 8124.0009765625, + "y": 1240.0001220703125 + }, + "m_Blocks": [ + { + "m_Id": "fe35fc451f8d456cb2f40b0fbe4432f8" + }, + { + "m_Id": "b623c75a206e4cf6b9680d22e8331a34" + }, + { + "m_Id": "3a454318580e46eeb62a5ff9701333ed" + } + ] + }, + "m_FragmentContext": { + "m_Position": { + "x": 8124.0009765625, + "y": 1440.000244140625 + }, + "m_Blocks": [ + { + "m_Id": "ac103027a06748e99de73b5e09c0a00a" + }, + { + "m_Id": "d3d55fa4da3f4b7f99869c8e0d626cd7" + }, + { + "m_Id": "17acb66410fa49d6a4c40be8b3717630" + }, + { + "m_Id": "e18a2983480d425188adf2ad444e356b" + }, + { + "m_Id": "e348e5dacc9d44498cea7f6062b4d449" + } + ] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"fileID\":10210,\"guid\":\"0000000000000000e000000000000000\",\"type\":0}}", + "m_Guid": "" + }, + "preventRotation": false + }, + "m_Path": "Shader Graphs", + "m_GraphPrecision": 1, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "" + }, + "m_SubDatas": [], + "m_ActiveTargets": [ + { + "m_Id": "4672c100e58b4a96ac0b1fd6395a9118" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "0137064b23954bbcbddececf0b82ff30", + "m_Id": 0, + "m_DisplayName": "Edge", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Edge", + "m_StageCapability": 3, + "m_Value": { + "x": 0.44999998807907107, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "0188e59a458846cea75c01aa764545c9", + "m_Id": 2, + "m_DisplayName": "Rotation", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Rotation", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "023c452b4801433e8645138b85e9935f", + "m_Id": 1, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "026384ddcb85445399b26bfd6e204a9d", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "02bf9628b1ec46499ce25b9a74f00d8c", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.OneMinusNode", + "m_ObjectId": "0565bd54eda64583aa2f6d25f5c0d006", + "m_Group": { + "m_Id": "" + }, + "m_Name": "One Minus", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 3520.00048828125, + "y": 987.0001220703125, + "width": 207.999755859375, + "height": 278.0 + } + }, + "m_Slots": [ + { + "m_Id": "3a4f83a703b145f1b2f1134c53f55fce" + }, + { + "m_Id": "e436ca5f0ed14318b6667b834cfd5420" + } + ], + "synonyms": [ + "complement", + "invert", + "opposite" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "062a108c00124c97bc86bf7699825385", + "m_Id": 0, + "m_DisplayName": "LineWidth", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "074e6a6b30b641ed86d6b1a469b2e824", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 2.5, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "0836a1b2b4da4a64b34cf632c8955ed9", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 7750.00048828125, + "y": 1437.0001220703125, + "width": 208.00048828125, + "height": 302.000244140625 + } + }, + "m_Slots": [ + { + "m_Id": "d11973ebee03460a921cfa7d25aaf7e1" + }, + { + "m_Id": "668006814e99437fa4fc513e97016442" + }, + { + "m_Id": "77416efd91a546a1843d90846e865412" + } + ], + "synonyms": [ + "multiplication", + "times", + "x" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "08501ac0d7f546108d5ba2e267177c42", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.800000011920929, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.LerpNode", + "m_ObjectId": "08a6a599941f408f8bc520aaf574e62c", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Lerp", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 4476.0, + "y": 987.0, + "width": 208.0, + "height": 326.0 + } + }, + "m_Slots": [ + { + "m_Id": "59cdba5a1f904dc3af0a76cec73cbe77" + }, + { + "m_Id": "8d15aad67c8c4edb987e2fc6f2ce6b3f" + }, + { + "m_Id": "218089213ffc4caeaadbe34ee4119a15" + }, + { + "m_Id": "14b01a219692405787571eb6e9c599e0" + } + ], + "synonyms": [ + "mix", + "blend", + "linear interpolate" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "09d889c759f44e54bc5adb2fff7eb67d", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "0ac3bb32f9c94414ba2c9ea98e0571a9", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SubtractNode", + "m_ObjectId": "0b116301444646a4960f3c184c6d95d0", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Subtract", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 883.9998779296875, + "y": 433.9999694824219, + "width": 208.0001220703125, + "height": 301.9999084472656 + } + }, + "m_Slots": [ + { + "m_Id": "4ba5d08fb6b242beba1ba5fa186880da" + }, + { + "m_Id": "fab8c828bf6248b48e7be9f02a105746" + }, + { + "m_Id": "d9e2eae814434717861c1b787a7492b8" + } + ], + "synonyms": [ + "subtraction", + "remove", + "minus", + "take away" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SmoothstepNode", + "m_ObjectId": "0ca19e217a9842298e26f40cd405fcd8", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Smoothstep", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 3234.000244140625, + "y": 987.0001220703125, + "width": 208.000244140625, + "height": 326.0 + } + }, + "m_Slots": [ + { + "m_Id": "bfa8d0c8145447cb9840752c0edb65d6" + }, + { + "m_Id": "878ca51a73a8438b888c1b7a98f60c0f" + }, + { + "m_Id": "c9269b2be06143b780ee0f76505b78f8" + }, + { + "m_Id": "d75ba8f6c3454ffbaf92727bc3a8928b" + } + ], + "synonyms": [ + "curve" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "0e3389226a5a4b04a8e0c5890e0612a7", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 0.30000001192092898, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "0efa6cd6b3fe4195a3ba38be5071ea38", + "m_Id": 0, + "m_DisplayName": "Progress", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "10bb12b58f0f4b9593de4a10d72a3d28", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "12b81ca84fdb459ba05ee8e2b3b668f7", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "14b01a219692405787571eb6e9c599e0", + "m_Id": 3, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "15810a39a2f24bccb2318565f454b439", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "15e8f72e125b40c39bf14dcecad3368f", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "16f34e9d1cd5487b8f0e3fbcc32716e4", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "17594859d262403497d8367080760e81", + "m_Id": 0, + "m_DisplayName": "Edge1", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Edge1", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "17acb66410fa49d6a4c40be8b3717630", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.NormalTS", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "58e6c9378a12448ea6c47f99d3a28d7b" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.NormalTS" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "17d0d0e6be304294a5d414cc4bd944ca", + "m_Id": 2, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.AbsoluteNode", + "m_ObjectId": "183a996a1cfd47ce8834beab65cc8182", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Absolute", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 2862.000244140625, + "y": 1035.0001220703125, + "width": 208.0, + "height": 278.0 + } + }, + "m_Slots": [ + { + "m_Id": "026384ddcb85445399b26bfd6e204a9d" + }, + { + "m_Id": "cb50ee8c78f3421786f00dbcd3bc9744" + } + ], + "synonyms": [ + "positive" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "1b3462022a0a48b4813f8c70a74c1afd", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "1b401549085c40bdb57d3410019fbe1a", + "m_Id": 3, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "1bcfb36c927f4c5ab87a04615a9664b9", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 4033.0, + "y": 2460.0, + "width": 208.00048828125, + "height": 302.0 + } + }, + "m_Slots": [ + { + "m_Id": "59bd572069914771b517c1a9689cb526" + }, + { + "m_Id": "fcab863431304cc4bc26b30901b2b8ae" + }, + { + "m_Id": "43c26e948a6c4c6fae73a81f87b1185a" + } + ], + "synonyms": [ + "multiplication", + "times", + "x" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalDecalSubTarget", + "m_ObjectId": "1c42ca1d8a2f4d909bde5dfeb6458d21", + "m_DecalData": { + "affectsAlbedo": true, + "affectsNormalBlend": true, + "affectsNormal": true, + "affectsMAOS": false, + "affectsEmission": true, + "drawOrder": 0, + "supportLodCrossFade": false, + "angleFade": false + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.OneMinusNode", + "m_ObjectId": "1c997d48185c4d97a1a50d8acef60f6e", + "m_Group": { + "m_Id": "" + }, + "m_Name": "One Minus", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 3451.0, + "y": 1867.0, + "width": 208.0, + "height": 278.0 + } + }, + "m_Slots": [ + { + "m_Id": "1b3462022a0a48b4813f8c70a74c1afd" + }, + { + "m_Id": "023c452b4801433e8645138b85e9935f" + } + ], + "synonyms": [ + "complement", + "invert", + "opposite" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "1d8f827746b1456d867fbe8b68d397f4", + "m_Id": 0, + "m_DisplayName": "Normal Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "NormalAlpha", + "m_StageCapability": 2, + "m_Value": 0.0, + "m_DefaultValue": 1.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "1dff4436c4b3492e86a66b31a37d2989", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 6162.00048828125, + "y": 1158.000244140625, + "width": 122.0, + "height": 33.9998779296875 + } + }, + "m_Slots": [ + { + "m_Id": "6632682ded57408f822480aaada33e47" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "58c406bd628c4ec585141954da771daa" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "1e7bc169251a4ddc93403627ee1a6238", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 0.41999998688697817, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "218089213ffc4caeaadbe34ee4119a15", + "m_Id": 2, + "m_DisplayName": "T", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "T", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "21e612ff508d481f9adb533d6937625a", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "226298f52f2747d9a7acb733d35f927c", + "m_Id": 2, + "m_DisplayName": "Cosine Time", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Cosine Time", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "22c5aa85f05346f0b6c5fde9224e0ef4", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 3107.000244140625, + "y": 1054.0, + "width": 127.0, + "height": 34.0001220703125 + } + }, + "m_Slots": [ + { + "m_Id": "062a108c00124c97bc86bf7699825385" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "80cd78247bdd43549c52f3cdbd08ab44" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "234f177918744c2882f1f5587bd53871", + "m_Id": 1, + "m_DisplayName": "Edge2", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Edge2", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "2950ea25830f4dbeb59d93d4ecaa7cff", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "29d6e841e726480ab726a51b8a08aa64", + "m_Id": 1, + "m_DisplayName": "Edge2", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Edge2", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MaximumNode", + "m_ObjectId": "2bf3ebe5f7c641b9a6d9bd91ea0351df", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Maximum", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 4858.0, + "y": 199.99998474121095, + "width": 208.0, + "height": 302.0 + } + }, + "m_Slots": [ + { + "m_Id": "21e612ff508d481f9adb533d6937625a" + }, + { + "m_Id": "6f3dec079ad1441e8768d8f0d05339cd" + }, + { + "m_Id": "4b43a5057f884087a99117f31277adc3" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "2e4754bae13e4504aa29e2a363b09846", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 1655.999755859375, + "y": 610.9999389648438, + "width": 208.0001220703125, + "height": 302.0 + } + }, + "m_Slots": [ + { + "m_Id": "b8fbd68c59be46f7919b79c9c64f060e" + }, + { + "m_Id": "c280e6409abe41ba84313afcab541105" + }, + { + "m_Id": "9b7df16b654345ee8fa372c0227b6f33" + } + ], + "synonyms": [ + "multiplication", + "times", + "x" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "2efac1e3ef444d999a154f2f303baa4c", + "m_Id": 3, + "m_DisplayName": "Delta Time", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Delta Time", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.TimeNode", + "m_ObjectId": "302f15a7ade0457785a9d1edf6b90111", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Time", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 809.9998779296875, + "y": 848.9999389648438, + "width": 124.0001220703125, + "height": 173.00006103515626 + } + }, + "m_Slots": [ + { + "m_Id": "4bd75036939340a7b8d4922b73ba3206" + }, + { + "m_Id": "a5c9009565a04653be26ab888915554b" + }, + { + "m_Id": "226298f52f2747d9a7acb733d35f927c" + }, + { + "m_Id": "2efac1e3ef444d999a154f2f303baa4c" + }, + { + "m_Id": "6895e82d5b2d413d8d19d04ca8da5521" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "30754650c8334c83ba8eb6c6131862aa", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 3903.0, + "y": 282.9999694824219, + "width": 122.0, + "height": 34.000030517578128 + } + }, + "m_Slots": [ + { + "m_Id": "0efa6cd6b3fe4195a3ba38be5071ea38" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "58c406bd628c4ec585141954da771daa" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SubtractNode", + "m_ObjectId": "309f3a009fcc47128c220cc54f381bc7", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Subtract", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 2501.000244140625, + "y": 1011.0000610351563, + "width": 208.0, + "height": 302.00006103515627 + } + }, + "m_Slots": [ + { + "m_Id": "09d889c759f44e54bc5adb2fff7eb67d" + }, + { + "m_Id": "1e7bc169251a4ddc93403627ee1a6238" + }, + { + "m_Id": "574ec69e74744ec68bb6809afdd809d0" + } + ], + "synonyms": [ + "subtraction", + "remove", + "minus", + "take away" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "322a608529494acd9bdcc8adb66e6822", + "m_Id": 3, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "32396e9ba8f3474ca4755d4df3636477", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SmoothstepNode", + "m_ObjectId": "3242f790f8a5479981192049b3339c0a", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Smoothstep", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 3234.000244140625, + "y": 583.0000610351563, + "width": 208.000244140625, + "height": 326.00006103515627 + } + }, + "m_Slots": [ + { + "m_Id": "55c469d9f56b4995b4d244fdddbb3629" + }, + { + "m_Id": "234f177918744c2882f1f5587bd53871" + }, + { + "m_Id": "ec67c11f975e434681e313d657436495" + }, + { + "m_Id": "70e18fc3e4ad4e41b595675bfea016b4" + } + ], + "synonyms": [ + "curve" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.OneMinusNode", + "m_ObjectId": "3256cdd6a19e44859552f5382d61c2da", + "m_Group": { + "m_Id": "" + }, + "m_Name": "One Minus", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 3451.0, + "y": 1530.0, + "width": 208.0, + "height": 278.0 + } + }, + "m_Slots": [ + { + "m_Id": "57ef7ff166804c0eb7a2a8da359823b3" + }, + { + "m_Id": "bee561cc9f7b4300bc64495cd5ead35e" + } + ], + "synonyms": [ + "complement", + "invert", + "opposite" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "33ad2d899c6e4968be230c7e032d3178", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.LerpNode", + "m_ObjectId": "35ae2b6e225d4e27a403be2b144d5354", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Lerp", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 4475.99951171875, + "y": 583.0, + "width": 208.0, + "height": 325.99993896484377 + } + }, + "m_Slots": [ + { + "m_Id": "b7de5bbc5bb2420ab55e3416f8d7c469" + }, + { + "m_Id": "02bf9628b1ec46499ce25b9a74f00d8c" + }, + { + "m_Id": "bc3b9436d0e2406f856dfb9d6ab37140" + }, + { + "m_Id": "867214605b20488dbe1f7095def8919c" + } + ], + "synonyms": [ + "mix", + "blend", + "linear interpolate" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "36c4679669694906b8e1c6e384982a43", + "m_Id": 1, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "37025b198e6f4baba1249b237f11fc7b", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "37a2ab484008455f80f1eca2a1ab037a", + "m_Id": 0, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 2, + "m_Value": 1.0, + "m_DefaultValue": 1.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "3a454318580e46eeb62a5ff9701333ed", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Tangent", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "dc2399bf1dd94eb9a5736cf01310f277" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Tangent" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "3a4f83a703b145f1b2f1134c53f55fce", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.AddNode", + "m_ObjectId": "3d192fa06bb44cfb8e2a1afba240adf8", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Add", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 6306.00048828125, + "y": 1461.0001220703125, + "width": 208.0, + "height": 302.000244140625 + } + }, + "m_Slots": [ + { + "m_Id": "814cbab7977d4cfba9cb55292252fa61" + }, + { + "m_Id": "dbb2132bdf504f598f1a5d8f76c07484" + }, + { + "m_Id": "fdd9e3f600c3458d86adc064777f9aa1" + } + ], + "synonyms": [ + "addition", + "sum", + "plus" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SmoothstepNode", + "m_ObjectId": "3fbbd81138f9468695e9dd3a06b7298c", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Smoothstep", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 3153.0, + "y": 1867.0, + "width": 208.0, + "height": 326.0 + } + }, + "m_Slots": [ + { + "m_Id": "17594859d262403497d8367080760e81" + }, + { + "m_Id": "6e10e4ca213d43e19138f587877c9d39" + }, + { + "m_Id": "17d0d0e6be304294a5d414cc4bd944ca" + }, + { + "m_Id": "e5711a2f1e0f4091914b7a1a1007946b" + } + ], + "synonyms": [ + "curve" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MaximumNode", + "m_ObjectId": "41f1e77db2a34589ba2fe6a5db197ac9", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Maximum", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 3791.0, + "y": 1686.0, + "width": 208.0, + "height": 302.0 + } + }, + "m_Slots": [ + { + "m_Id": "f2306196113b4ddd9e6e3c739e036025" + }, + { + "m_Id": "469c14ad735d43a4903801c3b588956e" + }, + { + "m_Id": "9f80875a7cfc4fb788429f5307ca4799" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "41f3902beb1a4707916f069656da1971", + "m_Id": 0, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "43c26e948a6c4c6fae73a81f87b1185a", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalTarget", + "m_ObjectId": "4672c100e58b4a96ac0b1fd6395a9118", + "m_Datas": [], + "m_ActiveSubTarget": { + "m_Id": "1c42ca1d8a2f4d909bde5dfeb6458d21" + }, + "m_AllowMaterialOverride": false, + "m_SurfaceType": 1, + "m_ZTestMode": 4, + "m_ZWriteControl": 0, + "m_AlphaMode": 2, + "m_RenderFace": 2, + "m_AlphaClip": false, + "m_CastShadows": true, + "m_ReceiveShadows": true, + "m_DisableTint": false, + "m_Sort3DAs2DCompatible": false, + "m_AdditionalMotionVectorMode": 0, + "m_AlembicMotionVectors": false, + "m_SupportsLODCrossFade": false, + "m_CustomEditorGUI": "", + "m_SupportVFX": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "469c14ad735d43a4903801c3b588956e", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.AbsoluteNode", + "m_ObjectId": "46ccac4b71c042d28c6e95b1cdd17e50", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Absolute", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 2635.0, + "y": 1578.0, + "width": 208.0, + "height": 278.0 + } + }, + "m_Slots": [ + { + "m_Id": "b0e1ee6b551d4bdfa2be6eebbc65394e" + }, + { + "m_Id": "94264fa7e95244d3b4e5ad81674f5293" + } + ], + "synonyms": [ + "positive" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.LerpNode", + "m_ObjectId": "471423a52325497aa4d9cd9a7674f596", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Lerp", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 4476.0, + "y": 199.99998474121095, + "width": 208.0, + "height": 326.0 + } + }, + "m_Slots": [ + { + "m_Id": "5f28f59176ff432ab50c5e366ab8606e" + }, + { + "m_Id": "b7f2925fb5024c3bba140b2bbac81b90" + }, + { + "m_Id": "c84b1d32611b4e49baca825d69b730b3" + }, + { + "m_Id": "1b401549085c40bdb57d3410019fbe1a" + } + ], + "synonyms": [ + "mix", + "blend", + "linear interpolate" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "47b811a914b34eea97baffa776d16e0a", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "4b43a5057f884087a99117f31277adc3", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "4ba5d08fb6b242beba1ba5fa186880da", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "4bd75036939340a7b8d4922b73ba3206", + "m_Id": 0, + "m_DisplayName": "Time", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Time", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "4c0465b1c1874fac98083d70f0845ef6", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "510b0b5c307240d8ac1e06e46c8e456c", + "m_Id": 1, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "51bffc1a2d7946a79f296600b6a416aa", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 4134.0, + "y": 1054.0, + "width": 208.0, + "height": 302.0 + } + }, + "m_Slots": [ + { + "m_Id": "12b81ca84fdb459ba05ee8e2b3b668f7" + }, + { + "m_Id": "08501ac0d7f546108d5ba2e267177c42" + }, + { + "m_Id": "67a5f4b7f1e04e9bb7d409810122231a" + } + ], + "synonyms": [ + "multiplication", + "times", + "x" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "52ef1702477b430da65a507258752d5c", + "m_Id": 1, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "55c469d9f56b4995b4d244fdddbb3629", + "m_Id": 0, + "m_DisplayName": "Edge1", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Edge1", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "56a4c7cceab5476aa0ff409f79902e5b", + "m_Id": 1, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "56d510ee05e94d088efed0ec17fe1279", + "m_Id": 0, + "m_DisplayName": "Progress", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "574ec69e74744ec68bb6809afdd809d0", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "57ef7ff166804c0eb7a2a8da359823b3", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "57fa33d30070423bbcb8df8cc46dfc8d", + "m_Id": 0, + "m_DisplayName": "Progress", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "58c406bd628c4ec585141954da771daa", + "m_Guid": { + "m_GuidSerialized": "6a7517f5-aa1f-4c77-92f6-c9282d2bfce6" + }, + "promotedFromAssetID": "", + "promotedFromCategoryName": "", + "promotedOrdering": -1, + "m_Name": "Progress", + "m_DefaultRefNameVersion": 1, + "m_RefNameGeneratedByDisplayName": "Progress", + "m_DefaultReferenceName": "_Progress", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_PerRendererData": false, + "m_customAttributes": [], + "m_Value": 0.0, + "m_FloatType": 1, + "m_LiteralFloatMode": false, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + }, + "m_SliderType": 0, + "m_SliderPower": 3.0, + "m_EnumType": 0, + "m_CSharpEnumString": "", + "m_EnumNames": [ + "Default" + ], + "m_EnumValues": [ + 0 + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "58e6c9378a12448ea6c47f99d3a28d7b", + "m_Id": 0, + "m_DisplayName": "Normal (Tangent Space)", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "NormalTS", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 3 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "5948329876f0426fa288e715623474bc", + "m_Id": 2, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "59bd572069914771b517c1a9689cb526", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "59cdba5a1f904dc3af0a76cec73cbe77", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "5cbf7cfc1e97491785ca94ee6cd946ce", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "5e71aefcada147958ad7923690234dc3", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 1195.0001220703125, + "y": 951.0000610351563, + "width": 122.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "57fa33d30070423bbcb8df8cc46dfc8d" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "58c406bd628c4ec585141954da771daa" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "5ec26b2b14b142719ca9fe4086139f28", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "5f28f59176ff432ab50c5e366ab8606e", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "64e2b7c882214050bd8a440c8e368c4a", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 7565.0009765625, + "y": 1536.0001220703125, + "width": 140.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "6d1affd637254989a559f4135a975804" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "89881b8a9ebc4d85bb89d77b74c51f58" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "6574e7fbc9e14855a7c658d2a76329ca", + "m_Id": 1, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SaturateNode", + "m_ObjectId": "65c9ab12ae9641e68c6687fd66ad87c4", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Saturate", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 6732.00048828125, + "y": 1461.0001220703125, + "width": 208.0, + "height": 278.000244140625 + } + }, + "m_Slots": [ + { + "m_Id": "15e8f72e125b40c39bf14dcecad3368f" + }, + { + "m_Id": "510b0b5c307240d8ac1e06e46c8e456c" + } + ], + "synonyms": [ + "clamp" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "6632682ded57408f822480aaada33e47", + "m_Id": 0, + "m_DisplayName": "Progress", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "664cf944febc42a6a762efc6d7883ddf", + "m_Id": 0, + "m_DisplayName": "SpinSpeed", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "668006814e99437fa4fc513e97016442", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "67a5f4b7f1e04e9bb7d409810122231a", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "6895e82d5b2d413d8d19d04ca8da5521", + "m_Id": 4, + "m_DisplayName": "Smooth Delta", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Smooth Delta", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "6a526ed2cd84446596a940a30163a8ce", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 3000.0, + "y": 1932.0, + "width": 127.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "a768721d95024c1aa58311e67214eab1" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "80cd78247bdd43549c52f3cdbd08ab44" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "6d1affd637254989a559f4135a975804", + "m_Id": 0, + "m_DisplayName": "ReticleColor", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "6d3e012dda7b4710b32aefdb72119b9e", + "m_Id": 0, + "m_DisplayName": "Edge1", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Edge1", + "m_StageCapability": 3, + "m_Value": { + "x": 0.8500000238418579, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "6e10e4ca213d43e19138f587877c9d39", + "m_Id": 1, + "m_DisplayName": "Edge2", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Edge2", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "6e69f137daad451c8b6f067f6b5fd74f", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "6f3dec079ad1441e8768d8f0d05339cd", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "70e18fc3e4ad4e41b595675bfea016b4", + "m_Id": 3, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "75b9883ce604499ca67b89c6aeb88d47", + "m_Id": 2, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "768dd004f33343c0b7432301d831c954", + "m_Id": 3, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "77416efd91a546a1843d90846e865412", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "77d57e9f34ce4b76ac61e82fd987b264", + "m_Id": 1, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "7bd49b0affc44e0d8a8b811a51218da0", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.OneMinusNode", + "m_ObjectId": "7d1cfba434a1485cbfaf5ce5617809b7", + "m_Group": { + "m_Id": "" + }, + "m_Name": "One Minus", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 3520.00048828125, + "y": 583.0000610351563, + "width": 207.999755859375, + "height": 278.0 + } + }, + "m_Slots": [ + { + "m_Id": "ab60035be7ad4baf84ec2ae894d2a4ae" + }, + { + "m_Id": "c10b603250854401aa89dc21860b032b" + } + ], + "synonyms": [ + "complement", + "invert", + "opposite" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "7f0bb06019964c1091f17825c3f275a4", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "80cd78247bdd43549c52f3cdbd08ab44", + "m_Guid": { + "m_GuidSerialized": "28a9a595-abd6-44f9-a185-3be098031b30" + }, + "promotedFromAssetID": "", + "promotedFromCategoryName": "", + "promotedOrdering": -1, + "m_Name": "LineWidth", + "m_DefaultRefNameVersion": 1, + "m_RefNameGeneratedByDisplayName": "LineWidth", + "m_DefaultReferenceName": "_LineWidth", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_PerRendererData": false, + "m_customAttributes": [], + "m_Value": 0.019999999552965165, + "m_FloatType": 0, + "m_LiteralFloatMode": false, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + }, + "m_SliderType": 0, + "m_SliderPower": 3.0, + "m_EnumType": 0, + "m_CSharpEnumString": "", + "m_EnumNames": [ + "Default" + ], + "m_EnumValues": [ + 0 + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SplitNode", + "m_ObjectId": "80e6aacf58c9413da3033deaff2af324", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Split", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 2284.0, + "y": 1578.0001220703125, + "width": 118.0, + "height": 148.999755859375 + } + }, + "m_Slots": [ + { + "m_Id": "92527819514943a79a37b3a4e3c09244" + }, + { + "m_Id": "36c4679669694906b8e1c6e384982a43" + }, + { + "m_Id": "75b9883ce604499ca67b89c6aeb88d47" + }, + { + "m_Id": "768dd004f33343c0b7432301d831c954" + }, + { + "m_Id": "d867b00f094b4c4c864321420650729e" + } + ], + "synonyms": [ + "separate" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "814cbab7977d4cfba9cb55292252fa61", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "818948d58f524ace992735b76865efd2", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 2990.0, + "y": 1595.0, + "width": 127.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "eb6c18e1c6694b0690306db90f1c4f4e" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "80cd78247bdd43549c52f3cdbd08ab44" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "81e93adba1054d798c5d92b9c99e29ef", + "m_Id": 2, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "84f1d70f4908430e8c3f0b9ff2e51546", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "867214605b20488dbe1f7095def8919c", + "m_Id": 3, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "878ca51a73a8438b888c1b7a98f60c0f", + "m_Id": 1, + "m_DisplayName": "Edge2", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Edge2", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SubtractNode", + "m_ObjectId": "88b194688a9a4d588dfce27e1bd4238f", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Subtract", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 2501.000244140625, + "y": 216.00003051757813, + "width": 208.0, + "height": 301.9999694824219 + } + }, + "m_Slots": [ + { + "m_Id": "d09339d76f084cd3819a00c0c4386f0b" + }, + { + "m_Id": "8cdfe719cc14421aa9d552de35bb472c" + }, + { + "m_Id": "7bd49b0affc44e0d8a8b811a51218da0" + } + ], + "synonyms": [ + "subtraction", + "remove", + "minus", + "take away" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "894c95d403644c7b917eae571f6b087c", + "m_Id": 0, + "m_DisplayName": "Emission", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Emission", + "m_StageCapability": 2, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_ColorMode": 1, + "m_DefaultColor": { + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 1.0 + } +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "89881b8a9ebc4d85bb89d77b74c51f58", + "m_Guid": { + "m_GuidSerialized": "a91fe426-07c4-4707-9d77-961e123eac39" + }, + "promotedFromAssetID": "", + "promotedFromCategoryName": "", + "promotedOrdering": -1, + "m_Name": "ReticleColor", + "m_DefaultRefNameVersion": 1, + "m_RefNameGeneratedByDisplayName": "ReticleColor", + "m_DefaultReferenceName": "_ReticleColor", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": true, + "hlslDeclarationOverride": 2, + "m_Hidden": false, + "m_PerRendererData": false, + "m_customAttributes": [], + "m_Value": { + "r": 1.9999998807907105, + "g": 0.007066239602863789, + "b": 0.007066239602863789, + "a": 1.0 + }, + "isMainColor": false, + "m_ColorMode": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "8a8be74e46fb40beac8eb5644a16e3e0", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 1.2000000476837159, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SmoothstepNode", + "m_ObjectId": "8b130bb6b8f84aa0a57135e70ea0807e", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Smoothstep", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 3143.0, + "y": 1530.0, + "width": 208.0, + "height": 326.0 + } + }, + "m_Slots": [ + { + "m_Id": "8e74697babd944aba7dfb18d2f953cfd" + }, + { + "m_Id": "29d6e841e726480ab726a51b8a08aa64" + }, + { + "m_Id": "81e93adba1054d798c5d92b9c99e29ef" + }, + { + "m_Id": "f1fd92bb0f7945e0aca3187622fff9e9" + } + ], + "synonyms": [ + "curve" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "8b88d368436d4d3da46a07b70054b06f", + "m_Id": 0, + "m_DisplayName": "Progress", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "8be7c1a3c6b14d52a3878fce473473f0", + "m_Group": { + "m_Id": "" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 413.99993896484377, + "y": 423.9999694824219, + "width": 208.0001220703125, + "height": 311.9999084472656 + } + }, + "m_Slots": [ + { + "m_Id": "6e69f137daad451c8b6f067f6b5fd74f" + } + ], + "synonyms": [ + "texcoords", + "coords", + "coordinates" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "8c8805ce6fdd4d0b9836c71bab33adbf", + "m_Id": 3, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "8cdfe719cc14421aa9d552de35bb472c", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 0.18000000715255738, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "8d15aad67c8c4edb987e2fc6f2ce6b3f", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "8d7cd11954fe471c96d65d49ecb3394a", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.5, + "y": 0.5, + "z": 0.5 + }, + "m_DefaultValue": { + "x": 0.5, + "y": 0.5, + "z": 0.5 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.5, + "g": 0.5, + "b": 0.5, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "8e49efc68461426a8ceab2c47b1d48fb", + "m_Id": 3, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "8e74697babd944aba7dfb18d2f953cfd", + "m_Id": 0, + "m_DisplayName": "Edge1", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Edge1", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "8f2d27dd90f84e3ea7662099a1c86a0d", + "m_Guid": { + "m_GuidSerialized": "a470c90b-194b-4669-8cc5-a0a2cced2028" + }, + "promotedFromAssetID": "", + "promotedFromCategoryName": "", + "promotedOrdering": -1, + "m_Name": "BeamColor", + "m_DefaultRefNameVersion": 1, + "m_RefNameGeneratedByDisplayName": "BeamColor", + "m_DefaultReferenceName": "_BeamColor", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_PerRendererData": false, + "m_customAttributes": [], + "m_Value": { + "r": 8.0, + "g": 0.0, + "b": 0.0, + "a": 1.0 + }, + "isMainColor": false, + "m_ColorMode": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "92527819514943a79a37b3a4e3c09244", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "94264fa7e95244d3b4e5ad81674f5293", + "m_Id": 1, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "96e01566b2fd44b2903c8b325c60111c", + "m_Id": 0, + "m_DisplayName": "LineWidth", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.OneMinusNode", + "m_ObjectId": "98b4c5e0784b4e839a6da017a7b2fa86", + "m_Group": { + "m_Id": "" + }, + "m_Name": "One Minus", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 6732.00048828125, + "y": 1054.0001220703125, + "width": 208.0, + "height": 278.0 + } + }, + "m_Slots": [ + { + "m_Id": "c11b40ac46c34389ac8f8460285d315d" + }, + { + "m_Id": "d3076cc693824353b52b801759e6c248" + } + ], + "synonyms": [ + "complement", + "invert", + "opposite" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "99d7a5ed2cd34fe0bd21ebebf078cb10", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 965.9998779296875, + "y": 794.9999389648438, + "width": 126.0001220703125, + "height": 118.0 + } + }, + "m_Slots": [ + { + "m_Id": "32396e9ba8f3474ca4755d4df3636477" + }, + { + "m_Id": "b98316bf447441879366956a80941e7a" + }, + { + "m_Id": "4c0465b1c1874fac98083d70f0845ef6" + } + ], + "synonyms": [ + "multiplication", + "times", + "x" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "9b7df16b654345ee8fa372c0227b6f33", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "9edb76c1d16c46f58b1158104c2c77ad", + "m_Id": 2, + "m_DisplayName": "T", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "T", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "9f80875a7cfc4fb788429f5307ca4799", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "a01c06a436fa41549794913c415df3c3", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.AbsoluteNode", + "m_ObjectId": "a2a1ac179d5649498fd9f0367b941478", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Absolute", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 2645.0, + "y": 1915.0, + "width": 208.0, + "height": 278.0 + } + }, + "m_Slots": [ + { + "m_Id": "2950ea25830f4dbeb59d93d4ecaa7cff" + }, + { + "m_Id": "56a4c7cceab5476aa0ff409f79902e5b" + } + ], + "synonyms": [ + "positive" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "a32e2112ddf745b4aaabac4c5c395ed0", + "m_Guid": { + "m_GuidSerialized": "d947cfd0-0bed-4263-ac8f-40791bb9ab31" + }, + "promotedFromAssetID": "", + "promotedFromCategoryName": "", + "promotedOrdering": -1, + "m_Name": "SpinSpeed", + "m_DefaultRefNameVersion": 1, + "m_RefNameGeneratedByDisplayName": "SpinSpeed", + "m_DefaultReferenceName": "_SpinSpeed", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_PerRendererData": false, + "m_customAttributes": [], + "m_Value": 8.0, + "m_FloatType": 0, + "m_LiteralFloatMode": false, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + }, + "m_SliderType": 0, + "m_SliderPower": 3.0, + "m_EnumType": 0, + "m_CSharpEnumString": "", + "m_EnumNames": [ + "Default" + ], + "m_EnumValues": [ + 0 + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MaximumNode", + "m_ObjectId": "a3f27c76b9134af2a663b0a6518d2850", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Maximum", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 5387.0, + "y": 547.0000610351563, + "width": 208.0, + "height": 302.00006103515627 + } + }, + "m_Slots": [ + { + "m_Id": "0ac3bb32f9c94414ba2c9ea98e0571a9" + }, + { + "m_Id": "a78a9180f80547cfbf938ed5de8afa15" + }, + { + "m_Id": "dffa1ec1b6024415b7694ad2a840f3de" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "a5c9009565a04653be26ab888915554b", + "m_Id": 1, + "m_DisplayName": "Sine Time", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Sine Time", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "a768721d95024c1aa58311e67214eab1", + "m_Id": 0, + "m_DisplayName": "LineWidth", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "a78a9180f80547cfbf938ed5de8afa15", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "aa282ac528cf4fcfa19e6c28b7a997af", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 7263.00048828125, + "y": 1437.0001220703125, + "width": 208.00048828125, + "height": 302.000244140625 + } + }, + "m_Slots": [ + { + "m_Id": "10bb12b58f0f4b9593de4a10d72a3d28" + }, + { + "m_Id": "37025b198e6f4baba1249b237f11fc7b" + }, + { + "m_Id": "fe3036ffadf2465990dd31def3cbc3ea" + } + ], + "synonyms": [ + "multiplication", + "times", + "x" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "ab60035be7ad4baf84ec2ae894d2a4ae", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "ab643bdd863640fb9a80c9299ea3ad0a", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 3903.0, + "y": 688.0, + "width": 122.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "8b88d368436d4d3da46a07b70054b06f" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "58c406bd628c4ec585141954da771daa" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "ac103027a06748e99de73b5e09c0a00a", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BaseColor", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "8d7cd11954fe471c96d65d49ecb3394a" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "ada189cd572c4a05b5bea0f192229887", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 3903.0, + "y": 1091.9998779296875, + "width": 122.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "56d510ee05e94d088efed0ec17fe1279" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "58c406bd628c4ec585141954da771daa" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "ae95626b63db4823b9e673e55187a39e", + "m_Id": 0, + "m_DisplayName": "Edge1", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Edge1", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "af054c6cafaf4a489d929ddf66539860", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SmoothstepNode", + "m_ObjectId": "afc4cd083d4d456786ed28d3f58c955a", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Smoothstep", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 6301.00048828125, + "y": 1054.0001220703125, + "width": 208.0, + "height": 325.9998779296875 + } + }, + "m_Slots": [ + { + "m_Id": "6d3e012dda7b4710b32aefdb72119b9e" + }, + { + "m_Id": "d1716d551fc4495da0be3c9254ce7731" + }, + { + "m_Id": "eeb7675f81a14772b2179a7add0cf25d" + }, + { + "m_Id": "8c8805ce6fdd4d0b9836c71bab33adbf" + } + ], + "synonyms": [ + "curve" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "b0e1ee6b551d4bdfa2be6eebbc65394e", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "b2aef32d19a94a678523ee8999f038e9", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 4134.0, + "y": 244.99996948242188, + "width": 208.0, + "height": 302.0000915527344 + } + }, + "m_Slots": [ + { + "m_Id": "af054c6cafaf4a489d929ddf66539860" + }, + { + "m_Id": "f484854e856245c98521570a1594f9c3" + }, + { + "m_Id": "bd354adca0e545358239a69c6cf88f37" + } + ], + "synonyms": [ + "multiplication", + "times", + "x" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "b44aef604fad49409e9bdd7fb15974cc", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 3107.000244140625, + "y": 259.0000305175781, + "width": 127.0, + "height": 33.999969482421878 + } + }, + "m_Slots": [ + { + "m_Id": "96e01566b2fd44b2903c8b325c60111c" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "80cd78247bdd43549c52f3cdbd08ab44" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "b623c75a206e4cf6b9680d22e8331a34", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Normal", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "f45315d494fc44438cae08f178e4ee3b" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Normal" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.LerpNode", + "m_ObjectId": "b6f4cd86d33b4cff80afe0b3b4bc9bd3", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Lerp", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 1348.0001220703125, + "y": 848.0000610351563, + "width": 208.0, + "height": 326.00006103515627 + } + }, + "m_Slots": [ + { + "m_Id": "5ec26b2b14b142719ca9fe4086139f28" + }, + { + "m_Id": "074e6a6b30b641ed86d6b1a469b2e824" + }, + { + "m_Id": "9edb76c1d16c46f58b1158104c2c77ad" + }, + { + "m_Id": "322a608529494acd9bdcc8adb66e6822" + } + ], + "synonyms": [ + "mix", + "blend", + "linear interpolate" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SmoothstepNode", + "m_ObjectId": "b6fdd8b4d094402ea102dc7abdec9df6", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Smoothstep", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 3234.000244140625, + "y": 192.00003051757813, + "width": 208.000244140625, + "height": 325.9999694824219 + } + }, + "m_Slots": [ + { + "m_Id": "ae95626b63db4823b9e673e55187a39e" + }, + { + "m_Id": "ddf18910e62145439cd5868ef2ae63b7" + }, + { + "m_Id": "5948329876f0426fa288e715623474bc" + }, + { + "m_Id": "8e49efc68461426a8ceab2c47b1d48fb" + } + ], + "synonyms": [ + "curve" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "b7de5bbc5bb2420ab55e3416f8d7c469", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "b7f2925fb5024c3bba140b2bbac81b90", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "b8fbd68c59be46f7919b79c9c64f060e", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "b98316bf447441879366956a80941e7a", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "b9c411b1b8224017b54a9fd53a5d19a5", + "m_Name": "", + "m_ChildObjectList": [ + { + "m_Id": "58c406bd628c4ec585141954da771daa" + }, + { + "m_Id": "89881b8a9ebc4d85bb89d77b74c51f58" + }, + { + "m_Id": "80cd78247bdd43549c52f3cdbd08ab44" + }, + { + "m_Id": "a32e2112ddf745b4aaabac4c5c395ed0" + }, + { + "m_Id": "8f2d27dd90f84e3ea7662099a1c86a0d" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SubtractNode", + "m_ObjectId": "b9dd614a3315450796510e0a490a77b9", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Subtract", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 2501.000244140625, + "y": 607.0000610351563, + "width": 208.0, + "height": 302.00006103515627 + } + }, + "m_Slots": [ + { + "m_Id": "dc93a4bbe0a3400393eaa78897f029a5" + }, + { + "m_Id": "0e3389226a5a4b04a8e0c5890e0612a7" + }, + { + "m_Id": "a01c06a436fa41549794913c415df3c3" + } + ], + "synonyms": [ + "subtraction", + "remove", + "minus", + "take away" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "bc3b9436d0e2406f856dfb9d6ab37140", + "m_Id": 2, + "m_DisplayName": "T", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "T", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "bd354adca0e545358239a69c6cf88f37", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "bee561cc9f7b4300bc64495cd5ead35e", + "m_Id": 1, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "bfa8d0c8145447cb9840752c0edb65d6", + "m_Id": 0, + "m_DisplayName": "Edge1", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Edge1", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "bfeac96ed0014bb2ab358c25f38218d4", + "m_Id": 1, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "c10b603250854401aa89dc21860b032b", + "m_Id": 1, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "c11b40ac46c34389ac8f8460285d315d", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "c280e6409abe41ba84313afcab541105", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.RotateNode", + "m_ObjectId": "c3bf01d754fb43f08463495942b7e200", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Rotate", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 1279.999755859375, + "y": 433.9999694824219, + "width": 208.0001220703125, + "height": 359.9999694824219 + } + }, + "m_Slots": [ + { + "m_Id": "41f3902beb1a4707916f069656da1971" + }, + { + "m_Id": "ed9dc2668a044fa1a2643d5baf0d7908" + }, + { + "m_Id": "0188e59a458846cea75c01aa764545c9" + }, + { + "m_Id": "f15e30d3420245bab1ac879e22aaa125" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Unit": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "c84b1d32611b4e49baca825d69b730b3", + "m_Id": 2, + "m_DisplayName": "T", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "T", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "c9269b2be06143b780ee0f76505b78f8", + "m_Id": 2, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "cb50ee8c78f3421786f00dbcd3bc9744", + "m_Id": 1, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "cbc59d37546f442d84f3a5d3ab6216fb", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 801.9998779296875, + "y": 788.0, + "width": 132.0001220703125, + "height": 33.99993896484375 + } + }, + "m_Slots": [ + { + "m_Id": "664cf944febc42a6a762efc6d7883ddf" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "a32e2112ddf745b4aaabac4c5c395ed0" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "ce6cf7576e2c4faab25a632d9b4cf921", + "m_Id": 0, + "m_DisplayName": "LineWidth", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.LengthNode", + "m_ObjectId": "cef229b9f0a74e57955cb5fb3a5cab12", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Length", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 2045.9998779296875, + "y": 610.9999389648438, + "width": 207.9998779296875, + "height": 278.00006103515627 + } + }, + "m_Slots": [ + { + "m_Id": "7f0bb06019964c1091f17825c3f275a4" + }, + { + "m_Id": "6574e7fbc9e14855a7c658d2a76329ca" + } + ], + "synonyms": [ + "measure" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "d09339d76f084cd3819a00c0c4386f0b", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "d11973ebee03460a921cfa7d25aaf7e1", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.OneMinusNode", + "m_ObjectId": "d1450bd323e24888b432c80fad63f3f2", + "m_Group": { + "m_Id": "" + }, + "m_Name": "One Minus", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 3520.00048828125, + "y": 192.00003051757813, + "width": 207.999755859375, + "height": 278.0 + } + }, + "m_Slots": [ + { + "m_Id": "84f1d70f4908430e8c3f0b9ff2e51546" + }, + { + "m_Id": "52ef1702477b430da65a507258752d5c" + } + ], + "synonyms": [ + "complement", + "invert", + "opposite" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "d1716d551fc4495da0be3c9254ce7731", + "m_Id": 1, + "m_DisplayName": "Edge2", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Edge2", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "d3076cc693824353b52b801759e6c248", + "m_Id": 1, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "d3d55fa4da3f4b7f99869c8e0d626cd7", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Alpha", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "37a2ab484008455f80f1eca2a1ab037a" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Alpha" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "d75ba8f6c3454ffbaf92727bc3a8928b", + "m_Id": 3, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "d867b00f094b4c4c864321420650729e", + "m_Id": 4, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "d9e2eae814434717861c1b787a7492b8", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PositionMaterialSlot", + "m_ObjectId": "da96b4dda01447849434ff398b057937", + "m_Id": 0, + "m_DisplayName": "Position", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Position", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "dbb2132bdf504f598f1a5d8f76c07484", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.TangentMaterialSlot", + "m_ObjectId": "dc2399bf1dd94eb9a5736cf01310f277", + "m_Id": 0, + "m_DisplayName": "Tangent", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Tangent", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "dc93a4bbe0a3400393eaa78897f029a5", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "ddf18910e62145439cd5868ef2ae63b7", + "m_Id": 1, + "m_DisplayName": "Edge2", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Edge2", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.AbsoluteNode", + "m_ObjectId": "df0e928660ac4975b6b1c33a0cfce1d9", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Absolute", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 2862.000244140625, + "y": 240.00003051757813, + "width": 208.0, + "height": 277.9999694824219 + } + }, + "m_Slots": [ + { + "m_Id": "47b811a914b34eea97baffa776d16e0a" + }, + { + "m_Id": "bfeac96ed0014bb2ab358c25f38218d4" + } + ], + "synonyms": [ + "positive" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "df441deaa6e646c1bcd60a84044cd099", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 3107.000244140625, + "y": 650.0, + "width": 127.0, + "height": 34.00006103515625 + } + }, + "m_Slots": [ + { + "m_Id": "ce6cf7576e2c4faab25a632d9b4cf921" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "80cd78247bdd43549c52f3cdbd08ab44" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "dffa1ec1b6024415b7694ad2a840f3de", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "e18a2983480d425188adf2ad444e356b", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.NormalAlpha", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "1d8f827746b1456d867fbe8b68d397f4" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.NormalAlpha" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "e348e5dacc9d44498cea7f6062b4d449", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Emission", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "894c95d403644c7b917eae571f6b087c" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Emission" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "e436ca5f0ed14318b6667b834cfd5420", + "m_Id": 1, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "e5711a2f1e0f4091914b7a1a1007946b", + "m_Id": 3, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "e84a5990e04f4c74b2e641ef88e2c48a", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 4134.0, + "y": 649.9999389648438, + "width": 208.0, + "height": 302.00006103515627 + } + }, + "m_Slots": [ + { + "m_Id": "33ad2d899c6e4968be230c7e032d3178" + }, + { + "m_Id": "8a8be74e46fb40beac8eb5644a16e3e0" + }, + { + "m_Id": "16f34e9d1cd5487b8f0e3fbcc32716e4" + } + ], + "synonyms": [ + "multiplication", + "times", + "x" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "e968078804ae43b5b5322d664bfdd2c7", + "m_Id": 1, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "eb6c18e1c6694b0690306db90f1c4f4e", + "m_Id": 0, + "m_DisplayName": "LineWidth", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "ec67c11f975e434681e313d657436495", + "m_Id": 2, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.AbsoluteNode", + "m_ObjectId": "eca6c38575ba43cb8b09dc650433f27b", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Absolute", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 2862.000244140625, + "y": 631.0000610351563, + "width": 208.0, + "height": 278.00006103515627 + } + }, + "m_Slots": [ + { + "m_Id": "5cbf7cfc1e97491785ca94ee6cd946ce" + }, + { + "m_Id": "77d57e9f34ce4b76ac61e82fd987b264" + } + ], + "synonyms": [ + "positive" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "ed9dc2668a044fa1a2643d5baf0d7908", + "m_Id": 1, + "m_DisplayName": "Center", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Center", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.5, + "y": 0.5 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "eeb7675f81a14772b2179a7add0cf25d", + "m_Id": 2, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "f15e30d3420245bab1ac879e22aaa125", + "m_Id": 3, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "f1fd92bb0f7945e0aca3187622fff9e9", + "m_Id": 3, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "f2306196113b4ddd9e6e3c739e036025", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "f45315d494fc44438cae08f178e4ee3b", + "m_Id": 0, + "m_DisplayName": "Normal", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Normal", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "f484854e856245c98521570a1594f9c3", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.200000047683716, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "fab8c828bf6248b48e7be9f02a105746", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 0.5, + "y": 0.5, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.StepNode", + "m_ObjectId": "fb3462ef3bf4412b916598df59a5ce02", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Step", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 2501.000244140625, + "y": 2460.0, + "width": 207.999755859375, + "height": 302.0 + } + }, + "m_Slots": [ + { + "m_Id": "0137064b23954bbcbddececf0b82ff30" + }, + { + "m_Id": "e968078804ae43b5b5322d664bfdd2c7" + }, + { + "m_Id": "15810a39a2f24bccb2318565f454b439" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "fcab863431304cc4bc26b30901b2b8ae", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "fdd9e3f600c3458d86adc064777f9aa1", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "fe3036ffadf2465990dd31def3cbc3ea", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "fe35fc451f8d456cb2f40b0fbe4432f8", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Position", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "da96b4dda01447849434ff398b057937" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Position" +} + diff --git a/Assets/_Project/Art/VFX/SG_TowerDrop.shadergraph.meta b/Assets/_Project/Art/VFX/SG_TowerDrop.shadergraph.meta new file mode 100644 index 0000000..9c01e4a --- /dev/null +++ b/Assets/_Project/Art/VFX/SG_TowerDrop.shadergraph.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 5a8ebb05602fadb48a72f94a08654006 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} + useAsTemplate: 0 + exposeTemplateAsShader: 0 + template: + name: + category: + description: + icon: {instanceID: 0} + thumbnail: {instanceID: 0} diff --git a/Assets/_Project/Art/VFX/SG_TowerDrop_Beam.shadergraph b/Assets/_Project/Art/VFX/SG_TowerDrop_Beam.shadergraph new file mode 100644 index 0000000..87eeba7 --- /dev/null +++ b/Assets/_Project/Art/VFX/SG_TowerDrop_Beam.shadergraph @@ -0,0 +1,4158 @@ +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.GraphData", + "m_ObjectId": "9c9cae5f445548bcb0e784291b2be2c0", + "m_Properties": [ + { + "m_Id": "b65709b98db942518b4c083dc869f606" + }, + { + "m_Id": "95c6420ec2f24007933fe6079319e7b0" + } + ], + "m_Keywords": [], + "m_Dropdowns": [], + "m_CategoryData": [ + { + "m_Id": "36ffdf67ac334aab84a39e8360799425" + } + ], + "m_Nodes": [ + { + "m_Id": "eac57d079be14ea3b605bb8e0c846723" + }, + { + "m_Id": "94346c79eb674164865ddb73f819b37e" + }, + { + "m_Id": "59fd23148a214c37b274b2e9ab5b5c93" + }, + { + "m_Id": "8830db62964a4ab7bfef0afd8f427874" + }, + { + "m_Id": "d56e181833ed4a66b0ad08287184acb5" + }, + { + "m_Id": "a39667b7a19a492c8208f1520e163d33" + }, + { + "m_Id": "0fe70580fd1d498288ad810e93674d35" + }, + { + "m_Id": "26a31783260e4bec9cae49244e75d19c" + }, + { + "m_Id": "fd0730bedd8e436e8cd2ee01db07ee73" + }, + { + "m_Id": "71c0ad8999ad4fe48444d7d938880b9c" + }, + { + "m_Id": "6aa7b9b7644f41a2ac4ba51a0a3a6bad" + }, + { + "m_Id": "9a37ca20b88b461e94b6c746715f40cc" + }, + { + "m_Id": "19114b26064b4bf09f7dd0d12837c55a" + }, + { + "m_Id": "9bf5c8f822104373a2769fcdc48960c0" + }, + { + "m_Id": "11666341280f4bcc8192f805d828ba2d" + }, + { + "m_Id": "d1e56ad5825346d9b1afbd3a286cb933" + }, + { + "m_Id": "5d2a0a3d401c44a7acd8b940d485cf31" + }, + { + "m_Id": "8302adcca4bd43dca4a4831682d6ecff" + }, + { + "m_Id": "d400881fe793442b942b58a613b1ae90" + }, + { + "m_Id": "9ba8541e93fa46c99d6468fc3f2ea837" + }, + { + "m_Id": "c6b81b10c9fc453ca78837f940602119" + }, + { + "m_Id": "6b1750846d574852bcd3a620034cbe1f" + }, + { + "m_Id": "72710b2641f94e4d9f47e897f148745a" + }, + { + "m_Id": "b7869c3f6a234f488c1f67957aa86f80" + }, + { + "m_Id": "2330192dafd84e5ba2af98b50c41b522" + }, + { + "m_Id": "24f1337a85c94c1d8c08b2b2bfa0247b" + }, + { + "m_Id": "5e97322ce1fa433d89c26487ffa8243f" + }, + { + "m_Id": "742af48c7ceb4d508bf57c2485f93feb" + }, + { + "m_Id": "b0ec7462908a4cf38dbfa84f0c8e3d5d" + }, + { + "m_Id": "856283adf75e421495916d2d37919c23" + }, + { + "m_Id": "f6f84ba43a884316a61bda83c1ecb90b" + } + ], + "m_GroupDatas": [], + "m_StickyNoteDatas": [], + "m_Edges": [ + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "0fe70580fd1d498288ad810e93674d35" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "26a31783260e4bec9cae49244e75d19c" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "11666341280f4bcc8192f805d828ba2d" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "d1e56ad5825346d9b1afbd3a286cb933" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "19114b26064b4bf09f7dd0d12837c55a" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "9a37ca20b88b461e94b6c746715f40cc" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "2330192dafd84e5ba2af98b50c41b522" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "9bf5c8f822104373a2769fcdc48960c0" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "24f1337a85c94c1d8c08b2b2bfa0247b" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "5e97322ce1fa433d89c26487ffa8243f" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "26a31783260e4bec9cae49244e75d19c" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "5e97322ce1fa433d89c26487ffa8243f" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "26a31783260e4bec9cae49244e75d19c" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "71c0ad8999ad4fe48444d7d938880b9c" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "5d2a0a3d401c44a7acd8b940d485cf31" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "d1e56ad5825346d9b1afbd3a286cb933" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "5e97322ce1fa433d89c26487ffa8243f" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "b0ec7462908a4cf38dbfa84f0c8e3d5d" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "6aa7b9b7644f41a2ac4ba51a0a3a6bad" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "72710b2641f94e4d9f47e897f148745a" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "6b1750846d574852bcd3a620034cbe1f" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "24f1337a85c94c1d8c08b2b2bfa0247b" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "6b1750846d574852bcd3a620034cbe1f" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "c6b81b10c9fc453ca78837f940602119" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "71c0ad8999ad4fe48444d7d938880b9c" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "6aa7b9b7644f41a2ac4ba51a0a3a6bad" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "72710b2641f94e4d9f47e897f148745a" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "9a37ca20b88b461e94b6c746715f40cc" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "72710b2641f94e4d9f47e897f148745a" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "b7869c3f6a234f488c1f67957aa86f80" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "742af48c7ceb4d508bf57c2485f93feb" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "8830db62964a4ab7bfef0afd8f427874" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "8302adcca4bd43dca4a4831682d6ecff" + }, + "m_SlotId": 6 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "9ba8541e93fa46c99d6468fc3f2ea837" + }, + "m_SlotId": 2 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "856283adf75e421495916d2d37919c23" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "742af48c7ceb4d508bf57c2485f93feb" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9a37ca20b88b461e94b6c746715f40cc" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "742af48c7ceb4d508bf57c2485f93feb" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "9ba8541e93fa46c99d6468fc3f2ea837" + }, + "m_SlotId": 3 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "6b1750846d574852bcd3a620034cbe1f" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "a39667b7a19a492c8208f1520e163d33" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "0fe70580fd1d498288ad810e93674d35" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "b0ec7462908a4cf38dbfa84f0c8e3d5d" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "856283adf75e421495916d2d37919c23" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "b7869c3f6a234f488c1f67957aa86f80" + }, + "m_SlotId": 1 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "2330192dafd84e5ba2af98b50c41b522" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "c6b81b10c9fc453ca78837f940602119" + }, + "m_SlotId": 3 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "72710b2641f94e4d9f47e897f148745a" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "d1e56ad5825346d9b1afbd3a286cb933" + }, + "m_SlotId": 2 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "8302adcca4bd43dca4a4831682d6ecff" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "d400881fe793442b942b58a613b1ae90" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "9ba8541e93fa46c99d6468fc3f2ea837" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "d56e181833ed4a66b0ad08287184acb5" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "a39667b7a19a492c8208f1520e163d33" + }, + "m_SlotId": 0 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "f6f84ba43a884316a61bda83c1ecb90b" + }, + "m_SlotId": 0 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "856283adf75e421495916d2d37919c23" + }, + "m_SlotId": 1 + } + }, + { + "m_OutputSlot": { + "m_Node": { + "m_Id": "fd0730bedd8e436e8cd2ee01db07ee73" + }, + "m_SlotId": 3 + }, + "m_InputSlot": { + "m_Node": { + "m_Id": "71c0ad8999ad4fe48444d7d938880b9c" + }, + "m_SlotId": 0 + } + } + ], + "m_VertexContext": { + "m_Position": { + "x": 4669.00048828125, + "y": 831.0000610351563 + }, + "m_Blocks": [ + { + "m_Id": "eac57d079be14ea3b605bb8e0c846723" + }, + { + "m_Id": "94346c79eb674164865ddb73f819b37e" + }, + { + "m_Id": "59fd23148a214c37b274b2e9ab5b5c93" + } + ] + }, + "m_FragmentContext": { + "m_Position": { + "x": 4669.00048828125, + "y": 1031.0 + }, + "m_Blocks": [ + { + "m_Id": "8830db62964a4ab7bfef0afd8f427874" + }, + { + "m_Id": "9bf5c8f822104373a2769fcdc48960c0" + } + ] + }, + "m_PreviewData": { + "serializedMesh": { + "m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}", + "m_Guid": "" + }, + "preventRotation": false + }, + "m_Path": "Shader Graphs", + "m_GraphPrecision": 1, + "m_PreviewMode": 2, + "m_OutputNode": { + "m_Id": "" + }, + "m_SubDatas": [], + "m_ActiveTargets": [ + { + "m_Id": "0e8cd3c57c764b9a94fac02cb19db778" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "0159b6831209460e9591a5f6953c1368", + "m_Id": 2, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "0241fa8cd7694d9b9118690c7ddf9ac7", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "040f60e430c647caa48c78e78fdfe977", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "042d10e169b84eb6af1f7548d22e9ef3", + "m_Id": 3, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "081439c7741346b5a095a32f2a9d282d", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 2.0, + "y": 2.0, + "z": 2.0, + "w": 2.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalTarget", + "m_ObjectId": "0e8cd3c57c764b9a94fac02cb19db778", + "m_Datas": [], + "m_ActiveSubTarget": { + "m_Id": "11117bfae2f9492ab30ef4a65a0681c6" + }, + "m_AllowMaterialOverride": false, + "m_SurfaceType": 1, + "m_ZTestMode": 4, + "m_ZWriteControl": 0, + "m_AlphaMode": 2, + "m_RenderFace": 2, + "m_AlphaClip": false, + "m_CastShadows": true, + "m_ReceiveShadows": true, + "m_DisableTint": false, + "m_Sort3DAs2DCompatible": false, + "m_AdditionalMotionVectorMode": 0, + "m_AlembicMotionVectors": false, + "m_SupportsLODCrossFade": false, + "m_CustomEditorGUI": "", + "m_SupportVFX": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "0ea7d7c7acd542f5b67630c20087efdb", + "m_Id": 3, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.OneMinusNode", + "m_ObjectId": "0fe70580fd1d498288ad810e93674d35", + "m_Group": { + "m_Id": "" + }, + "m_Name": "One Minus", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 833.0, + "y": 478.0000305175781, + "width": 208.0, + "height": 278.0000915527344 + } + }, + "m_Slots": [ + { + "m_Id": "c45e26c6a3314559a20fa87a9e0ddc7a" + }, + { + "m_Id": "448b6bea611a449d9653ab41641d0d5b" + } + ], + "synonyms": [ + "complement", + "invert", + "opposite" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 2, + "m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalUnlitSubTarget", + "m_ObjectId": "11117bfae2f9492ab30ef4a65a0681c6", + "m_KeepLightingVariants": false, + "m_DefaultDecalBlending": true, + "m_DefaultSSAO": true +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.TimeNode", + "m_ObjectId": "11666341280f4bcc8192f805d828ba2d", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Time", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 139.00001525878907, + "y": 1208.0, + "width": 124.00001525878906, + "height": 173.0001220703125 + } + }, + "m_Slots": [ + { + "m_Id": "1ca3807028844653a736639d4a01d31f" + }, + { + "m_Id": "da55d99d5b0348a2aa8c7c2f2ba52a60" + }, + { + "m_Id": "c80a1c3b8d96414581149b7a45439e1c" + }, + { + "m_Id": "f8e8c208afc748a685861f8dcb9e1884" + }, + { + "m_Id": "1eb8296c0b1544edb0503bffcb5c4a75" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "14d70dbc9afb416f82fe99fa3b0ba81d", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": -1.0, + "y": -1.0, + "z": -1.0, + "w": -1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "1702186cc8ff41fcb0893cfd0b3a0d89", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "19114b26064b4bf09f7dd0d12837c55a", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 3048.000244140625, + "y": 1137.0001220703125, + "width": 135.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "19daf6d0129945c7814be13e90c5c5f7" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "b65709b98db942518b4c083dc869f606" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "19daf6d0129945c7814be13e90c5c5f7", + "m_Id": 0, + "m_DisplayName": "BeamColor", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "1ca3807028844653a736639d4a01d31f", + "m_Id": 0, + "m_DisplayName": "Time", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Time", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "1eb8296c0b1544edb0503bffcb5c4a75", + "m_Id": 4, + "m_DisplayName": "Smooth Delta", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Smooth Delta", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "1f2f58fdc54548b7951b1a14654e18c3", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "2145eddbbec340788aa46090988693f8", + "m_Id": 0, + "m_DisplayName": "R", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "228ca490bf0a41568c6cb6fcd9a2ef31", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.RedirectNodeData", + "m_ObjectId": "2330192dafd84e5ba2af98b50c41b522", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Redirect Node", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 4444.0, + "y": 1473.0, + "width": 56.0, + "height": 24.0 + } + }, + "m_Slots": [ + { + "m_Id": "3a0dde4362d84485aaa544098a0f940f" + }, + { + "m_Id": "e4116f7c0c354bc1ae3a0e3db1bcf454" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector3MaterialSlot", + "m_ObjectId": "245ce670c7134c888238883cf9817027", + "m_Id": 5, + "m_DisplayName": "RGB", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGB", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "248de29923e64b3f9b78b34fe77a7715", + "m_Id": 2, + "m_DisplayName": "G", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PowerNode", + "m_ObjectId": "24f1337a85c94c1d8c08b2b2bfa0247b", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Power", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 2710.0, + "y": 494.0, + "width": 208.0, + "height": 302.0 + } + }, + "m_Slots": [ + { + "m_Id": "8283214831aa4f23bd326e77ceaff484" + }, + { + "m_Id": "8cb06cacb3f246909c755463c1ed2d35" + }, + { + "m_Id": "d34126f268a641e1b621ec8356e3d1d7" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PowerNode", + "m_ObjectId": "26a31783260e4bec9cae49244e75d19c", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Power", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 1128.0, + "y": 478.0000305175781, + "width": 208.0, + "height": 301.9999694824219 + } + }, + "m_Slots": [ + { + "m_Id": "5b0cc9b5e71246a1a949aeb31b4df99f" + }, + { + "m_Id": "081439c7741346b5a095a32f2a9d282d" + }, + { + "m_Id": "d190f99fa34746c8aacc99338493a474" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "2d811dd0fe0e4da8a1041352aa52dfe8", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "3608f69ddae54f4dbb783787fbcc9882", + "m_Id": 1, + "m_DisplayName": "R", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "R", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "363e334147924e0bab12fcbac683cfd9", + "m_Id": 0, + "m_DisplayName": "", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CategoryData", + "m_ObjectId": "36ffdf67ac334aab84a39e8360799425", + "m_Name": "", + "m_ChildObjectList": [ + { + "m_Id": "b65709b98db942518b4c083dc869f606" + }, + { + "m_Id": "95c6420ec2f24007933fe6079319e7b0" + } + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "3a0dde4362d84485aaa544098a0f940f", + "m_Id": 0, + "m_DisplayName": "", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ViewDirectionMaterialSlot", + "m_ObjectId": "3c571f79b6144115af7160e58d48a5da", + "m_Id": 1, + "m_DisplayName": "View Dir", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "ViewDir", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 2 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "3d9b11f8e9554e4cb4788aa376a2c5e0", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "440befb588d54b6f9b100c2a6434fcad", + "m_Id": 1, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.TangentMaterialSlot", + "m_ObjectId": "440f3ef213684cbeb36e361ce1726423", + "m_Id": 0, + "m_DisplayName": "Tangent", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Tangent", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "448b6bea611a449d9653ab41641d0d5b", + "m_Id": 1, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "473de086c9144c4d850122c3eb5b13b3", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "4d70b1c822bb416b8921558c6a7156e7", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "50da1d316c134fc1a74fb42ac745e45c", + "m_Id": 1, + "m_DisplayName": "In Min Max", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "InMinMax", + "m_StageCapability": 3, + "m_Value": { + "x": 0.3499999940395355, + "y": 0.6499999761581421 + }, + "m_DefaultValue": { + "x": -1.0, + "y": 1.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "54cdb7efe0a14dd7bdece8ef56dd1f77", + "m_Id": 0, + "m_DisplayName": "Alpha", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Alpha", + "m_StageCapability": 2, + "m_Value": 1.0, + "m_DefaultValue": 1.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "59fd23148a214c37b274b2e9ab5b5c93", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Tangent", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "440f3ef213684cbeb36e361ce1726423" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Tangent" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "5b0cc9b5e71246a1a949aeb31b4df99f", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "5d2a0a3d401c44a7acd8b940d485cf31", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 130.00001525878907, + "y": 1393.0, + "width": 133.00001525878907, + "height": 34.0001220703125 + } + }, + "m_Slots": [ + { + "m_Id": "fcd31dac7fda4a18bff1f132f90d2318" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "95c6420ec2f24007933fe6079319e7b0" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "5dbdaec90d354def94371c20a2de471f", + "m_Id": 0, + "m_DisplayName": "Normal", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Normal", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 2 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "5e97322ce1fa433d89c26487ffa8243f", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 3149.0, + "y": 281.0, + "width": 207.999755859375, + "height": 302.0 + } + }, + "m_Slots": [ + { + "m_Id": "1702186cc8ff41fcb0893cfd0b3a0d89" + }, + { + "m_Id": "d7264a644b3e45c3b8f65c3a8f927104" + }, + { + "m_Id": "84a79b026cb249e4aa5c15b930fb9315" + } + ], + "synonyms": [ + "multiplication", + "times", + "x" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "603a32f974994be59b4d1c378a0e1168", + "m_Id": 1, + "m_DisplayName": "G", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "G", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "695910e23cce494caa036787d6bf01ba", + "m_Id": 3, + "m_DisplayName": "B", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SaturateNode", + "m_ObjectId": "6aa7b9b7644f41a2ac4ba51a0a3a6bad", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Saturate", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 1870.0001220703125, + "y": 239.00010681152345, + "width": 207.9998779296875, + "height": 277.99993896484377 + } + }, + "m_Slots": [ + { + "m_Id": "84bd8d31a3bb401aac127d32ef0e2da4" + }, + { + "m_Id": "440befb588d54b6f9b100c2a6434fcad" + } + ], + "synonyms": [ + "clamp" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.NoiseNode", + "m_ObjectId": "6b1750846d574852bcd3a620034cbe1f", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Simple Noise", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 1906.0001220703125, + "y": 1184.0001220703125, + "width": 207.9998779296875, + "height": 336.0 + } + }, + "m_Slots": [ + { + "m_Id": "a74187c6ea034f18859ab784c17a1b56" + }, + { + "m_Id": "bc72cbbb03a14399bcbcbad8a7a7aee8" + }, + { + "m_Id": "3d9b11f8e9554e4cb4788aa376a2c5e0" + } + ], + "synonyms": [ + "value noise" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_HashType": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "6bb0fbe34ad149b8bd5612651908c750", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "6c0d83ca235f4054a69252fcf2221cdc", + "m_Id": 2, + "m_DisplayName": "Out Min Max", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "OutMinMax", + "m_StageCapability": 3, + "m_Value": { + "x": 0.4000000059604645, + "y": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 1.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "6c525f58eef94efc9be5a2c50197dbe2", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "6e571135f5de4a42b89be63d2762c8c6", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "6f3f82a32d734bc3a5d10941496d9676", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.AddNode", + "m_ObjectId": "71c0ad8999ad4fe48444d7d938880b9c", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Add", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 1544.0001220703125, + "y": 239.00010681152345, + "width": 207.9998779296875, + "height": 302.0 + } + }, + "m_Slots": [ + { + "m_Id": "4d70b1c822bb416b8921558c6a7156e7" + }, + { + "m_Id": "9685fc5630ab41d2a9c953e393154683" + }, + { + "m_Id": "040f60e430c647caa48c78e78fdfe977" + } + ], + "synonyms": [ + "addition", + "sum", + "plus" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "72710b2641f94e4d9f47e897f148745a", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 2713.0, + "y": 1055.0, + "width": 208.000244140625, + "height": 302.0 + } + }, + "m_Slots": [ + { + "m_Id": "99a11fd3cfe848c8b8de6ac6c69fe62c" + }, + { + "m_Id": "ff1d596a261f42099583aea101f1f446" + }, + { + "m_Id": "ecc4ec2386ef4f02ab12f1f8e1cfd4a8" + } + ], + "synonyms": [ + "multiplication", + "times", + "x" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.AddNode", + "m_ObjectId": "742af48c7ceb4d508bf57c2485f93feb", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Add", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 4236.0, + "y": 1033.0, + "width": 208.00048828125, + "height": 302.0001220703125 + } + }, + "m_Slots": [ + { + "m_Id": "473de086c9144c4d850122c3eb5b13b3" + }, + { + "m_Id": "228ca490bf0a41568c6cb6fcd9a2ef31" + }, + { + "m_Id": "e6ed7a2c42a5446ca6cede34543265a5" + } + ], + "synonyms": [ + "addition", + "sum", + "plus" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "74ef9a3674d94491802f525274feb668", + "m_Id": 4, + "m_DisplayName": "A", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "7938dfc340544f23b15aece8b846b9fa", + "m_Id": 2, + "m_DisplayName": "Power", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Power", + "m_StageCapability": 3, + "m_Value": 0.5, + "m_DefaultValue": 1.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PositionMaterialSlot", + "m_ObjectId": "7a3ade338d9c41d1ad835ef9e07d1dc8", + "m_Id": 0, + "m_DisplayName": "Position", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Position", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "823ad55ff66144649cd4102277bb15a0", + "m_Id": 6, + "m_DisplayName": "RG", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RG", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "8283214831aa4f23bd326e77ceaff484", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "829a8f5447c4409b86a8134d43b82427", + "m_Id": 1, + "m_DisplayName": "", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": true +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.CombineNode", + "m_ObjectId": "8302adcca4bd43dca4a4831682d6ecff", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Combine", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 815.9999389648438, + "y": 1184.0001220703125, + "width": 208.00006103515626, + "height": 350.0 + } + }, + "m_Slots": [ + { + "m_Id": "2145eddbbec340788aa46090988693f8" + }, + { + "m_Id": "603a32f974994be59b4d1c378a0e1168" + }, + { + "m_Id": "0159b6831209460e9591a5f6953c1368" + }, + { + "m_Id": "042d10e169b84eb6af1f7548d22e9ef3" + }, + { + "m_Id": "e4f9260533f942d2af0761b0c2d0ebd0" + }, + { + "m_Id": "245ce670c7134c888238883cf9817027" + }, + { + "m_Id": "823ad55ff66144649cd4102277bb15a0" + } + ], + "synonyms": [ + "append" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "84a79b026cb249e4aa5c15b930fb9315", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "84bd8d31a3bb401aac127d32ef0e2da4", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "856283adf75e421495916d2d37919c23", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 3951.000244140625, + "y": 281.0000305175781, + "width": 207.999755859375, + "height": 301.9999694824219 + } + }, + "m_Slots": [ + { + "m_Id": "ce92f8b4352845fd86f358b931012a90" + }, + { + "m_Id": "f9404fc050e14453bcc1534375d817d9" + }, + { + "m_Id": "0241fa8cd7694d9b9118690c7ddf9ac7" + } + ], + "synonyms": [ + "multiplication", + "times", + "x" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "86a2fd56200b42fd99b4f33838518ac7", + "m_Id": 1, + "m_DisplayName": "Tiling", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Tiling", + "m_StageCapability": 3, + "m_Value": { + "x": 8.0, + "y": 3.0 + }, + "m_DefaultValue": { + "x": 1.0, + "y": 1.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "8830db62964a4ab7bfef0afd8f427874", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.BaseColor", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "d5d6dc718de24ca0af9d7a58ecb75668" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.BaseColor" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "8cb06cacb3f246909c755463c1ed2d35", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 4.0, + "y": 2.0, + "z": 2.0, + "w": 2.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "905aaf52cd5f4d639a04744481dcf4e4", + "m_Id": 3, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "94346c79eb674164865ddb73f819b37e", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Normal", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "ee5fe0e46b0b4bbc851526fddea9de94" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Normal" +} + +{ + "m_SGVersion": 1, + "m_Type": "UnityEditor.ShaderGraph.Internal.Vector1ShaderProperty", + "m_ObjectId": "95c6420ec2f24007933fe6079319e7b0", + "m_Guid": { + "m_GuidSerialized": "569c3b96-83a8-4772-9e38-d1ebddb2f843" + }, + "promotedFromAssetID": "", + "promotedFromCategoryName": "", + "promotedOrdering": -1, + "m_Name": "FlowSpeed", + "m_DefaultRefNameVersion": 1, + "m_RefNameGeneratedByDisplayName": "FlowSpeed", + "m_DefaultReferenceName": "_FlowSpeed", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": true, + "hlslDeclarationOverride": 2, + "m_Hidden": false, + "m_PerRendererData": false, + "m_customAttributes": [], + "m_Value": 5.0, + "m_FloatType": 0, + "m_LiteralFloatMode": false, + "m_RangeValues": { + "x": 0.0, + "y": 1.0 + }, + "m_SliderType": 0, + "m_SliderPower": 3.0, + "m_EnumType": 0, + "m_CSharpEnumString": "", + "m_EnumNames": [ + "Default" + ], + "m_EnumValues": [ + 0 + ] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "964c641a08484ea98e0f119bca5d525b", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "966b3827bbe24e6f94f63dceba20c776", + "m_Id": 0, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "9685fc5630ab41d2a9c953e393154683", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "97cf0279ad0d44cb8a009044ebfab519", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "99a11fd3cfe848c8b8de6ac6c69fe62c", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "9a37ca20b88b461e94b6c746715f40cc", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 3227.000244140625, + "y": 1055.0001220703125, + "width": 208.0, + "height": 302.0 + } + }, + "m_Slots": [ + { + "m_Id": "97cf0279ad0d44cb8a009044ebfab519" + }, + { + "m_Id": "964c641a08484ea98e0f119bca5d525b" + }, + { + "m_Id": "cbdf650986c84b2080690db090f07112" + } + ], + "synonyms": [ + "multiplication", + "times", + "x" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.TilingAndOffsetNode", + "m_ObjectId": "9ba8541e93fa46c99d6468fc3f2ea837", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Tiling And Offset", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 1495.0, + "y": 1184.0001220703125, + "width": 207.9998779296875, + "height": 326.0 + } + }, + "m_Slots": [ + { + "m_Id": "966b3827bbe24e6f94f63dceba20c776" + }, + { + "m_Id": "86a2fd56200b42fd99b4f33838518ac7" + }, + { + "m_Id": "efb1b38246fb45ed81a9645c16404f9f" + }, + { + "m_Id": "0ea7d7c7acd542f5b67630c20087efdb" + } + ], + "synonyms": [ + "pan", + "scale" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "9bf5c8f822104373a2769fcdc48960c0", + "m_Group": { + "m_Id": "" + }, + "m_Name": "SurfaceDescription.Alpha", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "54cdb7efe0a14dd7bdece8ef56dd1f77" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "SurfaceDescription.Alpha" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.SplitNode", + "m_ObjectId": "a39667b7a19a492c8208f1520e163d33", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Split", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 618.0, + "y": 454.0, + "width": 120.0, + "height": 149.0001220703125 + } + }, + "m_Slots": [ + { + "m_Id": "6e571135f5de4a42b89be63d2762c8c6" + }, + { + "m_Id": "3608f69ddae54f4dbb783787fbcc9882" + }, + { + "m_Id": "248de29923e64b3f9b78b34fe77a7715" + }, + { + "m_Id": "695910e23cce494caa036787d6bf01ba" + }, + { + "m_Id": "74ef9a3674d94491802f525274feb668" + } + ], + "synonyms": [ + "separate" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVMaterialSlot", + "m_ObjectId": "a74187c6ea034f18859ab784c17a1b56", + "m_Id": 0, + "m_DisplayName": "UV", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "UV", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [], + "m_Channel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "a9bff9879bbd406a8ee401872765cdbe", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "b0ec7462908a4cf38dbfa84f0c8e3d5d", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 3503.0, + "y": 281.0, + "width": 208.0, + "height": 301.99993896484377 + } + }, + "m_Slots": [ + { + "m_Id": "a9bff9879bbd406a8ee401872765cdbe" + }, + { + "m_Id": "b83eba0f1a404aa9aec63f73244af80b" + }, + { + "m_Id": "2d811dd0fe0e4da8a1041352aa52dfe8" + } + ], + "synonyms": [ + "multiplication", + "times", + "x" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 3, + "m_Type": "UnityEditor.ShaderGraph.Internal.ColorShaderProperty", + "m_ObjectId": "b65709b98db942518b4c083dc869f606", + "m_Guid": { + "m_GuidSerialized": "416feed4-bf22-4fc3-922d-076e5bd1c846" + }, + "promotedFromAssetID": "", + "promotedFromCategoryName": "", + "promotedOrdering": -1, + "m_Name": "BeamColor", + "m_DefaultRefNameVersion": 1, + "m_RefNameGeneratedByDisplayName": "BeamColor", + "m_DefaultReferenceName": "_BeamColor", + "m_OverrideReferenceName": "", + "m_GeneratePropertyBlock": true, + "m_UseCustomSlotLabel": false, + "m_CustomSlotLabel": "", + "m_DismissedVersion": 0, + "m_Precision": 0, + "overrideHLSLDeclaration": false, + "hlslDeclarationOverride": 0, + "m_Hidden": false, + "m_PerRendererData": false, + "m_customAttributes": [], + "m_Value": { + "r": 8.0, + "g": 0.0, + "b": 0.0, + "a": 1.0 + }, + "isMainColor": false, + "m_ColorMode": 1 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.RedirectNodeData", + "m_ObjectId": "b7869c3f6a234f488c1f67957aa86f80", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Redirect Node", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 3127.000244140625, + "y": 1473.0, + "width": 56.0, + "height": 24.0001220703125 + } + }, + "m_Slots": [ + { + "m_Id": "363e334147924e0bab12fcbac683cfd9" + }, + { + "m_Id": "829a8f5447c4409b86a8134d43b82427" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "b83eba0f1a404aa9aec63f73244af80b", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "bc72cbbb03a14399bcbcbad8a7a7aee8", + "m_Id": 1, + "m_DisplayName": "Scale", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Scale", + "m_StageCapability": 3, + "m_Value": 1.0, + "m_DefaultValue": 500.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "be8485ff9a1b4498b3541786671a595e", + "m_Id": 0, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "c2aa79dabdf442b9bb2244917f6250ab", + "m_Id": 0, + "m_DisplayName": "BeamColor", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "c45e26c6a3314559a20fa87a9e0ddc7a", + "m_Id": 0, + "m_DisplayName": "In", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "In", + "m_StageCapability": 3, + "m_Value": { + "x": 1.0, + "y": 1.0, + "z": 1.0, + "w": 1.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.RemapNode", + "m_ObjectId": "c6b81b10c9fc453ca78837f940602119", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Remap", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 2317.000244140625, + "y": 1184.0001220703125, + "width": 207.999755859375, + "height": 326.0 + } + }, + "m_Slots": [ + { + "m_Id": "14d70dbc9afb416f82fe99fa3b0ba81d" + }, + { + "m_Id": "50da1d316c134fc1a74fb42ac745e45c" + }, + { + "m_Id": "6c0d83ca235f4054a69252fcf2221cdc" + }, + { + "m_Id": "e72aaf8129ce4ddf95eabcf440ff52af" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "c80a1c3b8d96414581149b7a45439e1c", + "m_Id": 2, + "m_DisplayName": "Cosine Time", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Cosine Time", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "cbdf650986c84b2080690db090f07112", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "ce92f8b4352845fd86f358b931012a90", + "m_Id": 0, + "m_DisplayName": "A", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "A", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "d190f99fa34746c8aacc99338493a474", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.MultiplyNode", + "m_ObjectId": "d1e56ad5825346d9b1afbd3a286cb933", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Multiply", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 410.0, + "y": 1208.0, + "width": 208.0, + "height": 302.0001220703125 + } + }, + "m_Slots": [ + { + "m_Id": "6bb0fbe34ad149b8bd5612651908c750" + }, + { + "m_Id": "1f2f58fdc54548b7951b1a14654e18c3" + }, + { + "m_Id": "6c525f58eef94efc9be5a2c50197dbe2" + } + ], + "synonyms": [ + "multiplication", + "times", + "x" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "d34126f268a641e1b621ec8356e3d1d7", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "d400881fe793442b942b58a613b1ae90", + "m_Group": { + "m_Id": "" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 1127.9998779296875, + "y": 839.0, + "width": 208.0, + "height": 312.0001220703125 + } + }, + "m_Slots": [ + { + "m_Id": "6f3f82a32d734bc3a5d10941496d9676" + } + ], + "synonyms": [ + "texcoords", + "coords", + "coordinates" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.UVNode", + "m_ObjectId": "d56e181833ed4a66b0ad08287184acb5", + "m_Group": { + "m_Id": "" + }, + "m_Name": "UV", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 275.0, + "y": 454.0, + "width": 207.99996948242188, + "height": 312.0 + } + }, + "m_Slots": [ + { + "m_Id": "be8485ff9a1b4498b3541786671a595e" + } + ], + "synonyms": [ + "texcoords", + "coords", + "coordinates" + ], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_OutputChannel": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot", + "m_ObjectId": "d5d6dc718de24ca0af9d7a58ecb75668", + "m_Id": 0, + "m_DisplayName": "Base Color", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "BaseColor", + "m_StageCapability": 2, + "m_Value": { + "x": 0.5, + "y": 0.5, + "z": 0.5 + }, + "m_DefaultValue": { + "x": 0.5, + "y": 0.5, + "z": 0.5 + }, + "m_Labels": [], + "m_ColorMode": 0, + "m_DefaultColor": { + "r": 0.5, + "g": 0.5, + "b": 0.5, + "a": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "d7264a644b3e45c3b8f65c3a8f927104", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "da55d99d5b0348a2aa8c7c2f2ba52a60", + "m_Id": 1, + "m_DisplayName": "Sine Time", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Sine Time", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "e4116f7c0c354bc1ae3a0e3db1bcf454", + "m_Id": 1, + "m_DisplayName": "", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": true +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector4MaterialSlot", + "m_ObjectId": "e4f9260533f942d2af0761b0c2d0ebd0", + "m_Id": 4, + "m_DisplayName": "RGBA", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "RGBA", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "e6ed7a2c42a5446ca6cede34543265a5", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicVectorMaterialSlot", + "m_ObjectId": "e72aaf8129ce4ddf95eabcf440ff52af", + "m_Id": 3, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 0.0 + }, + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.BlockNode", + "m_ObjectId": "eac57d079be14ea3b605bb8e0c846723", + "m_Group": { + "m_Id": "" + }, + "m_Name": "VertexDescription.Position", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 0.0, + "y": 0.0, + "width": 0.0, + "height": 0.0 + } + }, + "m_Slots": [ + { + "m_Id": "7a3ade338d9c41d1ad835ef9e07d1dc8" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_SerializedDescriptor": "VertexDescription.Position" +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "ecc4ec2386ef4f02ab12f1f8e1cfd4a8", + "m_Id": 2, + "m_DisplayName": "Out", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": { + "e00": 0.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 0.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 0.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 0.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot", + "m_ObjectId": "ee5fe0e46b0b4bbc851526fddea9de94", + "m_Id": 0, + "m_DisplayName": "Normal", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Normal", + "m_StageCapability": 1, + "m_Value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "m_Labels": [], + "m_Space": 0 +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector2MaterialSlot", + "m_ObjectId": "efb1b38246fb45ed81a9645c16404f9f", + "m_Id": 2, + "m_DisplayName": "Offset", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "Offset", + "m_StageCapability": 3, + "m_Value": { + "x": 0.0, + "y": 0.0 + }, + "m_DefaultValue": { + "x": 0.0, + "y": 0.0 + }, + "m_Labels": [] +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.PropertyNode", + "m_ObjectId": "f6f84ba43a884316a61bda83c1ecb90b", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Property", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 3743.000244140625, + "y": 346.0000305175781, + "width": 135.0, + "height": 34.0 + } + }, + "m_Slots": [ + { + "m_Id": "c2aa79dabdf442b9bb2244917f6250ab" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 0, + "m_CustomColors": { + "m_SerializableColors": [] + }, + "m_Property": { + "m_Id": "b65709b98db942518b4c083dc869f606" + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "f8e8c208afc748a685861f8dcb9e1884", + "m_Id": 3, + "m_DisplayName": "Delta Time", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Delta Time", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "f9404fc050e14453bcc1534375d817d9", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot", + "m_ObjectId": "fcd31dac7fda4a18bff1f132f90d2318", + "m_Id": 0, + "m_DisplayName": "FlowSpeed", + "m_SlotType": 1, + "m_Hidden": false, + "m_ShaderOutputName": "Out", + "m_StageCapability": 3, + "m_Value": 0.0, + "m_DefaultValue": 0.0, + "m_Labels": [], + "m_LiteralMode": false +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.FresnelNode", + "m_ObjectId": "fd0730bedd8e436e8cd2ee01db07ee73", + "m_Group": { + "m_Id": "" + }, + "m_Name": "Fresnel Effect", + "m_DrawState": { + "m_Expanded": true, + "m_Position": { + "serializedVersion": "2", + "x": 1128.0, + "y": 51.00003433227539, + "width": 208.0, + "height": 326.0000915527344 + } + }, + "m_Slots": [ + { + "m_Id": "5dbdaec90d354def94371c20a2de471f" + }, + { + "m_Id": "3c571f79b6144115af7160e58d48a5da" + }, + { + "m_Id": "7938dfc340544f23b15aece8b846b9fa" + }, + { + "m_Id": "905aaf52cd5f4d639a04744481dcf4e4" + } + ], + "synonyms": [], + "m_Precision": 0, + "m_PreviewExpanded": true, + "m_DismissedVersion": 0, + "m_PreviewMode": 2, + "m_CustomColors": { + "m_SerializableColors": [] + } +} + +{ + "m_SGVersion": 0, + "m_Type": "UnityEditor.ShaderGraph.DynamicValueMaterialSlot", + "m_ObjectId": "ff1d596a261f42099583aea101f1f446", + "m_Id": 1, + "m_DisplayName": "B", + "m_SlotType": 0, + "m_Hidden": false, + "m_ShaderOutputName": "B", + "m_StageCapability": 3, + "m_Value": { + "e00": 2.0, + "e01": 2.0, + "e02": 2.0, + "e03": 2.0, + "e10": 2.0, + "e11": 2.0, + "e12": 2.0, + "e13": 2.0, + "e20": 2.0, + "e21": 2.0, + "e22": 2.0, + "e23": 2.0, + "e30": 2.0, + "e31": 2.0, + "e32": 2.0, + "e33": 2.0 + }, + "m_DefaultValue": { + "e00": 1.0, + "e01": 0.0, + "e02": 0.0, + "e03": 0.0, + "e10": 0.0, + "e11": 1.0, + "e12": 0.0, + "e13": 0.0, + "e20": 0.0, + "e21": 0.0, + "e22": 1.0, + "e23": 0.0, + "e30": 0.0, + "e31": 0.0, + "e32": 0.0, + "e33": 1.0 + } +} + diff --git a/Assets/_Project/Art/VFX/SG_TowerDrop_Beam.shadergraph.meta b/Assets/_Project/Art/VFX/SG_TowerDrop_Beam.shadergraph.meta new file mode 100644 index 0000000..71fca5b --- /dev/null +++ b/Assets/_Project/Art/VFX/SG_TowerDrop_Beam.shadergraph.meta @@ -0,0 +1,18 @@ +fileFormatVersion: 2 +guid: 3a2790546855e2246ae4341f5b791133 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3} + useAsTemplate: 0 + exposeTemplateAsShader: 0 + template: + name: + category: + description: + icon: {instanceID: 0} + thumbnail: {instanceID: 0} diff --git a/Assets/_Project/Art/VFX/VFX_BeamMotes.vfx b/Assets/_Project/Art/VFX/VFX_BeamMotes.vfx new file mode 100644 index 0000000..cfbccbe --- /dev/null +++ b/Assets/_Project/Art/VFX/VFX_BeamMotes.vfx @@ -0,0 +1,2554 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!2058629511 &1 +VisualEffectResource: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: VFX_BeamMotes + m_Graph: {fileID: 114350483966674976} + m_Infos: + m_RendererSettings: + motionVectorGenerationMode: 0 + shadowCastingMode: 0 + m_CullingFlags: 3 + m_UpdateMode: 0 + m_PreWarmDeltaTime: 0.05 + m_PreWarmStepCount: 0 + m_InitialEventName: OnPlay + m_InstancingMode: 0 + m_InstancingCapacity: 64 +--- !u!114 &114350483966674976 +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: 7d4c867f6b72b714dbb5fd1780afe208, type: 3} + m_Name: VFX_BeamMotes + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 114350483966674978} + - {fileID: 114350483966674980} + - {fileID: 114350483966674995} + - {fileID: 114350483966674997} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_UIInfos: {fileID: 114350483966674977} + m_CustomAttributes: [] + m_ParameterInfo: [] + m_ImportDependencies: [] + m_GraphVersion: 19 + m_ResourceVersion: 1 + m_SubgraphDependencies: [] + m_CategoryPath: +--- !u!114 &114350483966674977 +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: d01270efd3285ea4a9d6c555cb0a8027, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXUI + groupInfos: [] + stickyNoteInfos: [] + categories: [] + uiBounds: + serializedVersion: 2 + x: 750 + y: -79 + width: 424 + height: 1742 +--- !u!114 &114350483966674978 +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: 73a13919d81fb7444849bae8b5c812a2, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXBasicSpawner + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674976} + m_Children: + - {fileID: 114350483966675001} + m_UIPosition: {x: 750, y: -79} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: [] + m_OutputSlots: [] + m_Label: + m_Data: {fileID: 114350483966674979} + m_InputFlowSlot: + - link: [] + - link: [] + m_OutputFlowSlot: + - link: + - context: {fileID: 114350483966674980} + slotIndex: 0 + loopDuration: 0 + loopCount: 0 + delayBeforeLoop: 0 + delayAfterLoop: 0 +--- !u!114 &114350483966674979 +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: f68759077adc0b143b6e1c101e82065e, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXDataSpawner + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + title: + m_Owners: + - {fileID: 114350483966674978} +--- !u!114 &114350483966674980 +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: 9dfea48843f53fc438eabc12a3a30abc, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXBasicInitialize + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674976} + m_Children: + - {fileID: 114350483966675004} + - {fileID: 114350483966675012} + - {fileID: 114350483966675034} + - {fileID: 114350483966675029} + m_UIPosition: {x: 750, y: 273} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 114350483966674981} + - {fileID: 114350483966674990} + m_OutputSlots: [] + m_Label: + m_Data: {fileID: 114350483966674994} + m_InputFlowSlot: + - link: + - context: {fileID: 114350483966674978} + slotIndex: 0 + m_OutputFlowSlot: + - link: + - context: {fileID: 114350483966674995} + slotIndex: 0 +--- !u!114 &114350483966674981 +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: 1b605c022ee79394a8a776c0869b3f9a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlot + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 114350483966674982} + - {fileID: 114350483966674986} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966674981} + m_MasterData: + m_Owner: {fileID: 114350483966674980} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.AABox, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"center":{"x":0.0,"y":0.0,"z":0.0},"size":{"x":1.0,"y":1.0,"z":1.0}}' + m_Space: 0 + m_Property: + name: bounds + m_serializedType: + m_SerializableType: UnityEditor.VFX.AABox, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966674982 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat3 + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674981} + m_Children: + - {fileID: 114350483966674983} + - {fileID: 114350483966674984} + - {fileID: 114350483966674985} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966674981} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: center + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966674983 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674982} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966674981} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966674984 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674982} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966674981} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966674985 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674982} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966674981} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966674986 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat3 + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674981} + m_Children: + - {fileID: 114350483966674987} + - {fileID: 114350483966674988} + - {fileID: 114350483966674989} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966674981} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: size + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966674987 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674986} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966674981} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966674988 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674986} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966674981} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966674989 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674986} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966674981} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966674990 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat3 + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 114350483966674991} + - {fileID: 114350483966674992} + - {fileID: 114350483966674993} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966674990} + m_MasterData: + m_Owner: {fileID: 114350483966674980} + m_Value: + m_Type: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"x":0.0,"y":0.0,"z":0.0}' + m_Space: -1 + m_Property: + name: boundsPadding + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966674991 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674990} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966674990} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966674992 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674990} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966674990} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966674993 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674990} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966674990} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966674994 +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: d78581a96eae8bf4398c282eb0b098bd, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXDataParticle + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + title: + m_Owners: + - {fileID: 114350483966674980} + - {fileID: 114350483966674995} + - {fileID: 114350483966674997} + dataType: 0 + capacity: 64 + stripCapacity: 1 + particlePerStripCount: 128 + needsComputeBounds: 0 + boundsMode: 0 + m_Space: 0 +--- !u!114 &114350483966674995 +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: 2dc095764ededfa4bb32fa602511ea4b, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXBasicUpdate + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674976} + m_Children: + - {fileID: 114350483966675043} + - {fileID: 114350483966675046} + m_UIPosition: {x: 750, y: 894} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: [] + m_OutputSlots: [] + m_Label: + m_Data: {fileID: 114350483966674994} + m_InputFlowSlot: + - link: + - context: {fileID: 114350483966674980} + slotIndex: 0 + m_OutputFlowSlot: + - link: + - context: {fileID: 114350483966674997} + slotIndex: 0 + integration: 0 + angularIntegration: 0 + ageParticles: 1 + reapParticles: 1 + skipZeroDeltaUpdate: 0 +--- !u!114 &114350483966674997 +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: a0b9e6b9139e58d4c957ec54595da7d3, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXPlanarPrimitiveOutput + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674976} + m_Children: [] + m_UIPosition: {x: 750, y: 1366} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 114350483966674998} + m_OutputSlots: [] + m_Label: + m_Data: {fileID: 114350483966674994} + m_InputFlowSlot: + - link: + - context: {fileID: 114350483966674995} + slotIndex: 0 + m_OutputFlowSlot: + - link: [] + blendMode: 0 + cullMode: 0 + zWriteMode: 0 + zTestMode: 0 + useAlphaClipping: 0 + generateMotionVector: 0 + excludeFromTUAndAA: 0 + sortingPriority: 0 + m_SubOutputs: + - {fileID: 114350483966675000} + useBaseColorMap: 3 + colorMapping: 0 + uvMode: 0 + flipbookLayout: 0 + flipbookBlendFrames: 0 + flipbookMotionVectors: 0 + useSoftParticle: 0 + vfxSystemSortPriority: 0 + sort: 0 + sortMode: 0 + revertSorting: 0 + indirectDraw: 0 + computeCulling: 0 + frustumCulling: 0 + castShadows: 0 + useExposureWeight: 0 + enableRayTracing: 0 + decimationFactor: 1 + raytracedScaleMode: 0 + needsOwnSort: 0 + needsOwnAabbBuffer: 0 + shaderGraph: {fileID: 0} + materialSettings: + m_PropertyNames: [] + m_PropertyValues: [] + renderQueue: -1 + primitiveType: 1 + useGeometryShader: 0 +--- !u!114 &114350483966674998 +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: 70a331b1d86cc8d4aa106ccbe0da5852, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotTexture2D + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966674998} + m_MasterData: + m_Owner: {fileID: 114350483966674997} + m_Value: + m_Type: + m_SerializableType: UnityEngine.Texture2D, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"obj":{"fileID":2800000,"guid":"8aafaa78fe944854997fef757ff4ba72","type":3}}' + m_Space: -1 + m_Property: + name: mainTexture + m_serializedType: + m_SerializableType: UnityEngine.Texture2D, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675000 +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: 388ad3b1dc9c6ae45b630f914fab638f, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.VFX.URP.VFXURPSubOutput + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 +--- !u!114 &114350483966675001 +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: f05c6884b705ce14d82ae720f0ec209f, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSpawnerConstantRate + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674978} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 114350483966675002} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 114350483966675003} +--- !u!114 &114350483966675002 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675002} + m_MasterData: + m_Owner: {fileID: 114350483966675001} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 20 + m_Space: -1 + m_Property: + name: Rate + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675003 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotBool + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675003} + m_MasterData: + m_Owner: {fileID: 114350483966675001} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675004 +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: a971fa2e110a0ac42ac1d8dae408704b, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.Block.SetAttribute + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674980} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 114350483966675010} + - {fileID: 114350483966675011} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 114350483966675006} + attribute: lifetime + Composition: 0 + Source: 0 + Random: 2 + channels: 6 +--- !u!114 &114350483966675006 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotBool + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675006} + m_MasterData: + m_Owner: {fileID: 114350483966675004} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675010 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675010} + m_MasterData: + m_Owner: {fileID: 114350483966675004} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0.8 + m_Space: -1 + m_Property: + name: A + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675011 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675011} + m_MasterData: + m_Owner: {fileID: 114350483966675004} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 1.2 + m_Space: -1 + m_Property: + name: B + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675012 +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: a971fa2e110a0ac42ac1d8dae408704b, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.Block.SetAttribute + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674980} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 114350483966675019} + - {fileID: 114350483966675024} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 114350483966675018} + attribute: velocity + Composition: 0 + Source: 0 + Random: 2 + channels: 6 +--- !u!114 &114350483966675018 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotBool + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675018} + m_MasterData: + m_Owner: {fileID: 114350483966675012} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675019 +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: a9f9544b71b7dab44a4644b6807e8bf6, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotVector + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 114350483966675020} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675019} + m_MasterData: + m_Owner: {fileID: 114350483966675012} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.Vector, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"vector":{"x":-0.10000000149011612,"y":0.10000000149011612,"z":-0.10000000149011612}}' + m_Space: 0 + m_Property: + name: A + m_serializedType: + m_SerializableType: UnityEditor.VFX.Vector, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675020 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat3 + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966675019} + m_Children: + - {fileID: 114350483966675021} + - {fileID: 114350483966675022} + - {fileID: 114350483966675023} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675019} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: vector + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675021 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966675020} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675019} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675022 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966675020} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675019} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675023 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966675020} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675019} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675024 +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: a9f9544b71b7dab44a4644b6807e8bf6, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotVector + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 114350483966675025} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675024} + m_MasterData: + m_Owner: {fileID: 114350483966675012} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.Vector, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"vector":{"x":0.10000000149011612,"y":1.2000000476837159,"z":0.10000000149011612}}' + m_Space: 0 + m_Property: + name: B + m_serializedType: + m_SerializableType: UnityEditor.VFX.Vector, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675025 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat3 + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966675024} + m_Children: + - {fileID: 114350483966675026} + - {fileID: 114350483966675027} + - {fileID: 114350483966675028} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675024} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: vector + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675026 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966675025} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675024} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675027 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966675025} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675024} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675028 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966675025} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675024} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675029 +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: a971fa2e110a0ac42ac1d8dae408704b, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.Block.SetAttribute + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674980} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 114350483966675032} + - {fileID: 114350483966675033} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 114350483966675031} + attribute: size + Composition: 0 + Source: 0 + Random: 2 + channels: 6 +--- !u!114 &114350483966675031 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotBool + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675031} + m_MasterData: + m_Owner: {fileID: 114350483966675029} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675032 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675032} + m_MasterData: + m_Owner: {fileID: 114350483966675029} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0.02 + m_Space: -1 + m_Property: + name: A + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675033 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675033} + m_MasterData: + m_Owner: {fileID: 114350483966675029} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0.05 + m_Space: -1 + m_Property: + name: B + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675034 +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: a971fa2e110a0ac42ac1d8dae408704b, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.Block.SetAttribute + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674980} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 114350483966675035} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 114350483966675039} + attribute: color + Composition: 0 + Source: 0 + Random: 0 + channels: 6 +--- !u!114 &114350483966675035 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat3 + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 114350483966675036} + - {fileID: 114350483966675037} + - {fileID: 114350483966675038} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675035} + m_MasterData: + m_Owner: {fileID: 114350483966675034} + m_Value: + m_Type: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"x":2.0,"y":0.0,"z":0.0}' + m_Space: -1 + m_Property: + name: _Color + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675036 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966675035} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675035} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675037 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966675035} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675035} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675038 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966675035} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675035} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675039 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotBool + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675039} + m_MasterData: + m_Owner: {fileID: 114350483966675034} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675043 +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: 01ec2c1930009b04ea08905b47262415, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.Block.AttributeFromCurve + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674995} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 114350483966675044} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 114350483966675045} + attribute: alpha + Composition: 0 + AlphaComposition: 0 + SampleMode: 0 + Mode: 1 + ColorMode: 3 + channels: 6 +--- !u!114 &114350483966675044 +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: c117b74c5c58db542bffe25c78fe92db, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotAnimationCurve + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675044} + m_MasterData: + m_Owner: {fileID: 114350483966675043} + m_Value: + m_Type: + m_SerializableType: UnityEngine.AnimationCurve, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"frames":[{"time":0.0,"value":1.0,"inTangent":-1.0,"outTangent":-1.0,"tangentMode":0,"leftTangentMode":1,"rightTangentMode":1,"broken":false},{"time":1.0,"value":0.0,"inTangent":-1.0,"outTangent":-1.0,"tangentMode":0,"leftTangentMode":1,"rightTangentMode":1,"broken":false}],"preWrapMode":8,"postWrapMode":8,"version":1}' + m_Space: -1 + m_Property: + name: Alpha + m_serializedType: + m_SerializableType: UnityEngine.AnimationCurve, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675045 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotBool + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675045} + m_MasterData: + m_Owner: {fileID: 114350483966675043} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675046 +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: 63716c0daf1806941a123003dc6d7398, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.Block.Turbulence + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674995} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 114350483966675047} + - {fileID: 114350483966675060} + - {fileID: 114350483966675061} + - {fileID: 114350483966675062} + - {fileID: 114350483966675063} + - {fileID: 114350483966675064} + - {fileID: 114350483966675065} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 114350483966675066} + Mode: 1 + NoiseType: 0 +--- !u!114 &114350483966675047 +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: 3e3f628d80ffceb489beac74258f9cf7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotTransform + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 114350483966675048} + - {fileID: 114350483966675052} + - {fileID: 114350483966675056} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675047} + m_MasterData: + m_Owner: {fileID: 114350483966675046} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.Transform, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"position":{"x":0.0,"y":0.0,"z":0.0},"angles":{"x":0.0,"y":0.0,"z":0.0},"scale":{"x":1.0,"y":1.0,"z":1.0}}' + m_Space: 0 + m_Property: + name: FieldTransform + m_serializedType: + m_SerializableType: UnityEditor.VFX.Transform, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675048 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat3 + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966675047} + m_Children: + - {fileID: 114350483966675049} + - {fileID: 114350483966675050} + - {fileID: 114350483966675051} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675047} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: position + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675049 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966675048} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675047} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675050 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966675048} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675047} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675051 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966675048} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675047} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675052 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat3 + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966675047} + m_Children: + - {fileID: 114350483966675053} + - {fileID: 114350483966675054} + - {fileID: 114350483966675055} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675047} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: angles + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675053 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966675052} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675047} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675054 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966675052} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675047} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675055 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966675052} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675047} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675056 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat3 + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966675047} + m_Children: + - {fileID: 114350483966675057} + - {fileID: 114350483966675058} + - {fileID: 114350483966675059} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675047} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: scale + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675057 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966675056} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675047} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675058 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966675056} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675047} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675059 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966675056} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675047} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675060 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675060} + m_MasterData: + m_Owner: {fileID: 114350483966675046} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0.2 + m_Space: -1 + m_Property: + name: Intensity + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675061 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675061} + m_MasterData: + m_Owner: {fileID: 114350483966675046} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 1 + m_Space: -1 + m_Property: + name: Drag + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675062 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675062} + m_MasterData: + m_Owner: {fileID: 114350483966675046} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 1 + m_Space: -1 + m_Property: + name: frequency + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675063 +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: 4d246e354feb93041a837a9ef59437cb, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotInt + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675063} + m_MasterData: + m_Owner: {fileID: 114350483966675046} + m_Value: + m_Type: + m_SerializableType: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 1 + m_Space: -1 + m_Property: + name: octaves + m_serializedType: + m_SerializableType: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675064 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675064} + m_MasterData: + m_Owner: {fileID: 114350483966675046} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0.5 + m_Space: -1 + m_Property: + name: roughness + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675065 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675065} + m_MasterData: + m_Owner: {fileID: 114350483966675046} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 2 + m_Space: -1 + m_Property: + name: lacunarity + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &114350483966675066 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotBool + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 114350483966675066} + m_MasterData: + m_Owner: {fileID: 114350483966675046} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] diff --git a/Assets/_Project/Art/VFX/VFX_BeamMotes.vfx.meta b/Assets/_Project/Art/VFX/VFX_BeamMotes.vfx.meta new file mode 100644 index 0000000..8f5a0e2 --- /dev/null +++ b/Assets/_Project/Art/VFX/VFX_BeamMotes.vfx.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: 142a41eb3c31cc3479182408de1b3ffe +VisualEffectImporter: + externalObjects: {} + serializedVersion: 2 + template: + name: + category: + description: + icon: {instanceID: 0} + thumbnail: {instanceID: 0} + useAsTemplate: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/Towers/SiegeCannonTower.asset b/Assets/_Project/Definitions/Towers/SiegeCannonTower.asset index 54d91dd..f8b6521 100644 --- a/Assets/_Project/Definitions/Towers/SiegeCannonTower.asset +++ b/Assets/_Project/Definitions/Towers/SiegeCannonTower.asset @@ -17,15 +17,17 @@ MonoBehaviour: ground enemies only. FootprintSize: {x: 2, y: 2} GoldCost: 50 - BuildTime: 0.5 + BuildTime: 1 TowerPrefab: {fileID: 6482414459531823157, guid: 85ad5cd50543454891b343720f3048d6, type: 3} + ConstructionPhases: {fileID: 0} + Icon: {fileID: 21300000, guid: 1423e4bda9704c3b826b0eb847c29c1c, type: 3} DamageType: 0 TargetPriority: 0 TargetType: 1 GroundedOnly: 1 Damage: 25 Range: 16 - FireRate: 0.8 + AttacksPerSecond: 0 SplashRadius: 3 ChainCount: 0 ChainRange: 0 @@ -35,4 +37,3 @@ MonoBehaviour: ProjectilePrefab: {fileID: 2664719039363295382, guid: dc2e4a4108e03874a8b2dab88dcc8fba, type: 3} ProjectileSpeed: 10 UpgradePaths: [] - Icon: {fileID: 21300000, guid: 1423e4bda9704c3b826b0eb847c29c1c, type: 3} diff --git a/Assets/_Project/Definitions/Towers/TeslaCoilTower.asset b/Assets/_Project/Definitions/Towers/TeslaCoilTower.asset index 5ee484e..c122a53 100644 --- a/Assets/_Project/Definitions/Towers/TeslaCoilTower.asset +++ b/Assets/_Project/Definitions/Towers/TeslaCoilTower.asset @@ -17,7 +17,7 @@ MonoBehaviour: Rapid, low per-hit damage; targets ground and air. FootprintSize: {x: 2, y: 2} GoldCost: 40 - BuildTime: 0.5 + BuildTime: 2 TowerPrefab: {fileID: 6482414459531823157, guid: 5a9e31f20d023e44dbd1c6d7dcdf4f71, type: 3} ConstructionPhases: {fileID: 0} Icon: {fileID: 0} @@ -27,7 +27,7 @@ MonoBehaviour: GroundedOnly: 0 Damage: 5 Range: 10 - FireRate: 2 + AttacksPerSecond: 0 SplashRadius: 0 ChainCount: 0 ChainRange: 0 diff --git a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/BuildSiteVisual.prefab b/Assets/_Project/Prefabs/Towers/Tower Construction Sets/BuildSiteVisual.prefab index 6b3815f..b77e65d 100644 --- a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/BuildSiteVisual.prefab +++ b/Assets/_Project/Prefabs/Towers/Tower Construction Sets/BuildSiteVisual.prefab @@ -299,6 +299,7 @@ MonoBehaviour: constructingMaterial: {fileID: 2100000, guid: 88f1dd7b174716645953857b38fb6948, type: 2} pausedMaterial: {fileID: 0} defaultPhaseSet: {fileID: 11400000, guid: ed951755c09d6d0479b4fd924b6915da, type: 2} + dropReticlePrefab: {fileID: 4110617398237858862, guid: f2a37509f5f2e4d4e86cdaf12f99c6c4, type: 3} stageCount: 4 queuedYScale: 0.15 --- !u!65 &6259437393614329336 diff --git a/Assets/_Project/Scripts/Gameplay/BuildSiteVisual.cs b/Assets/_Project/Scripts/Gameplay/BuildSiteVisual.cs index 3ba4d76..be09946 100644 --- a/Assets/_Project/Scripts/Gameplay/BuildSiteVisual.cs +++ b/Assets/_Project/Scripts/Gameplay/BuildSiteVisual.cs @@ -3,6 +3,7 @@ using Unity.Netcode; using UnityEngine; using TD.Core; using TD.Towers; +using TD.VFX; namespace TD.Gameplay { @@ -69,6 +70,13 @@ namespace TD.Gameplay "Leave empty to fall back to the legacy cube Y-scale growth below.")] [SerializeField] private ConstructionPhaseSet defaultPhaseSet; + [Header("Drop reticle FX")] + [Tooltip("Optional targeting-reticle effect (ground decal + beam + motes) shown for the " + + "life of this build. Spawned as a child on every peer and fed construction " + + "progress each frame so it shrinks as the tower builds, then destroyed with " + + "this visual at completion/cancel. Leave empty to build with no reticle.")] + [SerializeField] private TowerDropReticle dropReticlePrefab; + [Header("Construction stages (cube fallback)")] [Tooltip("FALLBACK ONLY (no phase set assigned): number of discrete growth stages " + "while constructing. 4 = 1/4 → 2/4 → 3/4 → 4/4 height.")] @@ -247,6 +255,10 @@ namespace TD.Gameplay private int activePhaseIndex = -1; private bool usePhases; + // Spawned child targeting-reticle effect (local, all peers). Fed progress in Update; + // destroyed automatically with this NetworkObject at completion/cancel. + private TowerDropReticle dropReticleInstance; + // ----- Lifecycle -------------------------------------------------- /// @@ -299,6 +311,15 @@ namespace TD.Gameplay // cube). Depends on towerTypeId, which is replicated by now on every peer. ResolvePhaseSet(); + // Spawn the targeting-reticle FX as a local child. It reads this build site's + // replicated progress (fed in Update) and dies with us at completion/cancel. + if (dropReticlePrefab != null) + { + dropReticleInstance = Instantiate(dropReticlePrefab, transform); + dropReticleInstance.transform.localPosition = Vector3.zero; + dropReticleInstance.transform.localRotation = Quaternion.identity; + } + // Subscribe to value changes so visual updates are reactive. currentStage.OnValueChanged += HandleStageChanged; @@ -353,6 +374,13 @@ namespace TD.Gameplay private void Update() { + // Drive the targeting reticle on every peer, every stage: 0 while Queued + // (full-size reticle, awaiting a builder), shrinking while Constructing, frozen + // while Paused. Kept before the Constructing early-return so it also animates + // the queued/paused states. + if (dropReticleInstance != null) + dropReticleInstance.SetProgress(ComputeProgressNormalized()); + // While constructing, advance the visual based on server time. Runs on every // peer so visuals stay synchronized. Paused does NOT update — the visual is // frozen at the pause point. diff --git a/Assets/_Project/Scripts/VFX.meta b/Assets/_Project/Scripts/VFX.meta new file mode 100644 index 0000000..eb2e1b6 --- /dev/null +++ b/Assets/_Project/Scripts/VFX.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ba7743153560abe4c8b69fb6e86ec013 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Scripts/VFX/TowerDropReticle.cs b/Assets/_Project/Scripts/VFX/TowerDropReticle.cs new file mode 100644 index 0000000..ef56a7a --- /dev/null +++ b/Assets/_Project/Scripts/VFX/TowerDropReticle.cs @@ -0,0 +1,96 @@ +// Assets/_Project/Scripts/VFX/TowerDropReticle.cs +using UnityEngine; +using UnityEngine.Rendering.Universal; + +namespace TD.VFX +{ + /// + /// Local visual for a tower-drop targeting reticle — the ground decal, the vertical + /// energy beam, and the rising motes, bundled under one root. It is spawned as a child + /// of a BuildSiteVisual, which feeds it construction progress via + /// each frame. The decal (and optionally the beam) shrink/fade + /// as progress climbs toward 1 through the shader's _Progress property. + /// + /// + /// Pure visualization — no networking. It runs on every peer because the owning + /// BuildSiteVisual spawns on every peer, and it reads the build site's already- + /// replicated progress. It is destroyed automatically when the build site despawns at + /// construction-complete or cancel (it's a child of that NetworkObject). + /// + /// Per-instance materials. Several towers can build at once, so each reticle + /// needs its own material — a shared material would make every reticle share one + /// _Progress value and shrink in lockstep. The decal's material is cloned here; + /// beam renderers use , which auto-instantiates. + /// + public class TowerDropReticle : MonoBehaviour + { + [Tooltip("Ground decal projector. Its material's _Progress drives the reticle shrink/fade. " + + "Auto-found in children if left empty.")] + [SerializeField] private DecalProjector decal; + + [Tooltip("Optional extra renderers (e.g. the beam) whose material also exposes _Progress " + + "so they fade with construction. Renderers without the property are skipped.")] + [SerializeField] private Renderer[] progressRenderers; + + [Tooltip("Shader float property that drives the shrink: 0 = full size, 1 = complete/gone.")] + [SerializeField] private string progressProperty = "_Progress"; + + private int progressId; + private Material decalMaterialInstance; + private Material[] rendererMaterialInstances; + + private void Awake() + { + progressId = Shader.PropertyToID(progressProperty); + + if (decal == null) decal = GetComponentInChildren(); + + // Clone the decal material so this reticle animates independently of any other + // build site sharing the same source material asset. + if (decal != null && decal.material != null) + { + decalMaterialInstance = new Material(decal.material); + decal.material = decalMaterialInstance; + } + + // Renderer.material returns a per-renderer instance, so these are already unique. + if (progressRenderers != null && progressRenderers.Length > 0) + { + rendererMaterialInstances = new Material[progressRenderers.Length]; + for (int i = 0; i < progressRenderers.Length; i++) + if (progressRenderers[i] != null) + rendererMaterialInstances[i] = progressRenderers[i].material; + } + } + + /// + /// Feed normalized construction progress. 0 = build just started (reticle full size); + /// 1 = complete (reticle shrunk away). Safe to call every frame on any peer. + /// + public void SetProgress(float t01) + { + t01 = Mathf.Clamp01(t01); + + if (decalMaterialInstance != null) + decalMaterialInstance.SetFloat(progressId, t01); + + if (rendererMaterialInstances != null) + { + for (int i = 0; i < rendererMaterialInstances.Length; i++) + { + var mat = rendererMaterialInstances[i]; + if (mat != null && mat.HasProperty(progressId)) + mat.SetFloat(progressId, t01); + } + } + } + + private void OnDestroy() + { + // The cloned decal material is ours to free. Renderer material instances are + // owned by their renderers and cleaned up when those GameObjects are destroyed. + if (decalMaterialInstance != null) + Destroy(decalMaterialInstance); + } + } +} diff --git a/Assets/_Project/Scripts/VFX/TowerDropReticle.cs.meta b/Assets/_Project/Scripts/VFX/TowerDropReticle.cs.meta new file mode 100644 index 0000000..f03d9dd --- /dev/null +++ b/Assets/_Project/Scripts/VFX/TowerDropReticle.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: baac389882e721248bb426ee40fbf74f \ No newline at end of file diff --git a/Packages/manifest.json b/Packages/manifest.json index 6060bba..5343bc8 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -20,6 +20,7 @@ "com.unity.toolchain.linux-x86_64-linux": "1.1.0", "com.unity.toolchain.win-x86_64-linux": "1.0.2", "com.unity.ugui": "2.0.0", + "com.unity.visualeffectgraph": "17.4.0", "com.unity.modules.accessibility": "1.0.0", "com.unity.modules.adaptiveperformance": "1.0.0", "com.unity.modules.ai": "1.0.0", diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json index 02f3359..e619138 100644 --- a/Packages/packages-lock.json +++ b/Packages/packages-lock.json @@ -441,6 +441,15 @@ "com.unity.modules.imgui": "1.0.0" } }, + "com.unity.visualeffectgraph": { + "version": "17.4.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.shadergraph": "17.4.0", + "com.unity.render-pipelines.core": "17.4.0" + } + }, "com.unity.modules.accessibility": { "version": "1.0.0", "depth": 0, diff --git a/ProjectSettings/Packages/com.unity.probuilder/Settings.json b/ProjectSettings/Packages/com.unity.probuilder/Settings.json index 9202690..c46a6fa 100644 --- a/ProjectSettings/Packages/com.unity.probuilder/Settings.json +++ b/ProjectSettings/Packages/com.unity.probuilder/Settings.json @@ -109,23 +109,43 @@ { "type": "UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", "key": "ShapeBuilder.LastSize.Cube", - "value": "{\"m_Value\":{\"x\":5.5,\"y\":3.0,\"z\":-2.5}}" + "value": "{\"m_Value\":{\"x\":-0.8617095947265625,\"y\":1.0079753398895264,\"z\":3.049813747406006}}" + }, + { + "type": "UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", + "key": "ShapeBuilder.LastSize.Stairs", + "value": "{\"m_Value\":{\"x\":-2.007598876953125,\"y\":2.0233278274536135,\"z\":2.0208892822265627}}" }, { "type": "UnityEngine.Quaternion, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", "key": "ShapeBuilder.LastRotation.Cube", "value": "{\"m_Value\":{\"x\":0.0,\"y\":0.0,\"z\":0.0,\"w\":1.0}}" }, + { + "type": "UnityEngine.Quaternion, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", + "key": "ShapeBuilder.LastRotation.Stairs", + "value": "{\"m_Value\":{\"x\":0.0,\"y\":0.0,\"z\":0.0,\"w\":1.0}}" + }, { "type": "UnityEngine.ProBuilder.PivotLocation, Unity.ProBuilder, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", "key": "ShapeBuilder.PivotLocation.Cube", "value": "{\"m_Value\":0}" }, + { + "type": "UnityEngine.ProBuilder.PivotLocation, Unity.ProBuilder, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", + "key": "ShapeBuilder.PivotLocation.Stairs", + "value": "{\"m_Value\":0}" + }, { "type": "UnityEngine.ProBuilder.Shapes.Shape, Unity.ProBuilder, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", "key": "ShapeBuilder.Cube", "value": "{}" }, + { + "type": "UnityEngine.ProBuilder.Shapes.Shape, Unity.ProBuilder, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", + "key": "ShapeBuilder.Stairs", + "value": "{}" + }, { "type": "UnityEngine.ProBuilder.SelectMode, Unity.ProBuilder, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", "key": "s_SelectMode", diff --git a/ProjectSettings/VFXManager.asset b/ProjectSettings/VFXManager.asset index 3a95c98..0462703 100644 --- a/ProjectSettings/VFXManager.asset +++ b/ProjectSettings/VFXManager.asset @@ -3,10 +3,18 @@ --- !u!937362698 &1 VFXManager: m_ObjectHideFlags: 0 - m_IndirectShader: {fileID: 0} - m_CopyBufferShader: {fileID: 0} - m_SortShader: {fileID: 0} - m_StripUpdateShader: {fileID: 0} + m_IndirectShader: {fileID: 7200000, guid: 84a17cfa13e40ae4082ef42714f0a81c, type: 3} + m_CopyBufferShader: {fileID: 7200000, guid: 23c51f21a3503f6428b527b01f8a2f4e, type: 3} + m_PrefixSumShader: {fileID: 7200000, guid: 783e0fdc1a277f54bb851fd2ceab1e7f, type: 3} + m_SortShader: {fileID: 7200000, guid: ea257ca3cfb12a642a5025e612af6b2a, type: 3} + m_StripUpdateShader: {fileID: 7200000, guid: 8fa6c4009fe2a4d4486c62736fc30ad8, type: 3} + m_EmptyShader: {fileID: 4800000, guid: 33a2079f6a2db4c4eb2e44b33f4ddf6b, type: 3} m_RenderPipeSettingsPath: m_FixedTimeStep: 0.016666668 m_MaxDeltaTime: 0.05 + m_MaxScrubTime: 30 + m_MaxCapacity: 100000000 + m_CompiledVersion: 7 + m_RuntimeVersion: 39 + m_RuntimeResources: {fileID: 11400000, guid: bc10b42afe3813544bffd38ae2cd893d, type: 2} + m_BatchEmptyLifetime: 300 From 9f25844657c9e54cce8fb2fc4caf2ebd814ac099 Mon Sep 17 00:00:00 2001 From: Ian Woods Date: Tue, 30 Jun 2026 23:12:27 -0700 Subject: [PATCH 06/58] death sounds, build sounds, better audio management --- Assets/_Project/Audio/buildings.meta | 8 ++++ .../_Project/Audio/buildings/tesla_tower.meta | 8 ++++ .../tesla_tower/construction_finished.wav | 3 ++ .../construction_finished.wav.meta | 23 ++++++++++ .../tesla_tower}/tesla_tower.ogg | 0 .../tesla_tower}/tesla_tower.ogg.meta | 0 Assets/_Project/Audio/death_sounds.meta | 8 ++++ .../_Project/Audio/death_sounds/cyclops.meta | 8 ++++ .../cyclops/cyclops_death_sound_1.wav | 3 ++ .../cyclops/cyclops_death_sound_1.wav.meta | 23 ++++++++++ .../cyclops/cyclops_death_sound_2.wav | 3 ++ .../cyclops/cyclops_death_sound_2.wav.meta | 23 ++++++++++ .../Enemies/Enemy_CrystalGolem_Blue.prefab | 22 ++++++++++ .../Enemies/Enemy_Cyclops_Green.prefab | 16 +++++++ .../Prefabs/Towers/Tower_TeslaCoil.prefab | 38 +++++++++++++++-- Assets/_Project/Scripts/Audio/AudioManager.cs | 3 +- Assets/_Project/Scripts/Audio/SoundConfig.cs | 16 +++++++ .../Scripts/Audio/SoundConfig.cs.meta | 2 + .../Scripts/Combat/EnemyDeathSound.cs | 42 +++++++++++++++++++ .../Scripts/Combat/EnemyDeathSound.cs.meta | 2 + .../Scripts/Combat/TeslaTowerFireSound.cs | 9 +--- .../Scripts/Combat/TowerBuiltSound.cs | 41 ++++++++++++++++++ .../Scripts/Combat/TowerBuiltSound.cs.meta | 2 + .../_Project/Scripts/Gameplay/EnemyHealth.cs | 10 +++++ .../Scripts/Gameplay/TowerInstance.cs | 7 ++++ .../com.unity.probuilder/Settings.json | 5 +++ 26 files changed, 313 insertions(+), 12 deletions(-) create mode 100644 Assets/_Project/Audio/buildings.meta create mode 100644 Assets/_Project/Audio/buildings/tesla_tower.meta create mode 100644 Assets/_Project/Audio/buildings/tesla_tower/construction_finished.wav create mode 100644 Assets/_Project/Audio/buildings/tesla_tower/construction_finished.wav.meta rename Assets/_Project/Audio/{ => buildings/tesla_tower}/tesla_tower.ogg (100%) rename Assets/_Project/Audio/{ => buildings/tesla_tower}/tesla_tower.ogg.meta (100%) create mode 100644 Assets/_Project/Audio/death_sounds.meta create mode 100644 Assets/_Project/Audio/death_sounds/cyclops.meta create mode 100755 Assets/_Project/Audio/death_sounds/cyclops/cyclops_death_sound_1.wav create mode 100644 Assets/_Project/Audio/death_sounds/cyclops/cyclops_death_sound_1.wav.meta create mode 100755 Assets/_Project/Audio/death_sounds/cyclops/cyclops_death_sound_2.wav create mode 100644 Assets/_Project/Audio/death_sounds/cyclops/cyclops_death_sound_2.wav.meta create mode 100644 Assets/_Project/Scripts/Audio/SoundConfig.cs create mode 100644 Assets/_Project/Scripts/Audio/SoundConfig.cs.meta create mode 100644 Assets/_Project/Scripts/Combat/EnemyDeathSound.cs create mode 100644 Assets/_Project/Scripts/Combat/EnemyDeathSound.cs.meta create mode 100644 Assets/_Project/Scripts/Combat/TowerBuiltSound.cs create mode 100644 Assets/_Project/Scripts/Combat/TowerBuiltSound.cs.meta diff --git a/Assets/_Project/Audio/buildings.meta b/Assets/_Project/Audio/buildings.meta new file mode 100644 index 0000000..1c49c38 --- /dev/null +++ b/Assets/_Project/Audio/buildings.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9922143d68d6063e4a08cdeeb509237c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Audio/buildings/tesla_tower.meta b/Assets/_Project/Audio/buildings/tesla_tower.meta new file mode 100644 index 0000000..b57c8e0 --- /dev/null +++ b/Assets/_Project/Audio/buildings/tesla_tower.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 010b1a2adea9686f09d4ab14690eb26b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Audio/buildings/tesla_tower/construction_finished.wav b/Assets/_Project/Audio/buildings/tesla_tower/construction_finished.wav new file mode 100644 index 0000000..38f8a15 --- /dev/null +++ b/Assets/_Project/Audio/buildings/tesla_tower/construction_finished.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d4bfa0b438971751b46fa605e5aacd28006e7518498c540c626708ccbe3a1bfb +size 787646 diff --git a/Assets/_Project/Audio/buildings/tesla_tower/construction_finished.wav.meta b/Assets/_Project/Audio/buildings/tesla_tower/construction_finished.wav.meta new file mode 100644 index 0000000..aaa6ef2 --- /dev/null +++ b/Assets/_Project/Audio/buildings/tesla_tower/construction_finished.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 6ff2e0ba45ef5eb6abeb34bd2c6e2da8 +AudioImporter: + externalObjects: {} + serializedVersion: 8 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Audio/tesla_tower.ogg b/Assets/_Project/Audio/buildings/tesla_tower/tesla_tower.ogg similarity index 100% rename from Assets/_Project/Audio/tesla_tower.ogg rename to Assets/_Project/Audio/buildings/tesla_tower/tesla_tower.ogg diff --git a/Assets/_Project/Audio/tesla_tower.ogg.meta b/Assets/_Project/Audio/buildings/tesla_tower/tesla_tower.ogg.meta similarity index 100% rename from Assets/_Project/Audio/tesla_tower.ogg.meta rename to Assets/_Project/Audio/buildings/tesla_tower/tesla_tower.ogg.meta diff --git a/Assets/_Project/Audio/death_sounds.meta b/Assets/_Project/Audio/death_sounds.meta new file mode 100644 index 0000000..5759991 --- /dev/null +++ b/Assets/_Project/Audio/death_sounds.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0a6f35a8a0b1666d8aeebf2071d63132 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Audio/death_sounds/cyclops.meta b/Assets/_Project/Audio/death_sounds/cyclops.meta new file mode 100644 index 0000000..0ab0edd --- /dev/null +++ b/Assets/_Project/Audio/death_sounds/cyclops.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 00e7929e355a29031b42d55d7637e784 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Audio/death_sounds/cyclops/cyclops_death_sound_1.wav b/Assets/_Project/Audio/death_sounds/cyclops/cyclops_death_sound_1.wav new file mode 100755 index 0000000..50fb46a --- /dev/null +++ b/Assets/_Project/Audio/death_sounds/cyclops/cyclops_death_sound_1.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e05eb8e8852d8425e8e615aa9183bef154ba978187f717d8dcced14d73725b56 +size 524990 diff --git a/Assets/_Project/Audio/death_sounds/cyclops/cyclops_death_sound_1.wav.meta b/Assets/_Project/Audio/death_sounds/cyclops/cyclops_death_sound_1.wav.meta new file mode 100644 index 0000000..573d4c5 --- /dev/null +++ b/Assets/_Project/Audio/death_sounds/cyclops/cyclops_death_sound_1.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: e007e19b827137ce395021d825927dcc +AudioImporter: + externalObjects: {} + serializedVersion: 8 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Audio/death_sounds/cyclops/cyclops_death_sound_2.wav b/Assets/_Project/Audio/death_sounds/cyclops/cyclops_death_sound_2.wav new file mode 100755 index 0000000..e8f0ac6 --- /dev/null +++ b/Assets/_Project/Audio/death_sounds/cyclops/cyclops_death_sound_2.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:862dd7c3d4bfa81198162f9473a07060ece551a42a52f2ef91be05c3d89b3090 +size 262334 diff --git a/Assets/_Project/Audio/death_sounds/cyclops/cyclops_death_sound_2.wav.meta b/Assets/_Project/Audio/death_sounds/cyclops/cyclops_death_sound_2.wav.meta new file mode 100644 index 0000000..eb82461 --- /dev/null +++ b/Assets/_Project/Audio/death_sounds/cyclops/cyclops_death_sound_2.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 6cea30689732db2f0a8989fe8f1a07a9 +AudioImporter: + externalObjects: {} + serializedVersion: 8 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Blue.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Blue.prefab index 6bf2444..546fd71 100644 --- a/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Blue.prefab +++ b/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Blue.prefab @@ -16,6 +16,7 @@ GameObject: - component: {fileID: 3283904430289710888} - component: {fileID: 3756613737869398948} - component: {fileID: 6036713598566100742} + - component: {fileID: -1575784752119152190} m_Layer: 10 m_Name: Enemy_CrystalGolem_Blue m_TagString: Untagged @@ -202,6 +203,27 @@ CapsuleCollider: m_Height: 2 m_Direction: 1 m_Center: {x: 0, y: 1, z: 0} +--- !u!114 &-1575784752119152190 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1455822126534880203} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9df6fea9a86daafae998f8eecc44ee7d, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Combat.EnemyDeathSound + deathSounds: + - clip: {fileID: 8300000, guid: e007e19b827137ce395021d825927dcc, type: 3} + volume: 0.75 + minPitch: 0.95 + maxPitch: 1.05 + - clip: {fileID: 8300000, guid: 6cea30689732db2f0a8989fe8f1a07a9, type: 3} + volume: 0.75 + minPitch: 0.95 + maxPitch: 1.05 --- !u!1 &5361867751622119598 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Green.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Green.prefab index fad5f6b..dfb934a 100644 --- a/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Green.prefab +++ b/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Green.prefab @@ -16,6 +16,7 @@ GameObject: - component: {fileID: 3283904430289710888} - component: {fileID: 3756613737869398948} - component: {fileID: 6036713598566100742} + - component: {fileID: -4695266156693656620} m_Layer: 10 m_Name: Enemy_Cyclops_Green m_TagString: Untagged @@ -202,6 +203,21 @@ CapsuleCollider: m_Height: 2 m_Direction: 1 m_Center: {x: 0, y: 1, z: 0} +--- !u!114 &-4695266156693656620 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1455822126534880203} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9df6fea9a86daafae998f8eecc44ee7d, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Combat.EnemyDeathSound + deathClips: + - {fileID: 8300000, guid: e007e19b827137ce395021d825927dcc, type: 3} + - {fileID: 8300000, guid: 6cea30689732db2f0a8989fe8f1a07a9, type: 3} --- !u!1 &5361867751622119598 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/_Project/Prefabs/Towers/Tower_TeslaCoil.prefab b/Assets/_Project/Prefabs/Towers/Tower_TeslaCoil.prefab index cff0c5b..ede5f43 100644 --- a/Assets/_Project/Prefabs/Towers/Tower_TeslaCoil.prefab +++ b/Assets/_Project/Prefabs/Towers/Tower_TeslaCoil.prefab @@ -100,6 +100,7 @@ GameObject: - component: {fileID: 8853488620519990682} - component: {fileID: 4524938955752569428} - component: {fileID: -2590971686077483651} + - component: {fileID: 1288485127287735786} m_Layer: 0 m_Name: Tower_TeslaCoil m_TagString: Untagged @@ -146,7 +147,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} m_Name: m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 1363936954 + GlobalObjectIdHash: 280718094 InScenePlacedSourceGlobalObjectIdHash: 0 DeferredDespawnTick: 0 Ownership: 1 @@ -219,10 +220,20 @@ MonoBehaviour: emitter: {fileID: 1088221722203278382} arcMaterial: {fileID: 2100000, guid: 9ba610475fb3d4c4fa1245e15a72aee5, type: 2} arcColor: {r: 0.6, g: 0.85, b: 1, a: 1} + emissionIntensity: 4 arcWidth: 0.06 arcDuration: 0.12 segmentsPerArc: 6 + arcHeight: 0.18 jitter: 0.2 + castLight: 1 + lightColor: {r: 0.6, g: 0.85, b: 1, a: 1} + lightIntensity: 8 + lightRange: 12 + castImpactLight: 1 + impactLightIntensity: 4 + impactLightRange: 5 + maxImpactLights: 8 --- !u!114 &-2590971686077483651 MonoBehaviour: m_ObjectHideFlags: 0 @@ -235,9 +246,28 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: db643146344a08a639133638e4746a33, type: 3} m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Combat.TeslaTowerFireSound - fireClip: {fileID: 8300000, guid: a0b5d0b15de667604b825f12d39b05a8, type: 3} - minPitch: 0.92 - maxPitch: 1.07 + fireSound: + clip: {fileID: 8300000, guid: a0b5d0b15de667604b825f12d39b05a8, type: 3} + volume: 0.263 + minPitch: 0.95 + maxPitch: 1.05 +--- !u!114 &1288485127287735786 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6482414459531823157} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ce512ec39eb6a8f079c7b258a4d0ced1, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Combat.TowerBuiltSound + builtSound: + clip: {fileID: 8300000, guid: 6ff2e0ba45ef5eb6abeb34bd2c6e2da8, type: 3} + volume: 0.496 + minPitch: 1 + maxPitch: 1 --- !u!1 &7101790219931971190 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/_Project/Scripts/Audio/AudioManager.cs b/Assets/_Project/Scripts/Audio/AudioManager.cs index 961a820..21099bb 100644 --- a/Assets/_Project/Scripts/Audio/AudioManager.cs +++ b/Assets/_Project/Scripts/Audio/AudioManager.cs @@ -58,7 +58,7 @@ namespace TD.Audio } } - public void Play(AudioClip clip, AudioCategory category, float pitch = 1f) + public void Play(AudioClip clip, AudioCategory category, float pitch = 1f, float volume = 1f) { if (clip == null) return; if (!pools.TryGetValue(category, out var pool)) return; @@ -66,6 +66,7 @@ namespace TD.Audio int idx = indices[category]; var src = pool[idx % pool.Length]; src.pitch = pitch; + src.volume = volume; src.clip = clip; src.Play(); indices[category] = idx + 1; diff --git a/Assets/_Project/Scripts/Audio/SoundConfig.cs b/Assets/_Project/Scripts/Audio/SoundConfig.cs new file mode 100644 index 0000000..d1be3e2 --- /dev/null +++ b/Assets/_Project/Scripts/Audio/SoundConfig.cs @@ -0,0 +1,16 @@ +// Assets/_Project/Scripts/Audio/SoundConfig.cs +using UnityEngine; + +namespace TD.Audio +{ + [System.Serializable] + public struct SoundConfig + { + public AudioClip clip; + [Range(0f, 1f)] public float volume; + [Range(0f, 3f)] public float minPitch; + [Range(0f, 3f)] public float maxPitch; + + public float RandomPitch() => Random.Range(minPitch, maxPitch); + } +} diff --git a/Assets/_Project/Scripts/Audio/SoundConfig.cs.meta b/Assets/_Project/Scripts/Audio/SoundConfig.cs.meta new file mode 100644 index 0000000..df0ac08 --- /dev/null +++ b/Assets/_Project/Scripts/Audio/SoundConfig.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: fce44aba7ccbe4224aeae2faa74b978f \ No newline at end of file diff --git a/Assets/_Project/Scripts/Combat/EnemyDeathSound.cs b/Assets/_Project/Scripts/Combat/EnemyDeathSound.cs new file mode 100644 index 0000000..cc1c503 --- /dev/null +++ b/Assets/_Project/Scripts/Combat/EnemyDeathSound.cs @@ -0,0 +1,42 @@ +// Assets/_Project/Scripts/Combat/EnemyDeathSound.cs +using TD.Audio; +using TD.Gameplay; +using UnityEngine; + +namespace TD.Combat +{ + /// + /// Local-only audio for enemy death. Subscribes to + /// and plays a randomly chosen clip from . + /// Attach to any enemy prefab and assign its clips in the Inspector. + /// + [RequireComponent(typeof(EnemyHealth))] + public class EnemyDeathSound : MonoBehaviour + { + [SerializeField] private SoundConfig[] deathSounds; + + private EnemyHealth enemyHealth; + + private void Awake() + { + enemyHealth = GetComponent(); + } + + private void OnEnable() + { + if (enemyHealth != null) enemyHealth.OnDiedClient += HandleDied; + } + + private void OnDisable() + { + if (enemyHealth != null) enemyHealth.OnDiedClient -= HandleDied; + } + + private void HandleDied() + { + if (deathSounds == null || deathSounds.Length == 0) return; + var sound = deathSounds[Random.Range(0, deathSounds.Length)]; + AudioManager.Instance?.Play(sound.clip, AudioCategory.EnemyHitDeath, sound.RandomPitch(), sound.volume); + } + } +} diff --git a/Assets/_Project/Scripts/Combat/EnemyDeathSound.cs.meta b/Assets/_Project/Scripts/Combat/EnemyDeathSound.cs.meta new file mode 100644 index 0000000..f68c450 --- /dev/null +++ b/Assets/_Project/Scripts/Combat/EnemyDeathSound.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9df6fea9a86daafae998f8eecc44ee7d \ No newline at end of file diff --git a/Assets/_Project/Scripts/Combat/TeslaTowerFireSound.cs b/Assets/_Project/Scripts/Combat/TeslaTowerFireSound.cs index 9294b85..3334523 100644 --- a/Assets/_Project/Scripts/Combat/TeslaTowerFireSound.cs +++ b/Assets/_Project/Scripts/Combat/TeslaTowerFireSound.cs @@ -17,12 +17,7 @@ namespace TD.Combat [RequireComponent(typeof(TowerCombat))] public class TeslaTowerFireSound : MonoBehaviour { - [Tooltip("Sound played each time the coil discharges.")] - [SerializeField] private AudioClip fireClip; - - [Tooltip("Pitch is randomized within this range each shot to avoid a mechanical loop.")] - [SerializeField] private float minPitch = 0.93f; - [SerializeField] private float maxPitch = 1.07f; + [SerializeField] private SoundConfig fireSound; private TowerCombat combat; @@ -43,7 +38,7 @@ namespace TD.Combat private void HandleAreaFired(Vector3[] positions) { - AudioManager.Instance?.Play(fireClip, AudioCategory.TowerFire, Random.Range(minPitch, maxPitch)); + AudioManager.Instance?.Play(fireSound.clip, AudioCategory.TowerFire, fireSound.RandomPitch(), fireSound.volume); } } } diff --git a/Assets/_Project/Scripts/Combat/TowerBuiltSound.cs b/Assets/_Project/Scripts/Combat/TowerBuiltSound.cs new file mode 100644 index 0000000..30f3376 --- /dev/null +++ b/Assets/_Project/Scripts/Combat/TowerBuiltSound.cs @@ -0,0 +1,41 @@ +// Assets/_Project/Scripts/Combat/TowerBuiltSound.cs +using TD.Audio; +using TD.Gameplay; +using UnityEngine; + +namespace TD.Combat +{ + /// + /// Local-only audio for tower construction completion. Subscribes to + /// and plays a sound on every peer + /// when the tower finishes building. + /// Attach to any tower prefab and assign its clip in the Inspector. + /// + [RequireComponent(typeof(TowerInstance))] + public class TowerBuiltSound : MonoBehaviour + { + [SerializeField] private SoundConfig builtSound; + + private TowerInstance towerInstance; + + private void Awake() + { + towerInstance = GetComponent(); + } + + private void OnEnable() + { + if (towerInstance != null) towerInstance.OnBuiltClient += HandleBuilt; + } + + private void OnDisable() + { + if (towerInstance != null) towerInstance.OnBuiltClient -= HandleBuilt; + } + + private void HandleBuilt() + { + AudioManager.Instance?.Play(builtSound.clip, AudioCategory.UI, builtSound.RandomPitch(), builtSound.volume); + } + } +} diff --git a/Assets/_Project/Scripts/Combat/TowerBuiltSound.cs.meta b/Assets/_Project/Scripts/Combat/TowerBuiltSound.cs.meta new file mode 100644 index 0000000..5aa4685 --- /dev/null +++ b/Assets/_Project/Scripts/Combat/TowerBuiltSound.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ce512ec39eb6a8f079c7b258a4d0ced1 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/EnemyHealth.cs b/Assets/_Project/Scripts/Gameplay/EnemyHealth.cs index 4d0e7ea..10256d2 100644 --- a/Assets/_Project/Scripts/Gameplay/EnemyHealth.cs +++ b/Assets/_Project/Scripts/Gameplay/EnemyHealth.cs @@ -126,6 +126,9 @@ namespace TD.Gameplay /// public event System.Action OnDied; + /// Fired on ALL peers the moment this enemy dies. Use for client-side visuals and audio. + public event System.Action OnDiedClient; + // ----- Server-only pre-spawn init ------------------------------------- /// @@ -240,6 +243,7 @@ namespace TD.Gameplay if (deathAnimator != null) deathAnimator.SetTrigger(DieHash); + DiedClientRpc(); StartCoroutine(DeathSequence()); } @@ -263,6 +267,12 @@ namespace TD.Gameplay // mesh sizes substantially, derive this from a collider bounds instead. public float SelectionRadius => 0.4f; + [ClientRpc] + private void DiedClientRpc() + { + OnDiedClient?.Invoke(); + } + private IEnumerator DeathSequence() { // Hold while the death animation plays. diff --git a/Assets/_Project/Scripts/Gameplay/TowerInstance.cs b/Assets/_Project/Scripts/Gameplay/TowerInstance.cs index 724776e..e459f01 100644 --- a/Assets/_Project/Scripts/Gameplay/TowerInstance.cs +++ b/Assets/_Project/Scripts/Gameplay/TowerInstance.cs @@ -166,6 +166,11 @@ namespace TD.Gameplay } } + // ----- Events --------------------------------------------------------- + + /// Fired on ALL peers when this tower finishes construction and spawns. + public event System.Action OnBuiltClient; + // ----- Server-only initialization ------------------------------------- /// @@ -262,6 +267,8 @@ namespace TD.Gameplay $"for {ownerSlot.Value} at anchor {anchorTile.Value}. " + $"IsServer={IsServer}"); } + + OnBuiltClient?.Invoke(); } public override void OnNetworkDespawn() diff --git a/ProjectSettings/Packages/com.unity.probuilder/Settings.json b/ProjectSettings/Packages/com.unity.probuilder/Settings.json index ebf0b37..9202690 100644 --- a/ProjectSettings/Packages/com.unity.probuilder/Settings.json +++ b/ProjectSettings/Packages/com.unity.probuilder/Settings.json @@ -135,6 +135,11 @@ "type": "UnityEngine.ProBuilder.RectSelectMode, Unity.ProBuilder, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", "key": "editor.dragSelectRectMode", "value": "{\"m_Value\":0}" + }, + { + "type": "UnityEditor.ProBuilder.Actions.ExportAssetOptions, Unity.ProBuilder.Editor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", + "key": "export.assetOptions", + "value": "{\"m_Value\":{\"makePrefab\":false,\"replaceOriginal\":false}}" } ] } From d14305d804a4f42359d62eba6c3df0b4a9dc49e6 Mon Sep 17 00:00:00 2001 From: Ian Woods Date: Tue, 30 Jun 2026 23:27:36 -0700 Subject: [PATCH 07/58] music --- Assets/_Project/Audio/music.meta | 8 + Assets/_Project/Audio/music/menu.meta | 8 + Assets/_Project/Audio/music/menu/menu_1.wav | 3 + .../_Project/Audio/music/menu/menu_1.wav.meta | 23 +++ Assets/_Project/Scenes/Levels/9Player.unity | 148 +++++++++++++++++- .../_Project/Scripts/Audio/AudioCategory.cs | 2 +- Assets/_Project/Scripts/Audio/MusicPlayer.cs | 27 ++++ .../Scripts/Audio/MusicPlayer.cs.meta | 2 + Assets/_Project/Scripts/Audio/README.md | 2 - .../com.unity.probuilder/Settings.json | 22 +-- 10 files changed, 218 insertions(+), 27 deletions(-) create mode 100644 Assets/_Project/Audio/music.meta create mode 100644 Assets/_Project/Audio/music/menu.meta create mode 100644 Assets/_Project/Audio/music/menu/menu_1.wav create mode 100644 Assets/_Project/Audio/music/menu/menu_1.wav.meta create mode 100644 Assets/_Project/Scripts/Audio/MusicPlayer.cs create mode 100644 Assets/_Project/Scripts/Audio/MusicPlayer.cs.meta diff --git a/Assets/_Project/Audio/music.meta b/Assets/_Project/Audio/music.meta new file mode 100644 index 0000000..0530425 --- /dev/null +++ b/Assets/_Project/Audio/music.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 83f3ae347a44c6e1da40d37aab1ba991 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Audio/music/menu.meta b/Assets/_Project/Audio/music/menu.meta new file mode 100644 index 0000000..77138b2 --- /dev/null +++ b/Assets/_Project/Audio/music/menu.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 619ed0e77e6deb6049c09744dff9687a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Audio/music/menu/menu_1.wav b/Assets/_Project/Audio/music/menu/menu_1.wav new file mode 100644 index 0000000..11fb364 --- /dev/null +++ b/Assets/_Project/Audio/music/menu/menu_1.wav @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:513e1c3fd4bf761b3ac49f0018327370e00e8768e9323b9359c6ae53b76d6573 +size 7879356 diff --git a/Assets/_Project/Audio/music/menu/menu_1.wav.meta b/Assets/_Project/Audio/music/menu/menu_1.wav.meta new file mode 100644 index 0000000..11174b0 --- /dev/null +++ b/Assets/_Project/Audio/music/menu/menu_1.wav.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: d4626563ad3c90179b247207e7b9f0be +AudioImporter: + externalObjects: {} + serializedVersion: 8 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Scenes/Levels/9Player.unity b/Assets/_Project/Scenes/Levels/9Player.unity index ad268e9..14f1ebc 100644 --- a/Assets/_Project/Scenes/Levels/9Player.unity +++ b/Assets/_Project/Scenes/Levels/9Player.unity @@ -2261,9 +2261,6 @@ MonoBehaviour: - category: 2 maxVoices: 4 volume: 0.5 - - category: 3 - maxVoices: 4 - volume: 0.5 --- !u!4 &176580462 Transform: m_ObjectHideFlags: 0 @@ -7339,6 +7336,150 @@ Transform: m_Children: [] m_Father: {fileID: 1097152085} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &516125084 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 516125087} + - component: {fileID: 516125086} + - component: {fileID: 516125085} + m_Layer: 0 + m_Name: MusicPlayer + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &516125085 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 516125084} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 292ad37b9e4d1d7c28e59cf4dc1e99fa, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Audio.MusicPlayer + clip: {fileID: 8300000, guid: d4626563ad3c90179b247207e7b9f0be, type: 3} + volume: 0.632 +--- !u!82 &516125086 +AudioSource: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 516125084} + m_Enabled: 1 + serializedVersion: 4 + OutputAudioMixerGroup: {fileID: 0} + m_audioClip: {fileID: 0} + m_Resource: {fileID: 0} + m_PlayOnAwake: 1 + m_Volume: 1 + m_Pitch: 1 + Loop: 0 + Mute: 0 + Spatialize: 0 + SpatializePostEffects: 0 + Priority: 128 + DopplerLevel: 1 + MinDistance: 1 + MaxDistance: 500 + Pan2D: 0 + rolloffMode: 0 + BypassEffects: 0 + BypassListenerEffects: 0 + BypassReverbZones: 0 + rolloffCustomCurve: + 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: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + panLevelCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + 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 + spreadCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + 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 + reverbZoneMixCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + 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 +--- !u!4 &516125087 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 516125084} + 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 &531325306 GameObject: m_ObjectHideFlags: 0 @@ -28772,3 +28913,4 @@ SceneRoots: - {fileID: 1889390964} - {fileID: 2139601601} - {fileID: 176580462} + - {fileID: 516125087} diff --git a/Assets/_Project/Scripts/Audio/AudioCategory.cs b/Assets/_Project/Scripts/Audio/AudioCategory.cs index ef63198..9a446aa 100644 --- a/Assets/_Project/Scripts/Audio/AudioCategory.cs +++ b/Assets/_Project/Scripts/Audio/AudioCategory.cs @@ -1,5 +1,5 @@ // Assets/_Project/Scripts/Audio/AudioCategory.cs namespace TD.Audio { - public enum AudioCategory { TowerFire, EnemyHitDeath, UI, Music } + public enum AudioCategory { TowerFire, EnemyHitDeath, UI } } diff --git a/Assets/_Project/Scripts/Audio/MusicPlayer.cs b/Assets/_Project/Scripts/Audio/MusicPlayer.cs new file mode 100644 index 0000000..325b15c --- /dev/null +++ b/Assets/_Project/Scripts/Audio/MusicPlayer.cs @@ -0,0 +1,27 @@ +// Assets/_Project/Scripts/Audio/MusicPlayer.cs +using UnityEngine; + +namespace TD.Audio +{ + /// + /// Plays a single looping music track for the scene it lives in. + /// Add to a GameObject in the scene, assign a clip, and it starts on load. + /// + [RequireComponent(typeof(AudioSource))] + public class MusicPlayer : MonoBehaviour + { + [SerializeField] private AudioClip clip; + [Range(0f, 1f)] + [SerializeField] private float volume = 1f; + + private void Start() + { + var src = GetComponent(); + src.clip = clip; + src.volume = volume; + src.loop = true; + src.playOnAwake = false; + src.Play(); + } + } +} diff --git a/Assets/_Project/Scripts/Audio/MusicPlayer.cs.meta b/Assets/_Project/Scripts/Audio/MusicPlayer.cs.meta new file mode 100644 index 0000000..ced75fb --- /dev/null +++ b/Assets/_Project/Scripts/Audio/MusicPlayer.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 292ad37b9e4d1d7c28e59cf4dc1e99fa \ No newline at end of file diff --git a/Assets/_Project/Scripts/Audio/README.md b/Assets/_Project/Scripts/Audio/README.md index 2f7d81c..31e990d 100644 --- a/Assets/_Project/Scripts/Audio/README.md +++ b/Assets/_Project/Scripts/Audio/README.md @@ -13,7 +13,6 @@ Centralised voice-limited audio for the game. Lives in `Assets/_Project/Scripts/ | `TowerFire` | Tower attack sounds | | `EnemyHitDeath` | Enemy damage and death sounds | | `UI` | Button clicks, placement confirmation, etc. | -| `Music` | Background music | Voice limits and volume per category are configured in the Inspector on the `AudioManager` scene GameObject. @@ -25,7 +24,6 @@ Suggested defaults: - TowerFire: 4 voices, volume 1.0 - EnemyHitDeath: 8 voices, volume 1.0 - UI: 4 voices, volume 1.0 -- Music: 2 voices, volume 0.8 ## Adding a new sound-emitting component diff --git a/ProjectSettings/Packages/com.unity.probuilder/Settings.json b/ProjectSettings/Packages/com.unity.probuilder/Settings.json index c46a6fa..9202690 100644 --- a/ProjectSettings/Packages/com.unity.probuilder/Settings.json +++ b/ProjectSettings/Packages/com.unity.probuilder/Settings.json @@ -109,43 +109,23 @@ { "type": "UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", "key": "ShapeBuilder.LastSize.Cube", - "value": "{\"m_Value\":{\"x\":-0.8617095947265625,\"y\":1.0079753398895264,\"z\":3.049813747406006}}" - }, - { - "type": "UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", - "key": "ShapeBuilder.LastSize.Stairs", - "value": "{\"m_Value\":{\"x\":-2.007598876953125,\"y\":2.0233278274536135,\"z\":2.0208892822265627}}" + "value": "{\"m_Value\":{\"x\":5.5,\"y\":3.0,\"z\":-2.5}}" }, { "type": "UnityEngine.Quaternion, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", "key": "ShapeBuilder.LastRotation.Cube", "value": "{\"m_Value\":{\"x\":0.0,\"y\":0.0,\"z\":0.0,\"w\":1.0}}" }, - { - "type": "UnityEngine.Quaternion, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", - "key": "ShapeBuilder.LastRotation.Stairs", - "value": "{\"m_Value\":{\"x\":0.0,\"y\":0.0,\"z\":0.0,\"w\":1.0}}" - }, { "type": "UnityEngine.ProBuilder.PivotLocation, Unity.ProBuilder, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", "key": "ShapeBuilder.PivotLocation.Cube", "value": "{\"m_Value\":0}" }, - { - "type": "UnityEngine.ProBuilder.PivotLocation, Unity.ProBuilder, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", - "key": "ShapeBuilder.PivotLocation.Stairs", - "value": "{\"m_Value\":0}" - }, { "type": "UnityEngine.ProBuilder.Shapes.Shape, Unity.ProBuilder, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", "key": "ShapeBuilder.Cube", "value": "{}" }, - { - "type": "UnityEngine.ProBuilder.Shapes.Shape, Unity.ProBuilder, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", - "key": "ShapeBuilder.Stairs", - "value": "{}" - }, { "type": "UnityEngine.ProBuilder.SelectMode, Unity.ProBuilder, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", "key": "s_SelectMode", From 362b76ae75e2501e254074f32e177a83c2aeb8e2 Mon Sep 17 00:00:00 2001 From: Ian Woods Date: Fri, 3 Jul 2026 14:05:08 -0700 Subject: [PATCH 08/58] towers fall from the sky - neat! --- .../Prefabs/Towers/Tower_BasicArrow.prefab | 61 ++++- .../Prefabs/Towers/Tower_SiegeCannon.prefab | 71 +++++- .../Prefabs/Towers/Tower_TeslaCoil.prefab | 61 ++++- Assets/_Project/Scripts/Combat/TowerCombat.cs | 13 + .../Scripts/Combat/TowerLandedSound.cs | 41 ++++ .../Scripts/Combat/TowerLandedSound.cs.meta | 2 + .../Scripts/Combat/TowerLandingVisual.cs | 104 ++++++++ .../Scripts/Combat/TowerLandingVisual.cs.meta | 2 + .../Scripts/Gameplay/BuildSiteVisual.cs | 231 ++---------------- .../Scripts/Gameplay/TowerInstance.cs | 29 +++ 10 files changed, 396 insertions(+), 219 deletions(-) create mode 100644 Assets/_Project/Scripts/Combat/TowerLandedSound.cs create mode 100644 Assets/_Project/Scripts/Combat/TowerLandedSound.cs.meta create mode 100644 Assets/_Project/Scripts/Combat/TowerLandingVisual.cs create mode 100644 Assets/_Project/Scripts/Combat/TowerLandingVisual.cs.meta diff --git a/Assets/_Project/Prefabs/Towers/Tower_BasicArrow.prefab b/Assets/_Project/Prefabs/Towers/Tower_BasicArrow.prefab index 72ae323..f21641d 100644 --- a/Assets/_Project/Prefabs/Towers/Tower_BasicArrow.prefab +++ b/Assets/_Project/Prefabs/Towers/Tower_BasicArrow.prefab @@ -70,6 +70,8 @@ GameObject: - component: {fileID: 805962841523123163} - component: {fileID: 8853488620519990682} - component: {fileID: 5360241685303413177} + - component: {fileID: 5793816278935258120} + - component: {fileID: 3412005213656160288} m_Layer: 0 m_Name: Tower_BasicArrow m_TagString: Untagged @@ -212,6 +214,8 @@ MonoBehaviour: ShowTopMostFoldoutHeaderGroup: 1 tintedRenderers: - {fileID: 4028055828417179692} + dropHeight: 15 + landingDuration: 0.4 --- !u!114 &805962841523123163 MonoBehaviour: m_ObjectHideFlags: 0 @@ -252,12 +256,67 @@ MonoBehaviour: m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 93bc533262394e1e8b122bbfad89391a, type: 3} - m_Name: + m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Visuals.ConeMesh sides: 4 radius: 0.7071068 height: 1.5 angularOffsetDegrees: 45 +--- !u!114 &5793816278935258120 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6482414459531823157} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 22d67b2aa780d786a93acfe06d1909b0, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Combat.TowerLandedSound + landedSound: + clip: {fileID: 0} + volume: 0 + minPitch: 0 + maxPitch: 0 +--- !u!114 &3412005213656160288 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6482414459531823157} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf337521317d9e297a652e97c666376f, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Combat.TowerLandingVisual + fallCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + impactVfxPrefab: {fileID: 0} + impactVfxLifetime: 3 --- !u!1 &7580197837852108944 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/_Project/Prefabs/Towers/Tower_SiegeCannon.prefab b/Assets/_Project/Prefabs/Towers/Tower_SiegeCannon.prefab index 1c6e32f..f7020d7 100644 --- a/Assets/_Project/Prefabs/Towers/Tower_SiegeCannon.prefab +++ b/Assets/_Project/Prefabs/Towers/Tower_SiegeCannon.prefab @@ -69,6 +69,8 @@ GameObject: - component: {fileID: 9137031893466587143} - component: {fileID: 805962841523123163} - component: {fileID: 8853488620519990682} + - component: {fileID: 3021373172845454683} + - component: {fileID: 4003901452716391977} m_Layer: 0 m_Name: Tower_SiegeCannon m_TagString: Untagged @@ -181,9 +183,9 @@ MonoBehaviour: m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: + m_Name: m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 3344551122 + GlobalObjectIdHash: 2153184693 InScenePlacedSourceGlobalObjectIdHash: 0 DeferredDespawnTick: 0 Ownership: 1 @@ -206,11 +208,13 @@ MonoBehaviour: m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fb111fc88b3d6a340a3abde5a1502af3, type: 3} - m_Name: + m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.TowerInstance ShowTopMostFoldoutHeaderGroup: 1 tintedRenderers: - {fileID: 4028055828417179692} + dropHeight: 15 + landingDuration: 0.4 --- !u!114 &805962841523123163 MonoBehaviour: m_ObjectHideFlags: 0 @@ -221,7 +225,7 @@ MonoBehaviour: m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 7eb6cce6cd96b23478b7d2173cebf74d, type: 3} - m_Name: + m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Combat.TowerCombat ShowTopMostFoldoutHeaderGroup: 1 enemyLayerMask: @@ -237,10 +241,65 @@ MonoBehaviour: m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: c0edb0c5206ca454bbd7c300c6cc7574, type: 3} - m_Name: + m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Combat.TowerRangeIndicator rangeProjector: {fileID: 8255517343120954594} projectionDepth: 50 +--- !u!114 &3021373172845454683 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6482414459531823157} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 22d67b2aa780d786a93acfe06d1909b0, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Combat.TowerLandedSound + landedSound: + clip: {fileID: 0} + volume: 0 + minPitch: 0 + maxPitch: 0 +--- !u!114 &4003901452716391977 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6482414459531823157} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf337521317d9e297a652e97c666376f, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Combat.TowerLandingVisual + fallCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + impactVfxPrefab: {fileID: 0} + impactVfxLifetime: 3 --- !u!1 &7580197837852108944 GameObject: m_ObjectHideFlags: 0 @@ -283,7 +342,7 @@ MonoBehaviour: m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 0777d029ed3dffa4692f417d4aba19ca, type: 3} - m_Name: + m_Name: m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Runtime::UnityEngine.Rendering.Universal.DecalProjector m_Material: {fileID: 2100000, guid: f99227cbde481ce47a2527e6bca709d2, type: 2} m_DrawDistance: 1000 diff --git a/Assets/_Project/Prefabs/Towers/Tower_TeslaCoil.prefab b/Assets/_Project/Prefabs/Towers/Tower_TeslaCoil.prefab index ede5f43..3694acf 100644 --- a/Assets/_Project/Prefabs/Towers/Tower_TeslaCoil.prefab +++ b/Assets/_Project/Prefabs/Towers/Tower_TeslaCoil.prefab @@ -101,6 +101,8 @@ GameObject: - component: {fileID: 4524938955752569428} - component: {fileID: -2590971686077483651} - component: {fileID: 1288485127287735786} + - component: {fileID: 1829137298732744432} + - component: {fileID: 8125712573731754244} m_Layer: 0 m_Name: Tower_TeslaCoil m_TagString: Untagged @@ -147,7 +149,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} m_Name: m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 280718094 + GlobalObjectIdHash: 1363936954 InScenePlacedSourceGlobalObjectIdHash: 0 DeferredDespawnTick: 0 Ownership: 1 @@ -175,6 +177,8 @@ MonoBehaviour: ShowTopMostFoldoutHeaderGroup: 1 tintedRenderers: - {fileID: 0} + dropHeight: 15 + landingDuration: 0.4 --- !u!114 &805962841523123163 MonoBehaviour: m_ObjectHideFlags: 0 @@ -268,6 +272,61 @@ MonoBehaviour: volume: 0.496 minPitch: 1 maxPitch: 1 +--- !u!114 &1829137298732744432 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6482414459531823157} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 22d67b2aa780d786a93acfe06d1909b0, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Combat.TowerLandedSound + landedSound: + clip: {fileID: 0} + volume: 0 + minPitch: 0 + maxPitch: 0 +--- !u!114 &8125712573731754244 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6482414459531823157} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf337521317d9e297a652e97c666376f, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Combat.TowerLandingVisual + fallCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + impactVfxPrefab: {fileID: 0} + impactVfxLifetime: 3 --- !u!1 &7101790219931971190 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/_Project/Scripts/Combat/TowerCombat.cs b/Assets/_Project/Scripts/Combat/TowerCombat.cs index 9c9ac7c..6c1a53f 100644 --- a/Assets/_Project/Scripts/Combat/TowerCombat.cs +++ b/Assets/_Project/Scripts/Combat/TowerCombat.cs @@ -58,6 +58,12 @@ namespace TD.Combat // is in range, the tower fires and the timer resets to 1 / AttacksPerSecond. private float attackCooldown; + // Counts down from towerInstance.LandingDuration, set in OnNetworkSpawn. Combat is + // fully inert until it reaches zero, so a tower can't target/fire while its mesh is + // still visually falling (TowerLandingVisual). Server-only; independent of whatever + // the client-side fall visual is doing to the (possibly shared, on a host) transform. + private float landingCooldown; + // Cached on OnNetworkSpawn — avoids GetComponent every Update. private TowerInstance towerInstance; @@ -102,6 +108,7 @@ namespace TD.Combat public override void OnNetworkSpawn() { towerInstance = GetComponent(); + landingCooldown = towerInstance.LandingDuration; replicatedTarget.OnValueChanged += HandleReplicatedTargetChanged; // Late-joining clients receive the NV's current value in the initial @@ -128,6 +135,12 @@ namespace TD.Combat { if (!IsServer) return; + if (landingCooldown > 0f) + { + landingCooldown -= Time.deltaTime; + return; + } + TowerDefinition def = towerInstance?.Definition; if (def == null || def.Range <= 0f || def.AttacksPerSecond <= 0f) return; diff --git a/Assets/_Project/Scripts/Combat/TowerLandedSound.cs b/Assets/_Project/Scripts/Combat/TowerLandedSound.cs new file mode 100644 index 0000000..b650d58 --- /dev/null +++ b/Assets/_Project/Scripts/Combat/TowerLandedSound.cs @@ -0,0 +1,41 @@ +// Assets/_Project/Scripts/Combat/TowerLandedSound.cs +using TD.Audio; +using TD.Gameplay; +using UnityEngine; + +namespace TD.Combat +{ + /// + /// Local-only audio for the tower's landing impact. Subscribes to + /// and plays a sound on every peer when the + /// tower's fall animation () finishes. + /// Attach to any tower prefab and assign its clip in the Inspector. + /// + [RequireComponent(typeof(TowerInstance))] + public class TowerLandedSound : MonoBehaviour + { + [SerializeField] private SoundConfig landedSound; + + private TowerInstance towerInstance; + + private void Awake() + { + towerInstance = GetComponent(); + } + + private void OnEnable() + { + if (towerInstance != null) towerInstance.OnLandedClient += HandleLanded; + } + + private void OnDisable() + { + if (towerInstance != null) towerInstance.OnLandedClient -= HandleLanded; + } + + private void HandleLanded() + { + AudioManager.Instance?.Play(landedSound.clip, AudioCategory.UI, landedSound.RandomPitch(), landedSound.volume); + } + } +} diff --git a/Assets/_Project/Scripts/Combat/TowerLandedSound.cs.meta b/Assets/_Project/Scripts/Combat/TowerLandedSound.cs.meta new file mode 100644 index 0000000..2adf2ce --- /dev/null +++ b/Assets/_Project/Scripts/Combat/TowerLandedSound.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 22d67b2aa780d786a93acfe06d1909b0 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Combat/TowerLandingVisual.cs b/Assets/_Project/Scripts/Combat/TowerLandingVisual.cs new file mode 100644 index 0000000..6031327 --- /dev/null +++ b/Assets/_Project/Scripts/Combat/TowerLandingVisual.cs @@ -0,0 +1,104 @@ +// Assets/_Project/Scripts/Combat/TowerLandingVisual.cs +using System.Collections; +using TD.Gameplay; +using UnityEngine; + +namespace TD.Combat +{ + /// + /// Local-only "falls from the sky and lands" spawn visual. Subscribes to + /// and, on every client (never on a + /// dedicated server, which has no camera to show it to), animates the tower's + /// transform down from above its already-correct + /// resting position over seconds. + /// + /// + /// No NetworkTransform involved. Tower prefabs have no NetworkTransform — + /// position is a one-shot snapshot sent at spawn. This animation is purely local per + /// peer (same pattern as 's audio cue); each peer computes + /// an identical animation independently from the same replicated landing position and + /// the same authored / + /// values, so no networking is required. + /// + /// Safe on a host despite sharing one Transform with server combat logic. + /// withholds all targeting/attack logic for + /// seconds after spawn (see its + /// landingCooldown field), so it never reads transform.position while this + /// animation is moving it. The two timers start from the same value in the same call + /// ( fires from OnNetworkSpawn), so they + /// finish within a frame of each other. + /// + /// Root transform, not a child wrapper. Tower prefabs render their mesh + /// directly on the root GameObject (no separate "Model" child exists to offset + /// instead), so this animates transform.position directly. Footprint/pathing is + /// unaffected — stamps walkability from its replicated + /// anchor tile (grid data), not from transform.position. + /// + [RequireComponent(typeof(TowerInstance))] + public class TowerLandingVisual : MonoBehaviour + { + [Tooltip("Eases the fall over LandingDuration. X = normalized time, Y = normalized " + + "fraction of DropHeight already descended (0 = still at drop height, 1 = landed).")] + [SerializeField] private AnimationCurve fallCurve = AnimationCurve.EaseInOut(0f, 0f, 1f, 1f); + + [Tooltip("Optional impact VFX (dust burst, etc.) instantiated at the landing point when " + + "the fall finishes. Leave empty for no VFX.")] + [SerializeField] private GameObject impactVfxPrefab; + + [Tooltip("Seconds before the instantiated impact VFX is destroyed. Ignored if " + + "impactVfxPrefab is unassigned.")] + [SerializeField] private float impactVfxLifetime = 3f; + + private TowerInstance towerInstance; + + private void Awake() + { + towerInstance = GetComponent(); + } + + private void OnEnable() + { + if (towerInstance != null) towerInstance.OnBuiltClient += HandleBuilt; + } + + private void OnDisable() + { + if (towerInstance != null) towerInstance.OnBuiltClient -= HandleBuilt; + } + + private void HandleBuilt() + { + // Dedicated (non-host) servers have no camera/visuals and must never move the + // shared transform. TowerCombat's landing gate is fully independent of this + // animation, so skipping it here on a pure server is a harmless no-op. + if (!towerInstance.IsClient) return; + + StartCoroutine(AnimateDrop()); + } + + private IEnumerator AnimateDrop() + { + Vector3 landedPosition = transform.position; // already correct (SeatOnGround, pre-spawn) + float dropHeight = towerInstance.DropHeight; + float duration = towerInstance.LandingDuration; + + transform.position = landedPosition + Vector3.up * dropHeight; + + float t = 0f; + while (t < duration) + { + t += Time.deltaTime; + float u = fallCurve.Evaluate(Mathf.Clamp01(t / duration)); + transform.position = landedPosition + Vector3.up * dropHeight * (1f - u); + yield return null; + } + + transform.position = landedPosition; // snap exactly, avoid float drift + + if (impactVfxPrefab != null) + Destroy(Instantiate(impactVfxPrefab, landedPosition, Quaternion.identity), impactVfxLifetime); + + towerInstance.ClientNotifyLanded(); + } + } +} diff --git a/Assets/_Project/Scripts/Combat/TowerLandingVisual.cs.meta b/Assets/_Project/Scripts/Combat/TowerLandingVisual.cs.meta new file mode 100644 index 0000000..8ad9019 --- /dev/null +++ b/Assets/_Project/Scripts/Combat/TowerLandingVisual.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: bf337521317d9e297a652e97c666376f \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/BuildSiteVisual.cs b/Assets/_Project/Scripts/Gameplay/BuildSiteVisual.cs index be09946..f51b10d 100644 --- a/Assets/_Project/Scripts/Gameplay/BuildSiteVisual.cs +++ b/Assets/_Project/Scripts/Gameplay/BuildSiteVisual.cs @@ -8,15 +8,16 @@ using TD.VFX; namespace TD.Gameplay { /// - /// Visual representation of an in-flight : the green - /// queued ghost, and the staged construction animation (4 stages of growing - /// height for the testing cube). One NetworkObject per active job. Despawned - /// when the job is cancelled or when the real - /// takes its place at construction-complete. + /// Visual representation of an in-flight : a static, non-growing + /// site marker (color-tinted by stage) plus the ground targeting reticle + /// () that shrinks as construction progresses. One + /// NetworkObject per active job. Despawned when the job is cancelled or when the real + /// takes its place at construction-complete, at which point + /// TowerLandingVisual plays the tower's fall-from-sky arrival. /// /// /// Why a separate prefab from TowerInstance. The build-site visual - /// has different rendering (transparent green or partial-height cube), no combat, + /// has different rendering (translucent green site marker), no combat, /// no grid-stamping (the Builder owns those state transitions), and a much /// shorter lifecycle. Sharing a prefab with TowerInstance would mean adding /// "am I real or a ghost" branching to every TowerInstance code path. Two @@ -27,10 +28,9 @@ namespace TD.Gameplay /// from NetworkManager.ServerTime.TimeAsFloat. Only the server writes; /// clients read. /// - /// Visual model. The prefab inspector points at a re-tinted copy - /// of the tower's mesh (the same testing cube). At Stage = Queued, the visual - /// is a translucent green cube at full footprint scale but reduced Y. At - /// Stage = Constructing, the cube grows in 4 sub-stages over BuildTime. + /// Visual model. The site marker's material swaps by stage (queued/ + /// constructing/paused) but never grows or changes shape — construction progress is + /// communicated entirely by the reticle shrinking, not by the marker itself. /// /// No grid stamping here. Walkability and occupancy stamps are /// driven by the Builder (queue-time stamps occupied=true / walkable=true, @@ -48,10 +48,6 @@ namespace TD.Gameplay "MeshRenderer on the prefab. Auto-populated from children if empty.")] [SerializeField] private MeshRenderer[] tintedRenderers; - [Tooltip("Transform that gets Y-scaled to represent construction progress. " + - "Typically the visual mesh's transform. The growth axis is local Y.")] - [SerializeField] private Transform scaleTarget; - [Tooltip("Material applied while the job is Queued (translucent green).")] [SerializeField] private Material queuedMaterial; @@ -63,13 +59,6 @@ namespace TD.Gameplay "Suggested: muted/grey-tinted variant of the constructing material.")] [SerializeField] private Material pausedMaterial; - [Header("Construction phases")] - [Tooltip("Project-default construction-stage visuals used when the tower being built " + - "doesn't define its own ConstructionPhases. When this (or the tower's set) " + - "has phases, the build site swaps between those phase prefabs as it builds. " + - "Leave empty to fall back to the legacy cube Y-scale growth below.")] - [SerializeField] private ConstructionPhaseSet defaultPhaseSet; - [Header("Drop reticle FX")] [Tooltip("Optional targeting-reticle effect (ground decal + beam + motes) shown for the " + "life of this build. Spawned as a child on every peer and fed construction " + @@ -77,16 +66,6 @@ namespace TD.Gameplay "this visual at completion/cancel. Leave empty to build with no reticle.")] [SerializeField] private TowerDropReticle dropReticlePrefab; - [Header("Construction stages (cube fallback)")] - [Tooltip("FALLBACK ONLY (no phase set assigned): number of discrete growth stages " + - "while constructing. 4 = 1/4 → 2/4 → 3/4 → 4/4 height.")] - [SerializeField] private int stageCount = 4; - - [Tooltip("FALLBACK ONLY: Y-scale applied to scaleTarget when Stage == Queued. " + - "Visually distinct from any constructing height so the queued ghost reads " + - "as 'intent, not progress'.")] - [SerializeField] private float queuedYScale = 0.15f; - // ----- Networked state -------------------------------------------- // Replicated owner slot for color tinting. Mirrors TowerInstance. @@ -133,7 +112,7 @@ namespace TD.Gameplay readPerm: NetworkVariableReadPermission.Everyone, writePerm: NetworkVariableWritePermission.Server); - // Current stage. Drives material swap and Y-scale animation. + // Current stage. Drives the site marker's material/tint swap. private readonly NetworkVariable currentStage = new NetworkVariable( BuildStage.Queued, @@ -244,17 +223,6 @@ namespace TD.Gameplay private int pendingGoldSpent; private bool hasPendingInit; - // ----- Construction-phase runtime (local, all peers) -------------- - - // Resolved on spawn from the tower's ConstructionPhases or the defaultPhaseSet. - // When non-null with PhaseCount > 0, the build site swaps between these - // instantiated phase prefabs instead of Y-scaling the fallback cube. - private ConstructionPhaseSet effectivePhaseSet; - private GameObject[] phaseInstances; // one instantiated child per phase - private MeshRenderer[][] phaseRenderers; // cached renderers per phase, for tinting - private int activePhaseIndex = -1; - private bool usePhases; - // Spawned child targeting-reticle effect (local, all peers). Fed progress in Update; // destroyed automatically with this NetworkObject at completion/cancel. private TowerDropReticle dropReticleInstance; @@ -307,10 +275,6 @@ namespace TD.Gameplay hasPendingInit = false; } - // Resolve and instantiate the construction-phase visuals (or fall back to the - // cube). Depends on towerTypeId, which is replicated by now on every peer. - ResolvePhaseSet(); - // Spawn the targeting-reticle FX as a local child. It reads this build site's // replicated progress (fed in Update) and dies with us at completion/cancel. if (dropReticlePrefab != null) @@ -324,7 +288,7 @@ namespace TD.Gameplay currentStage.OnValueChanged += HandleStageChanged; // Apply initial visual state based on the (now-replicated) values. - ApplyStageVisual(currentStage.Value); + ApplyStageMaterialAndTint(currentStage.Value); } public override void OnNetworkDespawn() @@ -376,30 +340,10 @@ namespace TD.Gameplay { // Drive the targeting reticle on every peer, every stage: 0 while Queued // (full-size reticle, awaiting a builder), shrinking while Constructing, frozen - // while Paused. Kept before the Constructing early-return so it also animates - // the queued/paused states. + // while Paused. This is the only per-frame visual effect on the build site — + // nothing about the site's mesh grows or changes shape during construction. if (dropReticleInstance != null) dropReticleInstance.SetProgress(ComputeProgressNormalized()); - - // While constructing, advance the visual based on server time. Runs on every - // peer so visuals stay synchronized. Paused does NOT update — the visual is - // frozen at the pause point. - if (currentStage.Value != BuildStage.Constructing) return; - - if (usePhases) - { - int index = PhaseIndexFromProgress(); - if (index != activePhaseIndex) - { - ShowPhase(index); - // Renderers changed with the swap — re-apply material + owner tint. - ApplyStageMaterialAndTint(BuildStage.Constructing); - } - return; - } - - // Fallback: smoothly grow the cube's Y-scale through the stages. - ApplyYScale(ComputeConstructingYScale()); } // ----- Server API ------------------------------------------------- @@ -522,9 +466,9 @@ namespace TD.Gameplay /// /// Server-only: transitions Constructing → Paused AND writes the new - /// accumulated construction time. Y-scale freezes at the level matching - /// the accumulated time. After this returns, the visual is fully self- - /// describing — it carries enough state to be shelved and later resumed. + /// accumulated construction time (freezing the reticle's shrink progress at that + /// point). After this returns, the visual is fully self-describing — it carries + /// enough state to be shelved and later resumed. /// public void ServerPauseAndPersistAccumulated(float totalAccumulated) { @@ -542,37 +486,11 @@ namespace TD.Gameplay private void HandleStageChanged(BuildStage previous, BuildStage current) { - ApplyStageVisual(current); + ApplyStageMaterialAndTint(current); } - private void ApplyStageVisual(BuildStage stage) - { - if (usePhases) - { - // Queued shows the first phase; constructing/paused show the phase - // matching current progress. ShowPhase repoints tintedRenderers at the - // active phase instance, so material + tint are applied AFTER it. - int index = stage == BuildStage.Queued ? 0 : PhaseIndexFromProgress(); - ShowPhase(index); - ApplyStageMaterialAndTint(stage); - return; - } - - // Fallback: legacy cube Y-scale growth (no phase set wired). - ApplyStageMaterialAndTint(stage); - switch (stage) - { - case BuildStage.Queued: ApplyYScale(queuedYScale); break; - case BuildStage.Constructing: ApplyYScale(ComputeConstructingYScale()); break; - // ComputePausedYScale uses accumulatedConstructionTime alone when - // constructionStartServerTime is -1 (the pause sentinel). - case BuildStage.Paused: ApplyYScale(ComputePausedYScale()); break; - } - } - - // Applies the stage's material + owner tint to whatever renderers are currently - // active — the cube fallback, or the active phase instance's renderers. Paused - // falls back to the constructing material if no paused material is assigned. + // Applies the stage's material + owner tint to the site marker's renderers. + // Paused falls back to the constructing material if no paused material is assigned. private void ApplyStageMaterialAndTint(BuildStage stage) { switch (stage) @@ -591,115 +509,6 @@ namespace TD.Gameplay } } - // ----- Construction phases ---------------------------------------- - - // Resolves the effective phase set (tower's own, else the project default) and - // instantiates one inactive child per phase. Sets usePhases=false (cube fallback) - // if neither set has any phases. Runs on every peer in OnNetworkSpawn. - private void ResolvePhaseSet() - { - var def = TowerPlacementManager.GetDefinition(towerTypeId.Value); - effectivePhaseSet = - (def != null && def.ConstructionPhases != null && def.ConstructionPhases.PhaseCount > 0) - ? def.ConstructionPhases - : defaultPhaseSet; - - int n = effectivePhaseSet != null ? effectivePhaseSet.PhaseCount : 0; - if (n <= 0) - { - usePhases = false; - return; - } - - usePhases = true; - phaseInstances = new GameObject[n]; - phaseRenderers = new MeshRenderer[n][]; - - // Hide the legacy fallback cube — the instantiated phase prefabs replace it. - if (scaleTarget != null) scaleTarget.gameObject.SetActive(false); - - for (int i = 0; i < n; i++) - { - var prefab = effectivePhaseSet.GetPhase(i); - if (prefab == null) continue; - - var go = Instantiate(prefab, transform); - go.transform.localPosition = Vector3.zero; - go.transform.localRotation = Quaternion.identity; - go.SetActive(false); - - phaseInstances[i] = go; - phaseRenderers[i] = go.GetComponentsInChildren(true); - } - } - - // Activates only phase and points tintedRenderers at its - // renderers so the existing material/tint helpers drive the active phase. - private void ShowPhase(int index) - { - if (phaseInstances == null) return; - index = Mathf.Clamp(index, 0, phaseInstances.Length - 1); - - for (int i = 0; i < phaseInstances.Length; i++) - if (phaseInstances[i] != null) - phaseInstances[i].SetActive(i == index); - - activePhaseIndex = index; - tintedRenderers = phaseRenderers[index]; - } - - // Maps current normalized progress to a phase index (0..PhaseCount-1). - private int PhaseIndexFromProgress() - { - int n = effectivePhaseSet != null ? effectivePhaseSet.PhaseCount : 1; - if (n <= 1) return 0; - float p = ComputeProgressNormalized(); - return Mathf.Clamp(Mathf.FloorToInt(p * n), 0, n - 1); - } - - // Stage index 0..stageCount-1 based on elapsed server time PLUS any accumulated - // time from previous Constructing runs (resume support). - // Returned Y-scale is (stageIndex + 1) / stageCount, so stage 0 = 1/4, - // stage 1 = 2/4, ..., stage stageCount-1 = 4/4 = full height. - private float ComputeConstructingYScale() - { - float bt = buildTime.Value; - if (bt <= 0f || stageCount <= 0) return 1f; - - float currentRunElapsed = (float)NetworkManager.Singleton.ServerTime.Time - - constructionStartServerTime.Value; - float total = currentRunElapsed + accumulatedConstructionTime.Value; - - float perStage = bt / stageCount; - int stageIndex = Mathf.Clamp( - Mathf.FloorToInt(total / perStage), - 0, stageCount - 1); - - return (stageIndex + 1f) / stageCount; - } - - // While Paused, only the accumulated time matters (no current run is in flight). - private float ComputePausedYScale() - { - float bt = buildTime.Value; - if (bt <= 0f || stageCount <= 0) return 1f; - - float total = accumulatedConstructionTime.Value; - float perStage = bt / stageCount; - int stageIndex = Mathf.Clamp( - Mathf.FloorToInt(total / perStage), - 0, stageCount - 1); - - return (stageIndex + 1f) / stageCount; - } - - private void ApplyYScale(float y) - { - if (scaleTarget == null) return; - Vector3 s = scaleTarget.localScale; - scaleTarget.localScale = new Vector3(s.x, y, s.z); - } - // ----- Material handling ------------------------------------------ private void SwapMaterial(Material mat) diff --git a/Assets/_Project/Scripts/Gameplay/TowerInstance.cs b/Assets/_Project/Scripts/Gameplay/TowerInstance.cs index e459f01..519ff04 100644 --- a/Assets/_Project/Scripts/Gameplay/TowerInstance.cs +++ b/Assets/_Project/Scripts/Gameplay/TowerInstance.cs @@ -55,6 +55,18 @@ namespace TD.Gameplay "to exclude specific children.")] [SerializeField] private MeshRenderer[] tintedRenderers; + [Header("Landing (post-construction drop)")] + [Tooltip("World-unit height the tower visually drops from when construction completes. " + + "Consumed only by the client-side fall visual (TowerLandingVisual).")] + [SerializeField] private float dropHeight = 15f; + + [Tooltip("Seconds the fall-and-land animation takes. Single source of truth: " + + "TowerCombat withholds targeting/attacks for exactly this long " + + "(server-authoritative), and TowerLandingVisual uses the same value to time " + + "its client-side animation, so the two stay in lockstep without duplicating " + + "the number.")] + [SerializeField] private float landingDuration = 0.4f; + // ----- Networked state ------------------------------------------------ // The TowerTypeId (index into TowerPlacementManager's catalog) for this tower. @@ -132,6 +144,13 @@ namespace TD.Gameplay /// The footprint anchor tile (SW corner, world-tile coords). public Vector2Int AnchorTile => anchorTile.Value; + /// World-unit height the post-construction drop animation falls from. + public float DropHeight => dropHeight; + + /// Seconds the drop/land animation takes. Also how long TowerCombat withholds + /// targeting/attacks after construction completes. + public float LandingDuration => landingDuration; + // ----- ISelectable ---------------------------------------------------- // Absolute world-unit margin that the selection ring extends beyond the @@ -171,6 +190,16 @@ namespace TD.Gameplay /// Fired on ALL peers when this tower finishes construction and spawns. public event System.Action OnBuiltClient; + /// Fired locally on this peer when the client-side fall/land animation + /// finishes (see ). Analogous to + /// , but delayed by . + public event System.Action OnLandedClient; + + /// Called by when its local + /// fall/land animation finishes. Purely local — never invoked on a dedicated + /// (non-client) server, which never runs that animation. + public void ClientNotifyLanded() => OnLandedClient?.Invoke(); + // ----- Server-only initialization ------------------------------------- /// From 3febdcf021c6f162535aab62ef8bd2e2e94a7e08 Mon Sep 17 00:00:00 2001 From: Ian Woods Date: Fri, 3 Jul 2026 14:18:01 -0700 Subject: [PATCH 09/58] remove old building effect vestiges --- Assets/DefaultNetworkPrefabs.asset | 10 +- .../BuildSiteVisual.prefab | 117 ------------------ .../DefaultConstructionSet.meta | 8 -- .../DefaultConstructionSet.asset | 18 --- .../DefaultConstructionSet.asset.meta | 8 -- .../DefaultConstruction_Phase_1.prefab | 114 ----------------- .../DefaultConstruction_Phase_1.prefab.meta | 7 -- .../DefaultConstruction_Phase_2.prefab | 114 ----------------- .../DefaultConstruction_Phase_2.prefab.meta | 7 -- .../DefaultConstruction_Phase_3.prefab | 114 ----------------- .../DefaultConstruction_Phase_3.prefab.meta | 7 -- 11 files changed, 5 insertions(+), 519 deletions(-) delete mode 100644 Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet.meta delete mode 100644 Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstructionSet.asset delete mode 100644 Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstructionSet.asset.meta delete mode 100644 Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_1.prefab delete mode 100644 Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_1.prefab.meta delete mode 100644 Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_2.prefab delete mode 100644 Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_2.prefab.meta delete mode 100644 Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_3.prefab delete mode 100644 Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_3.prefab.meta diff --git a/Assets/DefaultNetworkPrefabs.asset b/Assets/DefaultNetworkPrefabs.asset index 27abd08..57c9179 100644 --- a/Assets/DefaultNetworkPrefabs.asset +++ b/Assets/DefaultNetworkPrefabs.asset @@ -34,11 +34,6 @@ MonoBehaviour: SourcePrefabToOverride: {fileID: 0} SourceHashToOverride: 0 OverridingTargetPrefab: {fileID: 0} - - Override: 0 - Prefab: {fileID: 7720770984308489338, guid: dff852699e2897b4494fcbc7f7e547d6, type: 3} - SourcePrefabToOverride: {fileID: 0} - SourceHashToOverride: 0 - OverridingTargetPrefab: {fileID: 0} - Override: 0 Prefab: {fileID: 2664719039363295382, guid: dc2e4a4108e03874a8b2dab88dcc8fba, type: 3} SourcePrefabToOverride: {fileID: 0} @@ -99,3 +94,8 @@ MonoBehaviour: SourcePrefabToOverride: {fileID: 0} SourceHashToOverride: 0 OverridingTargetPrefab: {fileID: 0} + - Override: 0 + Prefab: {fileID: 7720770984308489338, guid: dff852699e2897b4494fcbc7f7e547d6, type: 3} + SourcePrefabToOverride: {fileID: 0} + SourceHashToOverride: 0 + OverridingTargetPrefab: {fileID: 0} diff --git a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/BuildSiteVisual.prefab b/Assets/_Project/Prefabs/Towers/Tower Construction Sets/BuildSiteVisual.prefab index b77e65d..6d0724b 100644 --- a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/BuildSiteVisual.prefab +++ b/Assets/_Project/Prefabs/Towers/Tower Construction Sets/BuildSiteVisual.prefab @@ -1,117 +1,5 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: ---- !u!1 &2381228775386571742 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2082013748313019226} - - component: {fileID: 7119837420184958461} - - component: {fileID: 8833246162440246558} - - component: {fileID: 1909402251021719060} - m_Layer: 0 - m_Name: Scale Target - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2082013748313019226 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2381228775386571742} - 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: 1531733800731892084} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &7119837420184958461 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2381228775386571742} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &8833246162440246558 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2381228775386571742} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - 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: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, 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!65 &1909402251021719060 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2381228775386571742} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: 0, z: 0} --- !u!1 &4243270647055755528 GameObject: m_ObjectHideFlags: 0 @@ -250,7 +138,6 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 2082013748313019226} - {fileID: 1059634071631389929} - {fileID: 3705223059275757242} m_Father: {fileID: 0} @@ -294,14 +181,10 @@ MonoBehaviour: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.BuildSiteVisual ShowTopMostFoldoutHeaderGroup: 1 tintedRenderers: [] - scaleTarget: {fileID: 2082013748313019226} queuedMaterial: {fileID: 2100000, guid: f8d951a6841d3f74098bb31255379774, type: 2} constructingMaterial: {fileID: 2100000, guid: 88f1dd7b174716645953857b38fb6948, type: 2} pausedMaterial: {fileID: 0} - defaultPhaseSet: {fileID: 11400000, guid: ed951755c09d6d0479b4fd924b6915da, type: 2} dropReticlePrefab: {fileID: 4110617398237858862, guid: f2a37509f5f2e4d4e86cdaf12f99c6c4, type: 3} - stageCount: 4 - queuedYScale: 0.15 --- !u!65 &6259437393614329336 BoxCollider: m_ObjectHideFlags: 0 diff --git a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet.meta b/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet.meta deleted file mode 100644 index e070754..0000000 --- a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 82e418e7a5a804747a9a4865648b7793 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstructionSet.asset b/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstructionSet.asset deleted file mode 100644 index 2272a43..0000000 --- a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstructionSet.asset +++ /dev/null @@ -1,18 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c8f2a4e1b9d6437052a1e8c4f7b3d069, type: 3} - m_Name: DefaultConstructionSet - m_EditorClassIdentifier: Assembly-CSharp::TD.Towers.ConstructionPhaseSet - phases: - - {fileID: 562891720401665892, guid: e7be86c29087e99439507b508425b612, type: 3} - - {fileID: 3284400382278582069, guid: c6dabc822d0afb746adc08fb8602c2b4, type: 3} - - {fileID: 2161157853692362223, guid: d00c71c0cfc7e8744b9f8c1d48c2d256, type: 3} diff --git a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstructionSet.asset.meta b/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstructionSet.asset.meta deleted file mode 100644 index 3832c3f..0000000 --- a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstructionSet.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: ed951755c09d6d0479b4fd924b6915da -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_1.prefab b/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_1.prefab deleted file mode 100644 index 70ca06b..0000000 --- a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_1.prefab +++ /dev/null @@ -1,114 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &562891720401665892 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 5433206400477731590} - - component: {fileID: 3041202948021905482} - - component: {fileID: 2318454595080774531} - - component: {fileID: 2971339723339766249} - m_Layer: 0 - m_Name: DefaultConstruction_Phase_1 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &5433206400477731590 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 562891720401665892} - 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: 0.1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &3041202948021905482 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 562891720401665892} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &2318454595080774531 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 562891720401665892} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - 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: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, 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!65 &2971339723339766249 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 562891720401665892} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: 0, z: 0} diff --git a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_1.prefab.meta b/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_1.prefab.meta deleted file mode 100644 index 684c909..0000000 --- a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_1.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: e7be86c29087e99439507b508425b612 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_2.prefab b/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_2.prefab deleted file mode 100644 index 43ed50f..0000000 --- a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_2.prefab +++ /dev/null @@ -1,114 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &3284400382278582069 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3820746952356246079} - - component: {fileID: 3350984935134180217} - - component: {fileID: 6336690892943026752} - - component: {fileID: 2003287843732108245} - m_Layer: 0 - m_Name: DefaultConstruction_Phase_2 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &3820746952356246079 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3284400382278582069} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1.5, y: 0.5, z: 1.5} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &3350984935134180217 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3284400382278582069} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &6336690892943026752 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3284400382278582069} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - 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: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, 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!65 &2003287843732108245 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3284400382278582069} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: 0, z: 0} diff --git a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_2.prefab.meta b/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_2.prefab.meta deleted file mode 100644 index bb668c4..0000000 --- a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_2.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: c6dabc822d0afb746adc08fb8602c2b4 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_3.prefab b/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_3.prefab deleted file mode 100644 index 0c380ed..0000000 --- a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_3.prefab +++ /dev/null @@ -1,114 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &2161157853692362223 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 6591719589271492770} - - component: {fileID: 3693505870455731207} - - component: {fileID: 2366594505425509977} - - component: {fileID: 5474707419433840976} - m_Layer: 0 - m_Name: DefaultConstruction_Phase_3 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &6591719589271492770 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2161157853692362223} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1.75, y: 1, z: 1.75} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &3693505870455731207 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2161157853692362223} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &2366594505425509977 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2161157853692362223} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - 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: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, 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!65 &5474707419433840976 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2161157853692362223} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: 0, z: 0} diff --git a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_3.prefab.meta b/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_3.prefab.meta deleted file mode 100644 index dc59d87..0000000 --- a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_3.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: d00c71c0cfc7e8744b9f8c1d48c2d256 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: From 49ac784f6d1a22f23a3e9fab948ed538c213f04c Mon Sep 17 00:00:00 2001 From: Ian Woods Date: Mon, 6 Jul 2026 11:23:42 -0700 Subject: [PATCH 10/58] VFX graph for basic dust --- Assets/_Project/Art/VFX/towers.meta | 8 + .../towers/vfx_tower_impact_dust_burst.vfx | 2676 +++++++++++++++++ .../vfx_tower_impact_dust_burst.vfx.meta | 15 + 3 files changed, 2699 insertions(+) create mode 100644 Assets/_Project/Art/VFX/towers.meta create mode 100644 Assets/_Project/Art/VFX/towers/vfx_tower_impact_dust_burst.vfx create mode 100644 Assets/_Project/Art/VFX/towers/vfx_tower_impact_dust_burst.vfx.meta diff --git a/Assets/_Project/Art/VFX/towers.meta b/Assets/_Project/Art/VFX/towers.meta new file mode 100644 index 0000000..1c1c6e3 --- /dev/null +++ b/Assets/_Project/Art/VFX/towers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f2d17bc871279624da92e209e890fee4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Art/VFX/towers/vfx_tower_impact_dust_burst.vfx b/Assets/_Project/Art/VFX/towers/vfx_tower_impact_dust_burst.vfx new file mode 100644 index 0000000..6e85742 --- /dev/null +++ b/Assets/_Project/Art/VFX/towers/vfx_tower_impact_dust_burst.vfx @@ -0,0 +1,2676 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &114340500867371532 +MonoBehaviour: + m_ObjectHideFlags: 1 + 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: d01270efd3285ea4a9d6c555cb0a8027, type: 3} + m_Name: VFXUI + m_EditorClassIdentifier: + groupInfos: + - title: Burst + position: + serializedVersion: 2 + x: 263 + y: 295 + width: 475 + height: 2220 + contents: + - model: {fileID: 8926484042661614700} + id: 0 + isStickyNote: 0 + - model: {fileID: 8926484042661614707} + id: 0 + isStickyNote: 0 + - model: {fileID: 8926484042661614756} + id: 0 + isStickyNote: 0 + - model: {fileID: 8926484042661614775} + id: 0 + isStickyNote: 0 + stickyNoteInfos: [] + categories: [] + uiBounds: + serializedVersion: 2 + x: 263 + y: 295 + width: 475 + height: 2220 +--- !u!114 &114350483966674976 +MonoBehaviour: + m_ObjectHideFlags: 1 + 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: 7d4c867f6b72b714dbb5fd1780afe208, type: 3} + m_Name: 03_Simple_Burst + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614700} + - {fileID: 8926484042661614707} + - {fileID: 8926484042661614756} + - {fileID: 8926484042661614775} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_UIInfos: {fileID: 114340500867371532} + m_CustomAttributes: [] + m_ParameterInfo: [] + m_ImportDependencies: [] + m_GraphVersion: 19 + m_ResourceVersion: 1 + m_SubgraphDependencies: [] + m_CategoryPath: +--- !u!2058629511 &8926484042661614527 +VisualEffectResource: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: 03_Simple_Burst + m_Graph: {fileID: 114350483966674976} + m_Infos: + m_RendererSettings: + motionVectorGenerationMode: 0 + shadowCastingMode: 0 + m_CullingFlags: 3 + m_UpdateMode: 0 + m_PreWarmDeltaTime: 0.05 + m_PreWarmStepCount: 0 + m_InitialEventName: OnPlay + m_InstancingMode: 0 + m_InstancingCapacity: 64 +--- !u!114 &8926484042661614700 +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: 73a13919d81fb7444849bae8b5c812a2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674976} + m_Children: + - {fileID: 8926484042661614703} + m_UIPosition: {x: 289, y: 354} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614879} + m_OutputSlots: [] + m_Label: Spawn system + m_Data: {fileID: 8926484042661614702} + m_InputFlowSlot: + - link: [] + - link: [] + m_OutputFlowSlot: + - link: + - context: {fileID: 8926484042661614707} + slotIndex: 0 + loopDuration: 1 + loopCount: 0 + delayBeforeLoop: 0 + delayAfterLoop: 0 +--- !u!114 &8926484042661614702 +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: f68759077adc0b143b6e1c101e82065e, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + title: + m_Owners: + - {fileID: 8926484042661614700} +--- !u!114 &8926484042661614703 +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: 5e382412bb691334bb79457a6c127924, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614700} + m_Children: [] + m_UIPosition: {x: 0, y: 2} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614704} + - {fileID: 8926484042661614705} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614706} + repeat: 0 + spawnMode: 0 + delayMode: 0 +--- !u!114 &8926484042661614704 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614704} + m_MasterData: + m_Owner: {fileID: 8926484042661614703} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 128 + m_Space: -1 + m_Property: + name: Count + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614705 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614705} + m_MasterData: + m_Owner: {fileID: 8926484042661614703} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0 + m_Space: -1 + m_Property: + name: Delay + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614706 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614706} + m_MasterData: + m_Owner: {fileID: 8926484042661614703} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614707 +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: 9dfea48843f53fc438eabc12a3a30abc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674976} + m_Children: + - {fileID: 8926484042661614722} + - {fileID: 8926484042661614956} + - {fileID: 8926484042661614912} + m_UIPosition: {x: 289, y: 800} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614880} + - {fileID: 8926484042661614889} + m_OutputSlots: [] + m_Label: Initialize Particles + m_Data: {fileID: 8926484042661614721} + m_InputFlowSlot: + - link: + - context: {fileID: 8926484042661614700} + slotIndex: 0 + m_OutputFlowSlot: + - link: + - context: {fileID: 8926484042661614756} + slotIndex: 0 +--- !u!114 &8926484042661614721 +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: d78581a96eae8bf4398c282eb0b098bd, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + title: Simple Burst + m_Owners: + - {fileID: 8926484042661614707} + - {fileID: 8926484042661614756} + - {fileID: 8926484042661614775} + dataType: 0 + capacity: 128 + stripCapacity: 1 + particlePerStripCount: 32 + needsComputeBounds: 0 + boundsMode: 0 + m_Space: 1 +--- !u!114 &8926484042661614722 +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: a971fa2e110a0ac42ac1d8dae408704b, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614707} + m_Children: [] + m_UIPosition: {x: 292.6464, y: 1481.9946} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614723} + - {fileID: 8926484042661614724} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614725} + attribute: lifetime + Composition: 0 + Source: 0 + Random: 2 + channels: 6 +--- !u!114 &8926484042661614723 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614723} + m_MasterData: + m_Owner: {fileID: 8926484042661614722} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0.5 + m_Space: -1 + m_Property: + name: A + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614724 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614724} + m_MasterData: + m_Owner: {fileID: 8926484042661614722} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 1 + m_Space: -1 + m_Property: + name: B + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614725 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614725} + m_MasterData: + m_Owner: {fileID: 8926484042661614722} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614756 +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: 2dc095764ededfa4bb32fa602511ea4b, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674976} + m_Children: + - {fileID: 8926484042661614922} + - {fileID: 8926484042661614929} + m_UIPosition: {x: 289, y: 1535} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: [] + m_OutputSlots: [] + m_Label: Update Particles + m_Data: {fileID: 8926484042661614721} + m_InputFlowSlot: + - link: + - context: {fileID: 8926484042661614707} + slotIndex: 0 + m_OutputFlowSlot: + - link: + - context: {fileID: 8926484042661614775} + slotIndex: 0 + integration: 0 + angularIntegration: 0 + ageParticles: 1 + reapParticles: 1 + skipZeroDeltaUpdate: 0 +--- !u!114 &8926484042661614775 +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: a0b9e6b9139e58d4c957ec54595da7d3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674976} + m_Children: + - {fileID: 8926484042661614779} + - {fileID: 8926484042661614952} + - {fileID: 8926484042661614792} + m_UIPosition: {x: 289, y: 1885} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614776} + m_OutputSlots: [] + m_Label: Render Quad + m_Data: {fileID: 8926484042661614721} + m_InputFlowSlot: + - link: + - context: {fileID: 8926484042661614756} + slotIndex: 0 + m_OutputFlowSlot: + - link: [] + blendMode: 1 + cullMode: 0 + zWriteMode: 0 + zTestMode: 0 + useAlphaClipping: 0 + generateMotionVector: 0 + excludeFromTUAndAA: 0 + sortingPriority: 0 + m_SubOutputs: + - {fileID: 8926484042661614781} + - {fileID: 8926484042661614955} + useBaseColorMap: 3 + colorMapping: 0 + uvMode: 0 + flipbookLayout: 0 + flipbookBlendFrames: 0 + flipbookMotionVectors: 0 + useSoftParticle: 0 + vfxSystemSortPriority: 0 + sort: 1 + sortMode: 1 + revertSorting: 0 + indirectDraw: 0 + computeCulling: 0 + frustumCulling: 0 + castShadows: 0 + useExposureWeight: 0 + enableRayTracing: 0 + decimationFactor: 1 + raytracedScaleMode: 0 + needsOwnSort: 0 + needsOwnAabbBuffer: 0 + shaderGraph: {fileID: 0} + materialSettings: + m_PropertyNames: [] + m_PropertyValues: [] + renderQueue: -1 + primitiveType: 1 + useGeometryShader: 0 +--- !u!114 &8926484042661614776 +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: 70a331b1d86cc8d4aa106ccbe0da5852, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614776} + m_MasterData: + m_Owner: {fileID: 8926484042661614775} + m_Value: + m_Type: + m_SerializableType: UnityEngine.Texture2D, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"obj":{"fileID":2800000,"guid":"8aafaa78fe944854997fef757ff4ba72","type":3}}' + m_Space: -1 + m_Property: + name: mainTexture + m_serializedType: + m_SerializableType: UnityEngine.Texture2D, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614779 +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: d16c6aeaef944094b9a1633041804207, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614775} + m_Children: [] + m_UIPosition: {x: 292.6464, y: 1481.9946} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: [] + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614780} + mode: 0 + axes: 4 + faceRay: 1 +--- !u!114 &8926484042661614780 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614780} + m_MasterData: + m_Owner: {fileID: 8926484042661614779} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614781 +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: 081ffb0090424ba4cb05370a42ead6b9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + opaqueRenderQueue: 0 + transparentRenderQueue: 1 +--- !u!114 &8926484042661614792 +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: 01ec2c1930009b04ea08905b47262415, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614775} + m_Children: [] + m_UIPosition: {x: 508.1385, y: 271.34802} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614793} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614794} + attribute: color + Composition: 2 + AlphaComposition: 0 + SampleMode: 0 + Mode: 1 + ColorMode: 3 + channels: 6 +--- !u!114 &8926484042661614793 +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: 76f778ff57c4e8145b9681fe3268d8e9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614793} + m_MasterData: + m_Owner: {fileID: 8926484042661614792} + m_Value: + m_Type: + m_SerializableType: UnityEngine.Gradient, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"colorKeys":[{"color":{"r":0.973445475101471,"g":0.5209956765174866,"b":0.0021246890537440778,"a":1.0},"time":0.5000076293945313},{"color":{"r":0.2158605307340622,"g":0.6866854429244995,"b":1.0,"a":1.0},"time":0.5020981431007385}],"alphaKeys":[{"alpha":1.0,"time":0.0},{"alpha":1.0,"time":0.800000011920929},{"alpha":0.0,"time":1.0}],"gradientMode":0}' + m_Space: -1 + m_Property: + name: Color + m_serializedType: + m_SerializableType: UnityEngine.Gradient, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614794 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614794} + m_MasterData: + m_Owner: {fileID: 8926484042661614792} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614879 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614879} + m_MasterData: + m_Owner: {fileID: 8926484042661614700} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 2 + m_Space: -1 + m_Property: + name: LoopDuration + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614880 +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: 1b605c022ee79394a8a776c0869b3f9a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614881} + - {fileID: 8926484042661614885} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614880} + m_MasterData: + m_Owner: {fileID: 8926484042661614707} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.AABox, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"center":{"x":0.0,"y":-2.0,"z":0.0},"size":{"x":7.0,"y":8.0,"z":7.0}}' + m_Space: 0 + m_Property: + name: bounds + m_serializedType: + m_SerializableType: UnityEditor.VFX.AABox, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614881 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614880} + m_Children: + - {fileID: 8926484042661614882} + - {fileID: 8926484042661614883} + - {fileID: 8926484042661614884} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614880} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: center + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614882 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614881} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614880} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614883 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614881} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614880} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614884 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614881} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614880} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614885 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614880} + m_Children: + - {fileID: 8926484042661614886} + - {fileID: 8926484042661614887} + - {fileID: 8926484042661614888} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614880} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: size + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614886 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614885} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614880} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614887 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614885} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614880} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614888 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614885} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614880} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614889 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614890} + - {fileID: 8926484042661614891} + - {fileID: 8926484042661614892} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614889} + m_MasterData: + m_Owner: {fileID: 8926484042661614707} + m_Value: + m_Type: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"x":0.5,"y":0.5,"z":0.5}' + m_Space: -1 + m_Property: + name: boundsPadding + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614890 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614889} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614889} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614891 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614889} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614889} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614892 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614889} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614889} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614912 +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: 26096dfac7c062b4b94c293605ba085e, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614707} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614913} + - {fileID: 8926484042661614918} + - {fileID: 8926484042661614919} + - {fileID: 8926484042661614920} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614921} + composition: 0 + speedMode: 1 +--- !u!114 &8926484042661614913 +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: e8f2b4a846fd4c14a893cde576ad172b, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614914} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614913} + m_MasterData: + m_Owner: {fileID: 8926484042661614912} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.DirectionType, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"direction":{"x":0.0,"y":1.0,"z":0.0}}' + m_Space: 0 + m_Property: + name: Direction + m_serializedType: + m_SerializableType: UnityEditor.VFX.DirectionType, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614914 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614913} + m_Children: + - {fileID: 8926484042661614915} + - {fileID: 8926484042661614916} + - {fileID: 8926484042661614917} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614913} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: direction + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614915 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614914} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614913} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614916 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614914} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614913} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614917 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614914} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614913} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614918 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614918} + m_MasterData: + m_Owner: {fileID: 8926484042661614912} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0.5 + m_Space: -1 + m_Property: + name: MinSpeed + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614919 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614919} + m_MasterData: + m_Owner: {fileID: 8926484042661614912} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 4.5 + m_Space: -1 + m_Property: + name: MaxSpeed + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614920 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614920} + m_MasterData: + m_Owner: {fileID: 8926484042661614912} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0 + m_Space: -1 + m_Property: + name: DirectionBlend + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614921 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614921} + m_MasterData: + m_Owner: {fileID: 8926484042661614912} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614922 +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: e5dce54ae3368c042b26ab1f305e15b2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614756} + m_Children: [] + m_UIPosition: {x: 0, y: 2} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614923} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614928} +--- !u!114 &8926484042661614923 +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: a9f9544b71b7dab44a4644b6807e8bf6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614924} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614923} + m_MasterData: + m_Owner: {fileID: 8926484042661614922} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.Vector, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"vector":{"x":0.0,"y":-9.8100004196167,"z":0.0}}' + m_Space: 1 + m_Property: + name: Force + m_serializedType: + m_SerializableType: UnityEditor.VFX.Vector, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614924 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614923} + m_Children: + - {fileID: 8926484042661614925} + - {fileID: 8926484042661614926} + - {fileID: 8926484042661614927} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614923} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: vector + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614925 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614924} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614923} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614926 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614924} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614923} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614927 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614924} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614923} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614928 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614928} + m_MasterData: + m_Owner: {fileID: 8926484042661614922} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614929 +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: b294673e879f9cf449cc9de536818ea9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614756} + m_Children: [] + m_UIPosition: {x: 0, y: 77} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614930} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614931} + UseParticleSize: 0 +--- !u!114 &8926484042661614930 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614930} + m_MasterData: + m_Owner: {fileID: 8926484042661614929} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0.5 + m_Space: -1 + m_Property: + name: dragCoefficient + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614931 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614931} + m_MasterData: + m_Owner: {fileID: 8926484042661614929} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614952 +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: 01ec2c1930009b04ea08905b47262415, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614775} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614953} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614954} + attribute: size + Composition: 2 + AlphaComposition: 0 + SampleMode: 0 + Mode: 1 + ColorMode: 3 + channels: 6 +--- !u!114 &8926484042661614953 +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: c117b74c5c58db542bffe25c78fe92db, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614953} + m_MasterData: + m_Owner: {fileID: 8926484042661614952} + m_Value: + m_Type: + m_SerializableType: UnityEngine.AnimationCurve, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"frames":[{"time":0.0,"value":0.0,"inTangent":6.615680694580078,"outTangent":6.615680694580078,"tangentMode":0,"leftTangentMode":0,"rightTangentMode":0,"broken":false},{"time":0.10000000149011612,"value":1.5,"inTangent":0.06686528027057648,"outTangent":0.06686528027057648,"tangentMode":0,"leftTangentMode":0,"rightTangentMode":0,"broken":false},{"time":1.0,"value":0.0,"inTangent":-1.6666667461395264,"outTangent":-1.6666667461395264,"tangentMode":0,"leftTangentMode":1,"rightTangentMode":1,"broken":false}],"preWrapMode":8,"postWrapMode":8,"version":1}' + m_Space: -1 + m_Property: + name: Size + m_serializedType: + m_SerializableType: UnityEngine.AnimationCurve, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614954 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614954} + m_MasterData: + m_Owner: {fileID: 8926484042661614952} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614955 +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: 388ad3b1dc9c6ae45b630f914fab638f, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &8926484042661614956 +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: fb1f6794ace8b0c4592af9c5604cddbf, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614707} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614957} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614974} + compositionPosition: 0 + compositionAxes: 0 + compositionDirection: 0 + positionMode: 0 + spawnMode: 0 + shape: 0 + heightMode: 1 + applyOrientation: 1 + killOutliers: 0 + projectionSteps: 2 +--- !u!114 &8926484042661614957 +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: 1b605c022ee79394a8a776c0869b3f9a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614958} + - {fileID: 8926484042661614973} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 8926484042661614956} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.TArcSphere, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"sphere":{"transform":{"position":{"x":0.0,"y":0.0,"z":0.0},"angles":{"x":0.0,"y":0.0,"z":0.0},"scale":{"x":1.0,"y":1.0,"z":1.0}},"radius":0.15000000596046449},"arc":6.28000020980835}' + m_Space: 0 + m_Property: + name: arcSphere + m_serializedType: + m_SerializableType: UnityEditor.VFX.TArcSphere, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614958 +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: 1b605c022ee79394a8a776c0869b3f9a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614957} + m_Children: + - {fileID: 8926484042661614959} + - {fileID: 8926484042661614972} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: sphere + m_serializedType: + m_SerializableType: UnityEditor.VFX.TSphere, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614959 +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: 3e3f628d80ffceb489beac74258f9cf7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614958} + m_Children: + - {fileID: 8926484042661614960} + - {fileID: 8926484042661614964} + - {fileID: 8926484042661614968} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: transform + m_serializedType: + m_SerializableType: UnityEditor.VFX.Transform, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614960 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614959} + m_Children: + - {fileID: 8926484042661614961} + - {fileID: 8926484042661614962} + - {fileID: 8926484042661614963} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: position + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614961 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614960} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614962 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614960} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614963 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614960} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614964 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614959} + m_Children: + - {fileID: 8926484042661614965} + - {fileID: 8926484042661614966} + - {fileID: 8926484042661614967} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: angles + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614965 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614964} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614966 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614964} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614967 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614964} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614968 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614959} + m_Children: + - {fileID: 8926484042661614969} + - {fileID: 8926484042661614970} + - {fileID: 8926484042661614971} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: scale + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614969 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614968} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614970 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614968} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614971 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614968} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614972 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614958} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: radius + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614973 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614957} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: arc + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614974 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614974} + m_MasterData: + m_Owner: {fileID: 8926484042661614956} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] diff --git a/Assets/_Project/Art/VFX/towers/vfx_tower_impact_dust_burst.vfx.meta b/Assets/_Project/Art/VFX/towers/vfx_tower_impact_dust_burst.vfx.meta new file mode 100644 index 0000000..341451f --- /dev/null +++ b/Assets/_Project/Art/VFX/towers/vfx_tower_impact_dust_burst.vfx.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: 9be8cca0a26062700863614752c39b8b +VisualEffectImporter: + externalObjects: {} + serializedVersion: 2 + template: + name: + category: + description: + icon: {instanceID: 0} + thumbnail: {instanceID: 0} + useAsTemplate: 0 + userData: + assetBundleName: + assetBundleVariant: From da4f72968125701f5954d8b2084b453310c27f5d Mon Sep 17 00:00:00 2001 From: Ian Woods Date: Mon, 6 Jul 2026 13:20:23 -0700 Subject: [PATCH 11/58] rudimentary dust and shockwave --- .../towers/vfx_tower_impact_dust_burst.vfx | 3046 ++++++++++++++++- .../TowerImpactDust.prefab | 152 + .../TowerImpactDust.prefab.meta | 7 + .../Prefabs/Towers/Tower_TeslaCoil.prefab | 2 +- Assets/_Project/Scenes/Levels/9Player.unity | 151 + 5 files changed, 3321 insertions(+), 37 deletions(-) create mode 100644 Assets/_Project/Prefabs/Towers/Tower Construction Sets/TowerImpactDust.prefab create mode 100644 Assets/_Project/Prefabs/Towers/Tower Construction Sets/TowerImpactDust.prefab.meta diff --git a/Assets/_Project/Art/VFX/towers/vfx_tower_impact_dust_burst.vfx b/Assets/_Project/Art/VFX/towers/vfx_tower_impact_dust_burst.vfx index 6e85742..a327ea6 100644 --- a/Assets/_Project/Art/VFX/towers/vfx_tower_impact_dust_burst.vfx +++ b/Assets/_Project/Art/VFX/towers/vfx_tower_impact_dust_burst.vfx @@ -16,10 +16,10 @@ MonoBehaviour: - title: Burst position: serializedVersion: 2 - x: 263 + x: 264 y: 295 - width: 475 - height: 2220 + width: 474 + height: 2591 contents: - model: {fileID: 8926484042661614700} id: 0 @@ -37,10 +37,10 @@ MonoBehaviour: categories: [] uiBounds: serializedVersion: 2 - x: 263 + x: 264 y: 295 - width: 475 - height: 2220 + width: 1232 + height: 2643 --- !u!114 &114350483966674976 MonoBehaviour: m_ObjectHideFlags: 1 @@ -51,7 +51,7 @@ MonoBehaviour: m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 7d4c867f6b72b714dbb5fd1780afe208, type: 3} - m_Name: 03_Simple_Burst + m_Name: vfx_tower_impact_dust_burst m_EditorClassIdentifier: m_UIIgnoredErrors: [] m_Parent: {fileID: 0} @@ -60,6 +60,10 @@ MonoBehaviour: - {fileID: 8926484042661614707} - {fileID: 8926484042661614756} - {fileID: 8926484042661614775} + - {fileID: 8926484042661614986} + - {fileID: 8926484042661614992} + - {fileID: 8926484042661615007} + - {fileID: 8926484042661615075} m_UIPosition: {x: 0, y: 0} m_UICollapsed: 1 m_UISuperCollapsed: 0 @@ -77,7 +81,7 @@ VisualEffectResource: m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_Name: 03_Simple_Burst + m_Name: vfx_tower_impact_dust_burst m_Graph: {fileID: 114350483966674976} m_Infos: m_RendererSettings: @@ -111,8 +115,9 @@ MonoBehaviour: m_UISuperCollapsed: 0 m_InputSlots: - {fileID: 8926484042661614879} + - {fileID: 8926484042661614975} m_OutputSlots: [] - m_Label: Spawn system + m_Label: Dust Cloud Spawn System m_Data: {fileID: 8926484042661614702} m_InputFlowSlot: - link: [] @@ -122,7 +127,7 @@ MonoBehaviour: - context: {fileID: 8926484042661614707} slotIndex: 0 loopDuration: 1 - loopCount: 0 + loopCount: 1 delayBeforeLoop: 0 delayAfterLoop: 0 --- !u!114 &8926484042661614702 @@ -198,7 +203,7 @@ MonoBehaviour: m_Type: m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - m_SerializableObject: 128 + m_SerializableObject: 4000 m_Space: -1 m_Property: name: Count @@ -293,6 +298,7 @@ MonoBehaviour: - {fileID: 8926484042661614722} - {fileID: 8926484042661614956} - {fileID: 8926484042661614912} + - {fileID: 8926484042661614983} m_UIPosition: {x: 289, y: 800} m_UICollapsed: 0 m_UISuperCollapsed: 0 @@ -334,7 +340,7 @@ MonoBehaviour: - {fileID: 8926484042661614756} - {fileID: 8926484042661614775} dataType: 0 - capacity: 128 + capacity: 4000 stripCapacity: 1 particlePerStripCount: 32 needsComputeBounds: 0 @@ -394,7 +400,7 @@ MonoBehaviour: m_Type: m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - m_SerializableObject: 0.5 + m_SerializableObject: 3 m_Space: -1 m_Property: name: A @@ -428,7 +434,7 @@ MonoBehaviour: m_Type: m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - m_SerializableObject: 1 + m_SerializableObject: 5 m_Space: -1 m_Property: name: B @@ -488,7 +494,7 @@ MonoBehaviour: m_Children: - {fileID: 8926484042661614922} - {fileID: 8926484042661614929} - m_UIPosition: {x: 289, y: 1535} + m_UIPosition: {x: 289, y: 1745} m_UICollapsed: 0 m_UISuperCollapsed: 0 m_InputSlots: [] @@ -526,7 +532,7 @@ MonoBehaviour: - {fileID: 8926484042661614779} - {fileID: 8926484042661614952} - {fileID: 8926484042661614792} - m_UIPosition: {x: 289, y: 1885} + m_UIPosition: {x: 289, y: 2278} m_UICollapsed: 0 m_UISuperCollapsed: 0 m_InputSlots: @@ -604,7 +610,7 @@ MonoBehaviour: m_Type: m_SerializableType: UnityEngine.Texture2D, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - m_SerializableObject: '{"obj":{"fileID":2800000,"guid":"8aafaa78fe944854997fef757ff4ba72","type":3}}' + m_SerializableObject: '{"obj":{"fileID":10300,"guid":"0000000000000000f000000000000000","type":0}}' m_Space: -1 m_Property: name: mainTexture @@ -684,14 +690,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 081ffb0090424ba4cb05370a42ead6b9, type: 3} m_Name: m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - opaqueRenderQueue: 0 - transparentRenderQueue: 1 --- !u!114 &8926484042661614792 MonoBehaviour: m_ObjectHideFlags: 0 @@ -747,7 +745,7 @@ MonoBehaviour: m_Type: m_SerializableType: UnityEngine.Gradient, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - m_SerializableObject: '{"colorKeys":[{"color":{"r":0.973445475101471,"g":0.5209956765174866,"b":0.0021246890537440778,"a":1.0},"time":0.5000076293945313},{"color":{"r":0.2158605307340622,"g":0.6866854429244995,"b":1.0,"a":1.0},"time":0.5020981431007385}],"alphaKeys":[{"alpha":1.0,"time":0.0},{"alpha":1.0,"time":0.800000011920929},{"alpha":0.0,"time":1.0}],"gradientMode":0}' + m_SerializableObject: '{"colorKeys":[{"color":{"r":0.8799999952316284,"g":0.9200000166893005,"b":0.9700000286102295,"a":1.0},"time":0.0},{"color":{"r":0.550000011920929,"g":0.6200000047683716,"b":0.7200000286102295,"a":1.0},"time":1.0}],"alphaKeys":[{"alpha":1.0,"time":0.3535515367984772},{"alpha":0.0,"time":1.0}],"gradientMode":0}' m_Space: -1 m_Property: name: Color @@ -815,7 +813,7 @@ MonoBehaviour: m_Type: m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - m_SerializableObject: 2 + m_SerializableObject: 0.15 m_Space: -1 m_Property: name: LoopDuration @@ -1489,7 +1487,7 @@ MonoBehaviour: m_Type: m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - m_SerializableObject: 0.5 + m_SerializableObject: 2 m_Space: -1 m_Property: name: MinSpeed @@ -1649,7 +1647,7 @@ MonoBehaviour: m_Type: m_SerializableType: UnityEditor.VFX.Vector, Unity.VisualEffectGraph.Editor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - m_SerializableObject: '{"vector":{"x":0.0,"y":-9.8100004196167,"z":0.0}}' + m_SerializableObject: '{"vector":{"x":0.0,"y":-1.0,"z":0.0}}' m_Space: 1 m_Property: name: Force @@ -1876,7 +1874,7 @@ MonoBehaviour: m_Type: m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - m_SerializableObject: 0.5 + m_SerializableObject: 0.4 m_Space: -1 m_Property: name: dragCoefficient @@ -2029,6 +2027,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 388ad3b1dc9c6ae45b630f914fab638f, type: 3} m_Name: m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 --- !u!114 &8926484042661614956 MonoBehaviour: m_ObjectHideFlags: 0 @@ -2055,7 +2059,7 @@ MonoBehaviour: compositionPosition: 0 compositionAxes: 0 compositionDirection: 0 - positionMode: 0 + positionMode: 1 spawnMode: 0 shape: 0 heightMode: 1 @@ -2080,7 +2084,7 @@ MonoBehaviour: - {fileID: 8926484042661614958} - {fileID: 8926484042661614973} m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 + m_UICollapsed: 0 m_UISuperCollapsed: 0 m_MasterSlot: {fileID: 8926484042661614957} m_MasterData: @@ -2089,7 +2093,7 @@ MonoBehaviour: m_Type: m_SerializableType: UnityEditor.VFX.TArcSphere, Unity.VisualEffectGraph.Editor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - m_SerializableObject: '{"sphere":{"transform":{"position":{"x":0.0,"y":0.0,"z":0.0},"angles":{"x":0.0,"y":0.0,"z":0.0},"scale":{"x":1.0,"y":1.0,"z":1.0}},"radius":0.15000000596046449},"arc":6.28000020980835}' + m_SerializableObject: '{"sphere":{"transform":{"position":{"x":0.0,"y":0.0,"z":0.0},"angles":{"x":0.0,"y":0.0,"z":90.0},"scale":{"x":1.0,"y":1.0,"z":1.0}},"radius":0.15000000596046449},"arc":3.1500000953674318}' m_Space: 0 m_Property: name: arcSphere @@ -2116,7 +2120,7 @@ MonoBehaviour: - {fileID: 8926484042661614959} - {fileID: 8926484042661614972} m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 + m_UICollapsed: 0 m_UISuperCollapsed: 0 m_MasterSlot: {fileID: 8926484042661614957} m_MasterData: @@ -2152,7 +2156,7 @@ MonoBehaviour: - {fileID: 8926484042661614964} - {fileID: 8926484042661614968} m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 + m_UICollapsed: 0 m_UISuperCollapsed: 0 m_MasterSlot: {fileID: 8926484042661614957} m_MasterData: @@ -2323,7 +2327,7 @@ MonoBehaviour: - {fileID: 8926484042661614966} - {fileID: 8926484042661614967} m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 + m_UICollapsed: 0 m_UISuperCollapsed: 0 m_MasterSlot: {fileID: 8926484042661614957} m_MasterData: @@ -2674,3 +2678,2973 @@ MonoBehaviour: PublicKeyToken=b77a5c561934e089 m_Direction: 0 m_LinkedSlots: [] +--- !u!114 &8926484042661614975 +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: 4d246e354feb93041a837a9ef59437cb, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotInt + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614975} + m_MasterData: + m_Owner: {fileID: 8926484042661614700} + m_Value: + m_Type: + m_SerializableType: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 1 + m_Space: -1 + m_Property: + name: LoopCount + m_serializedType: + m_SerializableType: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614983 +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: a971fa2e110a0ac42ac1d8dae408704b, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.Block.SetAttribute + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614707} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614984} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614985} + attribute: size + Composition: 0 + Source: 0 + Random: 0 + channels: 6 +--- !u!114 &8926484042661614984 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614984} + m_MasterData: + m_Owner: {fileID: 8926484042661614983} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0.04 + m_Space: -1 + m_Property: + name: _Size + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614985 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotBool + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614985} + m_MasterData: + m_Owner: {fileID: 8926484042661614983} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614986 +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: 73a13919d81fb7444849bae8b5c812a2, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXBasicSpawner + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674976} + m_Children: + - {fileID: 8926484042661614988} + m_UIPosition: {x: 1072, y: 354} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: [] + m_OutputSlots: [] + m_Label: Shockwave Spawn System + m_Data: {fileID: 8926484042661614987} + m_InputFlowSlot: + - link: [] + - link: [] + m_OutputFlowSlot: + - link: + - context: {fileID: 8926484042661614992} + slotIndex: 0 + loopDuration: 0 + loopCount: 0 + delayBeforeLoop: 0 + delayAfterLoop: 0 +--- !u!114 &8926484042661614987 +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: f68759077adc0b143b6e1c101e82065e, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXDataSpawner + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + title: + m_Owners: + - {fileID: 8926484042661614986} +--- !u!114 &8926484042661614988 +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: 5e382412bb691334bb79457a6c127924, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSpawnerBurst + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614986} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614989} + - {fileID: 8926484042661614990} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614991} + repeat: 0 + spawnMode: 0 + delayMode: 0 +--- !u!114 &8926484042661614989 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614989} + m_MasterData: + m_Owner: {fileID: 8926484042661614988} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 1 + m_Space: -1 + m_Property: + name: Count + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614990 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614990} + m_MasterData: + m_Owner: {fileID: 8926484042661614988} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0 + m_Space: -1 + m_Property: + name: Delay + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614991 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotBool + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614991} + m_MasterData: + m_Owner: {fileID: 8926484042661614988} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614992 +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: 9dfea48843f53fc438eabc12a3a30abc, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXBasicInitialize + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674976} + m_Children: + - {fileID: 8926484042661615016} + - {fileID: 8926484042661615121} + m_UIPosition: {x: 1072, y: 845} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614993} + - {fileID: 8926484042661615002} + m_OutputSlots: [] + m_Label: + m_Data: {fileID: 8926484042661615006} + m_InputFlowSlot: + - link: + - context: {fileID: 8926484042661614986} + slotIndex: 0 + m_OutputFlowSlot: + - link: + - context: {fileID: 8926484042661615007} + slotIndex: 0 +--- !u!114 &8926484042661614993 +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: 1b605c022ee79394a8a776c0869b3f9a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlot + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614994} + - {fileID: 8926484042661614998} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614993} + m_MasterData: + m_Owner: {fileID: 8926484042661614992} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.AABox, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"center":{"x":0.0,"y":0.0,"z":0.0},"size":{"x":1.0,"y":1.0,"z":1.0}}' + m_Space: 0 + m_Property: + name: bounds + m_serializedType: + m_SerializableType: UnityEditor.VFX.AABox, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614994 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat3 + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614993} + m_Children: + - {fileID: 8926484042661614995} + - {fileID: 8926484042661614996} + - {fileID: 8926484042661614997} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614993} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: center + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614995 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614994} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614993} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614996 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614994} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614993} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614997 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614994} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614993} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614998 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat3 + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614993} + m_Children: + - {fileID: 8926484042661614999} + - {fileID: 8926484042661615000} + - {fileID: 8926484042661615001} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614993} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: size + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614999 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614998} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614993} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615000 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614998} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614993} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615001 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614998} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614993} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615002 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat3 + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661615003} + - {fileID: 8926484042661615004} + - {fileID: 8926484042661615005} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615002} + m_MasterData: + m_Owner: {fileID: 8926484042661614992} + m_Value: + m_Type: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"x":0.0,"y":0.0,"z":0.0}' + m_Space: -1 + m_Property: + name: boundsPadding + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615003 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615002} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615002} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615004 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615002} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615002} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615005 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615002} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615002} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615006 +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: d78581a96eae8bf4398c282eb0b098bd, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXDataParticle + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + title: + m_Owners: + - {fileID: 8926484042661614992} + - {fileID: 8926484042661615007} + - {fileID: 8926484042661615075} + dataType: 0 + capacity: 1 + stripCapacity: 1 + particlePerStripCount: 128 + needsComputeBounds: 0 + boundsMode: 0 + m_Space: 1 +--- !u!114 &8926484042661615007 +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: 2dc095764ededfa4bb32fa602511ea4b, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXBasicUpdate + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674976} + m_Children: + - {fileID: 8926484042661615055} + - {fileID: 8926484042661615062} + - {fileID: 8926484042661615124} + - {fileID: 8926484042661615127} + m_UIPosition: {x: 1072, y: 1759} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: [] + m_OutputSlots: [] + m_Label: + m_Data: {fileID: 8926484042661615006} + m_InputFlowSlot: + - link: + - context: {fileID: 8926484042661614992} + slotIndex: 0 + m_OutputFlowSlot: + - link: + - context: {fileID: 8926484042661615075} + slotIndex: 0 + integration: 0 + angularIntegration: 0 + ageParticles: 1 + reapParticles: 1 + skipZeroDeltaUpdate: 0 +--- !u!114 &8926484042661615016 +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: fb1f6794ace8b0c4592af9c5604cddbf, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.Block.PositionShape + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614992} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661615371} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661615034} + compositionPosition: 0 + compositionAxes: 0 + compositionDirection: 0 + positionMode: 1 + spawnMode: 0 + shape: 4 + heightMode: 1 + applyOrientation: 1 + killOutliers: 0 + projectionSteps: 2 +--- !u!114 &8926484042661615034 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotBool + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615034} + m_MasterData: + m_Owner: {fileID: 8926484042661615016} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615055 +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: c079bc84df7c7e94f88c8ae0d1b0691d, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.Block.Force + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615007} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661615099} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661615061} + Mode: 0 +--- !u!114 &8926484042661615061 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotBool + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615061} + m_MasterData: + m_Owner: {fileID: 8926484042661615055} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615062 +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: e5dce54ae3368c042b26ab1f305e15b2, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.Block.Gravity + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615007} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661615063} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661615068} +--- !u!114 &8926484042661615063 +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: a9f9544b71b7dab44a4644b6807e8bf6, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotVector + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661615064} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615063} + m_MasterData: + m_Owner: {fileID: 8926484042661615062} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.Vector, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"vector":{"x":0.0,"y":0.0,"z":0.0}}' + m_Space: 0 + m_Property: + name: Force + m_serializedType: + m_SerializableType: UnityEditor.VFX.Vector, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615064 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat3 + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615063} + m_Children: + - {fileID: 8926484042661615065} + - {fileID: 8926484042661615066} + - {fileID: 8926484042661615067} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615063} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: vector + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615065 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615064} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615063} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615066 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615064} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615063} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615067 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615064} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615063} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615068 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotBool + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615068} + m_MasterData: + m_Owner: {fileID: 8926484042661615062} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: False + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615075 +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: a0b9e6b9139e58d4c957ec54595da7d3, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXPlanarPrimitiveOutput + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674976} + m_Children: + - {fileID: 8926484042661615079} + - {fileID: 8926484042661615082} + - {fileID: 8926484042661615085} + m_UIPosition: {x: 1072, y: 2285} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661615076} + m_OutputSlots: [] + m_Label: Render Quad + m_Data: {fileID: 8926484042661615006} + m_InputFlowSlot: + - link: + - context: {fileID: 8926484042661615007} + slotIndex: 0 + m_OutputFlowSlot: + - link: [] + blendMode: 1 + cullMode: 0 + zWriteMode: 0 + zTestMode: 0 + useAlphaClipping: 0 + generateMotionVector: 0 + excludeFromTUAndAA: 0 + sortingPriority: 0 + m_SubOutputs: + - {fileID: 8926484042661615081} + useBaseColorMap: 3 + colorMapping: 0 + uvMode: 0 + flipbookLayout: 0 + flipbookBlendFrames: 0 + flipbookMotionVectors: 0 + useSoftParticle: 0 + vfxSystemSortPriority: 0 + sort: 1 + sortMode: 1 + revertSorting: 0 + indirectDraw: 0 + computeCulling: 0 + frustumCulling: 0 + castShadows: 0 + useExposureWeight: 0 + enableRayTracing: 0 + decimationFactor: 1 + raytracedScaleMode: 0 + needsOwnSort: 0 + needsOwnAabbBuffer: 0 + shaderGraph: {fileID: 0} + materialSettings: + m_PropertyNames: [] + m_PropertyValues: [] + renderQueue: -1 + primitiveType: 1 + useGeometryShader: 0 +--- !u!114 &8926484042661615076 +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: 70a331b1d86cc8d4aa106ccbe0da5852, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotTexture2D + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615076} + m_MasterData: + m_Owner: {fileID: 8926484042661615075} + m_Value: + m_Type: + m_SerializableType: UnityEngine.Texture2D, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"obj":{"fileID":10300,"guid":"0000000000000000f000000000000000","type":0}}' + m_Space: -1 + m_Property: + name: mainTexture + m_serializedType: + m_SerializableType: UnityEngine.Texture2D, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615079 +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: d16c6aeaef944094b9a1633041804207, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.Block.Orient + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615075} + m_Children: [] + m_UIPosition: {x: 620.92737, y: 1524.9148} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661615366} + - {fileID: 8926484042661615361} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661615080} + mode: 4 + axes: 2 + faceRay: 1 +--- !u!114 &8926484042661615080 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotBool + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615080} + m_MasterData: + m_Owner: {fileID: 8926484042661615079} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615081 +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: 388ad3b1dc9c6ae45b630f914fab638f, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.VFX.URP.VFXURPSubOutput + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 +--- !u!114 &8926484042661615082 +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: 01ec2c1930009b04ea08905b47262415, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.Block.AttributeFromCurve + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615075} + m_Children: [] + m_UIPosition: {x: 328.281, y: 42.920166} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661615083} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661615084} + attribute: size + Composition: 2 + AlphaComposition: 0 + SampleMode: 0 + Mode: 1 + ColorMode: 3 + channels: 6 +--- !u!114 &8926484042661615083 +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: c117b74c5c58db542bffe25c78fe92db, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotAnimationCurve + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615083} + m_MasterData: + m_Owner: {fileID: 8926484042661615082} + m_Value: + m_Type: + m_SerializableType: UnityEngine.AnimationCurve, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"frames":[{"time":0.0,"value":0.0,"inTangent":6.615680694580078,"outTangent":6.615680694580078,"tangentMode":0,"leftTangentMode":0,"rightTangentMode":0,"broken":false},{"time":0.3052307069301605,"value":1.4977073669433594,"inTangent":0.06686528027057648,"outTangent":0.06686528027057648,"tangentMode":0,"leftTangentMode":0,"rightTangentMode":0,"broken":false},{"time":1.0,"value":0.0,"inTangent":-2.1556901931762697,"outTangent":-2.1556901931762697,"tangentMode":0,"leftTangentMode":1,"rightTangentMode":1,"broken":false}],"preWrapMode":8,"postWrapMode":8,"version":1}' + m_Space: -1 + m_Property: + name: Size + m_serializedType: + m_SerializableType: UnityEngine.AnimationCurve, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615084 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotBool + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615084} + m_MasterData: + m_Owner: {fileID: 8926484042661615082} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615085 +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: 01ec2c1930009b04ea08905b47262415, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.Block.AttributeFromCurve + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615075} + m_Children: [] + m_UIPosition: {x: 836.4195, y: 314.2682} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661615086} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661615087} + attribute: color + Composition: 2 + AlphaComposition: 0 + SampleMode: 0 + Mode: 1 + ColorMode: 3 + channels: 6 +--- !u!114 &8926484042661615086 +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: 76f778ff57c4e8145b9681fe3268d8e9, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotGradient + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615086} + m_MasterData: + m_Owner: {fileID: 8926484042661615085} + m_Value: + m_Type: + m_SerializableType: UnityEngine.Gradient, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"colorKeys":[{"color":{"r":0.8799999952316284,"g":0.9200000166893005,"b":0.9700000286102295,"a":1.0},"time":0.0},{"color":{"r":0.550000011920929,"g":0.6200000047683716,"b":0.7200000286102295,"a":1.0},"time":1.0}],"alphaKeys":[{"alpha":1.0,"time":0.3535515367984772},{"alpha":0.0,"time":1.0}],"gradientMode":0}' + m_Space: -1 + m_Property: + name: Color + m_serializedType: + m_SerializableType: UnityEngine.Gradient, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615087 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotBool + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615087} + m_MasterData: + m_Owner: {fileID: 8926484042661615085} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615099 +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: a9f9544b71b7dab44a4644b6807e8bf6, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotVector + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661615100} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615099} + m_MasterData: + m_Owner: {fileID: 8926484042661615055} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.Vector, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"vector":{"x":0.0,"y":0.0,"z":0.0}}' + m_Space: 0 + m_Property: + name: Force + m_serializedType: + m_SerializableType: UnityEditor.VFX.Vector, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615100 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat3 + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615099} + m_Children: + - {fileID: 8926484042661615101} + - {fileID: 8926484042661615102} + - {fileID: 8926484042661615103} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615099} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: vector + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615101 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615100} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615099} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615102 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615100} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615099} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615103 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615100} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615099} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615121 +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: a971fa2e110a0ac42ac1d8dae408704b, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.Block.SetAttribute + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614992} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661615122} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661615123} + attribute: size + Composition: 0 + Source: 0 + Random: 0 + channels: 6 +--- !u!114 &8926484042661615122 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615122} + m_MasterData: + m_Owner: {fileID: 8926484042661615121} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 10 + m_Space: -1 + m_Property: + name: _Size + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615123 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotBool + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615123} + m_MasterData: + m_Owner: {fileID: 8926484042661615121} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615124 +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: 01ec2c1930009b04ea08905b47262415, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.Block.AttributeFromCurve + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615007} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661615125} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661615126} + attribute: size + Composition: 0 + AlphaComposition: 0 + SampleMode: 0 + Mode: 1 + ColorMode: 3 + channels: 6 +--- !u!114 &8926484042661615125 +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: c117b74c5c58db542bffe25c78fe92db, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotAnimationCurve + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615125} + m_MasterData: + m_Owner: {fileID: 8926484042661615124} + m_Value: + m_Type: + m_SerializableType: UnityEngine.AnimationCurve, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"frames":[{"time":0.0,"value":0.0,"inTangent":2.0,"outTangent":2.0,"tangentMode":0,"leftTangentMode":0,"rightTangentMode":0,"broken":false},{"time":1.0082156658172608,"value":6.703911781311035,"inTangent":0.0,"outTangent":0.0,"tangentMode":0,"leftTangentMode":0,"rightTangentMode":0,"broken":false}],"preWrapMode":8,"postWrapMode":8,"version":1}' + m_Space: -1 + m_Property: + name: Size + m_serializedType: + m_SerializableType: UnityEngine.AnimationCurve, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615126 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotBool + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615126} + m_MasterData: + m_Owner: {fileID: 8926484042661615124} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615127 +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: 01ec2c1930009b04ea08905b47262415, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.Block.AttributeFromCurve + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615007} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661615128} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661615129} + attribute: alpha + Composition: 0 + AlphaComposition: 0 + SampleMode: 0 + Mode: 1 + ColorMode: 3 + channels: 6 +--- !u!114 &8926484042661615128 +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: c117b74c5c58db542bffe25c78fe92db, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotAnimationCurve + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615128} + m_MasterData: + m_Owner: {fileID: 8926484042661615127} + m_Value: + m_Type: + m_SerializableType: UnityEngine.AnimationCurve, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"frames":[{"time":0.0,"value":0.0,"inTangent":2.0,"outTangent":2.0,"tangentMode":0,"leftTangentMode":0,"rightTangentMode":0,"broken":false},{"time":1.0,"value":1.0,"inTangent":0.0,"outTangent":0.0,"tangentMode":0,"leftTangentMode":0,"rightTangentMode":0,"broken":false}],"preWrapMode":8,"postWrapMode":8,"version":1}' + m_Space: -1 + m_Property: + name: Alpha + m_serializedType: + m_SerializableType: UnityEngine.AnimationCurve, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615129 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotBool + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615129} + m_MasterData: + m_Owner: {fileID: 8926484042661615127} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615361 +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: e8f2b4a846fd4c14a893cde576ad172b, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotDirection + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661615362} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615361} + m_MasterData: + m_Owner: {fileID: 8926484042661615079} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.DirectionType, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"direction":{"x":0.0,"y":0.0,"z":1.0}}' + m_Space: 0 + m_Property: + name: AxisX + m_serializedType: + m_SerializableType: UnityEditor.VFX.DirectionType, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615362 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat3 + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615361} + m_Children: + - {fileID: 8926484042661615363} + - {fileID: 8926484042661615364} + - {fileID: 8926484042661615365} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615361} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: direction + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615363 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615362} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615361} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615364 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615362} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615361} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615365 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615362} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615361} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615366 +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: e8f2b4a846fd4c14a893cde576ad172b, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotDirection + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661615367} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615366} + m_MasterData: + m_Owner: {fileID: 8926484042661615079} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.DirectionType, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"direction":{"x":0.0,"y":1.0,"z":0.0}}' + m_Space: 0 + m_Property: + name: AxisZ + m_serializedType: + m_SerializableType: UnityEditor.VFX.DirectionType, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615367 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat3 + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615366} + m_Children: + - {fileID: 8926484042661615368} + - {fileID: 8926484042661615369} + - {fileID: 8926484042661615370} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615366} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: direction + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615368 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615367} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615366} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615369 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615367} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615366} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615370 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615367} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615366} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615371 +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: 1b605c022ee79394a8a776c0869b3f9a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlot + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661615372} + - {fileID: 8926484042661615387} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615371} + m_MasterData: + m_Owner: {fileID: 8926484042661615016} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.TArcCircle, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"circle":{"transform":{"position":{"x":0.0,"y":0.0,"z":0.0},"angles":{"x":0.0,"y":0.0,"z":0.0},"scale":{"x":1.0,"y":1.0,"z":1.0}},"radius":0.0},"arc":6.2831854820251469}' + m_Space: 0 + m_Property: + name: arcCircle + m_serializedType: + m_SerializableType: UnityEditor.VFX.TArcCircle, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615372 +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: 1b605c022ee79394a8a776c0869b3f9a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlot + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615371} + m_Children: + - {fileID: 8926484042661615373} + - {fileID: 8926484042661615386} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615371} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: circle + m_serializedType: + m_SerializableType: UnityEditor.VFX.TCircle, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615373 +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: 3e3f628d80ffceb489beac74258f9cf7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotTransform + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615372} + m_Children: + - {fileID: 8926484042661615374} + - {fileID: 8926484042661615378} + - {fileID: 8926484042661615382} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615371} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: transform + m_serializedType: + m_SerializableType: UnityEditor.VFX.Transform, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615374 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat3 + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615373} + m_Children: + - {fileID: 8926484042661615375} + - {fileID: 8926484042661615376} + - {fileID: 8926484042661615377} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615371} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: position + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615375 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615374} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615371} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615376 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615374} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615371} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615377 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615374} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615371} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615378 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat3 + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615373} + m_Children: + - {fileID: 8926484042661615379} + - {fileID: 8926484042661615380} + - {fileID: 8926484042661615381} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615371} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: angles + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615379 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615378} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615371} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615380 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615378} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615371} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615381 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615378} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615371} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615382 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat3 + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615373} + m_Children: + - {fileID: 8926484042661615383} + - {fileID: 8926484042661615384} + - {fileID: 8926484042661615385} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615371} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: scale + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615383 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615382} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615371} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615384 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615382} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615371} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615385 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615382} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615371} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615386 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615372} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615371} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: radius + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661615387 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661615371} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661615371} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: arc + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] diff --git a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/TowerImpactDust.prefab b/Assets/_Project/Prefabs/Towers/Tower Construction Sets/TowerImpactDust.prefab new file mode 100644 index 0000000..4f47ee9 --- /dev/null +++ b/Assets/_Project/Prefabs/Towers/Tower Construction Sets/TowerImpactDust.prefab @@ -0,0 +1,152 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &5755158003138779588 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5415886315182518892} + - component: {fileID: 312167897979414843} + - component: {fileID: 2180370240332948376} + m_Layer: 0 + m_Name: Burst + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5415886315182518892 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5755158003138779588} + 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: 8962335376457110685} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!2083052967 &312167897979414843 +VisualEffect: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5755158003138779588} + m_Enabled: 1 + m_Asset: {fileID: 8926484042661614526, guid: 9be8cca0a26062700863614752c39b8b, type: 3} + m_InitialEventName: OnPlay + m_InitialEventNameOverriden: 0 + m_StartSeed: 0 + m_ResetSeedOnPlay: 1 + m_AllowInstancing: 1 + m_ResourceVersion: 1 + m_PropertySheet: + m_Float: + m_Array: [] + m_Vector2f: + m_Array: [] + m_Vector3f: + m_Array: [] + m_Vector4f: + m_Array: [] + m_Uint: + m_Array: [] + m_Int: + m_Array: [] + m_Matrix4x4f: + m_Array: [] + m_AnimationCurve: + m_Array: [] + m_Gradient: + m_Array: [] + m_NamedObject: + m_Array: [] + m_Bool: + m_Array: [] +--- !u!73398921 &2180370240332948376 +VFXRenderer: + serializedVersion: 1 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5755158003138779588} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 0 + 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_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 +--- !u!1 &6874992557687165507 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8962335376457110685} + m_Layer: 0 + m_Name: TowerImpactDust + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8962335376457110685 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6874992557687165507} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.20536, y: -2.27998, z: 6.22769} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 5415886315182518892} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/TowerImpactDust.prefab.meta b/Assets/_Project/Prefabs/Towers/Tower Construction Sets/TowerImpactDust.prefab.meta new file mode 100644 index 0000000..60fc785 --- /dev/null +++ b/Assets/_Project/Prefabs/Towers/Tower Construction Sets/TowerImpactDust.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a9080df4046b863c8b07b3ad73d76bf4 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Prefabs/Towers/Tower_TeslaCoil.prefab b/Assets/_Project/Prefabs/Towers/Tower_TeslaCoil.prefab index 3694acf..77b630e 100644 --- a/Assets/_Project/Prefabs/Towers/Tower_TeslaCoil.prefab +++ b/Assets/_Project/Prefabs/Towers/Tower_TeslaCoil.prefab @@ -325,7 +325,7 @@ MonoBehaviour: m_PreInfinity: 2 m_PostInfinity: 2 m_RotationOrder: 4 - impactVfxPrefab: {fileID: 0} + impactVfxPrefab: {fileID: 6874992557687165507, guid: a9080df4046b863c8b07b3ad73d76bf4, type: 3} impactVfxLifetime: 3 --- !u!1 &7101790219931971190 GameObject: diff --git a/Assets/_Project/Scenes/Levels/9Player.unity b/Assets/_Project/Scenes/Levels/9Player.unity index 14f1ebc..bfb0d2a 100644 --- a/Assets/_Project/Scenes/Levels/9Player.unity +++ b/Assets/_Project/Scenes/Levels/9Player.unity @@ -9116,6 +9116,124 @@ Transform: m_Children: [] m_Father: {fileID: 1097152085} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &599469378 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 599469379} + - component: {fileID: 599469381} + - component: {fileID: 599469380} + m_Layer: 0 + m_Name: Visual Effect + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &599469379 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 599469378} + 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: 1339671004} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!73398921 &599469380 +VFXRenderer: + serializedVersion: 1 + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 599469378} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 0 + 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_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 +--- !u!2083052967 &599469381 +VisualEffect: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 599469378} + m_Enabled: 1 + m_Asset: {fileID: 8926484042661614526, guid: 9be8cca0a26062700863614752c39b8b, type: 3} + m_InitialEventName: OnPlay + m_InitialEventNameOverriden: 0 + m_StartSeed: 0 + m_ResetSeedOnPlay: 1 + m_AllowInstancing: 1 + m_ResourceVersion: 1 + m_PropertySheet: + m_Float: + m_Array: [] + m_Vector2f: + m_Array: [] + m_Vector3f: + m_Array: [] + m_Vector4f: + m_Array: [] + m_Uint: + m_Array: [] + m_Int: + m_Array: [] + m_Matrix4x4f: + m_Array: [] + m_AnimationCurve: + m_Array: [] + m_Gradient: + m_Array: [] + m_NamedObject: + m_Array: [] + m_Bool: + m_Array: [] --- !u!43 &616621804 Mesh: m_ObjectHideFlags: 0 @@ -17656,6 +17774,38 @@ Mesh: - serializedVersion: 1 m_IndexStart: 0 m_IndexCount: 0 +--- !u!1 &1339671003 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1339671004} + m_Layer: 0 + m_Name: GameObject + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1339671004 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1339671003} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.71021, y: -1.75, z: -0.9095} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 599469379} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1350863286 GameObject: m_ObjectHideFlags: 0 @@ -28914,3 +29064,4 @@ SceneRoots: - {fileID: 2139601601} - {fileID: 176580462} - {fileID: 516125087} + - {fileID: 1339671004} From 51b7d58adabd1fec7db13529a1ca39cbb935c8dc Mon Sep 17 00:00:00 2001 From: Ian Woods Date: Mon, 6 Jul 2026 14:02:00 -0700 Subject: [PATCH 12/58] cool sounds --- Assets/_Project/Art/VFX/smoke_test.vfx | 2905 +++++++++++++++++ Assets/_Project/Art/VFX/smoke_test.vfx.meta | 15 + Assets/_Project/Audio/buildings/general.meta | 8 + .../Audio/buildings/general/10_booms.ogg | 3 + .../Audio/buildings/general/10_booms.ogg.meta | 23 + .../general/building_landed_boom.ogg | 3 + .../general/building_landed_boom.ogg.meta | 23 + .../Tower Construction Sets/SmokeTest.prefab | 152 + .../SmokeTest.prefab.meta | 7 + .../Prefabs/Towers/Tower_TeslaCoil.prefab | 13 +- Assets/_Project/Scenes/Levels/9Player.unity | 151 - .../Scripts/Combat/TowerBuiltSound.cs | 6 + 12 files changed, 3152 insertions(+), 157 deletions(-) create mode 100644 Assets/_Project/Art/VFX/smoke_test.vfx create mode 100644 Assets/_Project/Art/VFX/smoke_test.vfx.meta create mode 100644 Assets/_Project/Audio/buildings/general.meta create mode 100644 Assets/_Project/Audio/buildings/general/10_booms.ogg create mode 100644 Assets/_Project/Audio/buildings/general/10_booms.ogg.meta create mode 100644 Assets/_Project/Audio/buildings/general/building_landed_boom.ogg create mode 100644 Assets/_Project/Audio/buildings/general/building_landed_boom.ogg.meta create mode 100644 Assets/_Project/Prefabs/Towers/Tower Construction Sets/SmokeTest.prefab create mode 100644 Assets/_Project/Prefabs/Towers/Tower Construction Sets/SmokeTest.prefab.meta diff --git a/Assets/_Project/Art/VFX/smoke_test.vfx b/Assets/_Project/Art/VFX/smoke_test.vfx new file mode 100644 index 0000000..8ff7774 --- /dev/null +++ b/Assets/_Project/Art/VFX/smoke_test.vfx @@ -0,0 +1,2905 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &114340500867371532 +MonoBehaviour: + m_ObjectHideFlags: 1 + 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: d01270efd3285ea4a9d6c555cb0a8027, type: 3} + m_Name: VFXUI + m_EditorClassIdentifier: + groupInfos: + - title: Burst + position: + serializedVersion: 2 + x: 263 + y: 295 + width: 475 + height: 2220 + contents: + - model: {fileID: 8926484042661614700} + id: 0 + isStickyNote: 0 + - model: {fileID: 8926484042661614707} + id: 0 + isStickyNote: 0 + - model: {fileID: 8926484042661614756} + id: 0 + isStickyNote: 0 + - model: {fileID: 8926484042661614775} + id: 0 + isStickyNote: 0 + stickyNoteInfos: [] + categories: [] + uiBounds: + serializedVersion: 2 + x: 264 + y: 295 + width: 474 + height: 2288 +--- !u!114 &114350483966674976 +MonoBehaviour: + m_ObjectHideFlags: 1 + 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: 7d4c867f6b72b714dbb5fd1780afe208, type: 3} + m_Name: smoke_test + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614700} + - {fileID: 8926484042661614707} + - {fileID: 8926484042661614756} + - {fileID: 8926484042661614775} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_UIInfos: {fileID: 114340500867371532} + m_CustomAttributes: [] + m_ParameterInfo: [] + m_ImportDependencies: [] + m_GraphVersion: 19 + m_ResourceVersion: 1 + m_SubgraphDependencies: [] + m_CategoryPath: +--- !u!2058629511 &8926484042661614527 +VisualEffectResource: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: smoke_test + m_Graph: {fileID: 114350483966674976} + m_Infos: + m_RendererSettings: + motionVectorGenerationMode: 0 + shadowCastingMode: 0 + m_CullingFlags: 3 + m_UpdateMode: 0 + m_PreWarmDeltaTime: 0.05 + m_PreWarmStepCount: 0 + m_InitialEventName: OnPlay + m_InstancingMode: 0 + m_InstancingCapacity: 64 +--- !u!114 &8926484042661614700 +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: 73a13919d81fb7444849bae8b5c812a2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674976} + m_Children: + - {fileID: 8926484042661614703} + m_UIPosition: {x: 289, y: 354} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614879} + - {fileID: 8926484042661614981} + m_OutputSlots: [] + m_Label: Spawn system + m_Data: {fileID: 8926484042661614702} + m_InputFlowSlot: + - link: [] + - link: [] + m_OutputFlowSlot: + - link: + - context: {fileID: 8926484042661614707} + slotIndex: 0 + loopDuration: 1 + loopCount: 1 + delayBeforeLoop: 0 + delayAfterLoop: 0 +--- !u!114 &8926484042661614702 +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: f68759077adc0b143b6e1c101e82065e, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + title: + m_Owners: + - {fileID: 8926484042661614700} +--- !u!114 &8926484042661614703 +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: 5e382412bb691334bb79457a6c127924, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614700} + m_Children: [] + m_UIPosition: {x: 0, y: 2} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614704} + - {fileID: 8926484042661614705} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614706} + repeat: 0 + spawnMode: 0 + delayMode: 0 +--- !u!114 &8926484042661614704 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614704} + m_MasterData: + m_Owner: {fileID: 8926484042661614703} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 1 + m_Space: -1 + m_Property: + name: Count + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614705 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614705} + m_MasterData: + m_Owner: {fileID: 8926484042661614703} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0 + m_Space: -1 + m_Property: + name: Delay + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614706 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614706} + m_MasterData: + m_Owner: {fileID: 8926484042661614703} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614707 +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: 9dfea48843f53fc438eabc12a3a30abc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674976} + m_Children: + - {fileID: 8926484042661614722} + - {fileID: 8926484042661614956} + - {fileID: 8926484042661614912} + - {fileID: 8926484042661614975} + m_UIPosition: {x: 289, y: 800} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614880} + - {fileID: 8926484042661614889} + m_OutputSlots: [] + m_Label: Initialize Particles + m_Data: {fileID: 8926484042661614721} + m_InputFlowSlot: + - link: + - context: {fileID: 8926484042661614700} + slotIndex: 0 + m_OutputFlowSlot: + - link: + - context: {fileID: 8926484042661614756} + slotIndex: 0 +--- !u!114 &8926484042661614721 +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: d78581a96eae8bf4398c282eb0b098bd, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + title: Simple Burst + m_Owners: + - {fileID: 8926484042661614707} + - {fileID: 8926484042661614756} + - {fileID: 8926484042661614775} + dataType: 0 + capacity: 1000 + stripCapacity: 1 + particlePerStripCount: 32 + needsComputeBounds: 0 + boundsMode: 0 + m_Space: 1 +--- !u!114 &8926484042661614722 +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: a971fa2e110a0ac42ac1d8dae408704b, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614707} + m_Children: [] + m_UIPosition: {x: 292.6464, y: 1481.9946} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614723} + - {fileID: 8926484042661614724} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614725} + attribute: lifetime + Composition: 0 + Source: 0 + Random: 2 + channels: 6 +--- !u!114 &8926484042661614723 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614723} + m_MasterData: + m_Owner: {fileID: 8926484042661614722} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 4 + m_Space: -1 + m_Property: + name: A + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614724 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614724} + m_MasterData: + m_Owner: {fileID: 8926484042661614722} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 6 + m_Space: -1 + m_Property: + name: B + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614725 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614725} + m_MasterData: + m_Owner: {fileID: 8926484042661614722} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614756 +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: 2dc095764ededfa4bb32fa602511ea4b, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674976} + m_Children: + - {fileID: 8926484042661614922} + - {fileID: 8926484042661614929} + - {fileID: 8926484042661614978} + m_UIPosition: {x: 289, y: 1558} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: [] + m_OutputSlots: [] + m_Label: Update Particles + m_Data: {fileID: 8926484042661614721} + m_InputFlowSlot: + - link: + - context: {fileID: 8926484042661614707} + slotIndex: 0 + m_OutputFlowSlot: + - link: + - context: {fileID: 8926484042661614775} + slotIndex: 0 + integration: 0 + angularIntegration: 0 + ageParticles: 1 + reapParticles: 1 + skipZeroDeltaUpdate: 0 +--- !u!114 &8926484042661614775 +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: a0b9e6b9139e58d4c957ec54595da7d3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674976} + m_Children: + - {fileID: 8926484042661614779} + - {fileID: 8926484042661614952} + - {fileID: 8926484042661614792} + m_UIPosition: {x: 289, y: 1975} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614776} + m_OutputSlots: [] + m_Label: Render Quad + m_Data: {fileID: 8926484042661614721} + m_InputFlowSlot: + - link: + - context: {fileID: 8926484042661614756} + slotIndex: 0 + m_OutputFlowSlot: + - link: [] + blendMode: 1 + cullMode: 0 + zWriteMode: 0 + zTestMode: 0 + useAlphaClipping: 0 + generateMotionVector: 0 + excludeFromTUAndAA: 0 + sortingPriority: 0 + m_SubOutputs: + - {fileID: 8926484042661614781} + - {fileID: 8926484042661614955} + useBaseColorMap: 3 + colorMapping: 0 + uvMode: 0 + flipbookLayout: 0 + flipbookBlendFrames: 0 + flipbookMotionVectors: 0 + useSoftParticle: 0 + vfxSystemSortPriority: 0 + sort: 1 + sortMode: 1 + revertSorting: 0 + indirectDraw: 0 + computeCulling: 0 + frustumCulling: 0 + castShadows: 0 + useExposureWeight: 0 + enableRayTracing: 0 + decimationFactor: 1 + raytracedScaleMode: 0 + needsOwnSort: 0 + needsOwnAabbBuffer: 0 + shaderGraph: {fileID: 0} + materialSettings: + m_PropertyNames: [] + m_PropertyValues: [] + renderQueue: -1 + primitiveType: 1 + useGeometryShader: 0 +--- !u!114 &8926484042661614776 +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: 70a331b1d86cc8d4aa106ccbe0da5852, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614776} + m_MasterData: + m_Owner: {fileID: 8926484042661614775} + m_Value: + m_Type: + m_SerializableType: UnityEngine.Texture2D, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"obj":{"fileID":2800000,"guid":"de0fae515169ff246a20d58a8a440ed0","type":3}}' + m_Space: -1 + m_Property: + name: mainTexture + m_serializedType: + m_SerializableType: UnityEngine.Texture2D, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614779 +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: d16c6aeaef944094b9a1633041804207, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614775} + m_Children: [] + m_UIPosition: {x: 292.6464, y: 1481.9946} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: [] + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614780} + mode: 0 + axes: 4 + faceRay: 1 +--- !u!114 &8926484042661614780 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614780} + m_MasterData: + m_Owner: {fileID: 8926484042661614779} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614781 +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: 081ffb0090424ba4cb05370a42ead6b9, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &8926484042661614792 +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: 01ec2c1930009b04ea08905b47262415, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614775} + m_Children: [] + m_UIPosition: {x: 508.1385, y: 271.34802} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614793} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614794} + attribute: color + Composition: 2 + AlphaComposition: 0 + SampleMode: 0 + Mode: 1 + ColorMode: 3 + channels: 6 +--- !u!114 &8926484042661614793 +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: 76f778ff57c4e8145b9681fe3268d8e9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614793} + m_MasterData: + m_Owner: {fileID: 8926484042661614792} + m_Value: + m_Type: + m_SerializableType: UnityEngine.Gradient, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"colorKeys":[{"color":{"r":0.6447322368621826,"g":0.8097582459449768,"b":0.9197756052017212,"a":1.0},"time":0.0},{"color":{"r":0.5755142569541931,"g":0.7771804332733154,"b":0.911624550819397,"a":1.0},"time":1.0}],"alphaKeys":[{"alpha":1.0,"time":0.0},{"alpha":1.0,"time":0.800000011920929},{"alpha":0.0,"time":1.0}],"gradientMode":0}' + m_Space: -1 + m_Property: + name: Color + m_serializedType: + m_SerializableType: UnityEngine.Gradient, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614794 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614794} + m_MasterData: + m_Owner: {fileID: 8926484042661614792} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614879 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614879} + m_MasterData: + m_Owner: {fileID: 8926484042661614700} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 4 + m_Space: -1 + m_Property: + name: LoopDuration + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614880 +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: 1b605c022ee79394a8a776c0869b3f9a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614881} + - {fileID: 8926484042661614885} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614880} + m_MasterData: + m_Owner: {fileID: 8926484042661614707} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.AABox, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"center":{"x":0.0,"y":-2.0,"z":0.0},"size":{"x":7.0,"y":8.0,"z":7.0}}' + m_Space: 0 + m_Property: + name: bounds + m_serializedType: + m_SerializableType: UnityEditor.VFX.AABox, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614881 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614880} + m_Children: + - {fileID: 8926484042661614882} + - {fileID: 8926484042661614883} + - {fileID: 8926484042661614884} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614880} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: center + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614882 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614881} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614880} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614883 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614881} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614880} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614884 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614881} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614880} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614885 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614880} + m_Children: + - {fileID: 8926484042661614886} + - {fileID: 8926484042661614887} + - {fileID: 8926484042661614888} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614880} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: size + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614886 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614885} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614880} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614887 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614885} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614880} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614888 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614885} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614880} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614889 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614890} + - {fileID: 8926484042661614891} + - {fileID: 8926484042661614892} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614889} + m_MasterData: + m_Owner: {fileID: 8926484042661614707} + m_Value: + m_Type: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"x":0.5,"y":0.5,"z":0.5}' + m_Space: -1 + m_Property: + name: boundsPadding + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614890 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614889} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614889} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614891 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614889} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614889} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614892 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614889} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614889} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614912 +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: 26096dfac7c062b4b94c293605ba085e, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614707} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614913} + - {fileID: 8926484042661614918} + - {fileID: 8926484042661614919} + - {fileID: 8926484042661614920} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614921} + composition: 0 + speedMode: 1 +--- !u!114 &8926484042661614913 +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: e8f2b4a846fd4c14a893cde576ad172b, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614914} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614913} + m_MasterData: + m_Owner: {fileID: 8926484042661614912} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.DirectionType, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"direction":{"x":0.0,"y":1.0,"z":0.0}}' + m_Space: 0 + m_Property: + name: Direction + m_serializedType: + m_SerializableType: UnityEditor.VFX.DirectionType, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614914 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614913} + m_Children: + - {fileID: 8926484042661614915} + - {fileID: 8926484042661614916} + - {fileID: 8926484042661614917} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614913} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: direction + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614915 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614914} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614913} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614916 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614914} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614913} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614917 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614914} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614913} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614918 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614918} + m_MasterData: + m_Owner: {fileID: 8926484042661614912} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0.5 + m_Space: -1 + m_Property: + name: MinSpeed + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614919 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614919} + m_MasterData: + m_Owner: {fileID: 8926484042661614912} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 4.5 + m_Space: -1 + m_Property: + name: MaxSpeed + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614920 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614920} + m_MasterData: + m_Owner: {fileID: 8926484042661614912} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0 + m_Space: -1 + m_Property: + name: DirectionBlend + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614921 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614921} + m_MasterData: + m_Owner: {fileID: 8926484042661614912} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614922 +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: e5dce54ae3368c042b26ab1f305e15b2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614756} + m_Children: [] + m_UIPosition: {x: 0, y: 2} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614923} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614928} +--- !u!114 &8926484042661614923 +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: a9f9544b71b7dab44a4644b6807e8bf6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614924} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614923} + m_MasterData: + m_Owner: {fileID: 8926484042661614922} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.Vector, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"vector":{"x":0.0,"y":0.0,"z":0.0}}' + m_Space: 1 + m_Property: + name: Force + m_serializedType: + m_SerializableType: UnityEditor.VFX.Vector, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614924 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614923} + m_Children: + - {fileID: 8926484042661614925} + - {fileID: 8926484042661614926} + - {fileID: 8926484042661614927} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614923} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: vector + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614925 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614924} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614923} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614926 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614924} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614923} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614927 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614924} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614923} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614928 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614928} + m_MasterData: + m_Owner: {fileID: 8926484042661614922} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614929 +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: b294673e879f9cf449cc9de536818ea9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614756} + m_Children: [] + m_UIPosition: {x: 0, y: 77} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614930} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614931} + UseParticleSize: 0 +--- !u!114 &8926484042661614930 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614930} + m_MasterData: + m_Owner: {fileID: 8926484042661614929} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0.5 + m_Space: -1 + m_Property: + name: dragCoefficient + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614931 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614931} + m_MasterData: + m_Owner: {fileID: 8926484042661614929} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614952 +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: 01ec2c1930009b04ea08905b47262415, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614775} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614953} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614954} + attribute: size + Composition: 2 + AlphaComposition: 0 + SampleMode: 0 + Mode: 1 + ColorMode: 3 + channels: 6 +--- !u!114 &8926484042661614953 +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: c117b74c5c58db542bffe25c78fe92db, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614953} + m_MasterData: + m_Owner: {fileID: 8926484042661614952} + m_Value: + m_Type: + m_SerializableType: UnityEngine.AnimationCurve, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"frames":[{"time":0.0,"value":0.0,"inTangent":6.615680694580078,"outTangent":6.615680694580078,"tangentMode":0,"leftTangentMode":0,"rightTangentMode":0,"broken":false},{"time":0.10000000149011612,"value":1.5,"inTangent":0.06686528027057648,"outTangent":0.06686528027057648,"tangentMode":0,"leftTangentMode":0,"rightTangentMode":0,"broken":false},{"time":1.0,"value":0.0,"inTangent":-1.6666667461395264,"outTangent":-1.6666667461395264,"tangentMode":0,"leftTangentMode":1,"rightTangentMode":1,"broken":false}],"preWrapMode":8,"postWrapMode":8,"version":1}' + m_Space: -1 + m_Property: + name: Size + m_serializedType: + m_SerializableType: UnityEngine.AnimationCurve, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614954 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614954} + m_MasterData: + m_Owner: {fileID: 8926484042661614952} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: False + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614955 +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: 388ad3b1dc9c6ae45b630f914fab638f, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 +--- !u!114 &8926484042661614956 +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: fb1f6794ace8b0c4592af9c5604cddbf, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614707} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614957} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614974} + compositionPosition: 0 + compositionAxes: 0 + compositionDirection: 0 + positionMode: 0 + spawnMode: 0 + shape: 0 + heightMode: 1 + applyOrientation: 1 + killOutliers: 0 + projectionSteps: 2 +--- !u!114 &8926484042661614957 +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: 1b605c022ee79394a8a776c0869b3f9a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614958} + - {fileID: 8926484042661614973} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 8926484042661614956} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.TArcSphere, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"sphere":{"transform":{"position":{"x":0.0,"y":0.0,"z":0.0},"angles":{"x":0.0,"y":0.0,"z":0.0},"scale":{"x":1.0,"y":1.0,"z":1.0}},"radius":0.15000000596046449},"arc":6.28000020980835}' + m_Space: 0 + m_Property: + name: arcSphere + m_serializedType: + m_SerializableType: UnityEditor.VFX.TArcSphere, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614958 +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: 1b605c022ee79394a8a776c0869b3f9a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614957} + m_Children: + - {fileID: 8926484042661614959} + - {fileID: 8926484042661614972} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: sphere + m_serializedType: + m_SerializableType: UnityEditor.VFX.TSphere, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614959 +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: 3e3f628d80ffceb489beac74258f9cf7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614958} + m_Children: + - {fileID: 8926484042661614960} + - {fileID: 8926484042661614964} + - {fileID: 8926484042661614968} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: transform + m_serializedType: + m_SerializableType: UnityEditor.VFX.Transform, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614960 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614959} + m_Children: + - {fileID: 8926484042661614961} + - {fileID: 8926484042661614962} + - {fileID: 8926484042661614963} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: position + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614961 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614960} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614962 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614960} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614963 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614960} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614964 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614959} + m_Children: + - {fileID: 8926484042661614965} + - {fileID: 8926484042661614966} + - {fileID: 8926484042661614967} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: angles + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614965 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614964} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614966 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614964} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614967 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614964} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614968 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614959} + m_Children: + - {fileID: 8926484042661614969} + - {fileID: 8926484042661614970} + - {fileID: 8926484042661614971} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: scale + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614969 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614968} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614970 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614968} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614971 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614968} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614972 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614958} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: radius + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614973 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614957} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: arc + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614974 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614974} + m_MasterData: + m_Owner: {fileID: 8926484042661614956} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614975 +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: a971fa2e110a0ac42ac1d8dae408704b, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.Block.SetAttribute + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614707} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614976} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614977} + attribute: size + Composition: 0 + Source: 0 + Random: 0 + channels: 6 +--- !u!114 &8926484042661614976 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614976} + m_MasterData: + m_Owner: {fileID: 8926484042661614975} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 7 + m_Space: -1 + m_Property: + name: _Size + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614977 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotBool + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614977} + m_MasterData: + m_Owner: {fileID: 8926484042661614975} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614978 +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: 01ec2c1930009b04ea08905b47262415, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.Block.AttributeFromCurve + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614756} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614979} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614980} + attribute: alpha + Composition: 0 + AlphaComposition: 0 + SampleMode: 0 + Mode: 1 + ColorMode: 3 + channels: 6 +--- !u!114 &8926484042661614979 +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: c117b74c5c58db542bffe25c78fe92db, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotAnimationCurve + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614979} + m_MasterData: + m_Owner: {fileID: 8926484042661614978} + m_Value: + m_Type: + m_SerializableType: UnityEngine.AnimationCurve, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"frames":[{"time":-0.0186920166015625,"value":1.00103759765625,"inTangent":-0.20127615332603455,"outTangent":-0.20127615332603455,"tangentMode":0,"leftTangentMode":1,"rightTangentMode":1,"broken":false},{"time":5.01995849609375,"value":-0.01312255859375,"inTangent":-0.20127615332603455,"outTangent":-0.20127615332603455,"tangentMode":0,"leftTangentMode":1,"rightTangentMode":1,"broken":false}],"preWrapMode":8,"postWrapMode":8,"version":1}' + m_Space: -1 + m_Property: + name: Alpha + m_serializedType: + m_SerializableType: UnityEngine.AnimationCurve, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614980 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotBool + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614980} + m_MasterData: + m_Owner: {fileID: 8926484042661614978} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614981 +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: 4d246e354feb93041a837a9ef59437cb, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotInt + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614981} + m_MasterData: + m_Owner: {fileID: 8926484042661614700} + m_Value: + m_Type: + m_SerializableType: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 1 + m_Space: -1 + m_Property: + name: LoopCount + m_serializedType: + m_SerializableType: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] diff --git a/Assets/_Project/Art/VFX/smoke_test.vfx.meta b/Assets/_Project/Art/VFX/smoke_test.vfx.meta new file mode 100644 index 0000000..c36ad2e --- /dev/null +++ b/Assets/_Project/Art/VFX/smoke_test.vfx.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: 0f2161665e283871db832868ad90b002 +VisualEffectImporter: + externalObjects: {} + serializedVersion: 2 + template: + name: + category: + description: + icon: {instanceID: 0} + thumbnail: {instanceID: 0} + useAsTemplate: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Audio/buildings/general.meta b/Assets/_Project/Audio/buildings/general.meta new file mode 100644 index 0000000..f7994dd --- /dev/null +++ b/Assets/_Project/Audio/buildings/general.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 09acbe3c28493f2e3be6d1f0f743ee30 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Audio/buildings/general/10_booms.ogg b/Assets/_Project/Audio/buildings/general/10_booms.ogg new file mode 100644 index 0000000..36df1c5 --- /dev/null +++ b/Assets/_Project/Audio/buildings/general/10_booms.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a83f139286a94e9960cb93ac2d132ff5e262fd4730471326f07b79391e1a306 +size 1215247 diff --git a/Assets/_Project/Audio/buildings/general/10_booms.ogg.meta b/Assets/_Project/Audio/buildings/general/10_booms.ogg.meta new file mode 100644 index 0000000..e488220 --- /dev/null +++ b/Assets/_Project/Audio/buildings/general/10_booms.ogg.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 8e90ffb09daead07f9c108b8047e8200 +AudioImporter: + externalObjects: {} + serializedVersion: 8 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Audio/buildings/general/building_landed_boom.ogg b/Assets/_Project/Audio/buildings/general/building_landed_boom.ogg new file mode 100644 index 0000000..1459ebc --- /dev/null +++ b/Assets/_Project/Audio/buildings/general/building_landed_boom.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:637d457da0a901b61346844411bd8994e3e4f2951fdb5ac4fd8990817e578054 +size 60433 diff --git a/Assets/_Project/Audio/buildings/general/building_landed_boom.ogg.meta b/Assets/_Project/Audio/buildings/general/building_landed_boom.ogg.meta new file mode 100644 index 0000000..2022fd5 --- /dev/null +++ b/Assets/_Project/Audio/buildings/general/building_landed_boom.ogg.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 4ee1b63f27ea04451802bafd35ecef89 +AudioImporter: + externalObjects: {} + serializedVersion: 8 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/SmokeTest.prefab b/Assets/_Project/Prefabs/Towers/Tower Construction Sets/SmokeTest.prefab new file mode 100644 index 0000000..1054994 --- /dev/null +++ b/Assets/_Project/Prefabs/Towers/Tower Construction Sets/SmokeTest.prefab @@ -0,0 +1,152 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &8424388185091977549 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6028395005242577650} + m_Layer: 0 + m_Name: SmokeTest + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6028395005242577650 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8424388185091977549} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.37028, y: -6.203, z: 3.30153} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6576162659729677824} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &8857551419746186207 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6576162659729677824} + - component: {fileID: 5680376354699372220} + - component: {fileID: 2209877433701470746} + m_Layer: 0 + m_Name: Visual Effect + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6576162659729677824 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8857551419746186207} + 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: 6028395005242577650} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!2083052967 &5680376354699372220 +VisualEffect: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8857551419746186207} + m_Enabled: 1 + m_Asset: {fileID: 8926484042661614526, guid: 0f2161665e283871db832868ad90b002, type: 3} + m_InitialEventName: OnPlay + m_InitialEventNameOverriden: 0 + m_StartSeed: 0 + m_ResetSeedOnPlay: 1 + m_AllowInstancing: 1 + m_ResourceVersion: 1 + m_PropertySheet: + m_Float: + m_Array: [] + m_Vector2f: + m_Array: [] + m_Vector3f: + m_Array: [] + m_Vector4f: + m_Array: [] + m_Uint: + m_Array: [] + m_Int: + m_Array: [] + m_Matrix4x4f: + m_Array: [] + m_AnimationCurve: + m_Array: [] + m_Gradient: + m_Array: [] + m_NamedObject: + m_Array: [] + m_Bool: + m_Array: [] +--- !u!73398921 &2209877433701470746 +VFXRenderer: + serializedVersion: 1 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8857551419746186207} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 0 + 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_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 diff --git a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/SmokeTest.prefab.meta b/Assets/_Project/Prefabs/Towers/Tower Construction Sets/SmokeTest.prefab.meta new file mode 100644 index 0000000..d2c78ed --- /dev/null +++ b/Assets/_Project/Prefabs/Towers/Tower Construction Sets/SmokeTest.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5527964698625ed3b8bd50747ecb3300 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Prefabs/Towers/Tower_TeslaCoil.prefab b/Assets/_Project/Prefabs/Towers/Tower_TeslaCoil.prefab index 77b630e..640d249 100644 --- a/Assets/_Project/Prefabs/Towers/Tower_TeslaCoil.prefab +++ b/Assets/_Project/Prefabs/Towers/Tower_TeslaCoil.prefab @@ -269,9 +269,10 @@ MonoBehaviour: m_EditorClassIdentifier: Assembly-CSharp::TD.Combat.TowerBuiltSound builtSound: clip: {fileID: 8300000, guid: 6ff2e0ba45ef5eb6abeb34bd2c6e2da8, type: 3} - volume: 0.496 + volume: 0.3 minPitch: 1 maxPitch: 1 + delaySeconds: 0.3 --- !u!114 &1829137298732744432 MonoBehaviour: m_ObjectHideFlags: 0 @@ -285,10 +286,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Combat.TowerLandedSound landedSound: - clip: {fileID: 0} - volume: 0 - minPitch: 0 - maxPitch: 0 + clip: {fileID: 8300000, guid: 4ee1b63f27ea04451802bafd35ecef89, type: 3} + volume: 0.663 + minPitch: 0.96 + maxPitch: 1.04 --- !u!114 &8125712573731754244 MonoBehaviour: m_ObjectHideFlags: 0 @@ -326,7 +327,7 @@ MonoBehaviour: m_PostInfinity: 2 m_RotationOrder: 4 impactVfxPrefab: {fileID: 6874992557687165507, guid: a9080df4046b863c8b07b3ad73d76bf4, type: 3} - impactVfxLifetime: 3 + impactVfxLifetime: 4 --- !u!1 &7101790219931971190 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/_Project/Scenes/Levels/9Player.unity b/Assets/_Project/Scenes/Levels/9Player.unity index bfb0d2a..14f1ebc 100644 --- a/Assets/_Project/Scenes/Levels/9Player.unity +++ b/Assets/_Project/Scenes/Levels/9Player.unity @@ -9116,124 +9116,6 @@ Transform: m_Children: [] m_Father: {fileID: 1097152085} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &599469378 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 599469379} - - component: {fileID: 599469381} - - component: {fileID: 599469380} - m_Layer: 0 - m_Name: Visual Effect - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &599469379 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 599469378} - 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: 1339671004} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!73398921 &599469380 -VFXRenderer: - serializedVersion: 1 - m_ObjectHideFlags: 2 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 599469378} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 0 - 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_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 ---- !u!2083052967 &599469381 -VisualEffect: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 599469378} - m_Enabled: 1 - m_Asset: {fileID: 8926484042661614526, guid: 9be8cca0a26062700863614752c39b8b, type: 3} - m_InitialEventName: OnPlay - m_InitialEventNameOverriden: 0 - m_StartSeed: 0 - m_ResetSeedOnPlay: 1 - m_AllowInstancing: 1 - m_ResourceVersion: 1 - m_PropertySheet: - m_Float: - m_Array: [] - m_Vector2f: - m_Array: [] - m_Vector3f: - m_Array: [] - m_Vector4f: - m_Array: [] - m_Uint: - m_Array: [] - m_Int: - m_Array: [] - m_Matrix4x4f: - m_Array: [] - m_AnimationCurve: - m_Array: [] - m_Gradient: - m_Array: [] - m_NamedObject: - m_Array: [] - m_Bool: - m_Array: [] --- !u!43 &616621804 Mesh: m_ObjectHideFlags: 0 @@ -17774,38 +17656,6 @@ Mesh: - serializedVersion: 1 m_IndexStart: 0 m_IndexCount: 0 ---- !u!1 &1339671003 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1339671004} - m_Layer: 0 - m_Name: GameObject - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1339671004 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1339671003} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -0.71021, y: -1.75, z: -0.9095} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 599469379} - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1350863286 GameObject: m_ObjectHideFlags: 0 @@ -29064,4 +28914,3 @@ SceneRoots: - {fileID: 2139601601} - {fileID: 176580462} - {fileID: 516125087} - - {fileID: 1339671004} diff --git a/Assets/_Project/Scripts/Combat/TowerBuiltSound.cs b/Assets/_Project/Scripts/Combat/TowerBuiltSound.cs index 30f3376..e76a289 100644 --- a/Assets/_Project/Scripts/Combat/TowerBuiltSound.cs +++ b/Assets/_Project/Scripts/Combat/TowerBuiltSound.cs @@ -15,6 +15,7 @@ namespace TD.Combat public class TowerBuiltSound : MonoBehaviour { [SerializeField] private SoundConfig builtSound; + [SerializeField] private float delaySeconds = 0.3f; private TowerInstance towerInstance; @@ -34,6 +35,11 @@ namespace TD.Combat } private void HandleBuilt() + { + Invoke(nameof(PlayBuiltSound), delaySeconds); + } + + private void PlayBuiltSound() { AudioManager.Instance?.Play(builtSound.clip, AudioCategory.UI, builtSound.RandomPitch(), builtSound.volume); } From 7c0beddec42d19d2cec2b9b968836cf2d3826cdb Mon Sep 17 00:00:00 2001 From: Ian Woods Date: Mon, 6 Jul 2026 14:08:53 -0700 Subject: [PATCH 13/58] remove useless files --- Assets/_Project/Art/VFX/smoke_test.vfx | 2905 ----------------- Assets/_Project/Art/VFX/smoke_test.vfx.meta | 15 - .../Audio/buildings/general/10_booms.ogg | 3 - .../Audio/buildings/general/10_booms.ogg.meta | 23 - .../Tower Construction Sets/SmokeTest.prefab | 152 - .../SmokeTest.prefab.meta | 7 - 6 files changed, 3105 deletions(-) delete mode 100644 Assets/_Project/Art/VFX/smoke_test.vfx delete mode 100644 Assets/_Project/Art/VFX/smoke_test.vfx.meta delete mode 100644 Assets/_Project/Audio/buildings/general/10_booms.ogg delete mode 100644 Assets/_Project/Audio/buildings/general/10_booms.ogg.meta delete mode 100644 Assets/_Project/Prefabs/Towers/Tower Construction Sets/SmokeTest.prefab delete mode 100644 Assets/_Project/Prefabs/Towers/Tower Construction Sets/SmokeTest.prefab.meta diff --git a/Assets/_Project/Art/VFX/smoke_test.vfx b/Assets/_Project/Art/VFX/smoke_test.vfx deleted file mode 100644 index 8ff7774..0000000 --- a/Assets/_Project/Art/VFX/smoke_test.vfx +++ /dev/null @@ -1,2905 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &114340500867371532 -MonoBehaviour: - m_ObjectHideFlags: 1 - 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: d01270efd3285ea4a9d6c555cb0a8027, type: 3} - m_Name: VFXUI - m_EditorClassIdentifier: - groupInfos: - - title: Burst - position: - serializedVersion: 2 - x: 263 - y: 295 - width: 475 - height: 2220 - contents: - - model: {fileID: 8926484042661614700} - id: 0 - isStickyNote: 0 - - model: {fileID: 8926484042661614707} - id: 0 - isStickyNote: 0 - - model: {fileID: 8926484042661614756} - id: 0 - isStickyNote: 0 - - model: {fileID: 8926484042661614775} - id: 0 - isStickyNote: 0 - stickyNoteInfos: [] - categories: [] - uiBounds: - serializedVersion: 2 - x: 264 - y: 295 - width: 474 - height: 2288 ---- !u!114 &114350483966674976 -MonoBehaviour: - m_ObjectHideFlags: 1 - 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: 7d4c867f6b72b714dbb5fd1780afe208, type: 3} - m_Name: smoke_test - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: - - {fileID: 8926484042661614700} - - {fileID: 8926484042661614707} - - {fileID: 8926484042661614756} - - {fileID: 8926484042661614775} - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_UIInfos: {fileID: 114340500867371532} - m_CustomAttributes: [] - m_ParameterInfo: [] - m_ImportDependencies: [] - m_GraphVersion: 19 - m_ResourceVersion: 1 - m_SubgraphDependencies: [] - m_CategoryPath: ---- !u!2058629511 &8926484042661614527 -VisualEffectResource: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: smoke_test - m_Graph: {fileID: 114350483966674976} - m_Infos: - m_RendererSettings: - motionVectorGenerationMode: 0 - shadowCastingMode: 0 - m_CullingFlags: 3 - m_UpdateMode: 0 - m_PreWarmDeltaTime: 0.05 - m_PreWarmStepCount: 0 - m_InitialEventName: OnPlay - m_InstancingMode: 0 - m_InstancingCapacity: 64 ---- !u!114 &8926484042661614700 -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: 73a13919d81fb7444849bae8b5c812a2, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 114350483966674976} - m_Children: - - {fileID: 8926484042661614703} - m_UIPosition: {x: 289, y: 354} - m_UICollapsed: 0 - m_UISuperCollapsed: 0 - m_InputSlots: - - {fileID: 8926484042661614879} - - {fileID: 8926484042661614981} - m_OutputSlots: [] - m_Label: Spawn system - m_Data: {fileID: 8926484042661614702} - m_InputFlowSlot: - - link: [] - - link: [] - m_OutputFlowSlot: - - link: - - context: {fileID: 8926484042661614707} - slotIndex: 0 - loopDuration: 1 - loopCount: 1 - delayBeforeLoop: 0 - delayAfterLoop: 0 ---- !u!114 &8926484042661614702 -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: f68759077adc0b143b6e1c101e82065e, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - title: - m_Owners: - - {fileID: 8926484042661614700} ---- !u!114 &8926484042661614703 -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: 5e382412bb691334bb79457a6c127924, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614700} - m_Children: [] - m_UIPosition: {x: 0, y: 2} - m_UICollapsed: 0 - m_UISuperCollapsed: 0 - m_InputSlots: - - {fileID: 8926484042661614704} - - {fileID: 8926484042661614705} - m_OutputSlots: [] - m_Disabled: 0 - m_ActivationSlot: {fileID: 8926484042661614706} - repeat: 0 - spawnMode: 0 - delayMode: 0 ---- !u!114 &8926484042661614704 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614704} - m_MasterData: - m_Owner: {fileID: 8926484042661614703} - m_Value: - m_Type: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_SerializableObject: 1 - m_Space: -1 - m_Property: - name: Count - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614705 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614705} - m_MasterData: - m_Owner: {fileID: 8926484042661614703} - m_Value: - m_Type: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_SerializableObject: 0 - m_Space: -1 - m_Property: - name: Delay - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614706 -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: b4c11ff25089a324daf359f4b0629b33, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614706} - m_MasterData: - m_Owner: {fileID: 8926484042661614703} - m_Value: - m_Type: - m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_SerializableObject: True - m_Space: -1 - m_Property: - name: _vfx_enabled - m_serializedType: - m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614707 -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: 9dfea48843f53fc438eabc12a3a30abc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 114350483966674976} - m_Children: - - {fileID: 8926484042661614722} - - {fileID: 8926484042661614956} - - {fileID: 8926484042661614912} - - {fileID: 8926484042661614975} - m_UIPosition: {x: 289, y: 800} - m_UICollapsed: 0 - m_UISuperCollapsed: 0 - m_InputSlots: - - {fileID: 8926484042661614880} - - {fileID: 8926484042661614889} - m_OutputSlots: [] - m_Label: Initialize Particles - m_Data: {fileID: 8926484042661614721} - m_InputFlowSlot: - - link: - - context: {fileID: 8926484042661614700} - slotIndex: 0 - m_OutputFlowSlot: - - link: - - context: {fileID: 8926484042661614756} - slotIndex: 0 ---- !u!114 &8926484042661614721 -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: d78581a96eae8bf4398c282eb0b098bd, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - title: Simple Burst - m_Owners: - - {fileID: 8926484042661614707} - - {fileID: 8926484042661614756} - - {fileID: 8926484042661614775} - dataType: 0 - capacity: 1000 - stripCapacity: 1 - particlePerStripCount: 32 - needsComputeBounds: 0 - boundsMode: 0 - m_Space: 1 ---- !u!114 &8926484042661614722 -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: a971fa2e110a0ac42ac1d8dae408704b, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614707} - m_Children: [] - m_UIPosition: {x: 292.6464, y: 1481.9946} - m_UICollapsed: 0 - m_UISuperCollapsed: 0 - m_InputSlots: - - {fileID: 8926484042661614723} - - {fileID: 8926484042661614724} - m_OutputSlots: [] - m_Disabled: 0 - m_ActivationSlot: {fileID: 8926484042661614725} - attribute: lifetime - Composition: 0 - Source: 0 - Random: 2 - channels: 6 ---- !u!114 &8926484042661614723 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614723} - m_MasterData: - m_Owner: {fileID: 8926484042661614722} - m_Value: - m_Type: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_SerializableObject: 4 - m_Space: -1 - m_Property: - name: A - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614724 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614724} - m_MasterData: - m_Owner: {fileID: 8926484042661614722} - m_Value: - m_Type: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_SerializableObject: 6 - m_Space: -1 - m_Property: - name: B - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614725 -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: b4c11ff25089a324daf359f4b0629b33, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614725} - m_MasterData: - m_Owner: {fileID: 8926484042661614722} - m_Value: - m_Type: - m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_SerializableObject: True - m_Space: -1 - m_Property: - name: _vfx_enabled - m_serializedType: - m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614756 -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: 2dc095764ededfa4bb32fa602511ea4b, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 114350483966674976} - m_Children: - - {fileID: 8926484042661614922} - - {fileID: 8926484042661614929} - - {fileID: 8926484042661614978} - m_UIPosition: {x: 289, y: 1558} - m_UICollapsed: 0 - m_UISuperCollapsed: 0 - m_InputSlots: [] - m_OutputSlots: [] - m_Label: Update Particles - m_Data: {fileID: 8926484042661614721} - m_InputFlowSlot: - - link: - - context: {fileID: 8926484042661614707} - slotIndex: 0 - m_OutputFlowSlot: - - link: - - context: {fileID: 8926484042661614775} - slotIndex: 0 - integration: 0 - angularIntegration: 0 - ageParticles: 1 - reapParticles: 1 - skipZeroDeltaUpdate: 0 ---- !u!114 &8926484042661614775 -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: a0b9e6b9139e58d4c957ec54595da7d3, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 114350483966674976} - m_Children: - - {fileID: 8926484042661614779} - - {fileID: 8926484042661614952} - - {fileID: 8926484042661614792} - m_UIPosition: {x: 289, y: 1975} - m_UICollapsed: 0 - m_UISuperCollapsed: 0 - m_InputSlots: - - {fileID: 8926484042661614776} - m_OutputSlots: [] - m_Label: Render Quad - m_Data: {fileID: 8926484042661614721} - m_InputFlowSlot: - - link: - - context: {fileID: 8926484042661614756} - slotIndex: 0 - m_OutputFlowSlot: - - link: [] - blendMode: 1 - cullMode: 0 - zWriteMode: 0 - zTestMode: 0 - useAlphaClipping: 0 - generateMotionVector: 0 - excludeFromTUAndAA: 0 - sortingPriority: 0 - m_SubOutputs: - - {fileID: 8926484042661614781} - - {fileID: 8926484042661614955} - useBaseColorMap: 3 - colorMapping: 0 - uvMode: 0 - flipbookLayout: 0 - flipbookBlendFrames: 0 - flipbookMotionVectors: 0 - useSoftParticle: 0 - vfxSystemSortPriority: 0 - sort: 1 - sortMode: 1 - revertSorting: 0 - indirectDraw: 0 - computeCulling: 0 - frustumCulling: 0 - castShadows: 0 - useExposureWeight: 0 - enableRayTracing: 0 - decimationFactor: 1 - raytracedScaleMode: 0 - needsOwnSort: 0 - needsOwnAabbBuffer: 0 - shaderGraph: {fileID: 0} - materialSettings: - m_PropertyNames: [] - m_PropertyValues: [] - renderQueue: -1 - primitiveType: 1 - useGeometryShader: 0 ---- !u!114 &8926484042661614776 -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: 70a331b1d86cc8d4aa106ccbe0da5852, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614776} - m_MasterData: - m_Owner: {fileID: 8926484042661614775} - m_Value: - m_Type: - m_SerializableType: UnityEngine.Texture2D, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - m_SerializableObject: '{"obj":{"fileID":2800000,"guid":"de0fae515169ff246a20d58a8a440ed0","type":3}}' - m_Space: -1 - m_Property: - name: mainTexture - m_serializedType: - m_SerializableType: UnityEngine.Texture2D, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614779 -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: d16c6aeaef944094b9a1633041804207, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614775} - m_Children: [] - m_UIPosition: {x: 292.6464, y: 1481.9946} - m_UICollapsed: 0 - m_UISuperCollapsed: 0 - m_InputSlots: [] - m_OutputSlots: [] - m_Disabled: 0 - m_ActivationSlot: {fileID: 8926484042661614780} - mode: 0 - axes: 4 - faceRay: 1 ---- !u!114 &8926484042661614780 -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: b4c11ff25089a324daf359f4b0629b33, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614780} - m_MasterData: - m_Owner: {fileID: 8926484042661614779} - m_Value: - m_Type: - m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_SerializableObject: True - m_Space: -1 - m_Property: - name: _vfx_enabled - m_serializedType: - m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614781 -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: 081ffb0090424ba4cb05370a42ead6b9, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!114 &8926484042661614792 -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: 01ec2c1930009b04ea08905b47262415, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614775} - m_Children: [] - m_UIPosition: {x: 508.1385, y: 271.34802} - m_UICollapsed: 0 - m_UISuperCollapsed: 0 - m_InputSlots: - - {fileID: 8926484042661614793} - m_OutputSlots: [] - m_Disabled: 0 - m_ActivationSlot: {fileID: 8926484042661614794} - attribute: color - Composition: 2 - AlphaComposition: 0 - SampleMode: 0 - Mode: 1 - ColorMode: 3 - channels: 6 ---- !u!114 &8926484042661614793 -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: 76f778ff57c4e8145b9681fe3268d8e9, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614793} - m_MasterData: - m_Owner: {fileID: 8926484042661614792} - m_Value: - m_Type: - m_SerializableType: UnityEngine.Gradient, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - m_SerializableObject: '{"colorKeys":[{"color":{"r":0.6447322368621826,"g":0.8097582459449768,"b":0.9197756052017212,"a":1.0},"time":0.0},{"color":{"r":0.5755142569541931,"g":0.7771804332733154,"b":0.911624550819397,"a":1.0},"time":1.0}],"alphaKeys":[{"alpha":1.0,"time":0.0},{"alpha":1.0,"time":0.800000011920929},{"alpha":0.0,"time":1.0}],"gradientMode":0}' - m_Space: -1 - m_Property: - name: Color - m_serializedType: - m_SerializableType: UnityEngine.Gradient, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614794 -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: b4c11ff25089a324daf359f4b0629b33, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614794} - m_MasterData: - m_Owner: {fileID: 8926484042661614792} - m_Value: - m_Type: - m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_SerializableObject: True - m_Space: -1 - m_Property: - name: _vfx_enabled - m_serializedType: - m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614879 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614879} - m_MasterData: - m_Owner: {fileID: 8926484042661614700} - m_Value: - m_Type: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_SerializableObject: 4 - m_Space: -1 - m_Property: - name: LoopDuration - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614880 -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: 1b605c022ee79394a8a776c0869b3f9a, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: - - {fileID: 8926484042661614881} - - {fileID: 8926484042661614885} - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 0 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614880} - m_MasterData: - m_Owner: {fileID: 8926484042661614707} - m_Value: - m_Type: - m_SerializableType: UnityEditor.VFX.AABox, Unity.VisualEffectGraph.Editor, - Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - m_SerializableObject: '{"center":{"x":0.0,"y":-2.0,"z":0.0},"size":{"x":7.0,"y":8.0,"z":7.0}}' - m_Space: 0 - m_Property: - name: bounds - m_serializedType: - m_SerializableType: UnityEditor.VFX.AABox, Unity.VisualEffectGraph.Editor, - Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614881 -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: ac39bd03fca81b849929b9c966f1836a, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614880} - m_Children: - - {fileID: 8926484042661614882} - - {fileID: 8926484042661614883} - - {fileID: 8926484042661614884} - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614880} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: center - m_serializedType: - m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614882 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614881} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614880} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: x - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614883 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614881} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614880} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: y - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614884 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614881} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614880} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: z - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614885 -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: ac39bd03fca81b849929b9c966f1836a, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614880} - m_Children: - - {fileID: 8926484042661614886} - - {fileID: 8926484042661614887} - - {fileID: 8926484042661614888} - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614880} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: size - m_serializedType: - m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614886 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614885} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614880} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: x - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614887 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614885} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614880} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: y - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614888 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614885} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614880} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: z - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614889 -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: ac39bd03fca81b849929b9c966f1836a, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: - - {fileID: 8926484042661614890} - - {fileID: 8926484042661614891} - - {fileID: 8926484042661614892} - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614889} - m_MasterData: - m_Owner: {fileID: 8926484042661614707} - m_Value: - m_Type: - m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - m_SerializableObject: '{"x":0.5,"y":0.5,"z":0.5}' - m_Space: -1 - m_Property: - name: boundsPadding - m_serializedType: - m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614890 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614889} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614889} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: x - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614891 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614889} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614889} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: y - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614892 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614889} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614889} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: z - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614912 -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: 26096dfac7c062b4b94c293605ba085e, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614707} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 0 - m_UISuperCollapsed: 0 - m_InputSlots: - - {fileID: 8926484042661614913} - - {fileID: 8926484042661614918} - - {fileID: 8926484042661614919} - - {fileID: 8926484042661614920} - m_OutputSlots: [] - m_Disabled: 0 - m_ActivationSlot: {fileID: 8926484042661614921} - composition: 0 - speedMode: 1 ---- !u!114 &8926484042661614913 -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: e8f2b4a846fd4c14a893cde576ad172b, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: - - {fileID: 8926484042661614914} - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614913} - m_MasterData: - m_Owner: {fileID: 8926484042661614912} - m_Value: - m_Type: - m_SerializableType: UnityEditor.VFX.DirectionType, Unity.VisualEffectGraph.Editor, - Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - m_SerializableObject: '{"direction":{"x":0.0,"y":1.0,"z":0.0}}' - m_Space: 0 - m_Property: - name: Direction - m_serializedType: - m_SerializableType: UnityEditor.VFX.DirectionType, Unity.VisualEffectGraph.Editor, - Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614914 -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: ac39bd03fca81b849929b9c966f1836a, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614913} - m_Children: - - {fileID: 8926484042661614915} - - {fileID: 8926484042661614916} - - {fileID: 8926484042661614917} - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614913} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: direction - m_serializedType: - m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614915 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614914} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614913} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: x - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614916 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614914} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614913} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: y - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614917 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614914} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614913} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: z - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614918 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614918} - m_MasterData: - m_Owner: {fileID: 8926484042661614912} - m_Value: - m_Type: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_SerializableObject: 0.5 - m_Space: -1 - m_Property: - name: MinSpeed - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614919 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614919} - m_MasterData: - m_Owner: {fileID: 8926484042661614912} - m_Value: - m_Type: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_SerializableObject: 4.5 - m_Space: -1 - m_Property: - name: MaxSpeed - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614920 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614920} - m_MasterData: - m_Owner: {fileID: 8926484042661614912} - m_Value: - m_Type: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_SerializableObject: 0 - m_Space: -1 - m_Property: - name: DirectionBlend - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614921 -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: b4c11ff25089a324daf359f4b0629b33, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614921} - m_MasterData: - m_Owner: {fileID: 8926484042661614912} - m_Value: - m_Type: - m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_SerializableObject: True - m_Space: -1 - m_Property: - name: _vfx_enabled - m_serializedType: - m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614922 -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: e5dce54ae3368c042b26ab1f305e15b2, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614756} - m_Children: [] - m_UIPosition: {x: 0, y: 2} - m_UICollapsed: 0 - m_UISuperCollapsed: 0 - m_InputSlots: - - {fileID: 8926484042661614923} - m_OutputSlots: [] - m_Disabled: 0 - m_ActivationSlot: {fileID: 8926484042661614928} ---- !u!114 &8926484042661614923 -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: a9f9544b71b7dab44a4644b6807e8bf6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: - - {fileID: 8926484042661614924} - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614923} - m_MasterData: - m_Owner: {fileID: 8926484042661614922} - m_Value: - m_Type: - m_SerializableType: UnityEditor.VFX.Vector, Unity.VisualEffectGraph.Editor, - Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - m_SerializableObject: '{"vector":{"x":0.0,"y":0.0,"z":0.0}}' - m_Space: 1 - m_Property: - name: Force - m_serializedType: - m_SerializableType: UnityEditor.VFX.Vector, Unity.VisualEffectGraph.Editor, - Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614924 -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: ac39bd03fca81b849929b9c966f1836a, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614923} - m_Children: - - {fileID: 8926484042661614925} - - {fileID: 8926484042661614926} - - {fileID: 8926484042661614927} - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614923} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: vector - m_serializedType: - m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614925 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614924} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614923} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: x - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614926 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614924} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614923} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: y - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614927 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614924} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614923} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: z - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614928 -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: b4c11ff25089a324daf359f4b0629b33, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614928} - m_MasterData: - m_Owner: {fileID: 8926484042661614922} - m_Value: - m_Type: - m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_SerializableObject: True - m_Space: -1 - m_Property: - name: _vfx_enabled - m_serializedType: - m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614929 -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: b294673e879f9cf449cc9de536818ea9, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614756} - m_Children: [] - m_UIPosition: {x: 0, y: 77} - m_UICollapsed: 0 - m_UISuperCollapsed: 0 - m_InputSlots: - - {fileID: 8926484042661614930} - m_OutputSlots: [] - m_Disabled: 0 - m_ActivationSlot: {fileID: 8926484042661614931} - UseParticleSize: 0 ---- !u!114 &8926484042661614930 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614930} - m_MasterData: - m_Owner: {fileID: 8926484042661614929} - m_Value: - m_Type: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_SerializableObject: 0.5 - m_Space: -1 - m_Property: - name: dragCoefficient - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614931 -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: b4c11ff25089a324daf359f4b0629b33, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614931} - m_MasterData: - m_Owner: {fileID: 8926484042661614929} - m_Value: - m_Type: - m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_SerializableObject: True - m_Space: -1 - m_Property: - name: _vfx_enabled - m_serializedType: - m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614952 -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: 01ec2c1930009b04ea08905b47262415, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614775} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 0 - m_UISuperCollapsed: 0 - m_InputSlots: - - {fileID: 8926484042661614953} - m_OutputSlots: [] - m_Disabled: 0 - m_ActivationSlot: {fileID: 8926484042661614954} - attribute: size - Composition: 2 - AlphaComposition: 0 - SampleMode: 0 - Mode: 1 - ColorMode: 3 - channels: 6 ---- !u!114 &8926484042661614953 -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: c117b74c5c58db542bffe25c78fe92db, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614953} - m_MasterData: - m_Owner: {fileID: 8926484042661614952} - m_Value: - m_Type: - m_SerializableType: UnityEngine.AnimationCurve, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - m_SerializableObject: '{"frames":[{"time":0.0,"value":0.0,"inTangent":6.615680694580078,"outTangent":6.615680694580078,"tangentMode":0,"leftTangentMode":0,"rightTangentMode":0,"broken":false},{"time":0.10000000149011612,"value":1.5,"inTangent":0.06686528027057648,"outTangent":0.06686528027057648,"tangentMode":0,"leftTangentMode":0,"rightTangentMode":0,"broken":false},{"time":1.0,"value":0.0,"inTangent":-1.6666667461395264,"outTangent":-1.6666667461395264,"tangentMode":0,"leftTangentMode":1,"rightTangentMode":1,"broken":false}],"preWrapMode":8,"postWrapMode":8,"version":1}' - m_Space: -1 - m_Property: - name: Size - m_serializedType: - m_SerializableType: UnityEngine.AnimationCurve, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614954 -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: b4c11ff25089a324daf359f4b0629b33, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614954} - m_MasterData: - m_Owner: {fileID: 8926484042661614952} - m_Value: - m_Type: - m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_SerializableObject: False - m_Space: -1 - m_Property: - name: _vfx_enabled - m_serializedType: - m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614955 -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: 388ad3b1dc9c6ae45b630f914fab638f, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 ---- !u!114 &8926484042661614956 -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: fb1f6794ace8b0c4592af9c5604cddbf, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614707} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 0 - m_UISuperCollapsed: 0 - m_InputSlots: - - {fileID: 8926484042661614957} - m_OutputSlots: [] - m_Disabled: 0 - m_ActivationSlot: {fileID: 8926484042661614974} - compositionPosition: 0 - compositionAxes: 0 - compositionDirection: 0 - positionMode: 0 - spawnMode: 0 - shape: 0 - heightMode: 1 - applyOrientation: 1 - killOutliers: 0 - projectionSteps: 2 ---- !u!114 &8926484042661614957 -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: 1b605c022ee79394a8a776c0869b3f9a, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: - - {fileID: 8926484042661614958} - - {fileID: 8926484042661614973} - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614957} - m_MasterData: - m_Owner: {fileID: 8926484042661614956} - m_Value: - m_Type: - m_SerializableType: UnityEditor.VFX.TArcSphere, Unity.VisualEffectGraph.Editor, - Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - m_SerializableObject: '{"sphere":{"transform":{"position":{"x":0.0,"y":0.0,"z":0.0},"angles":{"x":0.0,"y":0.0,"z":0.0},"scale":{"x":1.0,"y":1.0,"z":1.0}},"radius":0.15000000596046449},"arc":6.28000020980835}' - m_Space: 0 - m_Property: - name: arcSphere - m_serializedType: - m_SerializableType: UnityEditor.VFX.TArcSphere, Unity.VisualEffectGraph.Editor, - Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614958 -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: 1b605c022ee79394a8a776c0869b3f9a, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614957} - m_Children: - - {fileID: 8926484042661614959} - - {fileID: 8926484042661614972} - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614957} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: sphere - m_serializedType: - m_SerializableType: UnityEditor.VFX.TSphere, Unity.VisualEffectGraph.Editor, - Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614959 -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: 3e3f628d80ffceb489beac74258f9cf7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614958} - m_Children: - - {fileID: 8926484042661614960} - - {fileID: 8926484042661614964} - - {fileID: 8926484042661614968} - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614957} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: transform - m_serializedType: - m_SerializableType: UnityEditor.VFX.Transform, Unity.VisualEffectGraph.Editor, - Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614960 -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: ac39bd03fca81b849929b9c966f1836a, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614959} - m_Children: - - {fileID: 8926484042661614961} - - {fileID: 8926484042661614962} - - {fileID: 8926484042661614963} - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614957} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: position - m_serializedType: - m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614961 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614960} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614957} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: x - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614962 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614960} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614957} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: y - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614963 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614960} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614957} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: z - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614964 -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: ac39bd03fca81b849929b9c966f1836a, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614959} - m_Children: - - {fileID: 8926484042661614965} - - {fileID: 8926484042661614966} - - {fileID: 8926484042661614967} - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614957} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: angles - m_serializedType: - m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614965 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614964} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614957} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: x - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614966 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614964} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614957} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: y - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614967 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614964} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614957} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: z - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614968 -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: ac39bd03fca81b849929b9c966f1836a, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614959} - m_Children: - - {fileID: 8926484042661614969} - - {fileID: 8926484042661614970} - - {fileID: 8926484042661614971} - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614957} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: scale - m_serializedType: - m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614969 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614968} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614957} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: x - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614970 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614968} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614957} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: y - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614971 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614968} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614957} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: z - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614972 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614958} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614957} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: radius - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614973 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614957} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614957} - m_MasterData: - m_Owner: {fileID: 0} - m_Value: - m_Type: - m_SerializableType: - m_SerializableObject: - m_Space: -1 - m_Property: - name: arc - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614974 -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: b4c11ff25089a324daf359f4b0629b33, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614974} - m_MasterData: - m_Owner: {fileID: 8926484042661614956} - m_Value: - m_Type: - m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_SerializableObject: True - m_Space: -1 - m_Property: - name: _vfx_enabled - m_serializedType: - m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614975 -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: a971fa2e110a0ac42ac1d8dae408704b, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.Block.SetAttribute - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614707} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 0 - m_UISuperCollapsed: 0 - m_InputSlots: - - {fileID: 8926484042661614976} - m_OutputSlots: [] - m_Disabled: 0 - m_ActivationSlot: {fileID: 8926484042661614977} - attribute: size - Composition: 0 - Source: 0 - Random: 0 - channels: 6 ---- !u!114 &8926484042661614976 -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: f780aa281814f9842a7c076d436932e7, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614976} - m_MasterData: - m_Owner: {fileID: 8926484042661614975} - m_Value: - m_Type: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_SerializableObject: 7 - m_Space: -1 - m_Property: - name: _Size - m_serializedType: - m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614977 -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: b4c11ff25089a324daf359f4b0629b33, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotBool - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614977} - m_MasterData: - m_Owner: {fileID: 8926484042661614975} - m_Value: - m_Type: - m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_SerializableObject: True - m_Space: -1 - m_Property: - name: _vfx_enabled - m_serializedType: - m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614978 -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: 01ec2c1930009b04ea08905b47262415, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.Block.AttributeFromCurve - m_UIIgnoredErrors: [] - m_Parent: {fileID: 8926484042661614756} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 0 - m_UISuperCollapsed: 0 - m_InputSlots: - - {fileID: 8926484042661614979} - m_OutputSlots: [] - m_Disabled: 0 - m_ActivationSlot: {fileID: 8926484042661614980} - attribute: alpha - Composition: 0 - AlphaComposition: 0 - SampleMode: 0 - Mode: 1 - ColorMode: 3 - channels: 6 ---- !u!114 &8926484042661614979 -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: c117b74c5c58db542bffe25c78fe92db, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotAnimationCurve - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614979} - m_MasterData: - m_Owner: {fileID: 8926484042661614978} - m_Value: - m_Type: - m_SerializableType: UnityEngine.AnimationCurve, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - m_SerializableObject: '{"frames":[{"time":-0.0186920166015625,"value":1.00103759765625,"inTangent":-0.20127615332603455,"outTangent":-0.20127615332603455,"tangentMode":0,"leftTangentMode":1,"rightTangentMode":1,"broken":false},{"time":5.01995849609375,"value":-0.01312255859375,"inTangent":-0.20127615332603455,"outTangent":-0.20127615332603455,"tangentMode":0,"leftTangentMode":1,"rightTangentMode":1,"broken":false}],"preWrapMode":8,"postWrapMode":8,"version":1}' - m_Space: -1 - m_Property: - name: Alpha - m_serializedType: - m_SerializableType: UnityEngine.AnimationCurve, UnityEngine.CoreModule, Version=0.0.0.0, - Culture=neutral, PublicKeyToken=null - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614980 -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: b4c11ff25089a324daf359f4b0629b33, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotBool - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614980} - m_MasterData: - m_Owner: {fileID: 8926484042661614978} - m_Value: - m_Type: - m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_SerializableObject: True - m_Space: -1 - m_Property: - name: _vfx_enabled - m_serializedType: - m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] ---- !u!114 &8926484042661614981 -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: 4d246e354feb93041a837a9ef59437cb, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotInt - m_UIIgnoredErrors: [] - m_Parent: {fileID: 0} - m_Children: [] - m_UIPosition: {x: 0, y: 0} - m_UICollapsed: 1 - m_UISuperCollapsed: 0 - m_MasterSlot: {fileID: 8926484042661614981} - m_MasterData: - m_Owner: {fileID: 8926484042661614700} - m_Value: - m_Type: - m_SerializableType: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_SerializableObject: 1 - m_Space: -1 - m_Property: - name: LoopCount - m_serializedType: - m_SerializableType: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - m_Direction: 0 - m_LinkedSlots: [] diff --git a/Assets/_Project/Art/VFX/smoke_test.vfx.meta b/Assets/_Project/Art/VFX/smoke_test.vfx.meta deleted file mode 100644 index c36ad2e..0000000 --- a/Assets/_Project/Art/VFX/smoke_test.vfx.meta +++ /dev/null @@ -1,15 +0,0 @@ -fileFormatVersion: 2 -guid: 0f2161665e283871db832868ad90b002 -VisualEffectImporter: - externalObjects: {} - serializedVersion: 2 - template: - name: - category: - description: - icon: {instanceID: 0} - thumbnail: {instanceID: 0} - useAsTemplate: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/_Project/Audio/buildings/general/10_booms.ogg b/Assets/_Project/Audio/buildings/general/10_booms.ogg deleted file mode 100644 index 36df1c5..0000000 --- a/Assets/_Project/Audio/buildings/general/10_booms.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a83f139286a94e9960cb93ac2d132ff5e262fd4730471326f07b79391e1a306 -size 1215247 diff --git a/Assets/_Project/Audio/buildings/general/10_booms.ogg.meta b/Assets/_Project/Audio/buildings/general/10_booms.ogg.meta deleted file mode 100644 index e488220..0000000 --- a/Assets/_Project/Audio/buildings/general/10_booms.ogg.meta +++ /dev/null @@ -1,23 +0,0 @@ -fileFormatVersion: 2 -guid: 8e90ffb09daead07f9c108b8047e8200 -AudioImporter: - externalObjects: {} - serializedVersion: 8 - defaultSettings: - serializedVersion: 2 - loadType: 0 - sampleRateSetting: 0 - sampleRateOverride: 44100 - compressionFormat: 1 - quality: 1 - conversionMode: 0 - preloadAudioData: 0 - platformSettingOverrides: {} - forceToMono: 0 - normalize: 1 - loadInBackground: 0 - ambisonic: 0 - 3D: 1 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/SmokeTest.prefab b/Assets/_Project/Prefabs/Towers/Tower Construction Sets/SmokeTest.prefab deleted file mode 100644 index 1054994..0000000 --- a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/SmokeTest.prefab +++ /dev/null @@ -1,152 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &8424388185091977549 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 6028395005242577650} - m_Layer: 0 - m_Name: SmokeTest - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &6028395005242577650 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8424388185091977549} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 1.37028, y: -6.203, z: 3.30153} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 6576162659729677824} - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &8857551419746186207 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 6576162659729677824} - - component: {fileID: 5680376354699372220} - - component: {fileID: 2209877433701470746} - m_Layer: 0 - m_Name: Visual Effect - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &6576162659729677824 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8857551419746186207} - 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: 6028395005242577650} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!2083052967 &5680376354699372220 -VisualEffect: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8857551419746186207} - m_Enabled: 1 - m_Asset: {fileID: 8926484042661614526, guid: 0f2161665e283871db832868ad90b002, type: 3} - m_InitialEventName: OnPlay - m_InitialEventNameOverriden: 0 - m_StartSeed: 0 - m_ResetSeedOnPlay: 1 - m_AllowInstancing: 1 - m_ResourceVersion: 1 - m_PropertySheet: - m_Float: - m_Array: [] - m_Vector2f: - m_Array: [] - m_Vector3f: - m_Array: [] - m_Vector4f: - m_Array: [] - m_Uint: - m_Array: [] - m_Int: - m_Array: [] - m_Matrix4x4f: - m_Array: [] - m_AnimationCurve: - m_Array: [] - m_Gradient: - m_Array: [] - m_NamedObject: - m_Array: [] - m_Bool: - m_Array: [] ---- !u!73398921 &2209877433701470746 -VFXRenderer: - serializedVersion: 1 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8857551419746186207} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 0 - 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_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 diff --git a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/SmokeTest.prefab.meta b/Assets/_Project/Prefabs/Towers/Tower Construction Sets/SmokeTest.prefab.meta deleted file mode 100644 index d2c78ed..0000000 --- a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/SmokeTest.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 5527964698625ed3b8bd50747ecb3300 -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: From ffe38ed8b1e6c48ac51ac40e27f0e2dda93bb58b Mon Sep 17 00:00:00 2001 From: Ian Woods Date: Mon, 6 Jul 2026 14:13:25 -0700 Subject: [PATCH 14/58] add sounds to a few more units --- Assets/_Project/Prefabs/Towers/Tower_BasicArrow.prefab | 10 +++++----- .../_Project/Prefabs/Towers/Tower_SiegeCannon.prefab | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Assets/_Project/Prefabs/Towers/Tower_BasicArrow.prefab b/Assets/_Project/Prefabs/Towers/Tower_BasicArrow.prefab index f21641d..dc2ce94 100644 --- a/Assets/_Project/Prefabs/Towers/Tower_BasicArrow.prefab +++ b/Assets/_Project/Prefabs/Towers/Tower_BasicArrow.prefab @@ -275,10 +275,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Combat.TowerLandedSound landedSound: - clip: {fileID: 0} - volume: 0 - minPitch: 0 - maxPitch: 0 + clip: {fileID: 8300000, guid: 4ee1b63f27ea04451802bafd35ecef89, type: 3} + volume: 0.667 + minPitch: 0.96 + maxPitch: 1.04 --- !u!114 &3412005213656160288 MonoBehaviour: m_ObjectHideFlags: 0 @@ -315,7 +315,7 @@ MonoBehaviour: m_PreInfinity: 2 m_PostInfinity: 2 m_RotationOrder: 4 - impactVfxPrefab: {fileID: 0} + impactVfxPrefab: {fileID: 6874992557687165507, guid: a9080df4046b863c8b07b3ad73d76bf4, type: 3} impactVfxLifetime: 3 --- !u!1 &7580197837852108944 GameObject: diff --git a/Assets/_Project/Prefabs/Towers/Tower_SiegeCannon.prefab b/Assets/_Project/Prefabs/Towers/Tower_SiegeCannon.prefab index f7020d7..c6496e6 100644 --- a/Assets/_Project/Prefabs/Towers/Tower_SiegeCannon.prefab +++ b/Assets/_Project/Prefabs/Towers/Tower_SiegeCannon.prefab @@ -258,10 +258,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Combat.TowerLandedSound landedSound: - clip: {fileID: 0} - volume: 0 - minPitch: 0 - maxPitch: 0 + clip: {fileID: 8300000, guid: 4ee1b63f27ea04451802bafd35ecef89, type: 3} + volume: 0.667 + minPitch: 0.96 + maxPitch: 1.04 --- !u!114 &4003901452716391977 MonoBehaviour: m_ObjectHideFlags: 0 @@ -298,7 +298,7 @@ MonoBehaviour: m_PreInfinity: 2 m_PostInfinity: 2 m_RotationOrder: 4 - impactVfxPrefab: {fileID: 0} + impactVfxPrefab: {fileID: 6874992557687165507, guid: a9080df4046b863c8b07b3ad73d76bf4, type: 3} impactVfxLifetime: 3 --- !u!1 &7580197837852108944 GameObject: From 4a37d3747c8c96d70fb57714c5e886a05c6805cf Mon Sep 17 00:00:00 2001 From: Ian Woods Date: Mon, 6 Jul 2026 23:56:45 -0700 Subject: [PATCH 15/58] building falling from orbit sound --- .../buildings/general/building_falling.ogg | 3 ++ .../general/building_falling.ogg.meta | 23 ++++++++++ .../BuildSiteVisual.prefab | 19 ++++++++ .../Prefabs/Towers/Tower_TeslaCoil.prefab | 2 +- .../Scripts/Combat/TowerFallingSound.cs | 46 +++++++++++++++++++ .../Scripts/Combat/TowerFallingSound.cs.meta | 3 ++ .../Scripts/Gameplay/BuildSiteVisual.cs | 14 ++++++ 7 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 Assets/_Project/Audio/buildings/general/building_falling.ogg create mode 100644 Assets/_Project/Audio/buildings/general/building_falling.ogg.meta create mode 100644 Assets/_Project/Scripts/Combat/TowerFallingSound.cs create mode 100644 Assets/_Project/Scripts/Combat/TowerFallingSound.cs.meta diff --git a/Assets/_Project/Audio/buildings/general/building_falling.ogg b/Assets/_Project/Audio/buildings/general/building_falling.ogg new file mode 100644 index 0000000..859533a --- /dev/null +++ b/Assets/_Project/Audio/buildings/general/building_falling.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e81a9e427500661a7e5f11cb61124168f9be60cbfd7164fb86eaec408ccdef3b +size 51189 diff --git a/Assets/_Project/Audio/buildings/general/building_falling.ogg.meta b/Assets/_Project/Audio/buildings/general/building_falling.ogg.meta new file mode 100644 index 0000000..c1849c6 --- /dev/null +++ b/Assets/_Project/Audio/buildings/general/building_falling.ogg.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 2726115fda23119cea127edb372d0f21 +AudioImporter: + externalObjects: {} + serializedVersion: 8 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/BuildSiteVisual.prefab b/Assets/_Project/Prefabs/Towers/Tower Construction Sets/BuildSiteVisual.prefab index 6d0724b..771a16c 100644 --- a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/BuildSiteVisual.prefab +++ b/Assets/_Project/Prefabs/Towers/Tower Construction Sets/BuildSiteVisual.prefab @@ -118,6 +118,7 @@ GameObject: - component: {fileID: 9075933591925717035} - component: {fileID: 7845454079079718139} - component: {fileID: 6259437393614329336} + - component: {fileID: 3172884111175399884} m_Layer: 0 m_Name: BuildSiteVisual m_TagString: Untagged @@ -206,3 +207,21 @@ BoxCollider: serializedVersion: 3 m_Size: {x: 1, y: 1, z: 1} m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &3172884111175399884 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7720770984308489338} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5712fbfba2f64c3aa653bebe31773d54, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Combat.TowerFallingSound + fallingSound: + clip: {fileID: 8300000, guid: 2726115fda23119cea127edb372d0f21, type: 3} + volume: 0.67 + minPitch: 0.95 + maxPitch: 0.95 + triggerSecondsBeforeCompletion: 1 diff --git a/Assets/_Project/Prefabs/Towers/Tower_TeslaCoil.prefab b/Assets/_Project/Prefabs/Towers/Tower_TeslaCoil.prefab index 640d249..23c11f4 100644 --- a/Assets/_Project/Prefabs/Towers/Tower_TeslaCoil.prefab +++ b/Assets/_Project/Prefabs/Towers/Tower_TeslaCoil.prefab @@ -149,7 +149,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} m_Name: m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 1363936954 + GlobalObjectIdHash: 280718094 InScenePlacedSourceGlobalObjectIdHash: 0 DeferredDespawnTick: 0 Ownership: 1 diff --git a/Assets/_Project/Scripts/Combat/TowerFallingSound.cs b/Assets/_Project/Scripts/Combat/TowerFallingSound.cs new file mode 100644 index 0000000..9333b2f --- /dev/null +++ b/Assets/_Project/Scripts/Combat/TowerFallingSound.cs @@ -0,0 +1,46 @@ +// Assets/_Project/Scripts/Combat/TowerFallingSound.cs +using TD.Audio; +using TD.Gameplay; +using UnityEngine; + +namespace TD.Combat +{ + /// + /// Local-only audio for the tower falling from the sky. Attached to + /// (not , which doesn't exist + /// yet) and polled every frame: plays a sound on every peer once construction has + /// seconds or less remaining, so the whoosh + /// leads the tower's actual fall/land animation (see , + /// which starts once is replaced by the real + /// at construction-complete). + /// + [RequireComponent(typeof(BuildSiteVisual))] + public class TowerFallingSound : MonoBehaviour + { + [SerializeField] private SoundConfig fallingSound; + + [Tooltip("Sound fires once remaining construction time drops to this many seconds " + + "or less.")] + [SerializeField] private float triggerSecondsBeforeCompletion = 1f; + + private BuildSiteVisual buildSiteVisual; + private bool played; + + private void Awake() + { + buildSiteVisual = GetComponent(); + } + + private void Update() + { + if (played || buildSiteVisual == null) return; + if (buildSiteVisual.CurrentStage != BuildStage.Constructing) return; + + if (buildSiteVisual.ComputeRemainingSeconds() <= triggerSecondsBeforeCompletion) + { + played = true; + AudioManager.Instance?.Play(fallingSound.clip, AudioCategory.UI, fallingSound.RandomPitch(), fallingSound.volume); + } + } + } +} diff --git a/Assets/_Project/Scripts/Combat/TowerFallingSound.cs.meta b/Assets/_Project/Scripts/Combat/TowerFallingSound.cs.meta new file mode 100644 index 0000000..0ad2579 --- /dev/null +++ b/Assets/_Project/Scripts/Combat/TowerFallingSound.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5712fbfba2f64c3aa653bebe31773d54 +timeCreated: 1783406173 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/BuildSiteVisual.cs b/Assets/_Project/Scripts/Gameplay/BuildSiteVisual.cs index f51b10d..7e85cc4 100644 --- a/Assets/_Project/Scripts/Gameplay/BuildSiteVisual.cs +++ b/Assets/_Project/Scripts/Gameplay/BuildSiteVisual.cs @@ -184,6 +184,20 @@ namespace TD.Gameplay return Mathf.Clamp01((currentRunElapsed + accumulatedConstructionTime.Value) / bt); } + /// + /// Returns seconds remaining until construction completes. Safe to call on any + /// client. Returns 0 while Queued (no timer running yet) or once complete. + /// + public float ComputeRemainingSeconds() + { + float bt = buildTime.Value; + if (bt <= 0f) return 0f; + float currentRunElapsed = constructionStartServerTime.Value > 0f + ? (float)NetworkManager.Singleton.ServerTime.Time - constructionStartServerTime.Value + : 0f; + return Mathf.Max(0f, bt - (currentRunElapsed + accumulatedConstructionTime.Value)); + } + // ----- ISelectable ------------------------------------------------ /// Name shown in the HUD portrait. Pulls from the resolved From 05671e8b0c009850b27f24d6d09f0a55d7548022 Mon Sep 17 00:00:00 2001 From: Matt F Date: Tue, 7 Jul 2026 20:45:38 -0700 Subject: [PATCH 16/58] Removing unnecessary Terrain asset and moving 9 player terrain to art folder --- Assets/New Terrain.asset | Bin 557360 -> 0 bytes Assets/New Terrain.asset.meta | 8 -------- .../Art/9PlayerTerrain.asset} | Bin 1958960 -> 1958960 bytes .../Art/9PlayerTerrain.asset.meta} | 0 4 files changed, 8 deletions(-) delete mode 100644 Assets/New Terrain.asset delete mode 100644 Assets/New Terrain.asset.meta rename Assets/{New Terrain 1.asset => _Project/Art/9PlayerTerrain.asset} (99%) rename Assets/{New Terrain 1.asset.meta => _Project/Art/9PlayerTerrain.asset.meta} (100%) diff --git a/Assets/New Terrain.asset b/Assets/New Terrain.asset deleted file mode 100644 index e41b51bad195087a40c25dd9ac9810664b28f141..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 557360 zcmeI*d#q(wT?g=e?qffr8pHVe?Z=(7@4ojo zA;o6OXC-Ideb)EvwbuTu{W!OenWES#FW=fKZn&e`e!;tMuiI|eXtUSfe*5jW-F4et zkKR#y@$%)%gFysOXL$MYKfLXcKf3kS$Nu9}zw_i@Km8YnKlW?UddFN*Z7Ytn+yA~QpKN_#d;iz;@A`FBG!Z$JK=|0kk7=l{ygCs8$JP;}@2b&32rnKw-nRuW1 z{&-E#Z$94reYE{+yz=;O&U_M8Q`+_Y?|7eiUgzEOyX*6fnSXlv{O+#rEtyZ9-!n0* z*_crJWdE<}^*>*oUoVc&Wd2RPd|&7Mx;698^>t0>{QBl?;}42!iciG)x7XLV^zwTA z8=LXJ^%=&```ljRe|xY0?)b0m<@NRTnr8gls_~<0%J%c~JEDEB^E00*(bZN-|2ITK z9{)I6<382N^ZdIj?k`8;GkN`eXD{E^x&H2~@=4Tn85H|E*I(Z2yXWtGb$vY4^#8gl zZ+5P>yZyhuw|}?)c+U0uzZA!|5dG)*|As1$swsJVnXfeYcSn0{Zk0Aa*W_>9C4X0w zziEd&ug?!O`Q1C@mm>dYlYh@H`L8$mJ-g(8(B${-kbhtF|Eb9H-hZIV_eWiqT%Svk z|5>yDebGE9_BUy6*ZF6f{LQ=Mf8OK=cga87ra zx-M~l>YQJvqPgo^=k5AEyi4A$UyQZm{_Xlb(#vP6@t2zUzrD(%YDzxe()XQB{{7J& zOR-hj{3A{N13Too{=e1aKe$7l-!J|+@_c^%Q09~A=VSNz`NNrao?qSP=Z{qVPwzih zd^Y;d`*%KD^Sj#g^EJ=E&&T+G7oW-d_dBXQpMrI1ukX(_^B+d@py=oS+~j9=$^WIv z7kYVpfBk%uFIM^V{OkM+OzaINTi)(} zeUmS5%eU_z&OP5;|C^fqAM54y^ZS;_bNyE`pG4J^?a%N0o;^6wra4x3{ns+T5?A@_ zqVHV){BFJ8%j@U&!T3zB|3)wGK3{*V$|q6RC69ml_qS0rZ-0L0_48o#pU>CLDzEp= zy1oBB+~oNkqdWiF=N*x!&$-MeQ8i_|&-rK{9B9+*tLyW4=2zk>&)<*ICy)O^FYkW; zzF6gxsOysRpFaL4qIvrG^ZWA?G505%`Tuz4lX~B*+wadGZt|bVwmq)@{5@)~>;Iiq zpVQaRT(Q6T{u-A^@vdH8`##l-KgoQL@!y^K9`~R3^!lIce1HC_US5y?8_oDnKEwF$ zeTMPh*XzGK{`-6ROmQsM{`X`2JTHE_>OZQcwCnR%&HO$P?R)wBOy+y|{A}h$cYQ9! z_<8>2_3?APy!QF0X8inJcdzk3l=&Xx|9r3ix$61Wj{o6aUO(UeE5^_H{X&&T)s*zf z``b)}nSUf+-Rogj>Tu(sa&vv<+&JbKjc<hjtn%ZuZsVs&_-*;rmXQZAoe8fR0pwYI*zS)MG*#iHKY7?s1tVrhM) zJXLOv9~v$$pW6)NSd{U_VyPUijF&DRTwhrq6{F&8ai$m+i=(!oTw5$h$JZCj;@oC= zqMh0Ca&svgnl)QqJDcwg)m@%k7_MYX)MwXDtv@hYKex76Y^=v{A^hO-cwCN(@o;pu z93Q;GQlTA;kH(SY*|D&6a=5y&50BQ9Pdfd4y%irF*>{FvIHnS*RV) zo*5Q#_)FtByK36yfV>dHXXjgv^;lbPW9josD9(iX{lkU0c#5^*`NTf9o>PwtWo3Q1 z*qjabjaP=7)zwz7dkhty>2K$mek2xu>*ukz<`sB&ZFpv-tb(S)gX^m?fz7;D>%kVH z;oP`fJUkl3R8~(PUtT*tyihGpJxq4lxp-{0H{cJ3j+ZR8yC3~(E&LW0t5&UAV7cs0RjXF5FkL{%OWs0`=@XGvUIFd0tB9O zf#00{x38${`;)W({v{pn^nSVhyDxmsm+m>8z_iD6IuU~tAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5;&t60Flf4_1T7`Mvc2-|M^Ec-cOfDT?}! S0r;PLi{j;niXwj&#s2~N6t1EG diff --git a/Assets/New Terrain.asset.meta b/Assets/New Terrain.asset.meta deleted file mode 100644 index 830694d..0000000 --- a/Assets/New Terrain.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: e75cb6747dd151148b0f1bf06123e9cf -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 15600000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/New Terrain 1.asset b/Assets/_Project/Art/9PlayerTerrain.asset similarity index 99% rename from Assets/New Terrain 1.asset rename to Assets/_Project/Art/9PlayerTerrain.asset index 1c948f89673d435e1a0e0a5565732492a9b3377c..050e58b73bc209b574cc86194d08b6c50345453b 100644 GIT binary patch delta 108 zcmdmRqI|=N@`e`17N!>F7M2#)7Pc1l7LFFq7OocV7M>Q~7QPn#7J(MQ7NHj57LhHY z5!FI`3=9mG0Xd14sYM~FMMa63dF@%%qChML#Nt3K0mPC(ECs~UKrFL8t6KJ01_0H( BCBpy! delta 108 zcmdmRqI|=N@`e`17N!>F7M2#)7Pc1l7LFFq7OocV7M>Q~7QPn#7J(MQ7NHj57LhHY z5!FJx3=9l@spSeGsYOMJnRyC^4DDIfqChML#Nt3K0mPC(ECs~UKrFL8t6KJ01^}x( BB)0$n diff --git a/Assets/New Terrain 1.asset.meta b/Assets/_Project/Art/9PlayerTerrain.asset.meta similarity index 100% rename from Assets/New Terrain 1.asset.meta rename to Assets/_Project/Art/9PlayerTerrain.asset.meta From 157b77ebfa66d2251ad4ed2adb4a0e953144663c Mon Sep 17 00:00:00 2001 From: Ian Woods Date: Tue, 7 Jul 2026 22:55:35 -0700 Subject: [PATCH 17/58] new builder option per draft - first one is gold per kill --- .../_Project/Definitions/BuilderEffects.meta | 8 ++ .../BuilderEffects/GoldPerKillEffect.asset | 16 +++ .../GoldPerKillEffect.asset.meta | 8 ++ .../Draft_BuilderEffect_GoldPerKill.asset | 19 +++ ...Draft_BuilderEffect_GoldPerKill.asset.meta | 8 ++ Assets/_Project/Prefabs/Player/Player.prefab | 20 ++- Assets/_Project/Scenes/Levels/9Player.unity | 48 +++++++ .../Scripts/Core/BuilderEffectKind.cs | 14 ++ .../Scripts/Core/BuilderEffectKind.cs.meta | 2 + .../Scripts/Gameplay/BuilderEffects.meta | 8 ++ .../BuilderEffects/BuilderEffectDefinition.cs | 34 +++++ .../BuilderEffectDefinition.cs.meta | 2 + .../BuilderEffects/BuilderEffectPool.cs | 66 +++++++++ .../BuilderEffects/BuilderEffectPool.cs.meta | 2 + .../GoldPerKillEffectDefinition.cs | 22 +++ .../GoldPerKillEffectDefinition.cs.meta | 2 + .../Scripts/Gameplay/BuilderUpgradeManager.cs | 125 ++++++++++++++++++ .../Gameplay/BuilderUpgradeManager.cs.meta | 2 + .../Draft/BuilderEffectDraftOption.cs | 37 ++++++ .../Draft/BuilderEffectDraftOption.cs.meta | 2 + .../_Project/Scripts/Gameplay/WaveManager.cs | 18 ++- 21 files changed, 456 insertions(+), 7 deletions(-) create mode 100644 Assets/_Project/Definitions/BuilderEffects.meta create mode 100644 Assets/_Project/Definitions/BuilderEffects/GoldPerKillEffect.asset create mode 100644 Assets/_Project/Definitions/BuilderEffects/GoldPerKillEffect.asset.meta create mode 100644 Assets/_Project/Definitions/Draft/Draft_BuilderEffect_GoldPerKill.asset create mode 100644 Assets/_Project/Definitions/Draft/Draft_BuilderEffect_GoldPerKill.asset.meta create mode 100644 Assets/_Project/Scripts/Core/BuilderEffectKind.cs create mode 100644 Assets/_Project/Scripts/Core/BuilderEffectKind.cs.meta create mode 100644 Assets/_Project/Scripts/Gameplay/BuilderEffects.meta create mode 100644 Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectDefinition.cs create mode 100644 Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectDefinition.cs.meta create mode 100644 Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectPool.cs create mode 100644 Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectPool.cs.meta create mode 100644 Assets/_Project/Scripts/Gameplay/BuilderEffects/GoldPerKillEffectDefinition.cs create mode 100644 Assets/_Project/Scripts/Gameplay/BuilderEffects/GoldPerKillEffectDefinition.cs.meta create mode 100644 Assets/_Project/Scripts/Gameplay/BuilderUpgradeManager.cs create mode 100644 Assets/_Project/Scripts/Gameplay/BuilderUpgradeManager.cs.meta create mode 100644 Assets/_Project/Scripts/Gameplay/Draft/BuilderEffectDraftOption.cs create mode 100644 Assets/_Project/Scripts/Gameplay/Draft/BuilderEffectDraftOption.cs.meta diff --git a/Assets/_Project/Definitions/BuilderEffects.meta b/Assets/_Project/Definitions/BuilderEffects.meta new file mode 100644 index 0000000..c619ee9 --- /dev/null +++ b/Assets/_Project/Definitions/BuilderEffects.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3e6583debe83da83abe53dec4eb2454b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/BuilderEffects/GoldPerKillEffect.asset b/Assets/_Project/Definitions/BuilderEffects/GoldPerKillEffect.asset new file mode 100644 index 0000000..3f1044b --- /dev/null +++ b/Assets/_Project/Definitions/BuilderEffects/GoldPerKillEffect.asset @@ -0,0 +1,16 @@ +%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: 5ce77a7f27ed228a0ad0494dfc1a4749, type: 3} + m_Name: GoldPerKillEffect + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.BuilderEffects.GoldPerKillEffectDefinition + DisplayName: Gold Per Kill + BonusGoldPerKill: 1 diff --git a/Assets/_Project/Definitions/BuilderEffects/GoldPerKillEffect.asset.meta b/Assets/_Project/Definitions/BuilderEffects/GoldPerKillEffect.asset.meta new file mode 100644 index 0000000..c0cfe61 --- /dev/null +++ b/Assets/_Project/Definitions/BuilderEffects/GoldPerKillEffect.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 419fac0976a3e0a20827beff81826161 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/Draft/Draft_BuilderEffect_GoldPerKill.asset b/Assets/_Project/Definitions/Draft/Draft_BuilderEffect_GoldPerKill.asset new file mode 100644 index 0000000..391470d --- /dev/null +++ b/Assets/_Project/Definitions/Draft/Draft_BuilderEffect_GoldPerKill.asset @@ -0,0 +1,19 @@ +%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: 4eaef3264612070c48fbc6a987c89858, type: 3} + m_Name: Draft_BuilderEffect_GoldPerKill + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.Draft.BuilderEffectDraftOption + DisplayName: Gold Per Kill + Description: Get more gold per kill + Icon: {fileID: 0} + Weight: 1 + Kind: 0 diff --git a/Assets/_Project/Definitions/Draft/Draft_BuilderEffect_GoldPerKill.asset.meta b/Assets/_Project/Definitions/Draft/Draft_BuilderEffect_GoldPerKill.asset.meta new file mode 100644 index 0000000..3d7d0d2 --- /dev/null +++ b/Assets/_Project/Definitions/Draft/Draft_BuilderEffect_GoldPerKill.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 65ff25c1c8a89f7df8e88f71968c1c98 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Prefabs/Player/Player.prefab b/Assets/_Project/Prefabs/Player/Player.prefab index 666ff7b..33c1316 100644 --- a/Assets/_Project/Prefabs/Player/Player.prefab +++ b/Assets/_Project/Prefabs/Player/Player.prefab @@ -16,6 +16,7 @@ GameObject: - component: {fileID: 2806524246861401760} - component: {fileID: 2806524246861401799} - component: {fileID: 2806524246861401801} + - component: {fileID: 5683786710272852339} m_Layer: 0 m_Name: Player m_TagString: Untagged @@ -50,7 +51,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} m_Name: m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 1552073510 + GlobalObjectIdHash: 121878297 InScenePlacedSourceGlobalObjectIdHash: 0 DeferredDespawnTick: 0 Ownership: 1 @@ -129,7 +130,7 @@ MonoBehaviour: m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: b7e4c91a08f5d2461a3f8e6c25b09d74, type: 3} - m_Name: + m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.PlayerTowerDeck ShowTopMostFoldoutHeaderGroup: 1 --- !u!114 &2806524246861401801 @@ -142,6 +143,19 @@ MonoBehaviour: m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 2b8f4d1e6c3a497051d8e2f7a9c1b063, type: 3} - m_Name: + m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.Draft.PlayerDraft ShowTopMostFoldoutHeaderGroup: 1 +--- !u!114 &5683786710272852339 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3493329038866903420} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 72dac94cde24af07ea0b5c77b228be34, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.BuilderUpgradeManager + ShowTopMostFoldoutHeaderGroup: 1 diff --git a/Assets/_Project/Scenes/Levels/9Player.unity b/Assets/_Project/Scenes/Levels/9Player.unity index 14f1ebc..3264d21 100644 --- a/Assets/_Project/Scenes/Levels/9Player.unity +++ b/Assets/_Project/Scenes/Levels/9Player.unity @@ -27937,6 +27937,52 @@ BoxCollider: serializedVersion: 3 m_Size: {x: 20, y: 1, z: 13} m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &2079088111 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2079088113} + - component: {fileID: 2079088112} + m_Layer: 0 + m_Name: BuilderEffectPool + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &2079088112 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2079088111} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6226c6e672c5b358a9cdc2a1bee47daf, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.BuilderEffects.BuilderEffectPool + effects: + - {fileID: 11400000, guid: 419fac0976a3e0a20827beff81826161, type: 2} +--- !u!4 &2079088113 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2079088111} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -5.96326, y: 0, z: -13.28562} + 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 &2090447971 GameObject: m_ObjectHideFlags: 0 @@ -28518,6 +28564,7 @@ MonoBehaviour: options: - {fileID: 11400000, guid: 6b1d3f8a2c5e4097b8a1d0c3e6f9b240, type: 2} - {fileID: 11400000, guid: f4a2b8d1c6e93f05a7b2d4c8e1f6a930, type: 2} + - {fileID: 11400000, guid: 65ff25c1c8a89f7df8e88f71968c1c98, type: 2} --- !u!4 &2139601601 Transform: m_ObjectHideFlags: 0 @@ -28914,3 +28961,4 @@ SceneRoots: - {fileID: 2139601601} - {fileID: 176580462} - {fileID: 516125087} + - {fileID: 2079088113} diff --git a/Assets/_Project/Scripts/Core/BuilderEffectKind.cs b/Assets/_Project/Scripts/Core/BuilderEffectKind.cs new file mode 100644 index 0000000..4a731f7 --- /dev/null +++ b/Assets/_Project/Scripts/Core/BuilderEffectKind.cs @@ -0,0 +1,14 @@ +// Assets/_Project/Scripts/Core/BuilderEffectKind.cs +namespace TD.Core +{ + /// + /// Identifies which builder effect a + /// represents. Backs a + /// bitmask on , so keep this to 32 entries + /// or fewer (or widen the mask to ulong if it ever needs more). + /// + public enum BuilderEffectKind : byte + { + GoldPerKill = 0, + } +} diff --git a/Assets/_Project/Scripts/Core/BuilderEffectKind.cs.meta b/Assets/_Project/Scripts/Core/BuilderEffectKind.cs.meta new file mode 100644 index 0000000..6eaad35 --- /dev/null +++ b/Assets/_Project/Scripts/Core/BuilderEffectKind.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4e5626ef347960fd2880acfcefa7cc38 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/BuilderEffects.meta b/Assets/_Project/Scripts/Gameplay/BuilderEffects.meta new file mode 100644 index 0000000..26d9048 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderEffects.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dd9f1f667cfdcbf6d9ee44acc270f128 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectDefinition.cs b/Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectDefinition.cs new file mode 100644 index 0000000..12be8ff --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectDefinition.cs @@ -0,0 +1,34 @@ +// Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectDefinition.cs +using UnityEngine; +using TD.Core; + +namespace TD.Gameplay.BuilderEffects +{ + /// + /// Base class for one builder effect — a passive perk that applies to every tower a + /// player's Builder constructs (e.g. "kills yield bonus gold"). Granted via the draft + /// () and tracked per-player by + /// . + /// + /// + /// One asset per kind. is fixed per subclass (each concrete + /// type overrides it to its own ), so there's no way to + /// mis-tag an asset in the inspector. uses it to build a + /// fixed-size, enum-indexed lookup table — no scanning to resolve a kind to its data. + /// + /// No shared "Apply" contract. Concrete subclasses (e.g. + /// ) carry whatever payload they need. Effects with + /// different application shapes — a simple value read at an existing game-event hook vs. + /// behavior that needs its own component on the tower — are still just subclasses; consumers + /// query the concrete type they care about directly (see + /// ). + /// + public abstract class BuilderEffectDefinition : ScriptableObject + { + /// Which builder effect this asset's data belongs to. + public abstract BuilderEffectKind Kind { get; } + + [Tooltip("Name shown wherever a player's active builder effects are listed.")] + public string DisplayName; + } +} diff --git a/Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectDefinition.cs.meta b/Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectDefinition.cs.meta new file mode 100644 index 0000000..039a631 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectDefinition.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3a939cb6af19202e1a9bddf01d9f1857 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectPool.cs b/Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectPool.cs new file mode 100644 index 0000000..0c926e1 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectPool.cs @@ -0,0 +1,66 @@ +// Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectPool.cs +using System; +using UnityEngine; +using TD.Core; + +namespace TD.Gameplay.BuilderEffects +{ + /// + /// Scene singleton holding every available this match, + /// authored as a flat array in the inspector for convenience. Internally it builds a + /// fixed-size table indexed by so lookups are a single array + /// access, not a scan. + /// + /// + /// Plain MonoBehaviour: identical on every peer (same assets), so there is nothing to sync. + /// The server reads it to resolve grants; clients read it to render an "active effects" list. + /// + public class BuilderEffectPool : MonoBehaviour + { + public static BuilderEffectPool Instance { get; private set; } + + [Tooltip("Every BuilderEffectDefinition asset available this match. One entry per " + + "BuilderEffectKind — order doesn't matter, Kind on the asset itself decides " + + "its slot.")] + [SerializeField] private BuilderEffectDefinition[] effects; + + // Fixed-size, enum-indexed lookup built once in Awake. Sized to the enum's entry count, + // not authored count, so an out-of-range Kind is a compile-time impossibility rather + // than a bounds check we'd otherwise need on every Get(). + private BuilderEffectDefinition[] byKind; + + private void Awake() + { + if (Instance != null && Instance != this) + { + Debug.LogError("[BuilderEffectPool] Multiple instances detected. Only one per scene."); + return; + } + Instance = this; + + int kindCount = Enum.GetValues(typeof(BuilderEffectKind)).Length; + byKind = new BuilderEffectDefinition[kindCount]; + if (effects == null) return; + + for (int i = 0; i < effects.Length; i++) + { + var def = effects[i]; + if (def == null) continue; + byKind[(int)def.Kind] = def; + } + } + + private void OnDestroy() + { + if (Instance == this) Instance = null; + } + + /// Returns the effect asset for , or null if none is + /// authored in this pool. + public BuilderEffectDefinition Get(BuilderEffectKind kind) + { + int i = (int)kind; + return (byKind != null && i >= 0 && i < byKind.Length) ? byKind[i] : null; + } + } +} diff --git a/Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectPool.cs.meta b/Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectPool.cs.meta new file mode 100644 index 0000000..438b507 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderEffects/BuilderEffectPool.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 6226c6e672c5b358a9cdc2a1bee47daf \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/BuilderEffects/GoldPerKillEffectDefinition.cs b/Assets/_Project/Scripts/Gameplay/BuilderEffects/GoldPerKillEffectDefinition.cs new file mode 100644 index 0000000..775d4c0 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderEffects/GoldPerKillEffectDefinition.cs @@ -0,0 +1,22 @@ +// Assets/_Project/Scripts/Gameplay/BuilderEffects/GoldPerKillEffectDefinition.cs +using UnityEngine; +using TD.Core; + +namespace TD.Gameplay.BuilderEffects +{ + /// + /// Builder effect #1 — every tower the player owns yields extra gold per kill. + /// Read by , which + /// queries when awarding kill gold. + /// + [CreateAssetMenu(fileName = "GoldPerKillEffect", menuName = "TD/Builder Effects/Gold Per Kill")] + public class GoldPerKillEffectDefinition : BuilderEffectDefinition + { + public override BuilderEffectKind Kind => BuilderEffectKind.GoldPerKill; + + [Tooltip("Flat bonus gold awarded on top of the normal kill reward, for every kill by " + + "any of this player's towers.")] + [Min(0)] + public int BonusGoldPerKill = 1; + } +} diff --git a/Assets/_Project/Scripts/Gameplay/BuilderEffects/GoldPerKillEffectDefinition.cs.meta b/Assets/_Project/Scripts/Gameplay/BuilderEffects/GoldPerKillEffectDefinition.cs.meta new file mode 100644 index 0000000..f6342a3 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderEffects/GoldPerKillEffectDefinition.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5ce77a7f27ed228a0ad0494dfc1a4749 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/BuilderUpgradeManager.cs b/Assets/_Project/Scripts/Gameplay/BuilderUpgradeManager.cs new file mode 100644 index 0000000..0013ef9 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderUpgradeManager.cs @@ -0,0 +1,125 @@ +// Assets/_Project/Scripts/Gameplay/BuilderUpgradeManager.cs +using System.Collections.Generic; +using Unity.Netcode; +using UnityEngine; +using TD.Core; +using TD.Gameplay.BuilderEffects; + +namespace TD.Gameplay +{ + /// + /// Per-player set of granted builder effects. Lives on the Player prefab alongside + /// , , and + /// . + /// + /// + /// Bitmask, not a list. A builder effect carries no per-grant state (no level, + /// no enable/disable toggle) — it's either granted or it isn't — so the granted set is one + /// bitmask keyed by rather + /// than a NetworkList. "Has effect" and "grant effect" are both O(1) bit ops. + /// + /// Granted via draft. + /// calls when a player picks it. Effects are permanent for + /// the match — there is no revoke. + /// + /// Query, don't snapshot. Consumers (e.g. awarding + /// kill gold) query this manager live at the point of use rather than towers caching their + /// own copy — every tower a player owns benefits immediately, including ones built before + /// the effect was granted. + /// + /// Generic accessor, not one method per effect. + /// is the only way to read an effect's tunable data. + /// This keeps the API surface fixed as the effect roster grows — a new effect kind adds a + /// call site where it's consumed (e.g. a new line in WaveManager), not a new method + /// here. + /// + public class BuilderUpgradeManager : NetworkBehaviour + { + // ----- Static registry (mirrors PlayerGoldManager / PlayerTowerDeck) ----- + + private static readonly Dictionary s_byClientId + = new Dictionary(); + + /// Returns the manager owned by the given client, or null. + public static BuilderUpgradeManager GetForClient(ulong clientId) + { + s_byClientId.TryGetValue(clientId, out var mgr); + return mgr; + } + + /// Convenience: the local client's own manager. + public static BuilderUpgradeManager Local + { + get + { + var nm = NetworkManager.Singleton; + if (nm == null || !nm.IsClient) return null; + return GetForClient(nm.LocalClientId); + } + } + + // ----- Networked state -------------------------------------------- + + // One bit per BuilderEffectKind. readPerm Everyone (consistent with the other + // per-player managers); writePerm Server. + private readonly NetworkVariable grantedMask = new NetworkVariable( + value: 0, + readPerm: NetworkVariableReadPermission.Everyone, + writePerm: NetworkVariableWritePermission.Server + ); + + /// Fired on every peer when a new effect is granted. + public event System.Action OnUpgradesChanged; + + // ----- NGO lifecycle ------------------------------------------------ + + public override void OnNetworkSpawn() + { + s_byClientId[OwnerClientId] = this; + grantedMask.OnValueChanged += HandleMaskChanged; + } + + public override void OnNetworkDespawn() + { + grantedMask.OnValueChanged -= HandleMaskChanged; + + if (s_byClientId.TryGetValue(OwnerClientId, out var registered) && registered == this) + s_byClientId.Remove(OwnerClientId); + } + + private void HandleMaskChanged(uint previous, uint current) => OnUpgradesChanged?.Invoke(); + + // ----- Read API ----------------------------------------------------- + + /// True if this player has been granted the given effect. + public bool PlayerHasEffect(BuilderEffectKind kind) => (grantedMask.Value & BitFor(kind)) != 0; + + /// + /// Returns this player's for + /// as , or null if the player doesn't have it (or the pool has no + /// asset for it). Callers extract whatever field they need — see the "generic accessor" + /// note above for why this isn't a per-effect method. + /// + public T GetEffectDefinition(BuilderEffectKind kind) where T : BuilderEffectDefinition + => PlayerHasEffect(kind) ? BuilderEffectPool.Instance?.Get(kind) as T : null; + + // ----- Server mutation ----------------------------------------------- + + /// + /// Server-only: grants the given effect (a draft pick). No-op if already granted. + /// Returns true if it was actually granted. + /// + public bool ServerGrantEffect(BuilderEffectKind kind) + { + if (!IsServer) return false; + + uint bit = BitFor(kind); + if ((grantedMask.Value & bit) != 0) return false; + + grantedMask.Value |= bit; + return true; + } + + private static uint BitFor(BuilderEffectKind kind) => 1u << (int)kind; + } +} diff --git a/Assets/_Project/Scripts/Gameplay/BuilderUpgradeManager.cs.meta b/Assets/_Project/Scripts/Gameplay/BuilderUpgradeManager.cs.meta new file mode 100644 index 0000000..6da307b --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderUpgradeManager.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 72dac94cde24af07ea0b5c77b228be34 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/Draft/BuilderEffectDraftOption.cs b/Assets/_Project/Scripts/Gameplay/Draft/BuilderEffectDraftOption.cs new file mode 100644 index 0000000..fb91dda --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/Draft/BuilderEffectDraftOption.cs @@ -0,0 +1,37 @@ +// Assets/_Project/Scripts/Gameplay/Draft/BuilderEffectDraftOption.cs +using UnityEngine; +using TD.Core; +using TD.Gameplay.BuilderEffects; + +namespace TD.Gameplay.Draft +{ + /// + /// Draft choice #2 — "gain a builder effect". Grants the player a passive effect that + /// applies to every tower they own, adding it to their . + /// + /// + /// Unlike , this carries the + /// directly rather than an asset reference — there's no id to resolve, the enum value is the + /// stable identifier and + /// already key off of. + /// + [CreateAssetMenu(fileName = "BuilderEffectOption", menuName = "TD/Draft/Builder Effect Option")] + public class BuilderEffectDraftOption : DraftOption + { + [Header("Payload")] + [Tooltip("The builder effect this option grants.")] + public BuilderEffectKind Kind; + + public override bool IsValidFor(ulong clientId) + { + var upgrades = BuilderUpgradeManager.GetForClient(clientId); + return upgrades != null && !upgrades.PlayerHasEffect(Kind); + } + + public override bool ServerApply(ulong clientId) + { + var upgrades = BuilderUpgradeManager.GetForClient(clientId); + return upgrades != null && upgrades.ServerGrantEffect(Kind); + } + } +} diff --git a/Assets/_Project/Scripts/Gameplay/Draft/BuilderEffectDraftOption.cs.meta b/Assets/_Project/Scripts/Gameplay/Draft/BuilderEffectDraftOption.cs.meta new file mode 100644 index 0000000..b0d473b --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/Draft/BuilderEffectDraftOption.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4eaef3264612070c48fbc6a987c89858 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/WaveManager.cs b/Assets/_Project/Scripts/Gameplay/WaveManager.cs index 5c8f7dd..d1d889b 100644 --- a/Assets/_Project/Scripts/Gameplay/WaveManager.cs +++ b/Assets/_Project/Scripts/Gameplay/WaveManager.cs @@ -3,6 +3,7 @@ using System.Collections; using Unity.Netcode; using UnityEngine; using TD.Core; +using TD.Gameplay.BuilderEffects; using TD.Gameplay.Draft; using TD.Levels; using TD.UI; @@ -524,22 +525,31 @@ namespace TD.Gameplay var goldEntry = goldConfig?.GetWaveEntry(currentWaveIndex + 1); if (goldEntry != null) killReward = goldEntry.GoldPerEnemy; - // Award kill gold to the tower owner that landed the killing blow. + // Award kill gold to the tower owner that landed the killing blow. The builder's + // "gold per kill" effect (if granted) is queried live here rather than cached on + // the killing tower — see BuilderUpgradeManager's "query, don't snapshot" note. PlayerSlot killerSlot = health.LastHitOwner; + int totalReward = killReward; if (killerSlot != PlayerSlot.None && killReward > 0) { var pms = PlayerMatchState.GetForSlot(killerSlot); if (pms != null) + { + var gpk = BuilderUpgradeManager.GetForClient(pms.OwnerClientId) + ?.GetEffectDefinition(BuilderEffectKind.GoldPerKill); + totalReward = killReward + (gpk?.BonusGoldPerKill ?? 0); + PlayerGoldManager.GetForClient(pms.OwnerClientId) - ?.AwardGold(killReward); + ?.AwardGold(totalReward); + } } // Show a "+N" gold popup above the corpse on every peer. Capture the // position here on the server — by the time the RPC fires on clients // the death sequence will be moving the corpse, but the spawn point // is good enough and we want the popup to anchor where the kill happened. - if (killReward > 0) - ShowGoldRewardClientRpc(health.transform.position, killReward); + if (totalReward > 0) + ShowGoldRewardClientRpc(health.transform.position, totalReward); UnsubscribeEnemy(health); DecrementAndCheckComplete(); From bf3c0087777009387d790c2cce93a3d60de3c13a Mon Sep 17 00:00:00 2001 From: Ian Woods Date: Tue, 7 Jul 2026 23:43:15 -0700 Subject: [PATCH 18/58] bit field swapped for normal list at API boundaries --- .../Scripts/Gameplay/BuilderUpgradeManager.cs | 37 +++++++++---------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/Assets/_Project/Scripts/Gameplay/BuilderUpgradeManager.cs b/Assets/_Project/Scripts/Gameplay/BuilderUpgradeManager.cs index 0013ef9..5f07d31 100644 --- a/Assets/_Project/Scripts/Gameplay/BuilderUpgradeManager.cs +++ b/Assets/_Project/Scripts/Gameplay/BuilderUpgradeManager.cs @@ -13,10 +13,12 @@ namespace TD.Gameplay /// . /// /// - /// Bitmask, not a list. A builder effect carries no per-grant state (no level, - /// no enable/disable toggle) — it's either granted or it isn't — so the granted set is one - /// bitmask keyed by rather - /// than a NetworkList. "Has effect" and "grant effect" are both O(1) bit ops. + /// List of granted kinds. A builder effect carries no per-grant state (no + /// level, no enable/disable toggle) — it's either granted or it isn't — so the granted set + /// is a of values. Stored as + /// byte because NetworkList<T> requires T : IEquatable<T> + /// and plain enums don't implement that (see for the + /// same constraint on a struct); byte already does, for free. /// /// Granted via draft. /// calls when a player picks it. Effects are permanent for @@ -60,13 +62,10 @@ namespace TD.Gameplay // ----- Networked state -------------------------------------------- - // One bit per BuilderEffectKind. readPerm Everyone (consistent with the other - // per-player managers); writePerm Server. - private readonly NetworkVariable grantedMask = new NetworkVariable( - value: 0, - readPerm: NetworkVariableReadPermission.Everyone, - writePerm: NetworkVariableWritePermission.Server - ); + // Granted effect kinds, stored as byte (see class remarks for why not the enum + // directly). readPerm Everyone (consistent with the other per-player managers); + // writePerm Server — both are NetworkList's defaults. + private readonly NetworkList grantedKinds = new NetworkList(); /// Fired on every peer when a new effect is granted. public event System.Action OnUpgradesChanged; @@ -76,23 +75,23 @@ namespace TD.Gameplay public override void OnNetworkSpawn() { s_byClientId[OwnerClientId] = this; - grantedMask.OnValueChanged += HandleMaskChanged; + grantedKinds.OnListChanged += HandleGrantedKindsChanged; } public override void OnNetworkDespawn() { - grantedMask.OnValueChanged -= HandleMaskChanged; + grantedKinds.OnListChanged -= HandleGrantedKindsChanged; if (s_byClientId.TryGetValue(OwnerClientId, out var registered) && registered == this) s_byClientId.Remove(OwnerClientId); } - private void HandleMaskChanged(uint previous, uint current) => OnUpgradesChanged?.Invoke(); + private void HandleGrantedKindsChanged(NetworkListEvent change) => OnUpgradesChanged?.Invoke(); // ----- Read API ----------------------------------------------------- /// True if this player has been granted the given effect. - public bool PlayerHasEffect(BuilderEffectKind kind) => (grantedMask.Value & BitFor(kind)) != 0; + public bool PlayerHasEffect(BuilderEffectKind kind) => grantedKinds.Contains((byte)kind); /// /// Returns this player's for @@ -113,13 +112,11 @@ namespace TD.Gameplay { if (!IsServer) return false; - uint bit = BitFor(kind); - if ((grantedMask.Value & bit) != 0) return false; + byte value = (byte)kind; + if (grantedKinds.Contains(value)) return false; - grantedMask.Value |= bit; + grantedKinds.Add(value); return true; } - - private static uint BitFor(BuilderEffectKind kind) => 1u << (int)kind; } } From 9be31b16455f57b9a3011d35d44d38f2b55eade4 Mon Sep 17 00:00:00 2001 From: Matt F Date: Tue, 14 Jul 2026 20:05:06 -0700 Subject: [PATCH 19/58] Add tower Sell action with refund + coin VFX/SFX Owner-validated sell RPC refunds SellRefundPercent of invested gold (Wall refunds 100% while un-upgraded), despawns the tower, and broadcasts a coin-burst VFX + rustle SFX. Refunds do not count as per-wave income. Investment/upgrade tracking added as the seam for the future upgrade system. Co-Authored-By: Claude Opus 4.8 --- .../Scripts/Gameplay/PlayerGoldManager.cs | 16 ++- .../Scripts/Gameplay/TowerInstance.cs | 107 ++++++++++++++++++ .../Scripts/Gameplay/TowerPlacementManager.cs | 21 ++++ .../Scripts/Towers/TowerDefinition.cs | 16 +++ Assets/_Project/Scripts/UI/HUDController.cs | 29 +++-- Assets/_Project/Scripts/VFX/CoinBurstVfx.cs | 101 +++++++++++++++++ .../_Project/Scripts/VFX/SellEffectSpawner.cs | 83 ++++++++++++++ 7 files changed, 361 insertions(+), 12 deletions(-) create mode 100644 Assets/_Project/Scripts/VFX/CoinBurstVfx.cs create mode 100644 Assets/_Project/Scripts/VFX/SellEffectSpawner.cs diff --git a/Assets/_Project/Scripts/Gameplay/PlayerGoldManager.cs b/Assets/_Project/Scripts/Gameplay/PlayerGoldManager.cs index 1cb3170..4cbd3a4 100644 --- a/Assets/_Project/Scripts/Gameplay/PlayerGoldManager.cs +++ b/Assets/_Project/Scripts/Gameplay/PlayerGoldManager.cs @@ -143,11 +143,17 @@ namespace TD.Gameplay /// /// Server-side entry point for awarding gold (wave clear, enemy kill). /// Direct call — not Rpc-wrapped — because awards always originate - /// from server-authoritative game events. Also increments - /// so the HUD's per-wave counter reflects - /// it; spending does not decrement that counter (it tracks earnings, not balance). + /// from server-authoritative game events. When + /// is true (the default) it also increments so the + /// HUD's per-wave counter reflects it; spending does not decrement that counter (it + /// tracks earnings, not balance). /// - public void AwardGold(int amount) + /// + /// Pass false for gold returned to the player that isn't income — e.g. a tower-sell + /// refund. The player's balance still rises, but the per-wave "earned" counter does not, + /// so refunds don't inflate round-income stats. + /// + public void AwardGold(int amount, bool countAsEarned = true) { if (!IsServer) { @@ -158,7 +164,7 @@ namespace TD.Gameplay if (amount <= 0) return; currentGold.Value += amount; - goldEarnedThisWave.Value += amount; + if (countAsEarned) goldEarnedThisWave.Value += amount; } /// diff --git a/Assets/_Project/Scripts/Gameplay/TowerInstance.cs b/Assets/_Project/Scripts/Gameplay/TowerInstance.cs index 519ff04..1b01a4a 100644 --- a/Assets/_Project/Scripts/Gameplay/TowerInstance.cs +++ b/Assets/_Project/Scripts/Gameplay/TowerInstance.cs @@ -105,6 +105,24 @@ namespace TD.Gameplay readPerm: NetworkVariableReadPermission.Everyone, writePerm: NetworkVariableWritePermission.Server); + // Total gold sunk into this tower: its placement cost plus any gold later spent + // upgrading it. Set on the server at spawn (= placement cost) and grown by the + // (future) upgrade system via ServerAddUpgradeInvestment. Replicated so the HUD's + // Sell button can preview the exact refund without a server round-trip. + private readonly NetworkVariable goldInvested = + new NetworkVariable( + 0, + readPerm: NetworkVariableReadPermission.Everyone, + writePerm: NetworkVariableWritePermission.Server); + + // Number of upgrades applied to this tower. 0 = never upgraded. Drives the Wall's + // "full refund only while un-upgraded" rule and will back tier display later. + private readonly NetworkVariable upgradeCount = + new NetworkVariable( + 0, + readPerm: NetworkVariableReadPermission.Everyone, + writePerm: NetworkVariableWritePermission.Server); + // ----- Local resolved state ------------------------------------------- // Resolved on every client in OnNetworkSpawn from definitionTypeId via the catalog. @@ -144,6 +162,12 @@ namespace TD.Gameplay /// The footprint anchor tile (SW corner, world-tile coords). public Vector2Int AnchorTile => anchorTile.Value; + /// Total gold sunk into this tower so far (placement + upgrades). + public int GoldInvested => goldInvested.Value; + + /// How many upgrades have been applied to this tower (0 = never upgraded). + public int UpgradeCount => upgradeCount.Value; + /// World-unit height the post-construction drop animation falls from. public float DropHeight => dropHeight; @@ -254,6 +278,11 @@ namespace TD.Gameplay anchorTile.Value = pendingAnchor; ownerSlot.Value = pendingOwner; + // Seed invested gold with the placement cost — the same amount + // TowerPlacementManager deducted to build this tower. The upgrade system + // grows this later via ServerAddUpgradeInvestment. + goldInvested.Value = pendingDefinition != null ? pendingDefinition.GoldCost : 0; + // Clear the pending data — it's now committed to NetworkVariables. hasPendingInit = false; } @@ -345,6 +374,84 @@ namespace TD.Gameplay // Re-tint on every client (and the server) when the replicated paint color changes. private void HandlePaintColorChanged(PaintColor previous, PaintColor current) => ApplyTint(); + // ----- Selling -------------------------------------------------------- + + // Server-only guard: a fast double-click could deliver two sell RPCs before the + // despawn propagates. Mirrors BuildSiteVisual.serverCancelled. + private bool serverSold; + + /// + /// Gold returned if this tower is sold right now. Single source of truth for both + /// the server (which awards it) and the HUD (which labels the Sell button). By + /// default this is of everything + /// invested; a tower flagged + /// (the Wall) returns the full amount while it has never been upgraded. + /// + public int ComputeSellRefund() + { + int invested = goldInvested.Value; + if (resolvedDefinition == null) + return Mathf.RoundToInt(invested * 0.75f); + + if (resolvedDefinition.FullRefundIfUnupgraded && upgradeCount.Value == 0) + return invested; + + return Mathf.RoundToInt(invested * resolvedDefinition.SellRefundPercent); + } + + /// + /// Server-only: records gold spent upgrading this tower (so a later sell refunds a + /// share of it) and marks the tower upgraded — which forfeits any + /// full-refund-while-unupgraded rule. The upgrade system calls this when it lands. + /// + public void ServerAddUpgradeInvestment(int cost) + { + if (!IsServer) return; + if (cost > 0) goldInvested.Value += cost; + upgradeCount.Value += 1; + } + + /// + /// Client → server request to sell this tower. Accepted only from the tower's owner + /// (same ownership rule as placement and paint). The server refunds gold, broadcasts + /// the sell VFX/SFX from a persistent object, then despawns the tower — + /// restores the footprint's grid state and clears + /// selection on every peer. + /// + [Rpc(SendTo.Server)] + public void RequestSellServerRpc(RpcParams rpcParams = default) + { + if (!IsServer) return; + if (serverSold) return; // idempotent guard against a double-click + + ulong senderClientId = rpcParams.Receive.SenderClientId; + PlayerSlot senderSlot = PlayerMatchState.SlotForClient(senderClientId); + if (senderSlot == PlayerSlot.None || senderSlot != ownerSlot.Value) + { + Debug.Log($"[TowerInstance] Sell rejected: client {senderClientId} " + + $"({senderSlot}) does not own tower owned by {ownerSlot.Value}."); + return; + } + + serverSold = true; + + int refund = ComputeSellRefund(); + var goldManager = PlayerGoldManager.GetForClient(senderClientId); + if (goldManager != null && refund > 0) + // countAsEarned: false — a sell refund returns spent gold, it is not round + // income, so it must not inflate the per-wave "earned" counter. + goldManager.AwardGold(refund, countAsEarned: false); + + // Broadcast VFX/SFX from the persistent placement manager, capturing the world + // position NOW — this NetworkObject despawns below, so it can't carry the RPC to + // remote peers itself (same reason WaveManager routes kill/leak popups). + var pm = TowerPlacementManager.Instance; + if (pm != null) pm.BroadcastSellEffect(transform.position); + + if (NetworkObject != null && NetworkObject.IsSpawned) + NetworkObject.Despawn(destroy: true); + } + // ----- IMinimapEntity ------------------------------------------------- // // Towers are static, so WorldPosition is cheap (no movement to track). Color reflects diff --git a/Assets/_Project/Scripts/Gameplay/TowerPlacementManager.cs b/Assets/_Project/Scripts/Gameplay/TowerPlacementManager.cs index 7c4662d..92b349d 100644 --- a/Assets/_Project/Scripts/Gameplay/TowerPlacementManager.cs +++ b/Assets/_Project/Scripts/Gameplay/TowerPlacementManager.cs @@ -5,6 +5,7 @@ using UnityEngine; using TD.Core; using TD.Levels; using TD.Towers; +using TD.VFX; namespace TD.Gameplay { @@ -350,6 +351,26 @@ namespace TD.Gameplay $"client {req.SenderClientId} ({placingSlot}) at anchor {req.Anchor}."); } + // ----- Sell effects (persistent broadcaster) ---------------------- + + /// + /// Server-only: tells every peer to play the tower-sold VFX/SFX at + /// . Called by as it sells, + /// because the tower's own NetworkObject despawns the same frame — a persistent + /// object must carry the broadcast so it isn't dropped. + /// + public void BroadcastSellEffect(Vector3 worldPos) + { + if (!IsServer) return; + PlaySellEffectRpc(worldPos); + } + + [Rpc(SendTo.Everyone)] + private void PlaySellEffectRpc(Vector3 worldPos) + { + SellEffectSpawner.Instance?.Play(worldPos); + } + // ----- Server-side commit hooks called by Builder ------------------ /// diff --git a/Assets/_Project/Scripts/Towers/TowerDefinition.cs b/Assets/_Project/Scripts/Towers/TowerDefinition.cs index 3ce1632..8163490 100644 --- a/Assets/_Project/Scripts/Towers/TowerDefinition.cs +++ b/Assets/_Project/Scripts/Towers/TowerDefinition.cs @@ -47,6 +47,22 @@ namespace TD.Towers "successful server-side placement validation.")] public int GoldCost; + // ------------------------------------------------------------------- + // Selling + // ------------------------------------------------------------------- + + [Header("Selling")] + [Tooltip("Portion of the gold INVESTED in this tower (placement cost plus any gold " + + "later spent upgrading it) that is refunded when it is sold, as a 0–1 factor. " + + "Default 0.75 = 75%.")] + [Range(0f, 1f)] + public float SellRefundPercent = 0.75f; + + [Tooltip("When true, this tower refunds 100% of its invested gold while it has never " + + "been upgraded (upgradeCount == 0); once upgraded it falls back to " + + "SellRefundPercent. Set on the Wall so a fresh wall can be re-mazed for free.")] + public bool FullRefundIfUnupgraded = false; + // ------------------------------------------------------------------- // Construction // ------------------------------------------------------------------- diff --git a/Assets/_Project/Scripts/UI/HUDController.cs b/Assets/_Project/Scripts/UI/HUDController.cs index 96f50ec..f581be9 100644 --- a/Assets/_Project/Scripts/UI/HUDController.cs +++ b/Assets/_Project/Scripts/UI/HUDController.cs @@ -1178,19 +1178,30 @@ namespace TD.UI return btn; } + // Sell action for a completed tower. Refund is computed on the TowerInstance (single + // source of truth shared with the server) so the badge shows exactly what the player + // gets back. Hotkey is Key.None: the bottom-right slot's letter (B) is already the + // global buff-menu toggle — see CreateBuffMenuButton — so binding it here would fire + // both. The button stays click-only. private VisualElement CreateSellButton(TowerInstance tower, Key hotkey) { - int sellValue = tower.Definition != null - ? Mathf.RoundToInt(tower.Definition.GoldCost * 0.7f) - : 0; + // Only the tower's owner can sell it (the server enforces this too). A non-owner + // may have this tower view-selected — show the slot disabled with no refund badge + // so the action reads as unavailable rather than misleading. + bool ownedByLocal = tower != null + && PlayerMatchState.Local != null + && tower.Owner == PlayerMatchState.Local.Slot; + + int sellValue = ownedByLocal ? tower.ComputeSellRefund() : 0; var btn = CreateActionButton( costText: sellValue > 0 ? $"+{sellValue}g" : "", - hotkey: hotkey, + hotkey: Key.None, onClick: () => { - /* TODO: sell flow */ + if (tower != null) + tower.RequestSellServerRpc(); }); - btn.SetEnabled(false); + btn.SetEnabled(ownedByLocal); return btn; } @@ -1437,7 +1448,11 @@ namespace TD.UI ttStats.text = "(stats pending)"; } - int sellValue = Mathf.RoundToInt(def.GoldCost * 0.7f); + // Sell preview for a freshly placed (un-upgraded) tower: mirrors + // TowerInstance.ComputeSellRefund for invested == GoldCost, upgradeCount == 0. + int sellValue = def.FullRefundIfUnupgraded + ? def.GoldCost + : Mathf.RoundToInt(def.GoldCost * def.SellRefundPercent); ttCost.text = $"Cost: {def.GoldCost}g · Sell: {sellValue}g"; } diff --git a/Assets/_Project/Scripts/VFX/CoinBurstVfx.cs b/Assets/_Project/Scripts/VFX/CoinBurstVfx.cs new file mode 100644 index 0000000..e9d71eb --- /dev/null +++ b/Assets/_Project/Scripts/VFX/CoinBurstVfx.cs @@ -0,0 +1,101 @@ +// Assets/_Project/Scripts/VFX/CoinBurstVfx.cs +using UnityEngine; + +namespace TD.VFX +{ + /// + /// Self-contained, code-configured gold-coin burst used as the zero-art placeholder for the + /// tower-sell effect. Configures its own for a short radial + /// spray of gold specks thrown up in random arcs under gravity, then destroys itself. + /// + /// + /// Instantiated at runtime by when no authored VFX prefab is + /// assigned. It can also be dropped on a prefab in the editor and tuned. Replace with an + /// authored particle / VFX-graph prefab (assigned on the spawner) when art is ready — nothing + /// else needs to change. + /// + [RequireComponent(typeof(ParticleSystem))] + public class CoinBurstVfx : MonoBehaviour + { + [Tooltip("How many coin specks to throw.")] + [SerializeField] private int coinCount = 14; + + [Tooltip("Longest a speck lives (seconds). The whole effect self-destructs shortly after.")] + [SerializeField] private float lifetime = 0.6f; + + [Tooltip("Gold tint applied to the specks.")] + [SerializeField] private Color coinColor = new Color(1f, 0.84f, 0.2f, 1f); + + private void Awake() + { + var ps = GetComponent(); + if (ps == null) ps = gameObject.AddComponent(); + Configure(ps); + } + + private void Configure(ParticleSystem ps) + { + // Reconfiguring modules requires the system to be stopped first. + ps.Stop(true, ParticleSystemStopBehavior.StopEmittingAndClear); + + var main = ps.main; + main.duration = 0.1f; + main.loop = false; + main.playOnAwake = false; + main.startLifetime = new ParticleSystem.MinMaxCurve(lifetime * 0.6f, lifetime); + main.startSpeed = new ParticleSystem.MinMaxCurve(2.5f, 5f); + main.startSize = new ParticleSystem.MinMaxCurve(0.07f, 0.16f); + main.startRotation = new ParticleSystem.MinMaxCurve(0f, Mathf.PI * 2f); + main.startColor = coinColor; + main.gravityModifier = 2.5f; // arc up then fall back down quickly + main.simulationSpace = ParticleSystemSimulationSpace.World; + main.maxParticles = 64; + main.stopAction = ParticleSystemStopAction.None; + + var emission = ps.emission; + emission.enabled = true; + emission.rateOverTime = 0f; // burst only, no continuous stream + emission.SetBursts(new[] { new ParticleSystem.Burst(0f, (short)coinCount) }); + + // Hemisphere pointing up → specks spray outward and upward in random directions. + var shape = ps.shape; + shape.enabled = true; + shape.shapeType = ParticleSystemShapeType.Hemisphere; + shape.radius = 0.12f; + + // Fade the specks out over the back half of their life so they "decay quickly". + var col = ps.colorOverLifetime; + col.enabled = true; + var grad = new Gradient(); + grad.SetKeys( + new[] { new GradientColorKey(coinColor, 0f), new GradientColorKey(coinColor, 1f) }, + new[] + { + new GradientAlphaKey(1f, 0f), + new GradientAlphaKey(1f, 0.55f), + new GradientAlphaKey(0f, 1f), + }); + col.color = new ParticleSystem.MinMaxGradient(grad); + + // Give the specks a visible, transparent-capable material even with no assigned art. + var renderer = GetComponent(); + if (renderer != null) + { + renderer.renderMode = ParticleSystemRenderMode.Billboard; + if (renderer.sharedMaterial == null) + { + Shader shader = Shader.Find("Universal Render Pipeline/Particles/Unlit") + ?? Shader.Find("Sprites/Default") + ?? Shader.Find("Legacy Shaders/Particles/Alpha Blended Premultiply"); + if (shader != null) + renderer.material = new Material(shader) { color = coinColor }; + } + } + + ps.Play(); + + // Tear down after the last speck has died (plus a small margin). + Destroy(gameObject, lifetime + 0.25f); + } + } +} diff --git a/Assets/_Project/Scripts/VFX/SellEffectSpawner.cs b/Assets/_Project/Scripts/VFX/SellEffectSpawner.cs new file mode 100644 index 0000000..0b67fc3 --- /dev/null +++ b/Assets/_Project/Scripts/VFX/SellEffectSpawner.cs @@ -0,0 +1,83 @@ +// Assets/_Project/Scripts/VFX/SellEffectSpawner.cs +using UnityEngine; +using TD.Audio; + +namespace TD.VFX +{ + /// + /// Scene singleton that plays the "tower sold" feedback — a burst of gold coins plus a + /// coin-rustle sound — at a world position. Mirrors : + /// visual-only, plain MonoBehaviour, invoked on every peer via a ClientRpc so all + /// players see and hear a sale locally. + /// + /// + /// Who calls this: + /// routes a ClientRpc here when a tower is sold. + /// + /// Inspector setup: drop this on a SellEffectSpawner GameObject in each Match + /// scene. The VFX prefab is OPTIONAL — leave it empty to use the built-in + /// placeholder, or assign an authored particle/VFX-graph prefab. + /// Assign the coin-rustle clip on . + /// + public class SellEffectSpawner : MonoBehaviour + { + // ----- Singleton -------------------------------------------------- + + public static SellEffectSpawner Instance { get; private set; } + + // ----- Inspector -------------------------------------------------- + + [Tooltip("Optional authored VFX prefab spawned at the sale position. Leave empty to " + + "fall back to the built-in code-generated CoinBurstVfx placeholder.")] + [SerializeField] private GameObject coinBurstPrefab; + + [Tooltip("Coin-rustle sound played (2D, via AudioManager) when a tower is sold.")] + [SerializeField] private SoundConfig sellSound; + + [Tooltip("Vertical offset above the sale position where the coin burst originates, so " + + "it reads as coming from the tower body rather than the ground.")] + [SerializeField] private float verticalOffset = 0.75f; + + // ----- Lifecycle -------------------------------------------------- + + private void Awake() + { + if (Instance != null && Instance != this) + { + Debug.LogWarning("[SellEffectSpawner] Duplicate instance detected. " + + "Only one should exist per scene."); + return; + } + Instance = this; + } + + private void OnDestroy() + { + if (Instance == this) Instance = null; + } + + // ----- Public API ------------------------------------------------- + + /// Plays the coin burst + rustle sound at . + public void Play(Vector3 worldPos) + { + Vector3 spawnPos = worldPos + Vector3.up * verticalOffset; + + if (coinBurstPrefab != null) + { + Instantiate(coinBurstPrefab, spawnPos, Quaternion.identity); + } + else + { + // Zero-art fallback: a self-configuring, self-destroying particle burst. + var go = new GameObject("CoinBurst"); + go.transform.position = spawnPos; + go.AddComponent(); + } + + if (sellSound.clip != null) + AudioManager.Instance?.Play(sellSound.clip, AudioCategory.UI, + sellSound.RandomPitch(), sellSound.volume); + } + } +} From 86bc916c4936d8cbd463fab842cda3629967cc4a Mon Sep 17 00:00:00 2001 From: Matt F Date: Tue, 14 Jul 2026 20:22:00 -0700 Subject: [PATCH 20/58] Fix NGO RequireOwnership deprecation warnings; add VFX script metas Replace deprecated [Rpc(..., RequireOwnership = true)] with InvokePermission = RpcInvokePermission.Owner on the owner-submitted draft/buff RPCs (PlayerDraft, PlayerBuffManager), matching the pattern already used elsewhere. Also commits the .meta files Unity generated for the new sell-VFX scripts so their GUIDs are stable across machines. Co-Authored-By: Claude Opus 4.8 --- Assets/_Project/Scripts/Gameplay/Draft/PlayerDraft.cs | 4 ++-- Assets/_Project/Scripts/Gameplay/PlayerBuffManager.cs | 2 +- Assets/_Project/Scripts/VFX/CoinBurstVfx.cs.meta | 2 ++ Assets/_Project/Scripts/VFX/SellEffectSpawner.cs.meta | 2 ++ 4 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 Assets/_Project/Scripts/VFX/CoinBurstVfx.cs.meta create mode 100644 Assets/_Project/Scripts/VFX/SellEffectSpawner.cs.meta diff --git a/Assets/_Project/Scripts/Gameplay/Draft/PlayerDraft.cs b/Assets/_Project/Scripts/Gameplay/Draft/PlayerDraft.cs index 3fd7350..41a7c04 100644 --- a/Assets/_Project/Scripts/Gameplay/Draft/PlayerDraft.cs +++ b/Assets/_Project/Scripts/Gameplay/Draft/PlayerDraft.cs @@ -137,7 +137,7 @@ namespace TD.Gameplay.Draft // ----- Owner → server RPCs ---------------------------------------- /// Owning client: pick one of the offered options by id. - [Rpc(SendTo.Server, RequireOwnership = true)] + [Rpc(SendTo.Server, InvokePermission = RpcInvokePermission.Owner)] public void RequestPickRpc(int optionId) { ServerResolve(optionId); @@ -148,7 +148,7 @@ namespace TD.Gameplay.Draft /// afford it or already has an unresolved draft (resolve the current one first so a /// free pick is never silently overwritten). /// - [Rpc(SendTo.Server, RequireOwnership = true)] + [Rpc(SendTo.Server, InvokePermission = RpcInvokePermission.Owner)] public void RequestBuyRerollRpc() { if (HasActiveDraft) return; // resolve the pending draft before buying another diff --git a/Assets/_Project/Scripts/Gameplay/PlayerBuffManager.cs b/Assets/_Project/Scripts/Gameplay/PlayerBuffManager.cs index 506791e..52efbdc 100644 --- a/Assets/_Project/Scripts/Gameplay/PlayerBuffManager.cs +++ b/Assets/_Project/Scripts/Gameplay/PlayerBuffManager.cs @@ -146,7 +146,7 @@ namespace TD.Gameplay /// a random buff from the category at . /// The server validates gold and adds the buff if the purchase succeeds. /// - [Rpc(SendTo.Server, RequireOwnership = true)] + [Rpc(SendTo.Server, InvokePermission = RpcInvokePermission.Owner)] public void RequestPurchaseBuffRpc(int categoryIndex) { if (categories == null || categoryIndex < 0 || categoryIndex >= categories.Length) diff --git a/Assets/_Project/Scripts/VFX/CoinBurstVfx.cs.meta b/Assets/_Project/Scripts/VFX/CoinBurstVfx.cs.meta new file mode 100644 index 0000000..58bc699 --- /dev/null +++ b/Assets/_Project/Scripts/VFX/CoinBurstVfx.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: bdff685029f23004796671150c7cf39b \ No newline at end of file diff --git a/Assets/_Project/Scripts/VFX/SellEffectSpawner.cs.meta b/Assets/_Project/Scripts/VFX/SellEffectSpawner.cs.meta new file mode 100644 index 0000000..7ae5f2a --- /dev/null +++ b/Assets/_Project/Scripts/VFX/SellEffectSpawner.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e2708c6bac8136f45b48c899d3d40630 \ No newline at end of file From 1794f65b19d7a9df31683b473e8e6427b65699a9 Mon Sep 17 00:00:00 2001 From: Matt F Date: Tue, 14 Jul 2026 20:44:11 -0700 Subject: [PATCH 21/58] Fix sell hitch: batch footprint un-stamp; warn on missing SellEffectSpawner MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TowerInstance.StampFootprint now writes walkability via SetWalkableBatch instead of per-tile SetWalkable, so despawning (selling) a 2x2 tower fires one OnWalkabilityChanged / enemy re-path instead of four — matching placement and removing the frame hitch on sell. PlaySellEffectRpc now logs a one-time warning when no SellEffectSpawner is in the scene, since a missing spawner silently suppressed the coin VFX and sound. Co-Authored-By: Claude Opus 4.8 --- .../Scripts/Gameplay/TowerInstance.cs | 12 +++++++++++- .../Scripts/Gameplay/TowerPlacementManager.cs | 19 ++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/Assets/_Project/Scripts/Gameplay/TowerInstance.cs b/Assets/_Project/Scripts/Gameplay/TowerInstance.cs index 1b01a4a..dfd73a8 100644 --- a/Assets/_Project/Scripts/Gameplay/TowerInstance.cs +++ b/Assets/_Project/Scripts/Gameplay/TowerInstance.cs @@ -1,4 +1,5 @@ // Assets/_Project/Scripts/Gameplay/TowerInstance.cs +using System.Collections.Generic; using Unity.Netcode; using UnityEngine; using TD.Core; @@ -511,11 +512,20 @@ namespace TD.Gameplay ? resolvedDefinition.FootprintSize : new Vector2Int(2, 2); + // Collect the footprint, then stamp walkability as a BATCH so a single + // OnWalkabilityChanged fires for the whole footprint. Per-tile SetWalkable fires + // that event once PER TILE — on despawn (sell) that meant up to 4 full enemy A* + // re-paths for a 2×2 tower in one frame, which was the sell hitch. Placement + // batches for the same reason (TowerPlacementManager.StampWalkable). Occupancy + // doesn't fire walkability events, so it stays per-tile. + var footprint = new List(footprintSize.x * footprintSize.y); foreach (var tile in GridCoordinates.GetFootprintTiles(anchorTile.Value, footprintSize)) { - loader.SetWalkable(tile, walkable); + footprint.Add(tile); loader.SetOccupied(tile, occupied); } + + loader.SetWalkableBatch(footprint, walkable); } // Reused per-instance across color updates to avoid per-call GC allocation. diff --git a/Assets/_Project/Scripts/Gameplay/TowerPlacementManager.cs b/Assets/_Project/Scripts/Gameplay/TowerPlacementManager.cs index 92b349d..9943dc5 100644 --- a/Assets/_Project/Scripts/Gameplay/TowerPlacementManager.cs +++ b/Assets/_Project/Scripts/Gameplay/TowerPlacementManager.cs @@ -365,10 +365,27 @@ namespace TD.Gameplay PlaySellEffectRpc(worldPos); } + // One-time guard so a missing spawner warns once per peer instead of on every sale. + private static bool s_warnedNoSellSpawner; + [Rpc(SendTo.Everyone)] private void PlaySellEffectRpc(Vector3 worldPos) { - SellEffectSpawner.Instance?.Play(worldPos); + var spawner = SellEffectSpawner.Instance; + if (spawner == null) + { + if (!s_warnedNoSellSpawner) + { + Debug.LogWarning("[TowerPlacementManager] A tower was sold, but there is no " + + "SellEffectSpawner in the scene — no coin VFX or sell sound " + + "will play. Add a SellEffectSpawner GameObject to each Match " + + "scene (assign its Sell Sound clip; the coin burst works even " + + "with no VFX prefab)."); + s_warnedNoSellSpawner = true; + } + return; + } + spawner.Play(worldPos); } // ----- Server-side commit hooks called by Builder ------------------ From 7cf15dcaa63969acea4250fe5649154290a7a228 Mon Sep 17 00:00:00 2001 From: Ian Woods Date: Tue, 14 Jul 2026 20:56:50 -0700 Subject: [PATCH 22/58] draft options working; spells won't cast though --- .../_Project/Definitions/BuilderSpells.meta | 8 + .../BuilderSpells/FireballSpell.asset | 24 ++ .../BuilderSpells/FireballSpell.asset.meta | 8 + .../BuilderSpells/SlowAreaSpell.asset | 25 ++ .../BuilderSpells/SlowAreaSpell.asset.meta | 8 + .../Draft_BuilderSpellOption_Fireball.asset | 19 ++ ...aft_BuilderSpellOption_Fireball.asset.meta | 8 + .../Draft_BuilderSpellOption_SlowArea.asset | 19 ++ ...aft_BuilderSpellOption_SlowArea.asset.meta | 8 + Assets/_Project/Prefabs/Player/Player.prefab | 14 ++ Assets/_Project/Scenes/Levels/9Player.unity | 103 ++++++++ .../_Project/Scripts/Core/BuilderSpellKind.cs | 15 ++ .../Scripts/Core/BuilderSpellKind.cs.meta | 2 + .../_Project/Scripts/Core/SpellTargetType.cs | 23 ++ .../Scripts/Core/SpellTargetType.cs.meta | 2 + .../Gameplay/BuilderSpellCastController.cs | 226 ++++++++++++++++++ .../BuilderSpellCastController.cs.meta | 2 + .../Scripts/Gameplay/BuilderSpells.meta | 8 + .../BuilderSpells/BuilderSpellDefinition.cs | 91 +++++++ .../BuilderSpellDefinition.cs.meta | 2 + .../BuilderSpells/BuilderSpellPool.cs | 68 ++++++ .../BuilderSpells/BuilderSpellPool.cs.meta | 2 + .../BuilderSpells/FireballSpellDefinition.cs | 47 ++++ .../FireballSpellDefinition.cs.meta | 2 + .../BuilderSpells/SlowAreaSpellDefinition.cs | 55 +++++ .../SlowAreaSpellDefinition.cs.meta | 2 + .../Gameplay/Draft/BuilderSpellDraftOption.cs | 41 ++++ .../Draft/BuilderSpellDraftOption.cs.meta | 2 + .../Scripts/Gameplay/PlayerSpellLoadout.cs | 177 ++++++++++++++ .../Gameplay/PlayerSpellLoadout.cs.meta | 2 + .../_Project/Scripts/Gameplay/SpellHotkeys.cs | 29 +++ .../Scripts/Gameplay/SpellHotkeys.cs.meta | 2 + Assets/_Project/Scripts/Gameplay/SpellSlot.cs | 63 +++++ .../Scripts/Gameplay/SpellSlot.cs.meta | 2 + Assets/_Project/Scripts/UI/HUDController.cs | 149 ++++++++++++ Assets/_Project/UI/HUD.uss | 74 ++++++ Assets/_Project/UI/HUD.uxml | 8 + 37 files changed, 1340 insertions(+) create mode 100644 Assets/_Project/Definitions/BuilderSpells.meta create mode 100644 Assets/_Project/Definitions/BuilderSpells/FireballSpell.asset create mode 100644 Assets/_Project/Definitions/BuilderSpells/FireballSpell.asset.meta create mode 100644 Assets/_Project/Definitions/BuilderSpells/SlowAreaSpell.asset create mode 100644 Assets/_Project/Definitions/BuilderSpells/SlowAreaSpell.asset.meta create mode 100644 Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_Fireball.asset create mode 100644 Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_Fireball.asset.meta create mode 100644 Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_SlowArea.asset create mode 100644 Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_SlowArea.asset.meta create mode 100644 Assets/_Project/Scripts/Core/BuilderSpellKind.cs create mode 100644 Assets/_Project/Scripts/Core/BuilderSpellKind.cs.meta create mode 100644 Assets/_Project/Scripts/Core/SpellTargetType.cs create mode 100644 Assets/_Project/Scripts/Core/SpellTargetType.cs.meta create mode 100644 Assets/_Project/Scripts/Gameplay/BuilderSpellCastController.cs create mode 100644 Assets/_Project/Scripts/Gameplay/BuilderSpellCastController.cs.meta create mode 100644 Assets/_Project/Scripts/Gameplay/BuilderSpells.meta create mode 100644 Assets/_Project/Scripts/Gameplay/BuilderSpells/BuilderSpellDefinition.cs create mode 100644 Assets/_Project/Scripts/Gameplay/BuilderSpells/BuilderSpellDefinition.cs.meta create mode 100644 Assets/_Project/Scripts/Gameplay/BuilderSpells/BuilderSpellPool.cs create mode 100644 Assets/_Project/Scripts/Gameplay/BuilderSpells/BuilderSpellPool.cs.meta create mode 100644 Assets/_Project/Scripts/Gameplay/BuilderSpells/FireballSpellDefinition.cs create mode 100644 Assets/_Project/Scripts/Gameplay/BuilderSpells/FireballSpellDefinition.cs.meta create mode 100644 Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaSpellDefinition.cs create mode 100644 Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaSpellDefinition.cs.meta create mode 100644 Assets/_Project/Scripts/Gameplay/Draft/BuilderSpellDraftOption.cs create mode 100644 Assets/_Project/Scripts/Gameplay/Draft/BuilderSpellDraftOption.cs.meta create mode 100644 Assets/_Project/Scripts/Gameplay/PlayerSpellLoadout.cs create mode 100644 Assets/_Project/Scripts/Gameplay/PlayerSpellLoadout.cs.meta create mode 100644 Assets/_Project/Scripts/Gameplay/SpellHotkeys.cs create mode 100644 Assets/_Project/Scripts/Gameplay/SpellHotkeys.cs.meta create mode 100644 Assets/_Project/Scripts/Gameplay/SpellSlot.cs create mode 100644 Assets/_Project/Scripts/Gameplay/SpellSlot.cs.meta diff --git a/Assets/_Project/Definitions/BuilderSpells.meta b/Assets/_Project/Definitions/BuilderSpells.meta new file mode 100644 index 0000000..15f3140 --- /dev/null +++ b/Assets/_Project/Definitions/BuilderSpells.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f6f56fe562e9b8c229442088bb6ce11c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/BuilderSpells/FireballSpell.asset b/Assets/_Project/Definitions/BuilderSpells/FireballSpell.asset new file mode 100644 index 0000000..31db12b --- /dev/null +++ b/Assets/_Project/Definitions/BuilderSpells/FireballSpell.asset @@ -0,0 +1,24 @@ +%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: 22b36bfcd0ae4af4098d908138e874e1, type: 3} + m_Name: FireballSpell + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.BuilderSpells.FireballSpellDefinition + DisplayName: + Description: + Icon: {fileID: 0} + Cooldown: 5 + TargetType: 0 + Radius: 0 + enemyLayerMask: + serializedVersion: 2 + m_Bits: 0 + Damage: 50 diff --git a/Assets/_Project/Definitions/BuilderSpells/FireballSpell.asset.meta b/Assets/_Project/Definitions/BuilderSpells/FireballSpell.asset.meta new file mode 100644 index 0000000..61581ca --- /dev/null +++ b/Assets/_Project/Definitions/BuilderSpells/FireballSpell.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 051c48f416e5366b59d49b0e062333ac +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/BuilderSpells/SlowAreaSpell.asset b/Assets/_Project/Definitions/BuilderSpells/SlowAreaSpell.asset new file mode 100644 index 0000000..9df48bc --- /dev/null +++ b/Assets/_Project/Definitions/BuilderSpells/SlowAreaSpell.asset @@ -0,0 +1,25 @@ +%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: 249c65067c3bac80693255e594d844c7, type: 3} + m_Name: SlowAreaSpell + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.BuilderSpells.SlowAreaSpellDefinition + DisplayName: + Description: + Icon: {fileID: 0} + Cooldown: 5 + TargetType: 0 + Radius: 0 + enemyLayerMask: + serializedVersion: 2 + m_Bits: 0 + SlowFactor: 0.5 + EffectDuration: 3 diff --git a/Assets/_Project/Definitions/BuilderSpells/SlowAreaSpell.asset.meta b/Assets/_Project/Definitions/BuilderSpells/SlowAreaSpell.asset.meta new file mode 100644 index 0000000..1518d59 --- /dev/null +++ b/Assets/_Project/Definitions/BuilderSpells/SlowAreaSpell.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d893f46b037536b4ba91307e184cecfe +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_Fireball.asset b/Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_Fireball.asset new file mode 100644 index 0000000..5ec8c55 --- /dev/null +++ b/Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_Fireball.asset @@ -0,0 +1,19 @@ +%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: a574e8aa74d8787f2b949300932af485, type: 3} + m_Name: Draft_BuilderSpellOption_Fireball + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.Draft.BuilderSpellDraftOption + DisplayName: Fireball + Description: Shoot a FIREBALL out of your COCK + Icon: {fileID: 0} + Weight: 1 + Kind: 0 diff --git a/Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_Fireball.asset.meta b/Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_Fireball.asset.meta new file mode 100644 index 0000000..f9e25b5 --- /dev/null +++ b/Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_Fireball.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5f390de69ba43b2a6a0d89cf09580320 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_SlowArea.asset b/Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_SlowArea.asset new file mode 100644 index 0000000..5dd615e --- /dev/null +++ b/Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_SlowArea.asset @@ -0,0 +1,19 @@ +%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: a574e8aa74d8787f2b949300932af485, type: 3} + m_Name: Draft_BuilderSpellOption_SlowArea + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.Draft.BuilderSpellDraftOption + DisplayName: Slow Area + Description: Slows enemies in the target area + Icon: {fileID: 0} + Weight: 1 + Kind: 1 diff --git a/Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_SlowArea.asset.meta b/Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_SlowArea.asset.meta new file mode 100644 index 0000000..40f9145 --- /dev/null +++ b/Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_SlowArea.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 29b35841f7e5db454903798cb5d83434 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Prefabs/Player/Player.prefab b/Assets/_Project/Prefabs/Player/Player.prefab index 33c1316..08614f3 100644 --- a/Assets/_Project/Prefabs/Player/Player.prefab +++ b/Assets/_Project/Prefabs/Player/Player.prefab @@ -17,6 +17,7 @@ GameObject: - component: {fileID: 2806524246861401799} - component: {fileID: 2806524246861401801} - component: {fileID: 5683786710272852339} + - component: {fileID: 6856236869205671849} m_Layer: 0 m_Name: Player m_TagString: Untagged @@ -159,3 +160,16 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.BuilderUpgradeManager ShowTopMostFoldoutHeaderGroup: 1 +--- !u!114 &6856236869205671849 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3493329038866903420} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dfa83208b02c50b40866bb1846240c4a, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.PlayerSpellLoadout + ShowTopMostFoldoutHeaderGroup: 1 diff --git a/Assets/_Project/Scenes/Levels/9Player.unity b/Assets/_Project/Scenes/Levels/9Player.unity index 3264d21..98a6d5e 100644 --- a/Assets/_Project/Scenes/Levels/9Player.unity +++ b/Assets/_Project/Scenes/Levels/9Player.unity @@ -13345,6 +13345,53 @@ Transform: m_Children: [] m_Father: {fileID: 1097152085} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &914832724 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 914832726} + - component: {fileID: 914832725} + m_Layer: 0 + m_Name: BuilderSpellPool + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &914832725 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 914832724} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 36a7be1b3824682b8a183fbcf8564652, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.BuilderSpells.BuilderSpellPool + spells: + - {fileID: 11400000, guid: 051c48f416e5366b59d49b0e062333ac, type: 2} + - {fileID: 11400000, guid: d893f46b037536b4ba91307e184cecfe, type: 2} +--- !u!4 &914832726 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 914832724} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -18.90215, y: 6.17317, z: 0.5013} + 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 &921503905 GameObject: m_ObjectHideFlags: 0 @@ -13727,6 +13774,57 @@ BoxCollider: serializedVersion: 3 m_Size: {x: 17, y: 1, z: 13} m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &993870443 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 993870445} + - component: {fileID: 993870444} + m_Layer: 0 + m_Name: BuilderSpellCastController + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &993870444 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 993870443} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cc99a2b3d3e8d8178a74e1d68a34553c, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.BuilderSpellCastController + groundLayerMask: + serializedVersion: 2 + m_Bits: 128 + raycastMaxDistance: 500 + aimDecal: {fileID: 0} + pointReticleDiameter: 1.5 + projectionDepth: 50 +--- !u!4 &993870445 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 993870443} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -18.90215, y: 6.17317, z: 0.5013} + 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 &997315214 GameObject: m_ObjectHideFlags: 0 @@ -28565,6 +28663,9 @@ MonoBehaviour: - {fileID: 11400000, guid: 6b1d3f8a2c5e4097b8a1d0c3e6f9b240, type: 2} - {fileID: 11400000, guid: f4a2b8d1c6e93f05a7b2d4c8e1f6a930, type: 2} - {fileID: 11400000, guid: 65ff25c1c8a89f7df8e88f71968c1c98, type: 2} + - {fileID: 11400000, guid: 5f390de69ba43b2a6a0d89cf09580320, type: 2} + - {fileID: 11400000, guid: 65ff25c1c8a89f7df8e88f71968c1c98, type: 2} + - {fileID: 11400000, guid: 29b35841f7e5db454903798cb5d83434, type: 2} --- !u!4 &2139601601 Transform: m_ObjectHideFlags: 0 @@ -28962,3 +29063,5 @@ SceneRoots: - {fileID: 176580462} - {fileID: 516125087} - {fileID: 2079088113} + - {fileID: 914832726} + - {fileID: 993870445} diff --git a/Assets/_Project/Scripts/Core/BuilderSpellKind.cs b/Assets/_Project/Scripts/Core/BuilderSpellKind.cs new file mode 100644 index 0000000..58fcb5d --- /dev/null +++ b/Assets/_Project/Scripts/Core/BuilderSpellKind.cs @@ -0,0 +1,15 @@ +namespace TD.Core +{ + /// + /// Identifies which builder spell a + /// represents. Mirrors + /// — a stable, enum-indexed identifier used by + /// and + /// instead of an asset reference. + /// + public enum BuilderSpellKind : byte + { + Fireball = 0, + SlowArea = 1, + } +} diff --git a/Assets/_Project/Scripts/Core/BuilderSpellKind.cs.meta b/Assets/_Project/Scripts/Core/BuilderSpellKind.cs.meta new file mode 100644 index 0000000..af62b64 --- /dev/null +++ b/Assets/_Project/Scripts/Core/BuilderSpellKind.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a043765d6aa295a5397226e3e32d2c37 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Core/SpellTargetType.cs b/Assets/_Project/Scripts/Core/SpellTargetType.cs new file mode 100644 index 0000000..7ebb6ff --- /dev/null +++ b/Assets/_Project/Scripts/Core/SpellTargetType.cs @@ -0,0 +1,23 @@ +namespace TD.Core +{ + /// + /// How a is aimed. + /// + /// + /// Deliberately not named TargetType — that name is already taken in this + /// namespace by (Single/Splash/Chain/AllInRange, used by + /// TowerDefinition/TowerCombat), and every combat-adjacent file already + /// has using TD.Core;. + /// + public enum SpellTargetType : byte + { + /// Aimed at a single ground point. No radius preview while aiming, even + /// if the spell has an internal splash radius. + PointTarget = 0, + + /// Aimed at a ground point, affecting everything within + /// . Previewed + /// as a scaled radius decal while aiming. + AreaOfEffect = 1, + } +} diff --git a/Assets/_Project/Scripts/Core/SpellTargetType.cs.meta b/Assets/_Project/Scripts/Core/SpellTargetType.cs.meta new file mode 100644 index 0000000..0722838 --- /dev/null +++ b/Assets/_Project/Scripts/Core/SpellTargetType.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 0ebeda6f965b64f7ca82ecd6f849142a \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/BuilderSpellCastController.cs b/Assets/_Project/Scripts/Gameplay/BuilderSpellCastController.cs new file mode 100644 index 0000000..49160da --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpellCastController.cs @@ -0,0 +1,226 @@ +// Assets/_Project/Scripts/Gameplay/BuilderSpellCastController.cs +using UnityEngine; +using UnityEngine.InputSystem; +using UnityEngine.Rendering.Universal; +using TD.Core; +using TD.UI; +using TD.Gameplay.BuilderSpells; + +namespace TD.Gameplay +{ + /// + /// Per-client controller for the builder-spell casting UX. Watches + /// to enter aim mode, raycasts against a broad ground layer + /// (must cover the enemy path, not just buildable tiles), previews the aim point, and + /// dispatches the cast to via RPC on confirm. + /// + /// + /// Plain MonoBehaviour. Aiming visuals are purely cosmetic and local, same + /// rationale as . All server-authoritative + /// resolution lives in . + /// + /// Point vs. area preview. shows a + /// small fixed-size reticle, even if the spell has an internal splash radius. + /// scales the same decal to the spell's + /// , mirroring 's + /// diameter-sizing idiom. + /// + /// Single-shot only. Unlike tower placement, there is no chained/shift-held + /// casting — one keypress aims one cast. + /// + public class BuilderSpellCastController : MonoBehaviour + { + // ----- Inspector -------------------------------------------------- + + [Tooltip("Physics layer(s) the aim raycast hits. Must cover the whole level's ground " + + "(including over the enemy path), not just buildable tiles — set this to " + + "'TerrainGeometry', not 'BuildablePlane'.")] + [SerializeField] private LayerMask groundLayerMask; + + [Tooltip("Maximum raycast distance from the camera to the ground.")] + [SerializeField] private float raycastMaxDistance = 500f; + + [Tooltip("Ground decal used for both the point reticle and the area-of-effect " + + "radius preview. Auto-found in children if empty.")] + [SerializeField] private DecalProjector aimDecal; + + [Tooltip("Fixed diameter of the reticle shown for PointTarget spells, regardless of " + + "any internal splash radius the spell may use server-side.")] + [SerializeField] private float pointReticleDiameter = 1.5f; + + [Tooltip("Vertical thickness of the decal projector's projection volume. Should " + + "exceed the map's vertical range so it projects onto terrain at any height.")] + [SerializeField] private float projectionDepth = 50f; + + // ----- Active-aim state --------------------------------------------- + + // -1 when not aiming. + private int activeSlot = -1; + private BuilderSpellDefinition activeDefinition; + + private bool lastHitValid; + private Vector3 lastHitPoint; + + // ----- Lifecycle ---------------------------------------------------- + + private void Awake() + { + if (aimDecal == null) aimDecal = GetComponentInChildren(); + if (aimDecal != null) + { + aimDecal.transform.localRotation = Quaternion.Euler(90f, 0f, 0f); + aimDecal.enabled = false; + } + } + + private void OnDisable() + { + ExitAimMode(); + } + + private void Update() + { + if (!HUDController.IsTextInputActive) + ScanHotkeys(); + + if (activeSlot < 0) return; // idle — nothing to aim + + var keyboard = Keyboard.current; + if (keyboard != null && keyboard.escapeKey.wasPressedThisFrame) + { + ExitAimMode(); + return; + } + + var mouse = Mouse.current; + if (mouse == null) return; + + if (mouse.rightButton.wasPressedThisFrame) + { + ExitAimMode(); + return; + } + + if (TryGetGroundHit(mouse.position.ReadValue(), out Vector3 hitPoint)) + { + lastHitValid = true; + lastHitPoint = hitPoint; + ShowAimDecal(hitPoint); + } + else + { + lastHitValid = false; + HideAimDecal(); + } + + if (mouse.leftButton.wasPressedThisFrame && lastHitValid) + { + TrySubmitCast(); + } + } + + // ----- Hotkey scan -------------------------------------------------- + + private void ScanHotkeys() + { + if (activeSlot >= 0) return; // already aiming — hotkeys re-scanned only when idle + + var loadout = PlayerSpellLoadout.Local; + if (loadout == null) return; + + var keyboard = Keyboard.current; + if (keyboard == null) return; + + var layout = SpellHotkeys.Layout; + int slotCount = Mathf.Min(loadout.SlotCount, layout.Length); + + for (int i = 0; i < slotCount; i++) + { + if (!keyboard[layout[i]].wasPressedThisFrame) continue; + if (loadout.IsSlotOnCooldown(i)) continue; + + BeginAiming(i, loadout); + break; + } + } + + private void BeginAiming(int slot, PlayerSpellLoadout loadout) + { + var kind = loadout.GetKind(slot); + if (kind == null) return; + + var definition = BuilderSpellPool.Instance?.Get(kind.Value); + if (definition == null) + { + Debug.LogWarning($"[BuilderSpellCastController] No BuilderSpellDefinition for {kind.Value}."); + return; + } + + activeSlot = slot; + activeDefinition = definition; + lastHitValid = false; + } + + private void ExitAimMode() + { + activeSlot = -1; + activeDefinition = null; + lastHitValid = false; + HideAimDecal(); + } + + // ----- Raycasting --------------------------------------------------- + + private bool TryGetGroundHit(Vector2 screenPos, out Vector3 hitPoint) + { + hitPoint = Vector3.zero; + + var cam = Camera.main; + if (cam == null) return false; + + Ray ray = cam.ScreenPointToRay(new Vector3(screenPos.x, screenPos.y, 0f)); + if (Physics.Raycast(ray, out RaycastHit hit, raycastMaxDistance, groundLayerMask)) + { + hitPoint = hit.point; + return true; + } + return false; + } + + // ----- Aim decal ----------------------------------------------------- + + private void ShowAimDecal(Vector3 point) + { + if (aimDecal == null) return; + + float diameter = activeDefinition.TargetType == SpellTargetType.AreaOfEffect + ? activeDefinition.Radius * 2f + : pointReticleDiameter; + + aimDecal.size = new Vector3(diameter, diameter, projectionDepth); + aimDecal.pivot = Vector3.zero; + aimDecal.transform.position = point; + aimDecal.enabled = true; + } + + private void HideAimDecal() + { + if (aimDecal != null) aimDecal.enabled = false; + } + + // ----- Cast submission ------------------------------------------------ + + private void TrySubmitCast() + { + var loadout = PlayerSpellLoadout.Local; + if (loadout == null) + { + ExitAimMode(); + return; + } + + loadout.RequestCastSpellRpc(activeSlot, lastHitPoint); + ExitAimMode(); + } + } +} diff --git a/Assets/_Project/Scripts/Gameplay/BuilderSpellCastController.cs.meta b/Assets/_Project/Scripts/Gameplay/BuilderSpellCastController.cs.meta new file mode 100644 index 0000000..ffe509e --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpellCastController.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: cc99a2b3d3e8d8178a74e1d68a34553c \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/BuilderSpells.meta b/Assets/_Project/Scripts/Gameplay/BuilderSpells.meta new file mode 100644 index 0000000..fb42554 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpells.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7f64edca739cf31bfbdf58e2403b4a74 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Scripts/Gameplay/BuilderSpells/BuilderSpellDefinition.cs b/Assets/_Project/Scripts/Gameplay/BuilderSpells/BuilderSpellDefinition.cs new file mode 100644 index 0000000..e1ca3b2 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpells/BuilderSpellDefinition.cs @@ -0,0 +1,91 @@ +// Assets/_Project/Scripts/Gameplay/BuilderSpells/BuilderSpellDefinition.cs +using UnityEngine; +using TD.Core; + +namespace TD.Gameplay.BuilderSpells +{ + /// + /// Base class for one builder spell — a player-cast, key-triggered ability (e.g. "drop a + /// fireball on a point", "slow enemies in a radius"). Granted via the draft () and tracked per-player by , which owns the hotkey slot and cooldown state. + /// + /// + /// Contrast with . Effects + /// are passive and queried by consumers; spells are active and resolve themselves. + /// is that resolution — it IS the "apply the effect" method, + /// replacing the effect system's IsValidFor-only gate pattern (grant-time validity + /// still lives on ). + /// + /// One asset per kind. is fixed per subclass, same as + /// . uses + /// it to build a fixed-size, enum-indexed lookup table. + /// + /// Server-only resolution, client-only visual. runs on + /// the server and applies damage/status via the same Physics.OverlapSphereNonAlloc + + /// EnemyHealth/EnemyStatus pattern TowerCombat already uses. + /// runs on every peer (including the server) after a successful + /// cast, purely for presentation. + /// + public abstract class BuilderSpellDefinition : ScriptableObject + { + /// Which builder spell this asset's data belongs to. + public abstract BuilderSpellKind Kind { get; } + + [Header("Presentation")] + [Tooltip("Name shown on the draft card and the cast hotbar.")] + public string DisplayName; + + [Tooltip("Short description shown on the draft card.")] + [TextArea(2, 4)] + public string Description; + + [Tooltip("Icon shown on the draft card and the cast hotbar.")] + public Sprite Icon; + + [Header("Casting")] + [Tooltip("Seconds before this spell can be cast again after a successful cast.")] + [Min(0f)] + public float Cooldown = 5f; + + [Tooltip("How the cast controller aims this spell. AreaOfEffect previews Radius as a " + + "decal while aiming; PointTarget does not, even if Radius is used internally " + + "(e.g. a splash radius).")] + public SpellTargetType TargetType; + + [Tooltip("AreaOfEffect: the resolution radius AND the client-side preview size. " + + "PointTarget: optional internal-only radius (e.g. splash) with no preview.")] + [Min(0f)] + public float Radius; + + [Tooltip("Physics layer(s) enemies occupy, queried by this spell's own OverlapSphere " + + "call. Each spell asset authors its own mask — same convention as " + + "TowerCombat/Projectile's per-instance enemyLayerMask.")] + [SerializeField] + protected LayerMask enemyLayerMask; + + // Shared scratch buffer for OverlapSphereNonAlloc queries. The server processes casts + // sequentially (one RPC handler at a time), so a static buffer shared across all spell + // assets is safe — mirrors TowerCombat.s_overlapBuffer, but sized larger (64 vs. 32): + // OverlapSphereNonAlloc silently truncates past the buffer length with no way to + // detect the truncation, and spells are more likely than a single tower's splash/chain + // radius to catch a dense horde. TowerCombat's buffer is intentionally left at 32 — + // out of scope here, flagged separately for the team to revisit. + protected static readonly Collider[] s_overlapBuffer = new Collider[64]; + + /// + /// Server-only: resolve this spell's effect at for the + /// casting player. Returns false if the cast could not be applied (e.g. hit nothing) — + /// treats a false return as a no-op and does not start + /// the cooldown. + /// + public abstract bool ServerCast(ulong clientId, Vector3 targetPoint); + + /// + /// Runs on every peer (via 's ClientRpc) after a + /// successful . Default no-op; override to spawn an impact VFX + /// prefab and self-destroy it, the same idiom used elsewhere for one-off visuals. + /// + public virtual void ClientPlayVfx(Vector3 targetPoint) { } + } +} diff --git a/Assets/_Project/Scripts/Gameplay/BuilderSpells/BuilderSpellDefinition.cs.meta b/Assets/_Project/Scripts/Gameplay/BuilderSpells/BuilderSpellDefinition.cs.meta new file mode 100644 index 0000000..57deb3e --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpells/BuilderSpellDefinition.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9fca3191d98aa2652a9c5475d5c6b153 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/BuilderSpells/BuilderSpellPool.cs b/Assets/_Project/Scripts/Gameplay/BuilderSpells/BuilderSpellPool.cs new file mode 100644 index 0000000..2f44df6 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpells/BuilderSpellPool.cs @@ -0,0 +1,68 @@ +// Assets/_Project/Scripts/Gameplay/BuilderSpells/BuilderSpellPool.cs +using System; +using UnityEngine; +using TD.Core; + +namespace TD.Gameplay.BuilderSpells +{ + /// + /// Scene singleton holding every available this match, + /// authored as a flat array in the inspector for convenience. Internally it builds a + /// fixed-size table indexed by so lookups are a single array + /// access, not a scan. + /// + /// + /// Plain MonoBehaviour: identical on every peer (same assets), so there is nothing to sync. + /// The server reads it to resolve casts; clients read it to resolve and to render the cast hotbar. Mirrors + /// exactly. + /// + public class BuilderSpellPool : MonoBehaviour + { + public static BuilderSpellPool Instance { get; private set; } + + [Tooltip("Every BuilderSpellDefinition asset available this match. One entry per " + + "BuilderSpellKind — order doesn't matter, Kind on the asset itself decides " + + "its slot.")] + [SerializeField] private BuilderSpellDefinition[] spells; + + // Fixed-size, enum-indexed lookup built once in Awake. Sized to the enum's entry count, + // not authored count, so an out-of-range Kind is a compile-time impossibility rather + // than a bounds check we'd otherwise need on every Get(). + private BuilderSpellDefinition[] byKind; + + private void Awake() + { + if (Instance != null && Instance != this) + { + Debug.LogError("[BuilderSpellPool] Multiple instances detected. Only one per scene."); + return; + } + Instance = this; + + int kindCount = Enum.GetValues(typeof(BuilderSpellKind)).Length; + byKind = new BuilderSpellDefinition[kindCount]; + if (spells == null) return; + + for (int i = 0; i < spells.Length; i++) + { + var def = spells[i]; + if (def == null) continue; + byKind[(int)def.Kind] = def; + } + } + + private void OnDestroy() + { + if (Instance == this) Instance = null; + } + + /// Returns the spell asset for , or null if none is + /// authored in this pool. + public BuilderSpellDefinition Get(BuilderSpellKind kind) + { + int i = (int)kind; + return (byKind != null && i >= 0 && i < byKind.Length) ? byKind[i] : null; + } + } +} diff --git a/Assets/_Project/Scripts/Gameplay/BuilderSpells/BuilderSpellPool.cs.meta b/Assets/_Project/Scripts/Gameplay/BuilderSpells/BuilderSpellPool.cs.meta new file mode 100644 index 0000000..52803c7 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpells/BuilderSpellPool.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 36a7be1b3824682b8a183fbcf8564652 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/BuilderSpells/FireballSpellDefinition.cs b/Assets/_Project/Scripts/Gameplay/BuilderSpells/FireballSpellDefinition.cs new file mode 100644 index 0000000..b21e70c --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpells/FireballSpellDefinition.cs @@ -0,0 +1,47 @@ +// Assets/_Project/Scripts/Gameplay/BuilderSpells/FireballSpellDefinition.cs +using UnityEngine; +using TD.Core; + +namespace TD.Gameplay.BuilderSpells +{ + /// + /// Builder spell #1 — drop a fireball on a point, dealing direct damage to whatever's + /// there plus splash damage to nearby enemies. + /// + /// + /// is + /// — the cast controller shows only a fixed-size reticle, even though + /// is still used internally here as the splash + /// radius (0 = no splash, direct hit only). + /// + [CreateAssetMenu(fileName = "FireballSpell", menuName = "TD/Builder Spells/Fireball")] + public class FireballSpellDefinition : BuilderSpellDefinition + { + public override BuilderSpellKind Kind => BuilderSpellKind.Fireball; + + [Header("Fireball")] + [Tooltip("Damage dealt to every enemy within Radius of the target point.")] + [Min(0f)] + public float Damage = 50f; + + public override bool ServerCast(ulong clientId, Vector3 targetPoint) + { + PlayerSlot owner = PlayerMatchState.SlotForClient(clientId); + + int count = Physics.OverlapSphereNonAlloc( + targetPoint, Mathf.Max(Radius, 0.01f), s_overlapBuffer, enemyLayerMask); + + bool hitAny = false; + for (int i = 0; i < count; i++) + { + var enemyHealth = s_overlapBuffer[i].GetComponent(); + if (enemyHealth == null || enemyHealth.IsDead) continue; + + enemyHealth.TakeDamage(Damage, DamageType.Fire, owner); + hitAny = true; + } + + return hitAny; + } + } +} diff --git a/Assets/_Project/Scripts/Gameplay/BuilderSpells/FireballSpellDefinition.cs.meta b/Assets/_Project/Scripts/Gameplay/BuilderSpells/FireballSpellDefinition.cs.meta new file mode 100644 index 0000000..0871524 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpells/FireballSpellDefinition.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 22b36bfcd0ae4af4098d908138e874e1 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaSpellDefinition.cs b/Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaSpellDefinition.cs new file mode 100644 index 0000000..4bee6bd --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaSpellDefinition.cs @@ -0,0 +1,55 @@ +// Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaSpellDefinition.cs +using UnityEngine; +using TD.Core; + +namespace TD.Gameplay.BuilderSpells +{ + /// + /// Builder spell #2 — slow every enemy within an area for a duration. + /// + /// + /// is + /// — the cast controller previews as a decal + /// while aiming, and this spell resolves against that same radius (no separate field). + /// Reuses the existing slow/DoT system () rather than + /// introducing a new status mechanism. + /// + [CreateAssetMenu(fileName = "SlowAreaSpell", menuName = "TD/Builder Spells/Slow Area")] + public class SlowAreaSpellDefinition : BuilderSpellDefinition + { + public override BuilderSpellKind Kind => BuilderSpellKind.SlowArea; + + [Header("Slow Area")] + [Tooltip("Speed multiplier applied to affected enemies for EffectDuration " + + "(e.g. 0.5 = half speed).")] + [Range(0f, 1f)] + public float SlowFactor = 0.5f; + + [Tooltip("Seconds the slow lasts. Re-casting on an already-slowed enemy refreshes it.")] + [Min(0f)] + public float EffectDuration = 3f; + + public override bool ServerCast(ulong clientId, Vector3 targetPoint) + { + PlayerSlot owner = PlayerMatchState.SlotForClient(clientId); + + int count = Physics.OverlapSphereNonAlloc( + targetPoint, Mathf.Max(Radius, 0.01f), s_overlapBuffer, enemyLayerMask); + + bool hitAny = false; + for (int i = 0; i < count; i++) + { + var enemyHealth = s_overlapBuffer[i].GetComponent(); + if (enemyHealth == null || enemyHealth.IsDead) continue; + + var enemyStatus = s_overlapBuffer[i].GetComponent(); + if (enemyStatus == null) continue; + + enemyStatus.ApplyEffect(DamageType.Cold, SlowFactor, EffectDuration, owner); + hitAny = true; + } + + return hitAny; + } + } +} diff --git a/Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaSpellDefinition.cs.meta b/Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaSpellDefinition.cs.meta new file mode 100644 index 0000000..1ba03fa --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaSpellDefinition.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 249c65067c3bac80693255e594d844c7 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/Draft/BuilderSpellDraftOption.cs b/Assets/_Project/Scripts/Gameplay/Draft/BuilderSpellDraftOption.cs new file mode 100644 index 0000000..416fc03 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/Draft/BuilderSpellDraftOption.cs @@ -0,0 +1,41 @@ +// Assets/_Project/Scripts/Gameplay/Draft/BuilderSpellDraftOption.cs +using UnityEngine; +using TD.Core; +using TD.Gameplay.BuilderSpells; + +namespace TD.Gameplay.Draft +{ + /// + /// Draft choice — "gain a builder spell". Grants the player a key-triggered active ability, + /// adding it to their . + /// + /// + /// Mirrors : carries the + /// directly rather than an asset reference, since the enum value is the stable identifier + /// and already key off of. + /// also checks slot capacity — once + /// is reached, no further spell options are + /// offered. + /// + [CreateAssetMenu(fileName = "BuilderSpellOption", menuName = "TD/Draft/Builder Spell Option")] + public class BuilderSpellDraftOption : DraftOption + { + [Header("Payload")] + [Tooltip("The builder spell this option grants.")] + public BuilderSpellKind Kind; + + public override bool IsValidFor(ulong clientId) + { + var loadout = PlayerSpellLoadout.GetForClient(clientId); + if (loadout == null) return false; + if (loadout.SlotCount >= PlayerSpellLoadout.MaxSpellSlots) return false; + return !loadout.PlayerHasSpell(Kind); + } + + public override bool ServerApply(ulong clientId) + { + var loadout = PlayerSpellLoadout.GetForClient(clientId); + return loadout != null && loadout.ServerGrantSpell(Kind); + } + } +} diff --git a/Assets/_Project/Scripts/Gameplay/Draft/BuilderSpellDraftOption.cs.meta b/Assets/_Project/Scripts/Gameplay/Draft/BuilderSpellDraftOption.cs.meta new file mode 100644 index 0000000..a45da95 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/Draft/BuilderSpellDraftOption.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a574e8aa74d8787f2b949300932af485 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/PlayerSpellLoadout.cs b/Assets/_Project/Scripts/Gameplay/PlayerSpellLoadout.cs new file mode 100644 index 0000000..a6a1f68 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/PlayerSpellLoadout.cs @@ -0,0 +1,177 @@ +// Assets/_Project/Scripts/Gameplay/PlayerSpellLoadout.cs +using System.Collections.Generic; +using Unity.Netcode; +using UnityEngine; +using TD.Core; +using TD.Gameplay.BuilderSpells; + +namespace TD.Gameplay +{ + /// + /// Per-player set of granted builder spells and their cooldowns. Lives on the Player + /// prefab alongside and . + /// + /// + /// Slot == grant order == hotkey. is append-only; a + /// slot's index in the list is both its identity and the index into + /// . There is no player-configurable rebinding. + /// + /// Cast flow. The owning client calls with a + /// slot index and an aimed world point. The server re-validates everything (slot exists, + /// off cooldown, ) since client-side checks in + /// are UX-only, resolves the + /// via , and calls + /// . A successful cast starts the cooldown + /// and fires so every peer plays the same visual. + /// + public class PlayerSpellLoadout : NetworkBehaviour + { + /// Hard cap on granted spells, matching the number of hotkey slots available. + public const int MaxSpellSlots = 4; + + // ----- Static registry (mirrors BuilderUpgradeManager) ----- + + private static readonly Dictionary s_byClientId + = new Dictionary(); + + /// Returns the loadout owned by the given client, or null. + public static PlayerSpellLoadout GetForClient(ulong clientId) + { + s_byClientId.TryGetValue(clientId, out var loadout); + return loadout; + } + + /// Convenience: the local client's own loadout. + public static PlayerSpellLoadout Local + { + get + { + var nm = NetworkManager.Singleton; + if (nm == null || !nm.IsClient) return null; + return GetForClient(nm.LocalClientId); + } + } + + // ----- Networked state -------------------------------------------- + + private readonly NetworkList spells = new NetworkList(); + + /// Fired on every peer when a spell is granted or a cooldown changes. + public event System.Action OnLoadoutChanged; + + // ----- NGO lifecycle ------------------------------------------------ + + public override void OnNetworkSpawn() + { + s_byClientId[OwnerClientId] = this; + spells.OnListChanged += HandleSpellsChanged; + } + + public override void OnNetworkDespawn() + { + spells.OnListChanged -= HandleSpellsChanged; + + if (s_byClientId.TryGetValue(OwnerClientId, out var registered) && registered == this) + s_byClientId.Remove(OwnerClientId); + } + + private void HandleSpellsChanged(NetworkListEvent change) => OnLoadoutChanged?.Invoke(); + + // ----- Read API ----------------------------------------------------- + + /// Number of spells currently granted. + public int SlotCount => spells.Count; + + /// True if this player has already been granted the given spell. + public bool PlayerHasSpell(BuilderSpellKind kind) + { + for (int i = 0; i < spells.Count; i++) + { + if (spells[i].Kind == kind) return true; + } + return false; + } + + /// The spell kind occupying , or null if out of range. + public BuilderSpellKind? GetKind(int slot) + => (slot >= 0 && slot < spells.Count) ? spells[slot].Kind : (BuilderSpellKind?)null; + + /// True if is out of range, empty, or still cooling down. + public bool IsSlotOnCooldown(int slot) + { + if (slot < 0 || slot >= spells.Count) return true; + + var nm = NetworkManager.Singleton; + if (nm == null) return false; + + return spells[slot].CooldownEndServerTime > nm.ServerTime.Time; + } + + /// Seconds remaining on 's cooldown, or 0 if ready/invalid. + public float GetCooldownRemaining(int slot) + { + if (slot < 0 || slot >= spells.Count) return 0f; + + var nm = NetworkManager.Singleton; + if (nm == null) return 0f; + + double remaining = spells[slot].CooldownEndServerTime - nm.ServerTime.Time; + return remaining > 0d ? (float)remaining : 0f; + } + + // ----- Server mutation ----------------------------------------------- + + /// + /// Server-only: grants the given spell (a draft pick) into the next free slot. + /// No-op if already granted or slots are full. Returns true if actually granted. + /// + public bool ServerGrantSpell(BuilderSpellKind kind) + { + if (!IsServer) return false; + if (spells.Count >= MaxSpellSlots) return false; + if (PlayerHasSpell(kind)) return false; + + spells.Add(SpellSlot.CreateReady(kind)); + return true; + } + + // ----- Cast RPC ----------------------------------------------------- + + /// + /// Owning-client entry point. Requests the server resolve a cast of the spell in + /// at . All validation happens + /// here on the server; the client only uses this to trigger an attempt. + /// + [Rpc(SendTo.Server, RequireOwnership = true)] + public void RequestCastSpellRpc(int slot, Vector3 targetPoint) + { + if (MatchState.Instance == null || MatchState.Instance.Phase != MatchPhase.Playing) + return; + + if (slot < 0 || slot >= spells.Count) return; + + var slotValue = spells[slot]; + if (slotValue.CooldownEndServerTime > NetworkManager.ServerTime.Time) return; + + var definition = BuilderSpellPool.Instance?.Get(slotValue.Kind); + if (definition == null) + { + Debug.LogWarning($"[PlayerSpellLoadout] No BuilderSpellDefinition for {slotValue.Kind}."); + return; + } + + if (!definition.ServerCast(OwnerClientId, targetPoint)) return; + + slotValue.CooldownEndServerTime = NetworkManager.ServerTime.Time + definition.Cooldown; + spells[slot] = slotValue; + + PlayVfxClientRpc(slotValue.Kind, targetPoint); + } + + [ClientRpc] + private void PlayVfxClientRpc(BuilderSpellKind kind, Vector3 targetPoint) + { + BuilderSpellPool.Instance?.Get(kind)?.ClientPlayVfx(targetPoint); + } + } +} diff --git a/Assets/_Project/Scripts/Gameplay/PlayerSpellLoadout.cs.meta b/Assets/_Project/Scripts/Gameplay/PlayerSpellLoadout.cs.meta new file mode 100644 index 0000000..559df0e --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/PlayerSpellLoadout.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: dfa83208b02c50b40866bb1846240c4a \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/SpellHotkeys.cs b/Assets/_Project/Scripts/Gameplay/SpellHotkeys.cs new file mode 100644 index 0000000..2f162d1 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/SpellHotkeys.cs @@ -0,0 +1,29 @@ +// Assets/_Project/Scripts/Gameplay/SpellHotkeys.cs +using UnityEngine.InputSystem; + +namespace TD.Gameplay +{ + /// + /// The fixed key bound to each spell hotkey slot (slot index == grant order == + /// list index). Shared by + /// (reads input) and the HUD hotbar (renders key + /// labels) so the two can never drift apart. + /// + /// + /// 's HotkeyLayout already claims the entire + /// Q/W/E/R/T/A/S/D/F/G/Z/X/C/V/B block for the build command grid, so spell casting uses + /// the number row instead. + /// + public static class SpellHotkeys + { + public static readonly Key[] Layout = + { + Key.Digit1, + Key.Digit2, + Key.Digit3, + Key.Digit4, + }; + + public static int MaxSpellSlots => Layout.Length; + } +} diff --git a/Assets/_Project/Scripts/Gameplay/SpellHotkeys.cs.meta b/Assets/_Project/Scripts/Gameplay/SpellHotkeys.cs.meta new file mode 100644 index 0000000..62da374 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/SpellHotkeys.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 360482837f8c85d5abe29870dcf9cf1a \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/SpellSlot.cs b/Assets/_Project/Scripts/Gameplay/SpellSlot.cs new file mode 100644 index 0000000..c84e687 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/SpellSlot.cs @@ -0,0 +1,63 @@ +// Assets/_Project/Scripts/Gameplay/SpellSlot.cs +using System; +using Unity.Netcode; +using TD.Core; + +namespace TD.Gameplay +{ + /// + /// One granted builder spell in a . Replicated as part of + /// a ; the entry's index in that list IS the hotkey slot + /// (grant order == key order), so no separate slot index field is needed. + /// + /// + /// One struct, not parallel lists. is set once at grant time; + /// is rewritten on every cast. NetworkList{T}'s + /// indexer setter (spells[i] = newValue) short-circuits the write when + /// Equals on the old value returns true (see for the + /// documented case that first surfaced this). Comparing only would mean + /// a cooldown update — same Kind, new CooldownEndServerTime — never actually replicates. + /// therefore compares every field. + /// + [Serializable] + public struct SpellSlot : INetworkSerializable, IEquatable + { + /// Which spell occupies this slot. Fixed for the slot's lifetime. + public BuilderSpellKind Kind; + + /// + /// NetworkManager.ServerTime.Time at which this slot is next ready to cast. + /// 0 (or any value <= current server time) means ready now. + /// + public double CooldownEndServerTime; + + public static SpellSlot CreateReady(BuilderSpellKind kind) + { + return new SpellSlot { Kind = kind, CooldownEndServerTime = 0d }; + } + + // ----- INetworkSerializable --------------------------------------- + + public void NetworkSerialize(BufferSerializer serializer) where T : IReaderWriter + { + byte kindByte = (byte)Kind; + serializer.SerializeValue(ref kindByte); + Kind = (BuilderSpellKind)kindByte; + + serializer.SerializeValue(ref CooldownEndServerTime); + } + + // ----- IEquatable ------------------------------------------------- + // + // Full-field comparison — see remarks above. Without this, cooldown writes + // (Kind unchanged, only CooldownEndServerTime updated) would be silently dropped + // by NetworkList's indexer setter. + + public bool Equals(SpellSlot other) => + Kind == other.Kind && CooldownEndServerTime == other.CooldownEndServerTime; + + public override bool Equals(object obj) => obj is SpellSlot other && Equals(other); + + public override int GetHashCode() => (int)Kind; + } +} diff --git a/Assets/_Project/Scripts/Gameplay/SpellSlot.cs.meta b/Assets/_Project/Scripts/Gameplay/SpellSlot.cs.meta new file mode 100644 index 0000000..d9c0bee --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/SpellSlot.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9c8fdabdb3c89204ab28f9e031678db4 \ No newline at end of file diff --git a/Assets/_Project/Scripts/UI/HUDController.cs b/Assets/_Project/Scripts/UI/HUDController.cs index 96f50ec..504ac50 100644 --- a/Assets/_Project/Scripts/UI/HUDController.cs +++ b/Assets/_Project/Scripts/UI/HUDController.cs @@ -8,6 +8,7 @@ using UnityEngine.SceneManagement; using UnityEngine.UIElements; using TD.Core; using TD.Gameplay; +using TD.Gameplay.BuilderSpells; using TD.Gameplay.Draft; using TD.Towers; using TD.UI.Minimap; @@ -115,6 +116,27 @@ namespace TD.UI private bool draftSubscribed; private PlayerDraft subscribedDraft; + // Spell hotbar (bottom-ui Section 6). Frame is display:none while the local player + // has no granted spells; rebuilt on grant (append-only, so this is rare). Cooldown + // state changes continuously and has no change event, so it's polled every Update. + private VisualElement spellHotbarFrame; + private VisualElement spellHotbar; + private bool spellLoadoutSubscribed; + private PlayerSpellLoadout subscribedSpellLoadout; + private readonly List spellSlotUis = new List(); + + private readonly struct SpellSlotUi + { + public readonly VisualElement Cell; + public readonly Label CooldownLabel; + + public SpellSlotUi(VisualElement cell, Label cooldownLabel) + { + Cell = cell; + CooldownLabel = cooldownLabel; + } + } + // Chat panel (bottom-left, above portrait) — programmatic. The container // holds both the scrollable feed and the input. Highlight + scroll // interactivity are toggled on the container when typing. @@ -294,6 +316,23 @@ namespace TD.UI RebuildDraftCards(); } + // Hook the local player's spell loadout so the hotbar rebuilds when a new spell is + // granted. Retried each Update until the local PlayerSpellLoadout exists. + private void TrySubscribeSpellLoadout() + { + var loadout = PlayerSpellLoadout.Local; + if (loadout == null) return; + loadout.OnLoadoutChanged += HandleSpellLoadoutChanged; + subscribedSpellLoadout = loadout; + spellLoadoutSubscribed = true; + RebuildSpellHotbar(); + } + + private void HandleSpellLoadoutChanged() + { + RebuildSpellHotbar(); + } + // ----- Draft overlay ---------------------------------------------- // Non-modal draft UI: a card row floats at top-center while a draft is active, and @@ -434,6 +473,103 @@ namespace TD.UI draftPanel.style.display = (hasDraft || canShowBuy) ? DisplayStyle.Flex : DisplayStyle.None; } + // ----- Spell hotbar ------------------------------------------------- + + // Rebuilds the hotbar cells from the local player's current loadout. Called on + // OnLoadoutChanged (a new spell granted) — spells are append-only, so this is rare, + // not a per-frame concern. + private void RebuildSpellHotbar() + { + if (spellHotbar == null) return; + spellHotbar.Clear(); + spellSlotUis.Clear(); + + var loadout = PlayerSpellLoadout.Local; + int slotCount = loadout?.SlotCount ?? 0; + + if (spellHotbarFrame != null) + spellHotbarFrame.style.display = slotCount > 0 ? DisplayStyle.Flex : DisplayStyle.None; + + if (loadout == null) return; + + var layout = SpellHotkeys.Layout; + for (int i = 0; i < slotCount; i++) + { + var kind = loadout.GetKind(i); + if (kind == null) continue; + + var definition = BuilderSpellPool.Instance?.Get(kind.Value); + + var cell = new VisualElement(); + cell.AddToClassList("spell-slot"); + + var icon = new VisualElement(); + icon.AddToClassList("spell-slot-icon"); + icon.pickingMode = PickingMode.Ignore; + if (definition?.Icon != null) + icon.style.backgroundImage = new StyleBackground(definition.Icon); + cell.Add(icon); + + if (i < layout.Length) + { + var hkLabel = new Label(SpellKeyToDisplay(layout[i])); + hkLabel.AddToClassList("spell-slot-hotkey"); + hkLabel.pickingMode = PickingMode.Ignore; + cell.Add(hkLabel); + } + + var cooldownLabel = new Label(""); + cooldownLabel.AddToClassList("spell-slot-cooldown-label"); + cooldownLabel.pickingMode = PickingMode.Ignore; + cell.Add(cooldownLabel); + + cell.RegisterCallback(_ => ShowSpellTooltip(definition)); + cell.RegisterCallback(_ => ClearTooltip()); + + spellHotbar.Add(cell); + spellSlotUis.Add(new SpellSlotUi(cell, cooldownLabel)); + } + } + + // Per-frame: dims each slot while on cooldown and shows the remaining whole seconds. + // Cooldown has no change event (it advances continuously with server time), so this + // has to be polled — cheap at hotbar scale (at most MaxSpellSlots cells). + private void UpdateSpellCooldowns() + { + if (spellSlotUis.Count == 0) return; + + var loadout = PlayerSpellLoadout.Local; + if (loadout == null) return; + + for (int i = 0; i < spellSlotUis.Count; i++) + { + var ui = spellSlotUis[i]; + bool onCooldown = loadout.IsSlotOnCooldown(i); + ui.Cell.EnableInClassList("on-cooldown", onCooldown); + ui.CooldownLabel.text = onCooldown + ? $"{Mathf.CeilToInt(loadout.GetCooldownRemaining(i))}" + : ""; + } + } + + // Renders a spell hotkey as its display glyph. SpellHotkeys.Layout uses Key.DigitN, + // whose ToString() is "DigitN" — strip the prefix so the badge shows "1", not "Digit1". + private static string SpellKeyToDisplay(Key key) + { + string s = key.ToString(); + return s.StartsWith("Digit") ? s.Substring("Digit".Length) : s; + } + + // Lightweight tooltip for spell slots — reuses the tooltip box (title + desc + cooldown). + private void ShowSpellTooltip(BuilderSpellDefinition def) + { + if (ttTitle == null || def == null) return; + ttTitle.text = def.DisplayName; + ttDesc.text = def.Description ?? ""; + ttStats.text = $"Cooldown: {def.Cooldown:0.#}s"; + ttCost.text = ""; + } + private void InitializeUI() { var doc = GetComponent(); @@ -481,6 +617,8 @@ namespace TD.UI ttStats = Require /// /// is - /// — the cast controller shows only a fixed-size reticle, even though + /// — the cast controller shows only a fixed-size reticule, even though /// is still used internally here as the splash /// radius (0 = no splash, direct hit only). /// @@ -19,6 +19,14 @@ namespace TD.Gameplay.BuilderSpells { public override BuilderSpellKind Kind => BuilderSpellKind.Fireball; + [Header("Impact VFX")] + [Tooltip("Prefab spawned at the target point on a successful cast. Optional — leave empty for no visual.")] + [SerializeField] private GameObject impactVfxPrefab; + + [Tooltip("Seconds before the spawned VFX instance is destroyed.")] + [Min(0f)] + [SerializeField] private float impactVfxLifetime = 2f; + [Header("Fireball")] [Tooltip("Damage dealt to every enemy within Radius of the target point.")] [Min(0f)] @@ -43,5 +51,11 @@ namespace TD.Gameplay.BuilderSpells return hitAny; } + + public override void ClientPlayVfx(Vector3 targetPoint) + { + if (impactVfxPrefab != null) + Destroy(Instantiate(impactVfxPrefab, targetPoint, Quaternion.identity), impactVfxLifetime); + } } } From dd87fd6d0ae6d69b1b217979bf3925cbb330e6c8 Mon Sep 17 00:00:00 2001 From: Ian Woods Date: Tue, 14 Jul 2026 23:10:32 -0700 Subject: [PATCH 26/58] terrible looking placeholder for firework --- Assets/_Project/Art/VFX/spells.meta | 8 + .../_Project/Art/VFX/spells/Fireball.prefab | 133 + .../Art/VFX/spells/Fireball.prefab.meta | 7 + .../Art/VFX/spells/FireballMaterial.mat | 137 + .../Art/VFX/spells/FireballMaterial.mat.meta | 8 + .../Art/VFX/spells/VFX_fireball_impact.vfx | 2692 +++++++++++++++++ .../VFX/spells/VFX_fireball_impact.vfx.meta | 15 + .../BuilderSpells/FireballSpell.asset | 2 + Assets/_Project/Scenes/Levels/9Player.unity | 177 ++ .../_Project/Scripts/VFX/FallFromSkyVisual.cs | 82 + .../Scripts/VFX/FallFromSkyVisual.cs.meta | 2 + 11 files changed, 3263 insertions(+) create mode 100644 Assets/_Project/Art/VFX/spells.meta create mode 100644 Assets/_Project/Art/VFX/spells/Fireball.prefab create mode 100644 Assets/_Project/Art/VFX/spells/Fireball.prefab.meta create mode 100644 Assets/_Project/Art/VFX/spells/FireballMaterial.mat create mode 100644 Assets/_Project/Art/VFX/spells/FireballMaterial.mat.meta create mode 100644 Assets/_Project/Art/VFX/spells/VFX_fireball_impact.vfx create mode 100644 Assets/_Project/Art/VFX/spells/VFX_fireball_impact.vfx.meta create mode 100644 Assets/_Project/Scripts/VFX/FallFromSkyVisual.cs create mode 100644 Assets/_Project/Scripts/VFX/FallFromSkyVisual.cs.meta diff --git a/Assets/_Project/Art/VFX/spells.meta b/Assets/_Project/Art/VFX/spells.meta new file mode 100644 index 0000000..b5edea7 --- /dev/null +++ b/Assets/_Project/Art/VFX/spells.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 204a6f4885c16648c8bd80385fcbe93f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Art/VFX/spells/Fireball.prefab b/Assets/_Project/Art/VFX/spells/Fireball.prefab new file mode 100644 index 0000000..b51070f --- /dev/null +++ b/Assets/_Project/Art/VFX/spells/Fireball.prefab @@ -0,0 +1,133 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &158073311046191680 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7644069561715729860} + - component: {fileID: 4501491015215836543} + - component: {fileID: 4205765680785243152} + - component: {fileID: 8766422769305713616} + m_Layer: 0 + m_Name: Fireball + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7644069561715729860 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 158073311046191680} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -53.04094, y: 0, z: -31.13852} + m_LocalScale: {x: 5, y: 5, z: 5} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &4501491015215836543 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 158073311046191680} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &4205765680785243152 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 158073311046191680} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + 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: 2100000, guid: 94a6d1000bea4e36492489f6ab3d6349, 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 &8766422769305713616 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 158073311046191680} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 883bd1d14f70a623ea1b252cf7015a92, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.VFX.FallFromSkyVisual + dropHeight: 20 + duration: 0.5 + fallCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + fallAngleDegrees: 0 + fallDirection: {x: 0, y: 0, z: 1} diff --git a/Assets/_Project/Art/VFX/spells/Fireball.prefab.meta b/Assets/_Project/Art/VFX/spells/Fireball.prefab.meta new file mode 100644 index 0000000..5557f85 --- /dev/null +++ b/Assets/_Project/Art/VFX/spells/Fireball.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 80eaad6d0b024835482b64625b63053c +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Art/VFX/spells/FireballMaterial.mat b/Assets/_Project/Art/VFX/spells/FireballMaterial.mat new file mode 100644 index 0000000..bfa1880 --- /dev/null +++ b/Assets/_Project/Art/VFX/spells/FireballMaterial.mat @@ -0,0 +1,137 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-5733238300184794208 +MonoBehaviour: + m_ObjectHideFlags: 11 + 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: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion + version: 10 +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: FireballMaterial + m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: + RenderType: Opaque + disabledShaderPasses: + - MOTIONVECTORS + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _AddPrecomputedVelocity: 0 + - _AlphaClip: 0 + - _AlphaToMask: 0 + - _Blend: 0 + - _BlendModePreserveSpecular: 1 + - _BumpScale: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _DstBlendAlpha: 0 + - _EnvironmentReflections: 1 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _Metallic: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.005 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _Smoothness: 0.5 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _SrcBlendAlpha: 1 + - _Surface: 0 + - _WorkflowMode: 1 + - _XRMotionVectorsPass: 1 + - _ZWrite: 1 + m_Colors: + - _BaseColor: {r: 0.6196744, g: 0, b: 0, a: 1} + - _Color: {r: 0.6196744, g: 0, b: 0, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} + m_BuildTextureStacks: [] + m_AllowLocking: 1 diff --git a/Assets/_Project/Art/VFX/spells/FireballMaterial.mat.meta b/Assets/_Project/Art/VFX/spells/FireballMaterial.mat.meta new file mode 100644 index 0000000..4161053 --- /dev/null +++ b/Assets/_Project/Art/VFX/spells/FireballMaterial.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 94a6d1000bea4e36492489f6ab3d6349 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Art/VFX/spells/VFX_fireball_impact.vfx b/Assets/_Project/Art/VFX/spells/VFX_fireball_impact.vfx new file mode 100644 index 0000000..8e02032 --- /dev/null +++ b/Assets/_Project/Art/VFX/spells/VFX_fireball_impact.vfx @@ -0,0 +1,2692 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &114340500867371532 +MonoBehaviour: + m_ObjectHideFlags: 1 + 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: d01270efd3285ea4a9d6c555cb0a8027, type: 3} + m_Name: VFXUI + m_EditorClassIdentifier: + groupInfos: + - title: Burst + position: + serializedVersion: 2 + x: 264 + y: 295 + width: 1055 + height: 2398 + contents: + - model: {fileID: 8926484042661614700} + id: 0 + isStickyNote: 0 + - model: {fileID: 8926484042661614707} + id: 0 + isStickyNote: 0 + - model: {fileID: 8926484042661614756} + id: 0 + isStickyNote: 0 + - model: {fileID: 8926484042661614976} + id: 0 + isStickyNote: 0 + stickyNoteInfos: [] + categories: [] + uiBounds: + serializedVersion: 2 + x: 264 + y: 295 + width: 1055 + height: 2398 +--- !u!114 &114350483966674976 +MonoBehaviour: + m_ObjectHideFlags: 1 + 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: 7d4c867f6b72b714dbb5fd1780afe208, type: 3} + m_Name: VFX_fireball_impact + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614700} + - {fileID: 8926484042661614707} + - {fileID: 8926484042661614756} + - {fileID: 8926484042661614976} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_UIInfos: {fileID: 114340500867371532} + m_CustomAttributes: [] + m_ParameterInfo: [] + m_ImportDependencies: [] + m_GraphVersion: 19 + m_ResourceVersion: 1 + m_SubgraphDependencies: [] + m_CategoryPath: +--- !u!2058629511 &8926484042661614527 +VisualEffectResource: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: VFX_fireball_impact + m_Graph: {fileID: 114350483966674976} + m_Infos: + m_RendererSettings: + motionVectorGenerationMode: 0 + shadowCastingMode: 0 + m_CullingFlags: 3 + m_UpdateMode: 0 + m_PreWarmDeltaTime: 0.05 + m_PreWarmStepCount: 0 + m_InitialEventName: OnPlay + m_InstancingMode: 0 + m_InstancingCapacity: 64 +--- !u!114 &8926484042661614700 +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: 73a13919d81fb7444849bae8b5c812a2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674976} + m_Children: + - {fileID: 8926484042661614703} + m_UIPosition: {x: 289, y: 354} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614879} + - {fileID: 8926484042661614975} + m_OutputSlots: [] + m_Label: Spawn system + m_Data: {fileID: 8926484042661614702} + m_InputFlowSlot: + - link: [] + - link: [] + m_OutputFlowSlot: + - link: + - context: {fileID: 8926484042661614707} + slotIndex: 0 + loopDuration: 1 + loopCount: 1 + delayBeforeLoop: 0 + delayAfterLoop: 0 +--- !u!114 &8926484042661614702 +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: f68759077adc0b143b6e1c101e82065e, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + title: + m_Owners: + - {fileID: 8926484042661614700} +--- !u!114 &8926484042661614703 +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: 5e382412bb691334bb79457a6c127924, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614700} + m_Children: [] + m_UIPosition: {x: 0, y: 2} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614704} + - {fileID: 8926484042661614705} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614706} + repeat: 0 + spawnMode: 0 + delayMode: 0 +--- !u!114 &8926484042661614704 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614704} + m_MasterData: + m_Owner: {fileID: 8926484042661614703} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 128 + m_Space: -1 + m_Property: + name: Count + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614705 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614705} + m_MasterData: + m_Owner: {fileID: 8926484042661614703} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0 + m_Space: -1 + m_Property: + name: Delay + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614706 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614706} + m_MasterData: + m_Owner: {fileID: 8926484042661614703} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614707 +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: 9dfea48843f53fc438eabc12a3a30abc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674976} + m_Children: + - {fileID: 8926484042661614722} + - {fileID: 8926484042661614956} + - {fileID: 8926484042661614912} + m_UIPosition: {x: 289, y: 800} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614880} + - {fileID: 8926484042661614889} + m_OutputSlots: [] + m_Label: Initialize Particles + m_Data: {fileID: 8926484042661614721} + m_InputFlowSlot: + - link: + - context: {fileID: 8926484042661614700} + slotIndex: 0 + m_OutputFlowSlot: + - link: + - context: {fileID: 8926484042661614756} + slotIndex: 0 +--- !u!114 &8926484042661614721 +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: d78581a96eae8bf4398c282eb0b098bd, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + title: Simple Burst + m_Owners: + - {fileID: 8926484042661614707} + - {fileID: 8926484042661614756} + - {fileID: 8926484042661614976} + dataType: 0 + capacity: 128 + stripCapacity: 1 + particlePerStripCount: 32 + needsComputeBounds: 0 + boundsMode: 0 + m_Space: 1 +--- !u!114 &8926484042661614722 +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: a971fa2e110a0ac42ac1d8dae408704b, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614707} + m_Children: [] + m_UIPosition: {x: 292.6464, y: 1481.9946} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614723} + - {fileID: 8926484042661614724} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614725} + attribute: lifetime + Composition: 0 + Source: 0 + Random: 2 + channels: 6 +--- !u!114 &8926484042661614723 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614723} + m_MasterData: + m_Owner: {fileID: 8926484042661614722} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0.5 + m_Space: -1 + m_Property: + name: A + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614724 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614724} + m_MasterData: + m_Owner: {fileID: 8926484042661614722} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 1 + m_Space: -1 + m_Property: + name: B + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614725 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614725} + m_MasterData: + m_Owner: {fileID: 8926484042661614722} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614756 +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: 2dc095764ededfa4bb32fa602511ea4b, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674976} + m_Children: + - {fileID: 8926484042661614922} + - {fileID: 8926484042661614929} + m_UIPosition: {x: 289, y: 1535} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: [] + m_OutputSlots: [] + m_Label: Update Particles + m_Data: {fileID: 8926484042661614721} + m_InputFlowSlot: + - link: + - context: {fileID: 8926484042661614707} + slotIndex: 0 + m_OutputFlowSlot: + - link: + - context: {fileID: 8926484042661614976} + slotIndex: 0 + integration: 0 + angularIntegration: 0 + ageParticles: 1 + reapParticles: 1 + skipZeroDeltaUpdate: 0 +--- !u!114 &8926484042661614879 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614879} + m_MasterData: + m_Owner: {fileID: 8926484042661614700} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 2 + m_Space: -1 + m_Property: + name: LoopDuration + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614880 +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: 1b605c022ee79394a8a776c0869b3f9a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614881} + - {fileID: 8926484042661614885} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614880} + m_MasterData: + m_Owner: {fileID: 8926484042661614707} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.AABox, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"center":{"x":0.0,"y":-2.0,"z":0.0},"size":{"x":7.0,"y":8.0,"z":7.0}}' + m_Space: 0 + m_Property: + name: bounds + m_serializedType: + m_SerializableType: UnityEditor.VFX.AABox, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614881 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614880} + m_Children: + - {fileID: 8926484042661614882} + - {fileID: 8926484042661614883} + - {fileID: 8926484042661614884} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614880} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: center + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614882 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614881} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614880} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614883 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614881} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614880} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614884 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614881} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614880} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614885 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614880} + m_Children: + - {fileID: 8926484042661614886} + - {fileID: 8926484042661614887} + - {fileID: 8926484042661614888} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614880} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: size + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614886 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614885} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614880} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614887 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614885} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614880} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614888 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614885} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614880} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614889 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614890} + - {fileID: 8926484042661614891} + - {fileID: 8926484042661614892} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614889} + m_MasterData: + m_Owner: {fileID: 8926484042661614707} + m_Value: + m_Type: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"x":0.5,"y":0.5,"z":0.5}' + m_Space: -1 + m_Property: + name: boundsPadding + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614890 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614889} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614889} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614891 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614889} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614889} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614892 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614889} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614889} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614912 +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: 26096dfac7c062b4b94c293605ba085e, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614707} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614913} + - {fileID: 8926484042661614918} + - {fileID: 8926484042661614919} + - {fileID: 8926484042661614920} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614921} + composition: 0 + speedMode: 1 +--- !u!114 &8926484042661614913 +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: e8f2b4a846fd4c14a893cde576ad172b, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614914} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614913} + m_MasterData: + m_Owner: {fileID: 8926484042661614912} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.DirectionType, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"direction":{"x":0.0,"y":1.0,"z":0.0}}' + m_Space: 0 + m_Property: + name: Direction + m_serializedType: + m_SerializableType: UnityEditor.VFX.DirectionType, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614914 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614913} + m_Children: + - {fileID: 8926484042661614915} + - {fileID: 8926484042661614916} + - {fileID: 8926484042661614917} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614913} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: direction + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614915 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614914} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614913} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614916 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614914} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614913} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614917 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614914} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614913} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614918 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614918} + m_MasterData: + m_Owner: {fileID: 8926484042661614912} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0.5 + m_Space: -1 + m_Property: + name: MinSpeed + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614919 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614919} + m_MasterData: + m_Owner: {fileID: 8926484042661614912} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 4.5 + m_Space: -1 + m_Property: + name: MaxSpeed + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614920 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614920} + m_MasterData: + m_Owner: {fileID: 8926484042661614912} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0 + m_Space: -1 + m_Property: + name: DirectionBlend + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614921 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614921} + m_MasterData: + m_Owner: {fileID: 8926484042661614912} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614922 +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: e5dce54ae3368c042b26ab1f305e15b2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614756} + m_Children: [] + m_UIPosition: {x: 0, y: 2} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614923} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614928} +--- !u!114 &8926484042661614923 +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: a9f9544b71b7dab44a4644b6807e8bf6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614924} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614923} + m_MasterData: + m_Owner: {fileID: 8926484042661614922} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.Vector, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"vector":{"x":0.0,"y":-9.8100004196167,"z":0.0}}' + m_Space: 1 + m_Property: + name: Force + m_serializedType: + m_SerializableType: UnityEditor.VFX.Vector, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614924 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614923} + m_Children: + - {fileID: 8926484042661614925} + - {fileID: 8926484042661614926} + - {fileID: 8926484042661614927} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614923} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: vector + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614925 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614924} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614923} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614926 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614924} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614923} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614927 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614924} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614923} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614928 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614928} + m_MasterData: + m_Owner: {fileID: 8926484042661614922} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614929 +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: b294673e879f9cf449cc9de536818ea9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614756} + m_Children: [] + m_UIPosition: {x: 0, y: 77} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614930} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614931} + UseParticleSize: 0 +--- !u!114 &8926484042661614930 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614930} + m_MasterData: + m_Owner: {fileID: 8926484042661614929} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0.5 + m_Space: -1 + m_Property: + name: dragCoefficient + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614931 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614931} + m_MasterData: + m_Owner: {fileID: 8926484042661614929} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614956 +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: fb1f6794ace8b0c4592af9c5604cddbf, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614707} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614957} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614974} + compositionPosition: 0 + compositionAxes: 0 + compositionDirection: 0 + positionMode: 0 + spawnMode: 0 + shape: 0 + heightMode: 1 + applyOrientation: 1 + killOutliers: 0 + projectionSteps: 2 +--- !u!114 &8926484042661614957 +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: 1b605c022ee79394a8a776c0869b3f9a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614958} + - {fileID: 8926484042661614973} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 8926484042661614956} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.TArcSphere, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"sphere":{"transform":{"position":{"x":0.0,"y":0.0,"z":0.0},"angles":{"x":0.0,"y":0.0,"z":0.0},"scale":{"x":1.0,"y":1.0,"z":1.0}},"radius":0.15000000596046449},"arc":6.28000020980835}' + m_Space: 0 + m_Property: + name: arcSphere + m_serializedType: + m_SerializableType: UnityEditor.VFX.TArcSphere, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614958 +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: 1b605c022ee79394a8a776c0869b3f9a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614957} + m_Children: + - {fileID: 8926484042661614959} + - {fileID: 8926484042661614972} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: sphere + m_serializedType: + m_SerializableType: UnityEditor.VFX.TSphere, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614959 +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: 3e3f628d80ffceb489beac74258f9cf7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614958} + m_Children: + - {fileID: 8926484042661614960} + - {fileID: 8926484042661614964} + - {fileID: 8926484042661614968} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: transform + m_serializedType: + m_SerializableType: UnityEditor.VFX.Transform, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614960 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614959} + m_Children: + - {fileID: 8926484042661614961} + - {fileID: 8926484042661614962} + - {fileID: 8926484042661614963} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: position + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614961 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614960} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614962 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614960} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614963 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614960} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614964 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614959} + m_Children: + - {fileID: 8926484042661614965} + - {fileID: 8926484042661614966} + - {fileID: 8926484042661614967} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: angles + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614965 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614964} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614966 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614964} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614967 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614964} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614968 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614959} + m_Children: + - {fileID: 8926484042661614969} + - {fileID: 8926484042661614970} + - {fileID: 8926484042661614971} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: scale + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614969 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614968} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614970 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614968} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614971 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614968} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614972 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614958} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: radius + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614973 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614957} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614957} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: arc + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614974 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614974} + m_MasterData: + m_Owner: {fileID: 8926484042661614956} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614975 +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: 4d246e354feb93041a837a9ef59437cb, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotInt + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614975} + m_MasterData: + m_Owner: {fileID: 8926484042661614700} + m_Value: + m_Type: + m_SerializableType: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 1 + m_Space: -1 + m_Property: + name: LoopCount + m_serializedType: + m_SerializableType: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614976 +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: 9956086b52aebe1449639a9ac65802c2, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXComposedParticleOutput + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674976} + m_Children: [] + m_UIPosition: {x: 870, y: 1820} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614977} + - {fileID: 8926484042661614978} + - {fileID: 8926484042661614979} + - {fileID: 8926484042661614980} + m_OutputSlots: [] + m_Label: + m_Data: {fileID: 8926484042661614721} + m_InputFlowSlot: + - link: + - context: {fileID: 8926484042661614756} + slotIndex: 0 + m_OutputFlowSlot: + - link: [] + blendMode: 1 + cullMode: 0 + zWriteMode: 0 + zTestMode: 0 + useAlphaClipping: 0 + generateMotionVector: 0 + excludeFromTUAndAA: 0 + sortingPriority: 0 + m_SubOutputs: + - {fileID: 8926484042661614986} + useBaseColorMap: 3 + colorMapping: 0 + uvMode: 0 + flipbookLayout: 0 + flipbookBlendFrames: 0 + flipbookMotionVectors: 0 + useSoftParticle: 0 + vfxSystemSortPriority: 0 + sort: 0 + sortMode: 0 + revertSorting: 0 + indirectDraw: 0 + computeCulling: 0 + frustumCulling: 0 + castShadows: 0 + useExposureWeight: 0 + enableRayTracing: 0 + decimationFactor: 1 + raytracedScaleMode: 0 + needsOwnSort: 1 + needsOwnAabbBuffer: 0 + m_Topology: + rid: 6358680547474538635 + m_Shading: + rid: 6358680547474538636 + references: + version: 2 + RefIds: + - rid: 6358680547474538635 + type: {class: ParticleTopologyMesh, ns: UnityEditor.VFX, asm: Unity.VisualEffectGraph.Editor} + data: + MeshCount: 1 + lod: 0 + - rid: 6358680547474538636 + type: {class: ParticleShadingShaderGraph, ns: UnityEditor.VFX, asm: Unity.VisualEffectGraph.Editor} + data: + shaderGraph: {fileID: 4333940904281232215, guid: 16dbac556be7c00448dd113d83bf05e1, type: 3} + materialSettings: + m_PropertyNames: [] + m_PropertyValues: [] + renderQueue: -1 +--- !u!114 &8926484042661614977 +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: b47b8679b468b7347a00cdd50589bc9f, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotMesh + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614977} + m_MasterData: + m_Owner: {fileID: 8926484042661614976} + m_Value: + m_Type: + m_SerializableType: UnityEngine.Mesh, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"obj":{"fileID":10207,"guid":"0000000000000000e000000000000000","type":0}}' + m_Space: -1 + m_Property: + name: mesh + m_serializedType: + m_SerializableType: UnityEngine.Mesh, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614978 +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: c52d920e7fff73b498050a6b3c4404ca, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotUint + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614978} + m_MasterData: + m_Owner: {fileID: 8926484042661614976} + m_Value: + m_Type: + m_SerializableType: System.UInt32, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 4294967295 + m_Space: -1 + m_Property: + name: subMeshMask + m_serializedType: + m_SerializableType: System.UInt32, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614979 +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: 70a331b1d86cc8d4aa106ccbe0da5852, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotTexture2D + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614979} + m_MasterData: + m_Owner: {fileID: 8926484042661614976} + m_Value: + m_Type: + m_SerializableType: UnityEngine.Texture2D, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"obj":{"fileID":2800000,"guid":"8aafaa78fe944854997fef757ff4ba72","type":3}}' + m_Space: -1 + m_Property: + name: _BaseMap + m_serializedType: + m_SerializableType: UnityEngine.Texture2D, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614980 +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: c82227d5759e296488798b1554a72a15, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotColor + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614981} + - {fileID: 8926484042661614982} + - {fileID: 8926484042661614983} + - {fileID: 8926484042661614984} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614980} + m_MasterData: + m_Owner: {fileID: 8926484042661614976} + m_Value: + m_Type: + m_SerializableType: UnityEngine.Color, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"r":0.3019754886627197,"g":0.0,"b":0.01985604129731655,"a":1.0}' + m_Space: -1 + m_Property: + name: _Color + m_serializedType: + m_SerializableType: UnityEngine.Color, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614981 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614980} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614980} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: r + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614982 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614980} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614980} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: g + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614983 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614980} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614980} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: b + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614984 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614980} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614980} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: a + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614986 +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: 388ad3b1dc9c6ae45b630f914fab638f, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.VFX.URP.VFXURPSubOutput + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 diff --git a/Assets/_Project/Art/VFX/spells/VFX_fireball_impact.vfx.meta b/Assets/_Project/Art/VFX/spells/VFX_fireball_impact.vfx.meta new file mode 100644 index 0000000..73f1d83 --- /dev/null +++ b/Assets/_Project/Art/VFX/spells/VFX_fireball_impact.vfx.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: 3fa4641e771cdd27880ed1185a588a83 +VisualEffectImporter: + externalObjects: {} + serializedVersion: 2 + template: + name: + category: + description: + icon: {instanceID: 0} + thumbnail: {instanceID: 0} + useAsTemplate: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/BuilderSpells/FireballSpell.asset b/Assets/_Project/Definitions/BuilderSpells/FireballSpell.asset index d505a3a..4dcb8a2 100644 --- a/Assets/_Project/Definitions/BuilderSpells/FireballSpell.asset +++ b/Assets/_Project/Definitions/BuilderSpells/FireballSpell.asset @@ -21,4 +21,6 @@ MonoBehaviour: enemyLayerMask: serializedVersion: 2 m_Bits: 1024 + impactVfxPrefab: {fileID: 158073311046191680, guid: 80eaad6d0b024835482b64625b63053c, type: 3} + impactVfxLifetime: 2 Damage: 50 diff --git a/Assets/_Project/Scenes/Levels/9Player.unity b/Assets/_Project/Scenes/Levels/9Player.unity index 98a6d5e..6ccdbcb 100644 --- a/Assets/_Project/Scenes/Levels/9Player.unity +++ b/Assets/_Project/Scenes/Levels/9Player.unity @@ -22163,6 +22163,124 @@ Mesh: - serializedVersion: 1 m_IndexStart: 0 m_IndexCount: 0 +--- !u!1 &1686616342 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1686616345} + - component: {fileID: 1686616344} + - component: {fileID: 1686616343} + m_Layer: 0 + m_Name: VFX_fireball_impact + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!73398921 &1686616343 +VFXRenderer: + serializedVersion: 1 + m_ObjectHideFlags: 2 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1686616342} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 0 + 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_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 +--- !u!2083052967 &1686616344 +VisualEffect: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1686616342} + m_Enabled: 1 + m_Asset: {fileID: 8926484042661614526, guid: 3fa4641e771cdd27880ed1185a588a83, type: 3} + m_InitialEventName: OnPlay + m_InitialEventNameOverriden: 0 + m_StartSeed: 0 + m_ResetSeedOnPlay: 1 + m_AllowInstancing: 1 + m_ResourceVersion: 1 + m_PropertySheet: + m_Float: + m_Array: [] + m_Vector2f: + m_Array: [] + m_Vector3f: + m_Array: [] + m_Vector4f: + m_Array: [] + m_Uint: + m_Array: [] + m_Int: + m_Array: [] + m_Matrix4x4f: + m_Array: [] + m_AnimationCurve: + m_Array: [] + m_Gradient: + m_Array: [] + m_NamedObject: + m_Array: [] + m_Bool: + m_Array: [] +--- !u!4 &1686616345 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1686616342} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -18.90215, y: 6.17317, z: 0.5013} + 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 &1694718091 GameObject: m_ObjectHideFlags: 0 @@ -29037,6 +29155,63 @@ Transform: m_Children: [] m_Father: {fileID: 1097152085} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &6610752177701459700 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 158073311046191680, guid: 80eaad6d0b024835482b64625b63053c, type: 3} + propertyPath: m_Name + value: Fireball + objectReference: {fileID: 0} + - target: {fileID: 7644069561715729860, guid: 80eaad6d0b024835482b64625b63053c, type: 3} + propertyPath: m_LocalPosition.x + value: -53.04094 + objectReference: {fileID: 0} + - target: {fileID: 7644069561715729860, guid: 80eaad6d0b024835482b64625b63053c, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7644069561715729860, guid: 80eaad6d0b024835482b64625b63053c, type: 3} + propertyPath: m_LocalPosition.z + value: -31.13852 + objectReference: {fileID: 0} + - target: {fileID: 7644069561715729860, guid: 80eaad6d0b024835482b64625b63053c, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7644069561715729860, guid: 80eaad6d0b024835482b64625b63053c, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7644069561715729860, guid: 80eaad6d0b024835482b64625b63053c, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7644069561715729860, guid: 80eaad6d0b024835482b64625b63053c, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7644069561715729860, guid: 80eaad6d0b024835482b64625b63053c, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7644069561715729860, guid: 80eaad6d0b024835482b64625b63053c, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7644069561715729860, guid: 80eaad6d0b024835482b64625b63053c, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 80eaad6d0b024835482b64625b63053c, type: 3} --- !u!1660057539 &9223372036854775807 SceneRoots: m_ObjectHideFlags: 0 @@ -29065,3 +29240,5 @@ SceneRoots: - {fileID: 2079088113} - {fileID: 914832726} - {fileID: 993870445} + - {fileID: 1686616345} + - {fileID: 6610752177701459700} diff --git a/Assets/_Project/Scripts/VFX/FallFromSkyVisual.cs b/Assets/_Project/Scripts/VFX/FallFromSkyVisual.cs new file mode 100644 index 0000000..c287b16 --- /dev/null +++ b/Assets/_Project/Scripts/VFX/FallFromSkyVisual.cs @@ -0,0 +1,82 @@ +// Assets/_Project/Scripts/VFX/FallFromSkyVisual.cs +using System.Collections; +using UnityEngine; + +namespace TD.VFX +{ + /// + /// Animates this object falling from the sky down to its own spawn position. Intended for + /// a one-shot placeholder VFX prefab (e.g. FireballSpellDefinition.impactVfxPrefab) + /// that gets instantiated already at the correct landing point — on Start, it snaps + /// itself up by and animates back down over + /// seconds. + /// + /// + /// Mirrors 's fall coroutine, minus the + /// TowerInstance coupling — this is a plain local one-shot visual, not tied to any + /// networked gameplay state, so it can run from Start() instead of waiting on a + /// spawn event. + /// + public class FallFromSkyVisual : MonoBehaviour + { + [Tooltip("How high above the landing point this object starts.")] + [SerializeField] private float dropHeight = 20f; + + [Tooltip("Seconds for the fall animation to complete.")] + [Min(0.01f)] + [SerializeField] private float duration = 0.5f; + + [Tooltip("Eases the fall over Duration. X = normalized time, Y = normalized fraction " + + "of DropHeight already descended (0 = still at drop height, 1 = landed).")] + [SerializeField] private AnimationCurve fallCurve = AnimationCurve.EaseInOut(0f, 0f, 1f, 1f); + + [Header("Angle (optional — 0 = straight down)")] + [Tooltip("Angle from vertical, in degrees. 0 = falls straight down. Higher values = " + + "a shallower, more meteor-like diagonal approach. Capped below 90 — at 90 the " + + "object would never actually descend.")] + [Range(0f, 80f)] + [SerializeField] private float fallAngleDegrees = 0f; + + [Tooltip("Horizontal direction the object travels as it falls (only used when " + + "FallAngleDegrees > 0). Magnitude is ignored — normalized automatically.")] + [SerializeField] private Vector3 fallDirection = Vector3.forward; + + private void Start() + { + StartCoroutine(AnimateDrop()); + } + + private IEnumerator AnimateDrop() + { + Vector3 landedPosition = transform.position; // already correct — spawned at the target point + + // Split dropHeight into a vertical component (unchanged from the straight-down case) + // plus a horizontal component derived from the angle via basic trig: at angle θ from + // vertical, horizontal distance = dropHeight * tan(θ). At θ = 0 this is 0, so the + // whole angle path collapses back to the original straight-down offset. + float angleRad = fallAngleDegrees * Mathf.Deg2Rad; + float horizontalDistance = dropHeight * Mathf.Tan(angleRad); + + // Only the horizontal (XZ) part of fallDirection matters — a Y component would just + // be double-counting dropHeight, so it's dropped before normalizing. + Vector3 flatDirection = new Vector3(fallDirection.x, 0f, fallDirection.z); + Vector3 horizontalDir = flatDirection.sqrMagnitude > 0.0001f + ? flatDirection.normalized + : Vector3.zero; + + Vector3 startOffset = Vector3.up * dropHeight - horizontalDir * horizontalDistance; + transform.position = landedPosition + startOffset; + + float t = 0f; + while (t < duration) + { + t += Time.deltaTime; + float u = fallCurve.Evaluate(Mathf.Clamp01(t / duration)); + transform.position = landedPosition + startOffset * (1f - u); + yield return null; + } + + transform.position = landedPosition; // snap exactly, avoid float drift + } + } +} diff --git a/Assets/_Project/Scripts/VFX/FallFromSkyVisual.cs.meta b/Assets/_Project/Scripts/VFX/FallFromSkyVisual.cs.meta new file mode 100644 index 0000000..33fa527 --- /dev/null +++ b/Assets/_Project/Scripts/VFX/FallFromSkyVisual.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 883bd1d14f70a623ea1b252cf7015a92 \ No newline at end of file From 0b4cde4590a223ede9795aaf535bd0237c795ec6 Mon Sep 17 00:00:00 2001 From: Matt F Date: Tue, 14 Jul 2026 23:15:34 -0700 Subject: [PATCH 27/58] Adding the feature to sell towers with VFX and audio included --- Assets/_Project/Art/Materials/M_Gold.mat | 138 + Assets/_Project/Art/Materials/M_Gold.mat.meta | 8 + Assets/_Project/Art/Models/Blend Files.meta | 8 + Assets/_Project/Art/Models/Coin.fbx | 3 + Assets/_Project/Art/Models/Coin.fbx.meta | 110 + Assets/_Project/Art/VFX/FX_SellTower.prefab | 4896 +++++++++++++++++ .../_Project/Art/VFX/FX_SellTower.prefab.meta | 7 + Assets/_Project/Audio/Sound Effects.meta | 8 + .../Audio/Sound Effects/SellSoundEffect.ogg | 3 + .../Sound Effects/SellSoundEffect.ogg.meta | 23 + Assets/_Project/Scenes/Levels/9Player.unity | 53 + .../Scripts/Gameplay/EnemyMovement.cs | 20 +- .../Scripts/Gameplay/PathfindingService.cs | 88 +- .../_Project/Scripts/VFX/SellEffectSpawner.cs | 10 +- .../_Project/Scripts/VFX/TransientEffect.cs | 30 + .../Scripts/VFX/TransientEffect.cs.meta | 2 + 16 files changed, 5394 insertions(+), 13 deletions(-) create mode 100644 Assets/_Project/Art/Materials/M_Gold.mat create mode 100644 Assets/_Project/Art/Materials/M_Gold.mat.meta create mode 100644 Assets/_Project/Art/Models/Blend Files.meta create mode 100644 Assets/_Project/Art/Models/Coin.fbx create mode 100644 Assets/_Project/Art/Models/Coin.fbx.meta create mode 100644 Assets/_Project/Art/VFX/FX_SellTower.prefab create mode 100644 Assets/_Project/Art/VFX/FX_SellTower.prefab.meta create mode 100644 Assets/_Project/Audio/Sound Effects.meta create mode 100644 Assets/_Project/Audio/Sound Effects/SellSoundEffect.ogg create mode 100644 Assets/_Project/Audio/Sound Effects/SellSoundEffect.ogg.meta create mode 100644 Assets/_Project/Scripts/VFX/TransientEffect.cs create mode 100644 Assets/_Project/Scripts/VFX/TransientEffect.cs.meta diff --git a/Assets/_Project/Art/Materials/M_Gold.mat b/Assets/_Project/Art/Materials/M_Gold.mat new file mode 100644 index 0000000..3eb0ce0 --- /dev/null +++ b/Assets/_Project/Art/Materials/M_Gold.mat @@ -0,0 +1,138 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: M_Gold + m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: + - _EMISSION + m_InvalidKeywords: [] + m_LightmapFlags: 2 + m_EnableInstancingVariants: 1 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: + RenderType: Opaque + disabledShaderPasses: + - MOTIONVECTORS + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _AddPrecomputedVelocity: 0 + - _AlphaClip: 0 + - _AlphaToMask: 0 + - _Blend: 0 + - _BlendModePreserveSpecular: 1 + - _BumpScale: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _DstBlendAlpha: 0 + - _EnvironmentReflections: 1 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _Metallic: 0.3 + - _OcclusionStrength: 1 + - _Parallax: 0.005 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _Smoothness: 0.85 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _SrcBlendAlpha: 1 + - _Surface: 0 + - _WorkflowMode: 1 + - _XRMotionVectorsPass: 1 + - _ZWrite: 1 + m_Colors: + - _BaseColor: {r: 0.83137256, g: 0.6862745, b: 0.21568628, a: 1} + - _Color: {r: 0.83137256, g: 0.68627447, b: 0.2156862, a: 1} + - _EmissionColor: {r: 2, g: 0.6755797, b: 0.031372547, a: 1} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} + m_BuildTextureStacks: [] + m_AllowLocking: 1 +--- !u!114 &1062544154538963945 +MonoBehaviour: + m_ObjectHideFlags: 11 + 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: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion + version: 10 diff --git a/Assets/_Project/Art/Materials/M_Gold.mat.meta b/Assets/_Project/Art/Materials/M_Gold.mat.meta new file mode 100644 index 0000000..1caa033 --- /dev/null +++ b/Assets/_Project/Art/Materials/M_Gold.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 915f376be23f20941837c0809626fa5f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Art/Models/Blend Files.meta b/Assets/_Project/Art/Models/Blend Files.meta new file mode 100644 index 0000000..14a4fae --- /dev/null +++ b/Assets/_Project/Art/Models/Blend Files.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d70d84aef04e61749a232234c80f08ce +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Art/Models/Coin.fbx b/Assets/_Project/Art/Models/Coin.fbx new file mode 100644 index 0000000..c732270 --- /dev/null +++ b/Assets/_Project/Art/Models/Coin.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b5d924ce92dd6ea66125dea9941f965fb5da7eb4431f76ec9b4dd3b2091f19c1 +size 22476 diff --git a/Assets/_Project/Art/Models/Coin.fbx.meta b/Assets/_Project/Art/Models/Coin.fbx.meta new file mode 100644 index 0000000..674a119 --- /dev/null +++ b/Assets/_Project/Art/Models/Coin.fbx.meta @@ -0,0 +1,110 @@ +fileFormatVersion: 2 +guid: 280a727da941fc544b9aab7df7fe9f2d +ModelImporter: + serializedVersion: 24200 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + removeConstantScaleCurves: 0 + motionNodeName: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importPhysicalCameras: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + nodeNameCollisionStrategy: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + optimizeBones: 1 + generateMeshLods: 0 + meshLodGenerationFlags: 0 + maximumMeshLod: -1 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVMarginMethod: 1 + secondaryUVMinLightmapResolution: 40 + secondaryUVMinObjectScale: 1 + secondaryUVPackMargin: 4 + useFileScale: 1 + strictVertexDataChecks: 0 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 0 + addHumanoidExtraRootOnlyWhenUsingAvatar: 1 + importBlendShapeDeformPercent: 1 + remapMaterialsIfMaterialImportModeIsNone: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Art/VFX/FX_SellTower.prefab b/Assets/_Project/Art/VFX/FX_SellTower.prefab new file mode 100644 index 0000000..56bd027 --- /dev/null +++ b/Assets/_Project/Art/VFX/FX_SellTower.prefab @@ -0,0 +1,4896 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &2313150535691989867 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5508247059194889267} + - component: {fileID: 6710887781589457797} + - component: {fileID: 7520636153999768792} + m_Layer: 0 + m_Name: FX_SellTower + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5508247059194889267 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2313150535691989867} + serializedVersion: 2 + m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068} + 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: -90, y: 0, z: 0} +--- !u!198 &6710887781589457797 +ParticleSystem: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2313150535691989867} + serializedVersion: 8 + lengthInSec: 1.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: 3 + scalar: 0.9 + minScalar: 0.6 + 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: 3 + scalar: 6 + minScalar: 2 + 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: 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 + startSize: + serializedVersion: 2 + minMaxState: 0 + scalar: 30 + 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: 3 + scalar: 3.1415925 + 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: 3 + scalar: 3.1415927 + 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: 3 + scalar: 3.1415927 + 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: 1 + gravityModifier: + serializedVersion: 2 + minMaxState: 3 + scalar: 4 + minScalar: 1 + 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: 2 + 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: 2 + 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: 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 + 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: 3 + scalar: 50 + minScalar: 20 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + 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 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + cycleCount: 1 + repeatInterval: 0.01 + probability: 1 + SizeModule: + enabled: 1 + curve: + serializedVersion: 2 + minMaxState: 1 + scalar: 1 + minScalar: 1 + maxCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: -2 + outSlope: -2 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + 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: 1 + x: + serializedVersion: 2 + minMaxState: 3 + 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: 3 + 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: 3 + scalar: 0.7853982 + minScalar: 0.2617994 + 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 &7520636153999768792 +ParticleSystemRenderer: + serializedVersion: 7 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2313150535691989867} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + 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: 2100000, guid: 915f376be23f20941837c0809626fa5f, 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_RenderMode: 4 + 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: 8211022507781654652, guid: 280a727da941fc544b9aab7df7fe9f2d, type: 3} + 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/_Project/Art/VFX/FX_SellTower.prefab.meta b/Assets/_Project/Art/VFX/FX_SellTower.prefab.meta new file mode 100644 index 0000000..2755a51 --- /dev/null +++ b/Assets/_Project/Art/VFX/FX_SellTower.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 31f8d8c320b42c54d886d610fb13a1e7 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Audio/Sound Effects.meta b/Assets/_Project/Audio/Sound Effects.meta new file mode 100644 index 0000000..f7e97b8 --- /dev/null +++ b/Assets/_Project/Audio/Sound Effects.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d1508e070d3666a4282a219e30ffdbf6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Audio/Sound Effects/SellSoundEffect.ogg b/Assets/_Project/Audio/Sound Effects/SellSoundEffect.ogg new file mode 100644 index 0000000..437bd8c --- /dev/null +++ b/Assets/_Project/Audio/Sound Effects/SellSoundEffect.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6047efab82ffe96cf15c078196b289076daae1875220b99f77596a06e7823808 +size 21467 diff --git a/Assets/_Project/Audio/Sound Effects/SellSoundEffect.ogg.meta b/Assets/_Project/Audio/Sound Effects/SellSoundEffect.ogg.meta new file mode 100644 index 0000000..f4b28da --- /dev/null +++ b/Assets/_Project/Audio/Sound Effects/SellSoundEffect.ogg.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 778b3d5981f4c3045a475794435f43cc +AudioImporter: + externalObjects: {} + serializedVersion: 8 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Scenes/Levels/9Player.unity b/Assets/_Project/Scenes/Levels/9Player.unity index 3264d21..7ed2edb 100644 --- a/Assets/_Project/Scenes/Levels/9Player.unity +++ b/Assets/_Project/Scenes/Levels/9Player.unity @@ -12918,6 +12918,57 @@ BoxCollider: serializedVersion: 3 m_Size: {x: 24, y: 1, z: 30} m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &877074910 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 877074912} + - component: {fileID: 877074911} + m_Layer: 0 + m_Name: SellEffectSpawner + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &877074911 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 877074910} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e2708c6bac8136f45b48c899d3d40630, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.VFX.SellEffectSpawner + coinBurstPrefab: {fileID: 2313150535691989867, guid: 31f8d8c320b42c54d886d610fb13a1e7, type: 3} + sellSound: + clip: {fileID: 8300000, guid: 778b3d5981f4c3045a475794435f43cc, type: 3} + volume: 1 + minPitch: 0.95 + maxPitch: 1.05 + verticalOffset: 0.75 +--- !u!4 &877074912 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 877074910} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 38.13543, y: 0.5, z: 166.56534} + 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 &902199259 GameObject: m_ObjectHideFlags: 0 @@ -15394,6 +15445,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: de7d013503af0f74c950f215f8dae1c0, type: 3} m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.PathfindingService + recomputeBudgetMs: 1.5 --- !u!4 &1149980841 Transform: m_ObjectHideFlags: 0 @@ -28962,3 +29014,4 @@ SceneRoots: - {fileID: 176580462} - {fileID: 516125087} - {fileID: 2079088113} + - {fileID: 877074912} diff --git a/Assets/_Project/Scripts/Gameplay/EnemyMovement.cs b/Assets/_Project/Scripts/Gameplay/EnemyMovement.cs index 86195c6..96a6e30 100644 --- a/Assets/_Project/Scripts/Gameplay/EnemyMovement.cs +++ b/Assets/_Project/Scripts/Gameplay/EnemyMovement.cs @@ -21,8 +21,10 @@ namespace TD.Gameplay /// and stores the tile waypoint list. /// Each frame: moves toward the world center of remainingPath[0]. /// When within snap distance, pops the waypoint and checks for zone transitions. - /// When fires (tower placed / - /// sold), reruns A* from the current tile. + /// When the maze changes (tower placed / sold), 's + /// budgeted scheduler calls (registered via + /// ), rerunning A* from the current + /// tile — spread across frames so a full wave never spikes. /// When remainingPath is empty after a pop, the enemy has reached the /// goal — fires and the enemy is despawned. /// @@ -168,15 +170,18 @@ namespace TD.Gameplay // Recompute when a tower is placed or sold — grounded enemies only. // Flyers path on the static baked grid, so tower changes can never affect - // their route; subscribing would just trigger needless recomputes. + // their route; registering would just trigger needless recomputes. + // Registration (not a direct event subscription) lets PathfindingService + // spread the recomputes across frames under a per-frame budget, so a maze + // change with a full wave present never spikes a single frame. if (!isFlying && PathfindingService.Instance != null) - PathfindingService.Instance.OnPathsInvalidated += RecomputePath; + PathfindingService.Instance.RegisterMover(this); } public override void OnNetworkDespawn() { if (PathfindingService.Instance != null) - PathfindingService.Instance.OnPathsInvalidated -= RecomputePath; + PathfindingService.Instance.UnregisterMover(this); } // ----- Server update -------------------------------------------------- @@ -274,8 +279,9 @@ namespace TD.Gameplay // ----- Path invalidation ---------------------------------------------- - // Called on server when LevelLoader.OnWalkabilityChanged fires (tower placed/sold). - private void RecomputePath() + // Called by PathfindingService's budgeted scheduler after a walkability change + // (tower placed/sold). Public so the scheduler can drive it across frames. + public void RecomputePath() { if (!IsServer) return; diff --git a/Assets/_Project/Scripts/Gameplay/PathfindingService.cs b/Assets/_Project/Scripts/Gameplay/PathfindingService.cs index d6c99df..f9a98a8 100644 --- a/Assets/_Project/Scripts/Gameplay/PathfindingService.cs +++ b/Assets/_Project/Scripts/Gameplay/PathfindingService.cs @@ -26,13 +26,15 @@ namespace TD.Gameplay /// Who calls this: /// /// calls once on - /// spawn and again whenever fires. + /// spawn, then registers via to be re-pathed when + /// the maze changes. /// /// /// Invalidation: Subscribes to . - /// When a tower is placed or sold, LevelLoader.SetWalkable fires that event - /// and is relayed to all active enemies, which - /// each recompute their own path from their current tile. + /// When a tower is placed or sold, LevelLoader.SetWalkable fires that event; the + /// service then enqueues every registered grounded enemy and recomputes them under a + /// per-frame time budget (recomputeBudgetMs), draining across frames so a maze + /// change with a full wave present never spikes a single frame. /// /// Goal tile set: Built once on Start from /// LevelLoader.LevelData.Goals[].TileArea. Goal tiles never change at @@ -52,7 +54,10 @@ namespace TD.Gameplay /// /// Fired on every peer when the walkability grid changes (tower placed/sold). - /// subscribes per-instance to recompute its path. + /// Enemies no longer subscribe here — they register with the budgeted re-path + /// scheduler () so recomputes spread across frames. + /// This event remains as an extension point for any non-enemy listener that wants + /// immediate notification of a maze change. /// public event System.Action OnPathsInvalidated; @@ -79,6 +84,28 @@ namespace TD.Gameplay private readonly Dictionary gScore = new Dictionary(); private readonly SimplePriorityQueue openSet = new SimplePriorityQueue(); + // ----- Deferred re-path scheduler --------------------------------- + // + // Grounded enemies register here (flyers never re-path — baked grid). On a + // walkability change we enqueue every registered enemy and recompute a + // TIME-BUDGETED number of them per frame, draining the backlog over subsequent + // frames. Recomputing them all synchronously on the change frame spiked to ~0.5s + // with a full wave on this large grid whenever a tower was sold/placed — this + // caps the per-frame cost so no single frame ever hitches. The maze can only be + // opened (sell) or narrowed with a guaranteed remaining route (placement, BFS- + // validated), so an enemy briefly following its slightly-stale path for a few + // frames until its turn comes up is safe and visually negligible. + + [Tooltip("Max wall-clock milliseconds spent recomputing enemy paths per frame " + + "after a maze change. The backlog drains over following frames; at least " + + "one enemy is always processed per frame so it converges. Lower = smoother " + + "but slower to fully update; higher = faster to update but larger frame cost.")] + [SerializeField] private float recomputeBudgetMs = 1.5f; + + private readonly HashSet movers = new HashSet(); + private readonly Queue recomputeQueue = new Queue(); + private readonly HashSet queued = new HashSet(); + // ----- Lifecycle -------------------------------------------------- private void Awake() @@ -115,6 +142,48 @@ namespace TD.Gameplay loader.OnWalkabilityChanged -= HandleWalkabilityChanged; } + // Drains the deferred re-path backlog under a per-frame time budget. Runs on all + // peers, but the queue is only ever populated on the server (clients never register + // movers), so this is a no-op cost on clients. At least one enemy is processed per + // frame whenever the queue is non-empty, so it always converges. + private void Update() + { + if (recomputeQueue.Count == 0) return; + + double startMs = Time.realtimeSinceStartupAsDouble * 1000.0; + do + { + var mover = recomputeQueue.Dequeue(); + if (!queued.Remove(mover)) continue; // unregistered/cancelled after enqueue + if (mover != null) mover.RecomputePath(); // reads the CURRENT grid state + } + while (recomputeQueue.Count > 0 + && Time.realtimeSinceStartupAsDouble * 1000.0 - startMs < recomputeBudgetMs); + } + + // ----- Deferred re-path scheduler API ----------------------------- + + /// + /// Registers a grounded enemy to be re-pathed (budgeted, over following frames) + /// whenever the maze changes. Flyers must NOT register — their baked-grid route + /// never changes. Called on the server from . + /// + public void RegisterMover(EnemyMovement mover) + { + if (mover != null) movers.Add(mover); + } + + /// + /// Removes an enemy from the scheduler (on despawn). Any stale entry still sitting + /// in the pending queue is skipped when dequeued (the queued membership check). + /// + public void UnregisterMover(EnemyMovement mover) + { + if (mover == null) return; + movers.Remove(mover); + queued.Remove(mover); + } + // ----- Public API ------------------------------------------------- /// @@ -471,7 +540,16 @@ namespace TD.Gameplay private void HandleWalkabilityChanged() { + // Notify any non-enemy listeners immediately (kept for API compatibility). OnPathsInvalidated?.Invoke(); + + // Enqueue every registered grounded enemy for a budgeted, deferred recompute + // instead of recomputing them all on this frame. Already-queued enemies are + // deduped, so rapid successive maze changes just lengthen the drain rather + // than compounding into a spike. + foreach (var mover in movers) + if (queued.Add(mover)) + recomputeQueue.Enqueue(mover); } } diff --git a/Assets/_Project/Scripts/VFX/SellEffectSpawner.cs b/Assets/_Project/Scripts/VFX/SellEffectSpawner.cs index 0b67fc3..cbb8205 100644 --- a/Assets/_Project/Scripts/VFX/SellEffectSpawner.cs +++ b/Assets/_Project/Scripts/VFX/SellEffectSpawner.cs @@ -65,7 +65,15 @@ namespace TD.VFX if (coinBurstPrefab != null) { - Instantiate(coinBurstPrefab, spawnPos, Quaternion.identity); + var instance = Instantiate(coinBurstPrefab, spawnPos, Quaternion.identity); + + // Force the burst to play. The spawner's whole job is to play this effect, so + // it shouldn't depend on the prefab's ParticleSystem having "Play On Awake" + // ticked — if that's off, the effect would silently never appear. Harmless when + // Play On Awake is already on (a freshly instantiated one-shot just restarts at + // t=0). VFX Graph effects play from their own settings, so a null PS is fine. + var ps = instance.GetComponentInChildren(); + if (ps != null) ps.Play(withChildren: true); } else { diff --git a/Assets/_Project/Scripts/VFX/TransientEffect.cs b/Assets/_Project/Scripts/VFX/TransientEffect.cs new file mode 100644 index 0000000..a258ceb --- /dev/null +++ b/Assets/_Project/Scripts/VFX/TransientEffect.cs @@ -0,0 +1,30 @@ +// Assets/_Project/Scripts/VFX/TransientEffect.cs +using UnityEngine; + +namespace TD.VFX +{ + /// + /// Destroys its GameObject a fixed time after it spawns. Drop this onto any one-shot + /// effect prefab — a particle burst, a VFX Graph effect, a sound-only object — so it + /// cleans itself up without any bespoke code. Designed for prefabs spawned by + /// (and any future effect spawner) that fire once and + /// should disappear. + /// + /// + /// Shuriken shortcut: a plain can instead self-destroy + /// with no component at all — set Main → Stop Action → Destroy and make sure Looping + /// is off. Use this component for VFX Graph effects (which have no Stop Action) or for + /// prefabs that combine several systems and need one predictable lifetime. + /// + /// Set to comfortably exceed the effect's visible duration so it + /// isn't cut off mid-play. + /// + public class TransientEffect : MonoBehaviour + { + [Tooltip("Seconds after spawn before this GameObject destroys itself. Set it a little " + + "longer than the effect's visible length so nothing is cut off.")] + [SerializeField, Min(0f)] private float lifetime = 1.5f; + + private void Start() => Destroy(gameObject, lifetime); + } +} diff --git a/Assets/_Project/Scripts/VFX/TransientEffect.cs.meta b/Assets/_Project/Scripts/VFX/TransientEffect.cs.meta new file mode 100644 index 0000000..2eb9598 --- /dev/null +++ b/Assets/_Project/Scripts/VFX/TransientEffect.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 739f3145f66002d47850b603164d07b8 \ No newline at end of file From 6c03a2f25079d9745f638663b4f8c0c15af35685 Mon Sep 17 00:00:00 2001 From: Matt F Date: Tue, 14 Jul 2026 23:21:32 -0700 Subject: [PATCH 28/58] Docs: mark Tower Sell done; note budgeted pathfinding re-path scheduler Updates Project_Context.md + Project_Roadmap.md for the tower-sell work (refund rules, coin VFX/SFX, refund excluded from income) and the PathfindingService budgeted re-path scheduler that removed the sell/placement frame hitch. Follows commit 0b4cde4 which landed the code + art. Co-Authored-By: Claude Opus 4.8 --- Project_Context.md | 7 ++++--- Project_Roadmap.md | 7 +++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Project_Context.md b/Project_Context.md index 3e2c6d5..fd56cfd 100644 --- a/Project_Context.md +++ b/Project_Context.md @@ -4,7 +4,7 @@ A snapshot of **where the project is and how it works** — the authoritative reference for current architecture, implemented systems, conventions, and known debt. It pairs with [`Project_Roadmap.md`](Project_Roadmap.md), which is the forward-looking plan. When the two disagree, this document describes *what exists today*; the roadmap describes *what's planned next*. -Last substantial update: 2026-06-24. +Last substantial update: 2026-07-14. --- @@ -56,10 +56,11 @@ Unity **6.4 (6000.4.4f1)**, URP, IL2CPP, .NET Standard 2.1, Linear color space, - `TowerPlacementManager` (server-validated placement queue) — `SpawnTower` now **seats towers flush on the ground from their mesh bounds** (`SeatOnGround`), so any pivot works (replaced the old hard-coded y=0.5). `Builder` build queue with staged construction/pause/cancel/refund, RTS selection, owner tinting. - **Construction-phase build visuals:** `BuildSiteVisual` swaps between an ordered set of phase prefabs as a tower builds — `ConstructionPhaseSet` SO + optional per-tower `TowerDefinition.ConstructionPhases`, with a project-default set and a legacy cube Y-scale fallback. `BuildSiteVisual` resolves its def via `TowerTypeId` (catalog), like `TowerInstance`. - **Tesla Coil tower:** Electric, `AllInRange` (zaps every enemy in range each 0.5s tick). `TeslaArcVisual` draws arced, crackling, HDR `LineRenderer` bolts that flicker, plus **real point lights** (emitter flash + per-impact lights at struck enemies, capped) so the electricity actually illuminates the scene — emission/bloom alone don't cast light. +- **Tower Sell** (branch `tower-sell`, verified in-engine 2026-07-14): selecting an owned, completed tower shows a **Sell** action in the command grid's **bottom-right** slot (owner-gated; a non-owner sees it disabled). `TowerInstance.RequestSellServerRpc` (owner-validated, like paint) refunds `TowerDefinition.SellRefundPercent` (default 0.75) of the tower's replicated `goldInvested` (placement + any future upgrade spend), except a `FullRefundIfUnupgraded` tower (the **Wall**) refunds 100% while `upgradeCount == 0`. The refund is **not** counted as round income — `PlayerGoldManager.AwardGold(amount, countAsEarned:false)`. Selling despawns the tower (`OnNetworkDespawn` un-stamps the footprint as a **batch** and clears selection) and broadcasts a coin **VFX + rustle SFX** through `SellEffectSpawner` (scene singleton mirroring `FloatingTextSpawner`) via `TowerPlacementManager.PlaySellEffectRpc` (routed off a persistent object because the tower despawns the same frame). `TowerInstance.ServerAddUpgradeInvestment` is the seam the future upgrade system writes to. The coin VFX is an **artist-authored** prefab (`FX_SellTower`: a Shuriken **mesh-particle** burst of the Blender `Coin` model with an **emissive** gold material — emissive so it survives the grimdark grade); `CoinBurstVfx` is the zero-art code-gen fallback, and new reusable `TransientEffect` self-destructs one-shot effect prefabs (for VFX-Graph effects that lack a Stop Action). ### Enemies & pathfinding - `EnemyHealth` (replicated HP, damage types, `IsFlying`, held state), `EnemyStatus` (lingering effects: slow/DoT), `EnemyMovement` (A* path following, zone-leak attribution, death/sink sequence). -- `PathfindingService` (A* on the runtime walkability grid, octile heuristic, corner-cut prevention, line-of-sight path smoothing; re-paths on tower placement/removal). +- `PathfindingService` (A* on the runtime walkability grid, octile heuristic, corner-cut prevention, line-of-sight path smoothing). **Re-paths via a budgeted scheduler:** grounded enemies `RegisterMover`/`UnregisterMover`; on a maze change the service enqueues them and recomputes under a per-frame `recomputeBudgetMs` (default 1.5 ms) drain, spreading the work across frames so a placement/sell with a full wave present no longer spikes a frame (was ~0.5 s). Safe because selling only opens the maze and placement is BFS-guaranteed to leave a route, so a few frames of slightly-stale path is invisible. - **Flying enemies:** path on the **baked terrain grid** (`LevelLoader.IsBaseWalkable`) so they soar over towers; compute once, never re-path; spawn elevated by `EnemyDefinition.FlightHeight`. - Content: ~10 enemy definitions/prefabs (Crystal Golem / Cyclops / Ent variants, Undead Drake = the flying test enemy), 10 wave definitions. @@ -102,4 +103,4 @@ Unity **6.4 (6000.4.4f1)**, URP, IL2CPP, .NET Standard 2.1, Linear color space, - **Catalog index 0 is a reserved sentinel** (valid `TowerTypeId`s start at 1) — easy to forget when wiring the catalog in the inspector. - **Catalog-index identifiers aren't session-stable** — blocks cross-match persistence until a stable ID is added. - **Paint system frozen**; **Race vs Builder** naming unresolved; the gold **"Buy Roll available any time"** rule is provisional and may change. -- **Stubbed/unbuilt:** tower Upgrade/Sell actions (HUD buttons disabled), enemy resistances/weaknesses, in-match race-pick countdown. +- **Stubbed/unbuilt:** tower **Upgrade** action (HUD button still disabled; the `TowerInstance.ServerAddUpgradeInvestment` seam is ready for it), enemy resistances/weaknesses, in-match race-pick countdown. *(Tower **Sell** is now done — see Combat & towers.)* diff --git a/Project_Roadmap.md b/Project_Roadmap.md index a41edbf..aa95f7f 100644 --- a/Project_Roadmap.md +++ b/Project_Roadmap.md @@ -4,7 +4,7 @@ The **forward-looking plan**: what's done, what's next, and the sequencing. Current-state architecture and the full list of implemented systems live in [`Project_Context.md`](Project_Context.md) — read that first for "how things work today." This document focuses on direction and remaining work. -Last substantial update: 2026-06-24. +Last substantial update: 2026-07-14. --- @@ -36,6 +36,8 @@ All players start with the **same three towers** — **Basic Arrow** (ground+air **Done & merged:** functional match loop end-to-end, HUD, lobby + race selection, economy, enemies + A* pathfinding, **flying enemies + air-targeting**, **per-player tower deck** (keystone #1), **draft Slice 1** (spine + "new tower"), **TowerRegistry removal** (towers replicate by `TowerTypeId`), **per-tower construction-phase build visuals**, **ground-seating from mesh bounds**, **Tesla Coil tower** (Electric + AllInRange + arc VFX with real flash/impact lights). +**Done, on branch `tower-sell` (pushed to origin; NOT yet merged to `main`):** **Tower Sell** — owner-gated Sell action, refunds `SellRefundPercent` (default 75%) of invested gold, the **Wall refunds 100% while un-upgraded**, refund excluded from round income, coin **VFX** (artist-authored emissive mesh-particle `FX_SellTower`, with a `CoinBurstVfx` code-gen fallback) + rustle **SFX**. Also a **budgeted enemy re-path scheduler** in `PathfindingService` that removes the ~0.5 s frame hitch on any maze change (sell/placement) with a full wave present, plus a batched footprint un-stamp and the NGO `RequireOwnership`→`InvokePermission` deprecation cleanup. Verified in-engine 2026-07-14. + **In progress (branch `feature/post-processing`):** project-wide **grimdark post-processing** grade + HDR; Tesla arc lighting polish. *(This branch was fast-forwarded onto the Tesla work; commit the post-processing assets + the `TeslaArcVisual` light additions.)* **Paused:** in-match Paint system (overlaps with systemic upgrades). @@ -80,7 +82,8 @@ Player profile saving owned content; **win/loss reward pools** drawn server-side ## Part B — Functional gameplay remainder (not roguelike-specific) -- **Tower Upgrade / Sell actions** — HUD buttons exist but are disabled. Sell first (refund + despawn), then per-tower upgrade if the systemic model leaves room for it. +- **Tower Sell — ✅ DONE** (branch `tower-sell`): refund + despawn + coin VFX/SFX; 75% of invested gold, Wall 100% while un-upgraded, refund not counted as income; `TowerInstance.ServerAddUpgradeInvestment` records upgrade spend for the refund and is the seam the Upgrade system will write to. +- **Tower Upgrade action** — HUD button still disabled. Build it once the systemic-upgrade model (A3) settles whether per-tower upgrade trees are wanted on top of the systemic modifiers. - **Enemy resistances / weaknesses** — `EnemyHealth.TakeDamage` has the stub slot; info panel has the placeholder. - **Terrain architecture decision** — Unity Terrain vs mesh vs ProBuilder. Builder code is terrain-agnostic; decide before heavy art. - **Camera polish** — cursor-anchored zoom near map edges, center-on-builder hotkey, race/phase-aware initial position. From adfc6c106cc1213738d09b6e1a1a9cafa794eb83 Mon Sep 17 00:00:00 2001 From: Ian Woods Date: Tue, 14 Jul 2026 23:24:29 -0700 Subject: [PATCH 29/58] little bit of sound --- Assets/_Project/Scenes/Levels/9Player.unity | 177 ------------------ .../BuilderSpells/FireballSpellDefinition.cs | 13 +- 2 files changed, 12 insertions(+), 178 deletions(-) diff --git a/Assets/_Project/Scenes/Levels/9Player.unity b/Assets/_Project/Scenes/Levels/9Player.unity index 6ccdbcb..98a6d5e 100644 --- a/Assets/_Project/Scenes/Levels/9Player.unity +++ b/Assets/_Project/Scenes/Levels/9Player.unity @@ -22163,124 +22163,6 @@ Mesh: - serializedVersion: 1 m_IndexStart: 0 m_IndexCount: 0 ---- !u!1 &1686616342 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1686616345} - - component: {fileID: 1686616344} - - component: {fileID: 1686616343} - m_Layer: 0 - m_Name: VFX_fireball_impact - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!73398921 &1686616343 -VFXRenderer: - serializedVersion: 1 - m_ObjectHideFlags: 2 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1686616342} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 0 - 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_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 ---- !u!2083052967 &1686616344 -VisualEffect: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1686616342} - m_Enabled: 1 - m_Asset: {fileID: 8926484042661614526, guid: 3fa4641e771cdd27880ed1185a588a83, type: 3} - m_InitialEventName: OnPlay - m_InitialEventNameOverriden: 0 - m_StartSeed: 0 - m_ResetSeedOnPlay: 1 - m_AllowInstancing: 1 - m_ResourceVersion: 1 - m_PropertySheet: - m_Float: - m_Array: [] - m_Vector2f: - m_Array: [] - m_Vector3f: - m_Array: [] - m_Vector4f: - m_Array: [] - m_Uint: - m_Array: [] - m_Int: - m_Array: [] - m_Matrix4x4f: - m_Array: [] - m_AnimationCurve: - m_Array: [] - m_Gradient: - m_Array: [] - m_NamedObject: - m_Array: [] - m_Bool: - m_Array: [] ---- !u!4 &1686616345 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1686616342} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -18.90215, y: 6.17317, z: 0.5013} - 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 &1694718091 GameObject: m_ObjectHideFlags: 0 @@ -29155,63 +29037,6 @@ Transform: m_Children: [] m_Father: {fileID: 1097152085} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1001 &6610752177701459700 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 158073311046191680, guid: 80eaad6d0b024835482b64625b63053c, type: 3} - propertyPath: m_Name - value: Fireball - objectReference: {fileID: 0} - - target: {fileID: 7644069561715729860, guid: 80eaad6d0b024835482b64625b63053c, type: 3} - propertyPath: m_LocalPosition.x - value: -53.04094 - objectReference: {fileID: 0} - - target: {fileID: 7644069561715729860, guid: 80eaad6d0b024835482b64625b63053c, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7644069561715729860, guid: 80eaad6d0b024835482b64625b63053c, type: 3} - propertyPath: m_LocalPosition.z - value: -31.13852 - objectReference: {fileID: 0} - - target: {fileID: 7644069561715729860, guid: 80eaad6d0b024835482b64625b63053c, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 7644069561715729860, guid: 80eaad6d0b024835482b64625b63053c, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7644069561715729860, guid: 80eaad6d0b024835482b64625b63053c, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7644069561715729860, guid: 80eaad6d0b024835482b64625b63053c, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7644069561715729860, guid: 80eaad6d0b024835482b64625b63053c, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7644069561715729860, guid: 80eaad6d0b024835482b64625b63053c, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7644069561715729860, guid: 80eaad6d0b024835482b64625b63053c, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 80eaad6d0b024835482b64625b63053c, type: 3} --- !u!1660057539 &9223372036854775807 SceneRoots: m_ObjectHideFlags: 0 @@ -29240,5 +29065,3 @@ SceneRoots: - {fileID: 2079088113} - {fileID: 914832726} - {fileID: 993870445} - - {fileID: 1686616345} - - {fileID: 6610752177701459700} diff --git a/Assets/_Project/Scripts/Gameplay/BuilderSpells/FireballSpellDefinition.cs b/Assets/_Project/Scripts/Gameplay/BuilderSpells/FireballSpellDefinition.cs index 5fe9ee9..b5dae1f 100644 --- a/Assets/_Project/Scripts/Gameplay/BuilderSpells/FireballSpellDefinition.cs +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpells/FireballSpellDefinition.cs @@ -1,5 +1,6 @@ // Assets/_Project/Scripts/Gameplay/BuilderSpells/FireballSpellDefinition.cs using UnityEngine; +using TD.Audio; using TD.Core; namespace TD.Gameplay.BuilderSpells @@ -26,7 +27,13 @@ namespace TD.Gameplay.BuilderSpells [Tooltip("Seconds before the spawned VFX instance is destroyed.")] [Min(0f)] [SerializeField] private float impactVfxLifetime = 2f; - + + [Header("Impact Sound")] + [Tooltip("Sound played on every peer when this spell resolves successfully. Same " + + "SoundConfig struct TowerBuiltSound uses — reuse a tower's clip directly if " + + "you want the same sound.")] + [SerializeField] private SoundConfig impactSound; + [Header("Fireball")] [Tooltip("Damage dealt to every enemy within Radius of the target point.")] [Min(0f)] @@ -56,6 +63,10 @@ namespace TD.Gameplay.BuilderSpells { if (impactVfxPrefab != null) Destroy(Instantiate(impactVfxPrefab, targetPoint, Quaternion.identity), impactVfxLifetime); + + if (impactSound.clip != null) + AudioManager.Instance?.Play(impactSound.clip, AudioCategory.TowerFire, + impactSound.RandomPitch(), impactSound.volume); } } } From 9f87c04b4c7a30e50ed2b79e5ee5265ab819cc1f Mon Sep 17 00:00:00 2001 From: Matt F Date: Tue, 14 Jul 2026 23:28:12 -0700 Subject: [PATCH 30/58] reverting 9player changes --- Assets/_Project/Scenes/Levels/9Player.unity | 52 --------------------- 1 file changed, 52 deletions(-) diff --git a/Assets/_Project/Scenes/Levels/9Player.unity b/Assets/_Project/Scenes/Levels/9Player.unity index 7ed2edb..a8d0238 100644 --- a/Assets/_Project/Scenes/Levels/9Player.unity +++ b/Assets/_Project/Scenes/Levels/9Player.unity @@ -12918,57 +12918,6 @@ BoxCollider: serializedVersion: 3 m_Size: {x: 24, y: 1, z: 30} m_Center: {x: 0, y: 0, z: 0} ---- !u!1 &877074910 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 877074912} - - component: {fileID: 877074911} - m_Layer: 0 - m_Name: SellEffectSpawner - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &877074911 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 877074910} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e2708c6bac8136f45b48c899d3d40630, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.VFX.SellEffectSpawner - coinBurstPrefab: {fileID: 2313150535691989867, guid: 31f8d8c320b42c54d886d610fb13a1e7, type: 3} - sellSound: - clip: {fileID: 8300000, guid: 778b3d5981f4c3045a475794435f43cc, type: 3} - volume: 1 - minPitch: 0.95 - maxPitch: 1.05 - verticalOffset: 0.75 ---- !u!4 &877074912 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 877074910} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 38.13543, y: 0.5, z: 166.56534} - 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 &902199259 GameObject: m_ObjectHideFlags: 0 @@ -29014,4 +28963,3 @@ SceneRoots: - {fileID: 176580462} - {fileID: 516125087} - {fileID: 2079088113} - - {fileID: 877074912} From c38d6737681de27773a9787ac49269b470c69341 Mon Sep 17 00:00:00 2001 From: Matt F Date: Tue, 14 Jul 2026 23:57:13 -0700 Subject: [PATCH 31/58] adding sound effect game object to main branch --- Assets/_Project/Scenes/Levels/9Player.unity | 52 +++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/Assets/_Project/Scenes/Levels/9Player.unity b/Assets/_Project/Scenes/Levels/9Player.unity index 458828c..90db615 100644 --- a/Assets/_Project/Scenes/Levels/9Player.unity +++ b/Assets/_Project/Scenes/Levels/9Player.unity @@ -11534,6 +11534,57 @@ Mesh: - serializedVersion: 1 m_IndexStart: 0 m_IndexCount: 0 +--- !u!1 &759470733 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 759470735} + - component: {fileID: 759470734} + m_Layer: 0 + m_Name: SellEffectSpawner + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &759470734 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 759470733} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e2708c6bac8136f45b48c899d3d40630, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.VFX.SellEffectSpawner + coinBurstPrefab: {fileID: 2313150535691989867, guid: 31f8d8c320b42c54d886d610fb13a1e7, type: 3} + sellSound: + clip: {fileID: 8300000, guid: 778b3d5981f4c3045a475794435f43cc, type: 3} + volume: 1 + minPitch: 0.95 + maxPitch: 1.05 + verticalOffset: 0.75 +--- !u!4 &759470735 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 759470733} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 35.63582, y: 0.5, z: 163.67152} + 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 &759520883 GameObject: m_ObjectHideFlags: 0 @@ -29066,3 +29117,4 @@ SceneRoots: - {fileID: 2079088113} - {fileID: 914832726} - {fileID: 993870445} + - {fileID: 759470735} From c0e963fbeb10b8925b9c48305fc92680642af031 Mon Sep 17 00:00:00 2001 From: Ian Woods Date: Thu, 16 Jul 2026 20:26:12 -0700 Subject: [PATCH 32/58] fireball looks like a big stupid fuckin meatball now --- .../_Project/Definitions/BuilderSpells/FireballSpell.asset | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Assets/_Project/Definitions/BuilderSpells/FireballSpell.asset b/Assets/_Project/Definitions/BuilderSpells/FireballSpell.asset index 4dcb8a2..5f45c46 100644 --- a/Assets/_Project/Definitions/BuilderSpells/FireballSpell.asset +++ b/Assets/_Project/Definitions/BuilderSpells/FireballSpell.asset @@ -23,4 +23,9 @@ MonoBehaviour: m_Bits: 1024 impactVfxPrefab: {fileID: 158073311046191680, guid: 80eaad6d0b024835482b64625b63053c, type: 3} impactVfxLifetime: 2 + impactSound: + clip: {fileID: 8300000, guid: 4ee1b63f27ea04451802bafd35ecef89, type: 3} + volume: 0.5 + minPitch: 1.048 + maxPitch: 0.969 Damage: 50 From fe2c59d326d1497f29266ec2ee10c6cd42e638e6 Mon Sep 17 00:00:00 2001 From: Ian Woods Date: Thu, 16 Jul 2026 20:49:13 -0700 Subject: [PATCH 33/58] tab once selects builder, tab twice focuses builder --- Assets/_Project/Scenes/Levels/9Player.unity | 2 +- Assets/_Project/Scripts/Audio/AudioCategory.cs | 2 +- .../Scripts/Combat/TeslaTowerFireSound.cs | 2 +- .../Scripts/Gameplay/BuilderInputController.cs | 17 ++++++++++++++++- .../BuilderSpells/FireballSpellDefinition.cs | 2 +- Assets/_Project/Scripts/UI/HUDController.cs | 9 ++++++++- 6 files changed, 28 insertions(+), 6 deletions(-) diff --git a/Assets/_Project/Scenes/Levels/9Player.unity b/Assets/_Project/Scenes/Levels/9Player.unity index 90db615..0fcac59 100644 --- a/Assets/_Project/Scenes/Levels/9Player.unity +++ b/Assets/_Project/Scenes/Levels/9Player.unity @@ -2253,7 +2253,7 @@ MonoBehaviour: m_EditorClassIdentifier: Assembly-CSharp::TD.Audio.AudioManager categories: - category: 0 - maxVoices: 4 + maxVoices: 6 volume: 0.5 - category: 1 maxVoices: 4 diff --git a/Assets/_Project/Scripts/Audio/AudioCategory.cs b/Assets/_Project/Scripts/Audio/AudioCategory.cs index 9a446aa..539e9ba 100644 --- a/Assets/_Project/Scripts/Audio/AudioCategory.cs +++ b/Assets/_Project/Scripts/Audio/AudioCategory.cs @@ -1,5 +1,5 @@ // Assets/_Project/Scripts/Audio/AudioCategory.cs namespace TD.Audio { - public enum AudioCategory { TowerFire, EnemyHitDeath, UI } + public enum AudioCategory { Combat, EnemyHitDeath, UI } } diff --git a/Assets/_Project/Scripts/Combat/TeslaTowerFireSound.cs b/Assets/_Project/Scripts/Combat/TeslaTowerFireSound.cs index 3334523..eddc323 100644 --- a/Assets/_Project/Scripts/Combat/TeslaTowerFireSound.cs +++ b/Assets/_Project/Scripts/Combat/TeslaTowerFireSound.cs @@ -38,7 +38,7 @@ namespace TD.Combat private void HandleAreaFired(Vector3[] positions) { - AudioManager.Instance?.Play(fireSound.clip, AudioCategory.TowerFire, fireSound.RandomPitch(), fireSound.volume); + AudioManager.Instance?.Play(fireSound.clip, AudioCategory.Combat, fireSound.RandomPitch(), fireSound.volume); } } } diff --git a/Assets/_Project/Scripts/Gameplay/BuilderInputController.cs b/Assets/_Project/Scripts/Gameplay/BuilderInputController.cs index ce1e258..72bd7c3 100644 --- a/Assets/_Project/Scripts/Gameplay/BuilderInputController.cs +++ b/Assets/_Project/Scripts/Gameplay/BuilderInputController.cs @@ -156,7 +156,22 @@ namespace TD.Gameplay { HUDController.Instance?.ToggleBuffMenu(); } - + + // Tab: select the builder, or (if already selected) recenter the camera on it. + if (keyboard != null && keyboard.tabKey.wasPressedThisFrame + && !HUDController.IsTextInputActive) + { + var selection = SelectionState.Instance; + if (selection != null && selection.IsSelected(builder)) + { + HUDController.Instance?.CenterCameraOnSelection(); + } + else + { + selection?.Select(builder); + } + } + if (pointerOverHud) return; if (!mouse.rightButton.wasPressedThisFrame) return; diff --git a/Assets/_Project/Scripts/Gameplay/BuilderSpells/FireballSpellDefinition.cs b/Assets/_Project/Scripts/Gameplay/BuilderSpells/FireballSpellDefinition.cs index b5dae1f..5f34a1c 100644 --- a/Assets/_Project/Scripts/Gameplay/BuilderSpells/FireballSpellDefinition.cs +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpells/FireballSpellDefinition.cs @@ -65,7 +65,7 @@ namespace TD.Gameplay.BuilderSpells Destroy(Instantiate(impactVfxPrefab, targetPoint, Quaternion.identity), impactVfxLifetime); if (impactSound.clip != null) - AudioManager.Instance?.Play(impactSound.clip, AudioCategory.TowerFire, + AudioManager.Instance?.Play(impactSound.clip, AudioCategory.Combat, impactSound.RandomPitch(), impactSound.volume); } } diff --git a/Assets/_Project/Scripts/UI/HUDController.cs b/Assets/_Project/Scripts/UI/HUDController.cs index e63a097..7d17387 100644 --- a/Assets/_Project/Scripts/UI/HUDController.cs +++ b/Assets/_Project/Scripts/UI/HUDController.cs @@ -1642,7 +1642,14 @@ namespace TD.UI // WC3 / SC2 convention: clicking the portrait recenters the camera on // whoever is selected. Zoom is preserved (CameraController.JumpTo only // moves the pivot). No-op when nothing is selected or the camera isn't wired. - private void OnPortraitClicked(ClickEvent evt) + private void OnPortraitClicked(ClickEvent evt) => CenterCameraOnSelection(); + + /// + /// Recenters the camera on the current selection (same behavior as clicking the + /// portrait). No-op when nothing is selected or the camera isn't wired. Also used + /// by the Tab hotkey (select-builder-then-focus) in BuilderInputController. + /// + public void CenterCameraOnSelection() { var sel = SelectionState.Instance?.SelectedObject; if (sel == null) return; From 689fe7be885ae5f6357ebe47444d6c4993e25dd6 Mon Sep 17 00:00:00 2001 From: Ian Woods Date: Fri, 17 Jul 2026 00:03:36 -0700 Subject: [PATCH 34/58] shitty looking AOE effect for slow area --- .../_Project/Art/VFX/spells/Fireball.prefab | 6 +- .../Art/VFX/spells/VFX_slowarea.prefab | 120 + .../Art/VFX/spells/VFX_slowarea.prefab.meta | 7 + .../_Project/Art/VFX/spells/VFX_slowarea.vfx | 2601 +++++++++++++++++ .../Art/VFX/spells/VFX_slowarea.vfx.meta | 15 + .../BuilderSpells/FireballSpell.asset | 2 +- .../BuilderSpells/SlowAreaSpell.asset | 8 +- .../BuilderSpells/SlowAreaSpellDefinition.cs | 24 + 8 files changed, 2778 insertions(+), 5 deletions(-) create mode 100644 Assets/_Project/Art/VFX/spells/VFX_slowarea.prefab create mode 100644 Assets/_Project/Art/VFX/spells/VFX_slowarea.prefab.meta create mode 100644 Assets/_Project/Art/VFX/spells/VFX_slowarea.vfx create mode 100644 Assets/_Project/Art/VFX/spells/VFX_slowarea.vfx.meta diff --git a/Assets/_Project/Art/VFX/spells/Fireball.prefab b/Assets/_Project/Art/VFX/spells/Fireball.prefab index b51070f..b7e0984 100644 --- a/Assets/_Project/Art/VFX/spells/Fireball.prefab +++ b/Assets/_Project/Art/VFX/spells/Fireball.prefab @@ -104,7 +104,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.VFX.FallFromSkyVisual dropHeight: 20 - duration: 0.5 + duration: 1.2 fallCurve: serializedVersion: 2 m_Curve: @@ -129,5 +129,5 @@ MonoBehaviour: m_PreInfinity: 2 m_PostInfinity: 2 m_RotationOrder: 4 - fallAngleDegrees: 0 - fallDirection: {x: 0, y: 0, z: 1} + fallAngleDegrees: 25.6 + fallDirection: {x: 0.2, y: 0.2, z: 1} diff --git a/Assets/_Project/Art/VFX/spells/VFX_slowarea.prefab b/Assets/_Project/Art/VFX/spells/VFX_slowarea.prefab new file mode 100644 index 0000000..b5d5e68 --- /dev/null +++ b/Assets/_Project/Art/VFX/spells/VFX_slowarea.prefab @@ -0,0 +1,120 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1462673130280185047 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 30710218362299472} + - component: {fileID: 2262385832724230530} + - component: {fileID: 5239089805406934537} + m_Layer: 0 + m_Name: VFX_slowarea + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &30710218362299472 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1462673130280185047} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -55.61683, y: -0, z: -33.87226} + 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!2083052967 &2262385832724230530 +VisualEffect: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1462673130280185047} + m_Enabled: 1 + m_Asset: {fileID: 8926484042661614526, guid: 397a5bed36b1e63a0a3eef17b04f65bd, type: 3} + m_InitialEventName: OnPlay + m_InitialEventNameOverriden: 0 + m_StartSeed: 0 + m_ResetSeedOnPlay: 1 + m_AllowInstancing: 1 + m_ResourceVersion: 1 + m_PropertySheet: + m_Float: + m_Array: [] + m_Vector2f: + m_Array: [] + m_Vector3f: + m_Array: [] + m_Vector4f: + m_Array: [] + m_Uint: + m_Array: [] + m_Int: + m_Array: [] + m_Matrix4x4f: + m_Array: [] + m_AnimationCurve: + m_Array: [] + m_Gradient: + m_Array: [] + m_NamedObject: + m_Array: [] + m_Bool: + m_Array: [] +--- !u!73398921 &5239089805406934537 +VFXRenderer: + serializedVersion: 1 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1462673130280185047} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 0 + 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_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 diff --git a/Assets/_Project/Art/VFX/spells/VFX_slowarea.prefab.meta b/Assets/_Project/Art/VFX/spells/VFX_slowarea.prefab.meta new file mode 100644 index 0000000..ecc94a0 --- /dev/null +++ b/Assets/_Project/Art/VFX/spells/VFX_slowarea.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: bf2f1f2a9a54e9162b80673e3f7eeaf6 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Art/VFX/spells/VFX_slowarea.vfx b/Assets/_Project/Art/VFX/spells/VFX_slowarea.vfx new file mode 100644 index 0000000..a94dcde --- /dev/null +++ b/Assets/_Project/Art/VFX/spells/VFX_slowarea.vfx @@ -0,0 +1,2601 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &114340500867371532 +MonoBehaviour: + m_ObjectHideFlags: 1 + 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: d01270efd3285ea4a9d6c555cb0a8027, type: 3} + m_Name: VFXUI + m_EditorClassIdentifier: + groupInfos: + - title: Base Loop + position: + serializedVersion: 2 + x: 851 + y: -1433 + width: 475 + height: 2277 + contents: + - model: {fileID: 8926484042661614608} + id: 0 + isStickyNote: 0 + - model: {fileID: 8926484042661614613} + id: 0 + isStickyNote: 0 + - model: {fileID: 8926484042661614662} + id: 0 + isStickyNote: 0 + - model: {fileID: 8926484042661614681} + id: 0 + isStickyNote: 0 + stickyNoteInfos: [] + categories: [] + uiBounds: + serializedVersion: 2 + x: 852 + y: -1433 + width: 474 + height: 2255 +--- !u!114 &114350483966674976 +MonoBehaviour: + m_ObjectHideFlags: 1 + 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: 7d4c867f6b72b714dbb5fd1780afe208, type: 3} + m_Name: VFX_slowarea + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614608} + - {fileID: 8926484042661614613} + - {fileID: 8926484042661614662} + - {fileID: 8926484042661614681} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_UIInfos: {fileID: 114340500867371532} + m_CustomAttributes: [] + m_ParameterInfo: [] + m_ImportDependencies: [] + m_GraphVersion: 19 + m_ResourceVersion: 1 + m_SubgraphDependencies: [] + m_CategoryPath: +--- !u!2058629511 &8926484042661614527 +VisualEffectResource: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: VFX_slowarea + m_Graph: {fileID: 114350483966674976} + m_Infos: + m_RendererSettings: + motionVectorGenerationMode: 0 + shadowCastingMode: 0 + m_CullingFlags: 3 + m_UpdateMode: 0 + m_PreWarmDeltaTime: 0.05 + m_PreWarmStepCount: 0 + m_InitialEventName: OnPlay + m_InstancingMode: 0 + m_InstancingCapacity: 64 +--- !u!114 &8926484042661614608 +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: 73a13919d81fb7444849bae8b5c812a2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674976} + m_Children: + - {fileID: 8926484042661614610} + m_UIPosition: {x: 877, y: -1374} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: [] + m_OutputSlots: [] + m_Label: Spawn system + m_Data: {fileID: 8926484042661614609} + m_InputFlowSlot: + - link: [] + - link: [] + m_OutputFlowSlot: + - link: + - context: {fileID: 8926484042661614613} + slotIndex: 0 + loopDuration: 0 + loopCount: 0 + delayBeforeLoop: 0 + delayAfterLoop: 0 +--- !u!114 &8926484042661614609 +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: f68759077adc0b143b6e1c101e82065e, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + title: + m_Owners: + - {fileID: 8926484042661614608} +--- !u!114 &8926484042661614610 +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: f05c6884b705ce14d82ae720f0ec209f, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614608} + m_Children: [] + m_UIPosition: {x: 357.33423, y: 1216.2454} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614611} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614612} +--- !u!114 &8926484042661614611 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614611} + m_MasterData: + m_Owner: {fileID: 8926484042661614610} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 64 + m_Space: -1 + m_Property: + name: Rate + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614612 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614612} + m_MasterData: + m_Owner: {fileID: 8926484042661614610} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614613 +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: 9dfea48843f53fc438eabc12a3a30abc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674976} + m_Children: + - {fileID: 8926484042661614628} + - {fileID: 8926484042661614834} + - {fileID: 8926484042661614806} + m_UIPosition: {x: 877, y: -1086} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614774} + - {fileID: 8926484042661614783} + m_OutputSlots: [] + m_Label: Initialize Particles + m_Data: {fileID: 8926484042661614627} + m_InputFlowSlot: + - link: + - context: {fileID: 8926484042661614608} + slotIndex: 0 + m_OutputFlowSlot: + - link: + - context: {fileID: 8926484042661614662} + slotIndex: 0 +--- !u!114 &8926484042661614627 +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: d78581a96eae8bf4398c282eb0b098bd, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + title: Simple Loop + m_Owners: + - {fileID: 8926484042661614613} + - {fileID: 8926484042661614662} + - {fileID: 8926484042661614681} + dataType: 0 + capacity: 68 + stripCapacity: 1 + particlePerStripCount: 32 + needsComputeBounds: 0 + boundsMode: 0 + m_Space: 1 +--- !u!114 &8926484042661614628 +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: a971fa2e110a0ac42ac1d8dae408704b, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614613} + m_Children: [] + m_UIPosition: {x: 357.33423, y: 1214.2454} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614629} + - {fileID: 8926484042661614630} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614631} + attribute: lifetime + Composition: 0 + Source: 0 + Random: 2 + channels: 6 +--- !u!114 &8926484042661614629 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614629} + m_MasterData: + m_Owner: {fileID: 8926484042661614628} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0.8 + m_Space: -1 + m_Property: + name: A + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614630 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614630} + m_MasterData: + m_Owner: {fileID: 8926484042661614628} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 1.2 + m_Space: -1 + m_Property: + name: B + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614631 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614631} + m_MasterData: + m_Owner: {fileID: 8926484042661614628} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614662 +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: 2dc095764ededfa4bb32fa602511ea4b, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674976} + m_Children: + - {fileID: 8926484042661614820} + - {fileID: 8926484042661614827} + m_UIPosition: {x: 877, y: -187} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: [] + m_OutputSlots: [] + m_Label: Update Particles + m_Data: {fileID: 8926484042661614627} + m_InputFlowSlot: + - link: + - context: {fileID: 8926484042661614613} + slotIndex: 0 + m_OutputFlowSlot: + - link: + - context: {fileID: 8926484042661614681} + slotIndex: 0 + integration: 0 + angularIntegration: 0 + ageParticles: 1 + reapParticles: 1 + skipZeroDeltaUpdate: 0 +--- !u!114 &8926484042661614681 +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: a0b9e6b9139e58d4c957ec54595da7d3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 114350483966674976} + m_Children: + - {fileID: 8926484042661614685} + - {fileID: 8926484042661614830} + - {fileID: 8926484042661614722} + m_UIPosition: {x: 877, y: 214} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614682} + m_OutputSlots: [] + m_Label: Render Quad + m_Data: {fileID: 8926484042661614627} + m_InputFlowSlot: + - link: + - context: {fileID: 8926484042661614662} + slotIndex: 0 + m_OutputFlowSlot: + - link: [] + blendMode: 1 + cullMode: 0 + zWriteMode: 0 + zTestMode: 0 + useAlphaClipping: 0 + generateMotionVector: 0 + excludeFromTUAndAA: 0 + sortingPriority: 0 + m_SubOutputs: + - {fileID: 8926484042661614687} + - {fileID: 8926484042661614833} + useBaseColorMap: 3 + colorMapping: 0 + uvMode: 0 + flipbookLayout: 0 + flipbookBlendFrames: 0 + flipbookMotionVectors: 0 + useSoftParticle: 0 + vfxSystemSortPriority: 0 + sort: 0 + sortMode: 0 + revertSorting: 0 + indirectDraw: 0 + computeCulling: 0 + frustumCulling: 0 + castShadows: 0 + useExposureWeight: 0 + enableRayTracing: 0 + decimationFactor: 1 + raytracedScaleMode: 0 + needsOwnSort: 1 + needsOwnAabbBuffer: 0 + shaderGraph: {fileID: 0} + materialSettings: + m_PropertyNames: [] + m_PropertyValues: [] + renderQueue: -1 + primitiveType: 1 + useGeometryShader: 0 +--- !u!114 &8926484042661614682 +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: 70a331b1d86cc8d4aa106ccbe0da5852, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614682} + m_MasterData: + m_Owner: {fileID: 8926484042661614681} + m_Value: + m_Type: + m_SerializableType: UnityEngine.Texture2D, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"obj":{"fileID":2800000,"guid":"8aafaa78fe944854997fef757ff4ba72","type":3}}' + m_Space: -1 + m_Property: + name: mainTexture + m_serializedType: + m_SerializableType: UnityEngine.Texture2D, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614685 +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: d16c6aeaef944094b9a1633041804207, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614681} + m_Children: [] + m_UIPosition: {x: 0, y: 2} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: [] + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614686} + mode: 0 + axes: 4 + faceRay: 1 +--- !u!114 &8926484042661614686 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614686} + m_MasterData: + m_Owner: {fileID: 8926484042661614685} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614687 +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: 081ffb0090424ba4cb05370a42ead6b9, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &8926484042661614722 +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: 01ec2c1930009b04ea08905b47262415, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614681} + m_Children: [] + m_UIPosition: {x: 508.1385, y: 271.34802} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614723} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614724} + attribute: color + Composition: 2 + AlphaComposition: 0 + SampleMode: 0 + Mode: 1 + ColorMode: 3 + channels: 6 +--- !u!114 &8926484042661614723 +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: 76f778ff57c4e8145b9681fe3268d8e9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614723} + m_MasterData: + m_Owner: {fileID: 8926484042661614722} + m_Value: + m_Type: + m_SerializableType: UnityEngine.Gradient, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"colorKeys":[{"color":{"r":0.003921564668416977,"g":0.7162883877754211,"b":0.9725490212440491,"a":1.0},"time":0.0},{"color":{"r":0.2158605307340622,"g":0.6866854429244995,"b":1.0,"a":1.0},"time":1.0}],"alphaKeys":[{"alpha":1.0,"time":0.0},{"alpha":1.0,"time":0.800000011920929},{"alpha":0.0,"time":1.0}],"gradientMode":0}' + m_Space: -1 + m_Property: + name: Color + m_serializedType: + m_SerializableType: UnityEngine.Gradient, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614724 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614724} + m_MasterData: + m_Owner: {fileID: 8926484042661614722} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614774 +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: 1b605c022ee79394a8a776c0869b3f9a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614775} + - {fileID: 8926484042661614779} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614774} + m_MasterData: + m_Owner: {fileID: 8926484042661614613} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.AABox, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"center":{"x":0.0,"y":1.0,"z":0.0},"size":{"x":3.5,"y":4.0,"z":3.5}}' + m_Space: 0 + m_Property: + name: bounds + m_serializedType: + m_SerializableType: UnityEditor.VFX.AABox, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614775 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614774} + m_Children: + - {fileID: 8926484042661614776} + - {fileID: 8926484042661614777} + - {fileID: 8926484042661614778} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614774} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: center + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614776 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614775} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614774} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614777 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614775} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614774} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614778 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614775} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614774} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614779 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614774} + m_Children: + - {fileID: 8926484042661614780} + - {fileID: 8926484042661614781} + - {fileID: 8926484042661614782} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614774} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: size + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614780 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614779} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614774} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614781 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614779} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614774} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614782 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614779} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614774} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614783 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614784} + - {fileID: 8926484042661614785} + - {fileID: 8926484042661614786} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614783} + m_MasterData: + m_Owner: {fileID: 8926484042661614613} + m_Value: + m_Type: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"x":0.5,"y":0.5,"z":0.5}' + m_Space: -1 + m_Property: + name: boundsPadding + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614784 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614783} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614783} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614785 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614783} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614783} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614786 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614783} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614783} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614806 +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: 26096dfac7c062b4b94c293605ba085e, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614613} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614807} + - {fileID: 8926484042661614818} + - {fileID: 8926484042661614819} + - {fileID: 8926484042661614813} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614814} + composition: 0 + speedMode: 1 +--- !u!114 &8926484042661614807 +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: e8f2b4a846fd4c14a893cde576ad172b, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614808} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614807} + m_MasterData: + m_Owner: {fileID: 8926484042661614806} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.DirectionType, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"direction":{"x":0.0,"y":1.0,"z":0.0}}' + m_Space: 0 + m_Property: + name: Direction + m_serializedType: + m_SerializableType: UnityEditor.VFX.DirectionType, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614808 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614807} + m_Children: + - {fileID: 8926484042661614809} + - {fileID: 8926484042661614810} + - {fileID: 8926484042661614811} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614807} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: direction + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614809 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614808} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614807} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614810 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614808} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614807} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614811 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614808} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614807} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614813 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614813} + m_MasterData: + m_Owner: {fileID: 8926484042661614806} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0.85 + m_Space: -1 + m_Property: + name: DirectionBlend + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614814 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614814} + m_MasterData: + m_Owner: {fileID: 8926484042661614806} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614818 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614818} + m_MasterData: + m_Owner: {fileID: 8926484042661614806} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 4.8 + m_Space: -1 + m_Property: + name: MinSpeed + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614819 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614819} + m_MasterData: + m_Owner: {fileID: 8926484042661614806} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 7.5 + m_Space: -1 + m_Property: + name: MaxSpeed + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614820 +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: e5dce54ae3368c042b26ab1f305e15b2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614662} + m_Children: [] + m_UIPosition: {x: 0, y: 2} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614821} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614826} +--- !u!114 &8926484042661614821 +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: a9f9544b71b7dab44a4644b6807e8bf6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614822} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614821} + m_MasterData: + m_Owner: {fileID: 8926484042661614820} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.Vector, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"vector":{"x":0.0,"y":-9.8100004196167,"z":0.0}}' + m_Space: 1 + m_Property: + name: Force + m_serializedType: + m_SerializableType: UnityEditor.VFX.Vector, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614822 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614821} + m_Children: + - {fileID: 8926484042661614823} + - {fileID: 8926484042661614824} + - {fileID: 8926484042661614825} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614821} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: vector + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614823 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614822} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614821} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614824 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614822} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614821} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614825 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614822} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614821} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614826 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614826} + m_MasterData: + m_Owner: {fileID: 8926484042661614820} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: False + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614827 +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: b294673e879f9cf449cc9de536818ea9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614662} + m_Children: [] + m_UIPosition: {x: 0, y: 77} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614828} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614829} + UseParticleSize: 0 +--- !u!114 &8926484042661614828 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614828} + m_MasterData: + m_Owner: {fileID: 8926484042661614827} + m_Value: + m_Type: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: 0.5 + m_Space: -1 + m_Property: + name: dragCoefficient + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614829 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614829} + m_MasterData: + m_Owner: {fileID: 8926484042661614827} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614830 +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: 01ec2c1930009b04ea08905b47262415, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614681} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614831} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614832} + attribute: size + Composition: 2 + AlphaComposition: 0 + SampleMode: 0 + Mode: 1 + ColorMode: 3 + channels: 6 +--- !u!114 &8926484042661614831 +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: c117b74c5c58db542bffe25c78fe92db, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614831} + m_MasterData: + m_Owner: {fileID: 8926484042661614830} + m_Value: + m_Type: + m_SerializableType: UnityEngine.AnimationCurve, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"frames":[{"time":0.0,"value":0.75,"inTangent":0.0,"outTangent":1.25,"tangentMode":0,"leftTangentMode":2,"rightTangentMode":2,"broken":true},{"time":1.0,"value":2.0,"inTangent":1.25,"outTangent":2.0,"tangentMode":0,"leftTangentMode":2,"rightTangentMode":2,"broken":true}],"preWrapMode":8,"postWrapMode":8,"version":1}' + m_Space: -1 + m_Property: + name: Size + m_serializedType: + m_SerializableType: UnityEngine.AnimationCurve, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614832 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614832} + m_MasterData: + m_Owner: {fileID: 8926484042661614830} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614833 +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: 388ad3b1dc9c6ae45b630f914fab638f, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 +--- !u!114 &8926484042661614834 +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: fb1f6794ace8b0c4592af9c5604cddbf, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614613} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 0 + m_UISuperCollapsed: 0 + m_InputSlots: + - {fileID: 8926484042661614871} + m_OutputSlots: [] + m_Disabled: 0 + m_ActivationSlot: {fileID: 8926484042661614852} + compositionPosition: 0 + compositionAxes: 0 + compositionDirection: 0 + positionMode: 1 + spawnMode: 0 + shape: 0 + heightMode: 1 + applyOrientation: 1 + killOutliers: 0 + projectionSteps: 2 +--- !u!114 &8926484042661614852 +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: b4c11ff25089a324daf359f4b0629b33, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614852} + m_MasterData: + m_Owner: {fileID: 8926484042661614834} + m_Value: + m_Type: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_SerializableObject: True + m_Space: -1 + m_Property: + name: _vfx_enabled + m_serializedType: + m_SerializableType: System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614871 +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: 1b605c022ee79394a8a776c0869b3f9a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlot + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614872} + - {fileID: 8926484042661614887} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614871} + m_MasterData: + m_Owner: {fileID: 8926484042661614834} + m_Value: + m_Type: + m_SerializableType: UnityEditor.VFX.TArcSphere, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_SerializableObject: '{"sphere":{"transform":{"position":{"x":0.0,"y":0.0,"z":0.0},"angles":{"x":0.0,"y":0.0,"z":0.0},"scale":{"x":1.0,"y":1.0,"z":1.0}},"radius":1.0},"arc":6.2831854820251469}' + m_Space: 0 + m_Property: + name: arcSphere + m_serializedType: + m_SerializableType: UnityEditor.VFX.TArcSphere, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614872 +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: 1b605c022ee79394a8a776c0869b3f9a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlot + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614871} + m_Children: + - {fileID: 8926484042661614873} + - {fileID: 8926484042661614886} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614871} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: sphere + m_serializedType: + m_SerializableType: UnityEditor.VFX.TSphere, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614873 +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: 3e3f628d80ffceb489beac74258f9cf7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotTransform + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614872} + m_Children: + - {fileID: 8926484042661614874} + - {fileID: 8926484042661614878} + - {fileID: 8926484042661614882} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614871} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: transform + m_serializedType: + m_SerializableType: UnityEditor.VFX.Transform, Unity.VisualEffectGraph.Editor, + Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614874 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat3 + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614873} + m_Children: + - {fileID: 8926484042661614875} + - {fileID: 8926484042661614876} + - {fileID: 8926484042661614877} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614871} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: position + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614875 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614874} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614871} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614876 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614874} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614871} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614877 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614874} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614871} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614878 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat3 + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614873} + m_Children: + - {fileID: 8926484042661614879} + - {fileID: 8926484042661614880} + - {fileID: 8926484042661614881} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614871} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: angles + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614879 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614878} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614871} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614880 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614878} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614871} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614881 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614878} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614871} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614882 +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: ac39bd03fca81b849929b9c966f1836a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat3 + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614873} + m_Children: + - {fileID: 8926484042661614883} + - {fileID: 8926484042661614884} + - {fileID: 8926484042661614885} + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614871} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: scale + m_serializedType: + m_SerializableType: UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, + Culture=neutral, PublicKeyToken=null + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614883 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614882} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614871} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: x + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614884 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614882} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614871} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: y + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614885 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614882} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614871} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: z + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614886 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614872} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614871} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: radius + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] +--- !u!114 &8926484042661614887 +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: f780aa281814f9842a7c076d436932e7, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.VisualEffectGraph.Editor::UnityEditor.VFX.VFXSlotFloat + m_UIIgnoredErrors: [] + m_Parent: {fileID: 8926484042661614871} + m_Children: [] + m_UIPosition: {x: 0, y: 0} + m_UICollapsed: 1 + m_UISuperCollapsed: 0 + m_MasterSlot: {fileID: 8926484042661614871} + m_MasterData: + m_Owner: {fileID: 0} + m_Value: + m_Type: + m_SerializableType: + m_SerializableObject: + m_Space: -1 + m_Property: + name: arc + m_serializedType: + m_SerializableType: System.Single, mscorlib, Version=4.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + m_Direction: 0 + m_LinkedSlots: [] diff --git a/Assets/_Project/Art/VFX/spells/VFX_slowarea.vfx.meta b/Assets/_Project/Art/VFX/spells/VFX_slowarea.vfx.meta new file mode 100644 index 0000000..b32e89c --- /dev/null +++ b/Assets/_Project/Art/VFX/spells/VFX_slowarea.vfx.meta @@ -0,0 +1,15 @@ +fileFormatVersion: 2 +guid: 397a5bed36b1e63a0a3eef17b04f65bd +VisualEffectImporter: + externalObjects: {} + serializedVersion: 2 + template: + name: + category: + description: + icon: {instanceID: 0} + thumbnail: {instanceID: 0} + useAsTemplate: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/BuilderSpells/FireballSpell.asset b/Assets/_Project/Definitions/BuilderSpells/FireballSpell.asset index 5f45c46..d78d1f8 100644 --- a/Assets/_Project/Definitions/BuilderSpells/FireballSpell.asset +++ b/Assets/_Project/Definitions/BuilderSpells/FireballSpell.asset @@ -22,7 +22,7 @@ MonoBehaviour: serializedVersion: 2 m_Bits: 1024 impactVfxPrefab: {fileID: 158073311046191680, guid: 80eaad6d0b024835482b64625b63053c, type: 3} - impactVfxLifetime: 2 + impactVfxLifetime: 3 impactSound: clip: {fileID: 8300000, guid: 4ee1b63f27ea04451802bafd35ecef89, type: 3} volume: 0.5 diff --git a/Assets/_Project/Definitions/BuilderSpells/SlowAreaSpell.asset b/Assets/_Project/Definitions/BuilderSpells/SlowAreaSpell.asset index 74694ff..d6f043a 100644 --- a/Assets/_Project/Definitions/BuilderSpells/SlowAreaSpell.asset +++ b/Assets/_Project/Definitions/BuilderSpells/SlowAreaSpell.asset @@ -16,10 +16,16 @@ MonoBehaviour: Description: Slows enemies in an area Icon: {fileID: 0} Cooldown: 5 - TargetType: 0 + TargetType: 1 Radius: 5 enemyLayerMask: serializedVersion: 2 m_Bits: 1024 + areaVfxPrefab: {fileID: 1462673130280185047, guid: bf2f1f2a9a54e9162b80673e3f7eeaf6, type: 3} + areaSound: + clip: {fileID: 0} + volume: 0 + minPitch: 0 + maxPitch: 0 SlowFactor: 0.5 EffectDuration: 3 diff --git a/Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaSpellDefinition.cs b/Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaSpellDefinition.cs index 4bee6bd..b992845 100644 --- a/Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaSpellDefinition.cs +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaSpellDefinition.cs @@ -1,5 +1,6 @@ // Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaSpellDefinition.cs using UnityEngine; +using TD.Audio; using TD.Core; namespace TD.Gameplay.BuilderSpells @@ -19,6 +20,15 @@ namespace TD.Gameplay.BuilderSpells { public override BuilderSpellKind Kind => BuilderSpellKind.SlowArea; + [Header("Area VFX")] + [Tooltip("Prefab spawned at the target point on a successful cast, authored at a 1-unit " + + "radius — scaled up to match Radius here. Lives for EffectDuration, matching " + + "how long the slow itself lasts. Optional — leave empty for no visual.")] + [SerializeField] private GameObject areaVfxPrefab; + + [Tooltip("Sound played on every peer when this spell resolves successfully.")] + [SerializeField] private SoundConfig areaSound; + [Header("Slow Area")] [Tooltip("Speed multiplier applied to affected enemies for EffectDuration " + "(e.g. 0.5 = half speed).")] @@ -51,5 +61,19 @@ namespace TD.Gameplay.BuilderSpells return hitAny; } + + public override void ClientPlayVfx(Vector3 targetPoint) + { + if (areaVfxPrefab != null) + { + var instance = Instantiate(areaVfxPrefab, targetPoint, Quaternion.identity); + instance.transform.localScale *= Mathf.Max(Radius, 0.01f); + Destroy(instance, EffectDuration); + } + + if (areaSound.clip != null) + AudioManager.Instance?.Play(areaSound.clip, AudioCategory.Combat, + areaSound.RandomPitch(), areaSound.volume); + } } } From a33d951abd4f2c59acab81b62c9655c1657d532b Mon Sep 17 00:00:00 2001 From: Matt F Date: Sat, 18 Jul 2026 18:12:56 -0700 Subject: [PATCH 35/58] Updates to spells, HUD, Gold, and Camera Controls. New sound effects! --- Assets/_Project/Art/Sprites/Spells.meta | 8 ++ .../Art/Sprites/Spells/FireballSpell.png | 3 + .../Art/Sprites/Spells/FireballSpell.png.meta | 117 ++++++++++++++++++ .../_Project/Art/Sprites/Spells/SlowSpell.png | 3 + .../Art/Sprites/Spells/SlowSpell.png.meta | 117 ++++++++++++++++++ .../Audio/Sound Effects/FireballExplosion.ogg | 3 + .../Sound Effects/FireballExplosion.ogg.meta | 23 ++++ .../_Project/Audio/Sound Effects/TimeSlow.ogg | 3 + .../Audio/Sound Effects/TimeSlow.ogg.meta | 23 ++++ .../BuilderSpells/FireballSpell.asset | 13 +- .../BuilderSpells/SlowAreaSpell.asset | 14 +-- Assets/_Project/Definitions/GoldConfig.asset | 24 ++-- .../Gameplay/BuilderInputController.cs | 19 ++- .../Gameplay/BuilderSpellCastController.cs | 39 ++++++ .../BuilderSpells/BuilderSpellDefinition.cs | 31 ++++- .../BuilderSpells/BuilderSpellPool.cs | 3 +- .../BuilderSpells/FireballSpellDefinition.cs | 15 ++- .../BuilderSpells/SlowAreaSpellDefinition.cs | 6 +- .../Scripts/Gameplay/CameraController.cs | 15 +-- .../Gameplay/Draft/BuilderSpellDraftOption.cs | 9 ++ .../Scripts/Gameplay/Draft/DraftOption.cs | 12 +- .../Gameplay/Draft/NewTowerDraftOption.cs | 4 + .../Scripts/Gameplay/PlayerSpellLoadout.cs | 69 +++++++++-- Assets/_Project/Scripts/UI/HUDController.cs | 58 +++++++-- Assets/_Project/UI/HUD.uss | 7 +- Assets/_Project/UI/HUD.uxml | 2 +- Assets/_Project/UI/HUDPanelSettings.asset | 6 +- 27 files changed, 578 insertions(+), 68 deletions(-) create mode 100644 Assets/_Project/Art/Sprites/Spells.meta create mode 100644 Assets/_Project/Art/Sprites/Spells/FireballSpell.png create mode 100644 Assets/_Project/Art/Sprites/Spells/FireballSpell.png.meta create mode 100644 Assets/_Project/Art/Sprites/Spells/SlowSpell.png create mode 100644 Assets/_Project/Art/Sprites/Spells/SlowSpell.png.meta create mode 100644 Assets/_Project/Audio/Sound Effects/FireballExplosion.ogg create mode 100644 Assets/_Project/Audio/Sound Effects/FireballExplosion.ogg.meta create mode 100644 Assets/_Project/Audio/Sound Effects/TimeSlow.ogg create mode 100644 Assets/_Project/Audio/Sound Effects/TimeSlow.ogg.meta diff --git a/Assets/_Project/Art/Sprites/Spells.meta b/Assets/_Project/Art/Sprites/Spells.meta new file mode 100644 index 0000000..599da31 --- /dev/null +++ b/Assets/_Project/Art/Sprites/Spells.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b086eebc9f3f87543bf2c98de8c8e4af +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Art/Sprites/Spells/FireballSpell.png b/Assets/_Project/Art/Sprites/Spells/FireballSpell.png new file mode 100644 index 0000000..6c62964 --- /dev/null +++ b/Assets/_Project/Art/Sprites/Spells/FireballSpell.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c58fd337b19c098a34a4eb7730e87fad72ec3b4819665e00535676b008348146 +size 177456 diff --git a/Assets/_Project/Art/Sprites/Spells/FireballSpell.png.meta b/Assets/_Project/Art/Sprites/Spells/FireballSpell.png.meta new file mode 100644 index 0000000..25bac7d --- /dev/null +++ b/Assets/_Project/Art/Sprites/Spells/FireballSpell.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: eff45e5e3dab24f438c054a095d34578 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Art/Sprites/Spells/SlowSpell.png b/Assets/_Project/Art/Sprites/Spells/SlowSpell.png new file mode 100644 index 0000000..9f0cdef --- /dev/null +++ b/Assets/_Project/Art/Sprites/Spells/SlowSpell.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3d54e2ec41954205c8775d2c6f09e6a134e8a960a797394c6e01ce67daebc840 +size 357045 diff --git a/Assets/_Project/Art/Sprites/Spells/SlowSpell.png.meta b/Assets/_Project/Art/Sprites/Spells/SlowSpell.png.meta new file mode 100644 index 0000000..98e89b4 --- /dev/null +++ b/Assets/_Project/Art/Sprites/Spells/SlowSpell.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: 5f5072d8c9f626c4690a7b231c7488f9 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Audio/Sound Effects/FireballExplosion.ogg b/Assets/_Project/Audio/Sound Effects/FireballExplosion.ogg new file mode 100644 index 0000000..77a3f9b --- /dev/null +++ b/Assets/_Project/Audio/Sound Effects/FireballExplosion.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2263f258fb816411ff3c118c796cf622bf8327c597c2037f628d5b7dee32ab2a +size 54249 diff --git a/Assets/_Project/Audio/Sound Effects/FireballExplosion.ogg.meta b/Assets/_Project/Audio/Sound Effects/FireballExplosion.ogg.meta new file mode 100644 index 0000000..e3b4013 --- /dev/null +++ b/Assets/_Project/Audio/Sound Effects/FireballExplosion.ogg.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: e54448243d0478045b6566412c54e4a7 +AudioImporter: + externalObjects: {} + serializedVersion: 8 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Audio/Sound Effects/TimeSlow.ogg b/Assets/_Project/Audio/Sound Effects/TimeSlow.ogg new file mode 100644 index 0000000..6540f44 --- /dev/null +++ b/Assets/_Project/Audio/Sound Effects/TimeSlow.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e4d6c70f74ae50b15bcbcf1b53cdf63f521f671b119aa6c32ea9a41c9e07e563 +size 30845 diff --git a/Assets/_Project/Audio/Sound Effects/TimeSlow.ogg.meta b/Assets/_Project/Audio/Sound Effects/TimeSlow.ogg.meta new file mode 100644 index 0000000..fe80db5 --- /dev/null +++ b/Assets/_Project/Audio/Sound Effects/TimeSlow.ogg.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 038ff3eab9aa0034bac26ccb648ef2a1 +AudioImporter: + externalObjects: {} + serializedVersion: 8 + defaultSettings: + serializedVersion: 2 + loadType: 0 + sampleRateSetting: 0 + sampleRateOverride: 44100 + compressionFormat: 1 + quality: 1 + conversionMode: 0 + preloadAudioData: 0 + platformSettingOverrides: {} + forceToMono: 0 + normalize: 1 + loadInBackground: 0 + ambisonic: 0 + 3D: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/BuilderSpells/FireballSpell.asset b/Assets/_Project/Definitions/BuilderSpells/FireballSpell.asset index d78d1f8..b63d958 100644 --- a/Assets/_Project/Definitions/BuilderSpells/FireballSpell.asset +++ b/Assets/_Project/Definitions/BuilderSpells/FireballSpell.asset @@ -14,18 +14,19 @@ MonoBehaviour: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.BuilderSpells.FireballSpellDefinition DisplayName: Fireball Description: Shoot a fireball - Icon: {fileID: 0} - Cooldown: 5 + Icon: {fileID: 21300000, guid: eff45e5e3dab24f438c054a095d34578, type: 3} + Cooldown: 1 TargetType: 0 - Radius: 3 + Radius: 5 enemyLayerMask: serializedVersion: 2 m_Bits: 1024 impactVfxPrefab: {fileID: 158073311046191680, guid: 80eaad6d0b024835482b64625b63053c, type: 3} impactVfxLifetime: 3 + impactDelay: 0.9 impactSound: - clip: {fileID: 8300000, guid: 4ee1b63f27ea04451802bafd35ecef89, type: 3} - volume: 0.5 + clip: {fileID: 8300000, guid: e54448243d0478045b6566412c54e4a7, type: 3} + volume: 0.603 minPitch: 1.048 maxPitch: 0.969 - Damage: 50 + Damage: 500 diff --git a/Assets/_Project/Definitions/BuilderSpells/SlowAreaSpell.asset b/Assets/_Project/Definitions/BuilderSpells/SlowAreaSpell.asset index d6f043a..e2550d2 100644 --- a/Assets/_Project/Definitions/BuilderSpells/SlowAreaSpell.asset +++ b/Assets/_Project/Definitions/BuilderSpells/SlowAreaSpell.asset @@ -14,8 +14,8 @@ MonoBehaviour: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.BuilderSpells.SlowAreaSpellDefinition DisplayName: Slow Area Description: Slows enemies in an area - Icon: {fileID: 0} - Cooldown: 5 + Icon: {fileID: 21300000, guid: 5f5072d8c9f626c4690a7b231c7488f9, type: 3} + Cooldown: 10 TargetType: 1 Radius: 5 enemyLayerMask: @@ -23,9 +23,9 @@ MonoBehaviour: m_Bits: 1024 areaVfxPrefab: {fileID: 1462673130280185047, guid: bf2f1f2a9a54e9162b80673e3f7eeaf6, type: 3} areaSound: - clip: {fileID: 0} - volume: 0 - minPitch: 0 - maxPitch: 0 + clip: {fileID: 8300000, guid: 038ff3eab9aa0034bac26ccb648ef2a1, type: 3} + volume: 0.632 + minPitch: 1.14 + maxPitch: 0.96 SlowFactor: 0.5 - EffectDuration: 3 + EffectDuration: 8 diff --git a/Assets/_Project/Definitions/GoldConfig.asset b/Assets/_Project/Definitions/GoldConfig.asset index 58f29f6..abf9261 100644 --- a/Assets/_Project/Definitions/GoldConfig.asset +++ b/Assets/_Project/Definitions/GoldConfig.asset @@ -17,44 +17,40 @@ MonoBehaviour: - Wave: {fileID: 11400000, guid: 65f66289ea1233b4897f46cd997d9c7a, type: 2} GoldPerEnemy: 5 CompletionBonus: 25 - NoLeaksBonus: 50 + NoLeaksBonus: 10 - Wave: {fileID: 11400000, guid: 190e39db44aa0794aa808fd60976f7c4, type: 2} GoldPerEnemy: 7 CompletionBonus: 30 - NoLeaksBonus: 50 + NoLeaksBonus: 10 - Wave: {fileID: 11400000, guid: 39921b44a1a0a56478200028940c5202, type: 2} GoldPerEnemy: 10 CompletionBonus: 35 - NoLeaksBonus: 50 + NoLeaksBonus: 10 - Wave: {fileID: 11400000, guid: 50f498bc5bfc46e44b064cc96403e2cb, type: 2} GoldPerEnemy: 15 CompletionBonus: 40 - NoLeaksBonus: 50 + NoLeaksBonus: 10 - Wave: {fileID: 11400000, guid: 9ee6dee12f0660844b4d46880f01c02f, type: 2} GoldPerEnemy: 15 CompletionBonus: 45 - NoLeaksBonus: 50 + NoLeaksBonus: 10 - Wave: {fileID: 11400000, guid: 41231de63e8f25d448f19f3816e0c22f, type: 2} GoldPerEnemy: 20 CompletionBonus: 50 - NoLeaksBonus: 100 + NoLeaksBonus: 10 - Wave: {fileID: 11400000, guid: 6290df178cbd3144aa92a0f09833a7be, type: 2} GoldPerEnemy: 20 CompletionBonus: 55 - NoLeaksBonus: 100 + NoLeaksBonus: 20 - Wave: {fileID: 11400000, guid: 86736fd52c18fa84e8ced40f30b514fa, type: 2} GoldPerEnemy: 25 CompletionBonus: 60 - NoLeaksBonus: 100 + NoLeaksBonus: 20 - Wave: {fileID: 11400000, guid: 8fdf53cfc405a5f41a00f376198b8d84, type: 2} GoldPerEnemy: 25 CompletionBonus: 65 - NoLeaksBonus: 100 + NoLeaksBonus: 20 - Wave: {fileID: 11400000, guid: 4db677d2940202340841471f90a5b73a, type: 2} GoldPerEnemy: 25 CompletionBonus: 70 - NoLeaksBonus: 100 - - Wave: {fileID: 11400000, guid: fc1a55fab4ce81047b4925f53a3a8b8d, type: 2} - GoldPerEnemy: 50 - CompletionBonus: 75 - NoLeaksBonus: 500 + NoLeaksBonus: 20 diff --git a/Assets/_Project/Scripts/Gameplay/BuilderInputController.cs b/Assets/_Project/Scripts/Gameplay/BuilderInputController.cs index 72bd7c3..23a1c05 100644 --- a/Assets/_Project/Scripts/Gameplay/BuilderInputController.cs +++ b/Assets/_Project/Scripts/Gameplay/BuilderInputController.cs @@ -85,6 +85,7 @@ namespace TD.Gameplay // Cached reference to the local TowerPaintController, looked up lazily (same // rationale as the placement controller). private TowerPaintController cachedPaintController; + private BuilderSpellCastController cachedSpellCastController; // ----- Lifecycle -------------------------------------------------- @@ -120,7 +121,7 @@ namespace TD.Gameplay // Placement and paint are both modal: while either is active, the local // controller for that mode owns left-/right-click, so selection here yields. - bool isModal = IsLocalPlayerPlacing() || IsLocalPlayerPainting(); + bool isModal = IsLocalPlayerPlacing() || IsLocalPlayerPainting() || IsLocalPlayerAimingSpell(); Vector2 mousePos = mouse.position.ReadValue(); // UI Toolkit dispatches button click events AFTER Update runs, but raw mouse @@ -292,5 +293,21 @@ namespace TD.Gameplay } return cachedPaintController.IsPainting; } + + private bool IsLocalPlayerAimingSpell() + { + if (cachedSpellCastController == null) + { + // Find lazily — controller may have been added after this component spawned. + cachedSpellCastController = + UnityEngine.Object.FindAnyObjectByType(); + if (cachedSpellCastController == null) return false; + } + // IsAiming covers "aiming, click not yet made"; ConsumedCastClickThisFrame covers the + // frame the confirming click casts and exits aim mode — together they suppress the + // selection click regardless of Update order between the two controllers. + return cachedSpellCastController.IsAiming + || cachedSpellCastController.ConsumedCastClickThisFrame; + } } } \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/BuilderSpellCastController.cs b/Assets/_Project/Scripts/Gameplay/BuilderSpellCastController.cs index 49160da..745ebe8 100644 --- a/Assets/_Project/Scripts/Gameplay/BuilderSpellCastController.cs +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpellCastController.cs @@ -56,6 +56,21 @@ namespace TD.Gameplay // -1 when not aiming. private int activeSlot = -1; + + // Frame on which the confirming cast click was consumed. Lets the selection controller + // ignore that click order-independently — see ConsumedCastClickThisFrame. + private int lastCastClickFrame = -1; + + /// True while a spell is being aimed (awaiting the confirming click). The + /// selection input controller treats this as a modal state, so the click that confirms + /// the cast doesn't also fall through to selection and deselect the builder. + public bool IsAiming => activeSlot >= 0; + + /// True during the frame the confirming cast click was consumed. Aim mode exits + /// the same frame the cast is submitted, flipping false; this stays + /// true for the rest of that frame so the selection controller ignores the click no matter + /// which controller's Update ran first. + public bool ConsumedCastClickThisFrame => lastCastClickFrame == Time.frameCount; private BuilderSpellDefinition activeDefinition; private bool lastHitValid; @@ -85,6 +100,14 @@ namespace TD.Gameplay if (activeSlot < 0) return; // idle — nothing to aim + // Deselecting the builder mid-aim cancels the cast, so you can't start aiming while + // selected and then deselect to sneak a cast past the gate above. + if (!LocalBuilderSelected()) + { + ExitAimMode(); + return; + } + var keyboard = Keyboard.current; if (keyboard != null && keyboard.escapeKey.wasPressedThisFrame) { @@ -115,16 +138,32 @@ namespace TD.Gameplay if (mouse.leftButton.wasPressedThisFrame && lastHitValid) { + // Record the frame so the selection controller ignores this click even though + // TrySubmitCast exits aim mode this same frame (IsAiming flips false). Without + // this, whether the click also deselected the builder depended on Update order. + lastCastClickFrame = Time.frameCount; TrySubmitCast(); } } // ----- Hotkey scan -------------------------------------------------- + // True when the local player's own builder is the current selection. Casting is gated + // on this so it matches the spell HUD (shown only for the selected builder). + private static bool LocalBuilderSelected() + { + var selected = SelectionState.Instance?.SelectedObject; + return selected is Builder builder && builder.IsOwner; + } + private void ScanHotkeys() { if (activeSlot >= 0) return; // already aiming — hotkeys re-scanned only when idle + // Spells cast only while the local player's OWN builder is selected — keeps casting + // in sync with the spell HUD, which is shown only for the selected builder. + if (!LocalBuilderSelected()) return; + var loadout = PlayerSpellLoadout.Local; if (loadout == null) return; diff --git a/Assets/_Project/Scripts/Gameplay/BuilderSpells/BuilderSpellDefinition.cs b/Assets/_Project/Scripts/Gameplay/BuilderSpells/BuilderSpellDefinition.cs index e1ca3b2..2bf7c9e 100644 --- a/Assets/_Project/Scripts/Gameplay/BuilderSpells/BuilderSpellDefinition.cs +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpells/BuilderSpellDefinition.cs @@ -24,8 +24,9 @@ namespace TD.Gameplay.BuilderSpells /// Server-only resolution, client-only visual. runs on /// the server and applies damage/status via the same Physics.OverlapSphereNonAlloc + /// EnemyHealth/EnemyStatus pattern TowerCombat already uses. - /// runs on every peer (including the server) after a successful - /// cast, purely for presentation. + /// Presentation is split into (on cast) and + /// (on contact, seconds later for a + /// projectile spell), both running on every peer including the server. /// public abstract class BuilderSpellDefinition : ScriptableObject { @@ -82,10 +83,28 @@ namespace TD.Gameplay.BuilderSpells public abstract bool ServerCast(ulong clientId, Vector3 targetPoint); /// - /// Runs on every peer (via 's ClientRpc) after a - /// successful . Default no-op; override to spawn an impact VFX - /// prefab and self-destroy it, the same idiom used elsewhere for one-off visuals. + /// Seconds between the cast and the effect landing. 0 = instant: damage and the impact + /// sound resolve immediately on cast. A projectile-style spell (e.g. the Fireball meteor) + /// overrides this with its fall/travel time, so spawns the + /// visual on cast but holds (damage) and + /// (sound) until the projectile reaches the ground. Set it to match the VFX's fall time. /// - public virtual void ClientPlayVfx(Vector3 targetPoint) { } + public virtual float ImpactDelay => 0f; + + /// + /// Runs on every peer (via 's ClientRpc) the moment the + /// spell is cast. Spawns the visual: for an instant spell that's the whole effect; for a + /// delayed spell it's the projectile/travel visual that lands after . + /// Default no-op. + /// + public virtual void ClientSpawnVfx(Vector3 targetPoint) { } + + /// + /// Runs on every peer when the spell makes contact — immediately for an instant spell, or + /// seconds after cast for a delayed one. Play the impact sound + /// (and any impact-moment visual) here so it lands with the effect, not the throw. + /// Default no-op. + /// + public virtual void ClientPlayImpact(Vector3 targetPoint) { } } } diff --git a/Assets/_Project/Scripts/Gameplay/BuilderSpells/BuilderSpellPool.cs b/Assets/_Project/Scripts/Gameplay/BuilderSpells/BuilderSpellPool.cs index 2f44df6..1327be9 100644 --- a/Assets/_Project/Scripts/Gameplay/BuilderSpells/BuilderSpellPool.cs +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpells/BuilderSpellPool.cs @@ -14,7 +14,8 @@ namespace TD.Gameplay.BuilderSpells /// /// Plain MonoBehaviour: identical on every peer (same assets), so there is nothing to sync. /// The server reads it to resolve casts; clients read it to resolve and to render the cast hotbar. Mirrors + /// cref="BuilderSpellDefinition.ClientSpawnVfx"/> / and to render the cast hotbar. Mirrors /// exactly. /// public class BuilderSpellPool : MonoBehaviour diff --git a/Assets/_Project/Scripts/Gameplay/BuilderSpells/FireballSpellDefinition.cs b/Assets/_Project/Scripts/Gameplay/BuilderSpells/FireballSpellDefinition.cs index 5f34a1c..b4917ca 100644 --- a/Assets/_Project/Scripts/Gameplay/BuilderSpells/FireballSpellDefinition.cs +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpells/FireballSpellDefinition.cs @@ -28,6 +28,14 @@ namespace TD.Gameplay.BuilderSpells [Min(0f)] [SerializeField] private float impactVfxLifetime = 2f; + [Tooltip("Seconds from cast until the falling fireball reaches the ground. Damage and the " + + "impact sound are held until then so they land with the visual — SET THIS TO MATCH " + + "the meteor VFX's fall time. 0 = everything resolves instantly on cast.")] + [Min(0f)] + [SerializeField] private float impactDelay = 0.8f; + + public override float ImpactDelay => impactDelay; + [Header("Impact Sound")] [Tooltip("Sound played on every peer when this spell resolves successfully. Same " + "SoundConfig struct TowerBuiltSound uses — reuse a tower's clip directly if " + @@ -59,11 +67,16 @@ namespace TD.Gameplay.BuilderSpells return hitAny; } - public override void ClientPlayVfx(Vector3 targetPoint) + public override void ClientSpawnVfx(Vector3 targetPoint) { + // The meteor VFX plays its full fall-and-crash animation from here; it reaches the + // ground after ImpactDelay, which is when ClientPlayImpact and ServerCast fire. if (impactVfxPrefab != null) Destroy(Instantiate(impactVfxPrefab, targetPoint, Quaternion.identity), impactVfxLifetime); + } + public override void ClientPlayImpact(Vector3 targetPoint) + { if (impactSound.clip != null) AudioManager.Instance?.Play(impactSound.clip, AudioCategory.Combat, impactSound.RandomPitch(), impactSound.volume); diff --git a/Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaSpellDefinition.cs b/Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaSpellDefinition.cs index b992845..bd4cd8b 100644 --- a/Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaSpellDefinition.cs +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaSpellDefinition.cs @@ -62,7 +62,7 @@ namespace TD.Gameplay.BuilderSpells return hitAny; } - public override void ClientPlayVfx(Vector3 targetPoint) + public override void ClientSpawnVfx(Vector3 targetPoint) { if (areaVfxPrefab != null) { @@ -70,7 +70,11 @@ namespace TD.Gameplay.BuilderSpells instance.transform.localScale *= Mathf.Max(Radius, 0.01f); Destroy(instance, EffectDuration); } + } + public override void ClientPlayImpact(Vector3 targetPoint) + { + // Instant spell (ImpactDelay = 0), so this fires on cast alongside ClientSpawnVfx. if (areaSound.clip != null) AudioManager.Instance?.Play(areaSound.clip, AudioCategory.Combat, areaSound.RandomPitch(), areaSound.volume); diff --git a/Assets/_Project/Scripts/Gameplay/CameraController.cs b/Assets/_Project/Scripts/Gameplay/CameraController.cs index b80f33e..bd071d6 100644 --- a/Assets/_Project/Scripts/Gameplay/CameraController.cs +++ b/Assets/_Project/Scripts/Gameplay/CameraController.cs @@ -227,16 +227,17 @@ namespace TD.Gameplay { Vector2 dir = Vector2.zero; - // Keyboard: WASD + arrow keys. Suppressed entirely while the player - // is typing — pressing 'a' or 'w' into chat should not pan the camera. - // (Edge-pan below stays active since it's mouse-driven.) + // Keyboard: arrow keys only. WASD is reserved for tower-build hotkeys (the command + // grid) — camera panning is arrow keys plus the mouse edge-pan below. Suppressed + // entirely while the player is typing so arrow keys in chat navigate text instead of + // panning. (Edge-pan below stays active since it's mouse-driven.) var kb = HUDController.IsTextInputActive ? null : Keyboard.current; if (kb != null) { - if (kb.aKey.isPressed || kb.leftArrowKey.isPressed) dir.x -= 1f; - if (kb.dKey.isPressed || kb.rightArrowKey.isPressed) dir.x += 1f; - if (kb.sKey.isPressed || kb.downArrowKey.isPressed) dir.y -= 1f; - if (kb.wKey.isPressed || kb.upArrowKey.isPressed) dir.y += 1f; + if (kb.leftArrowKey.isPressed) dir.x -= 1f; + if (kb.rightArrowKey.isPressed) dir.x += 1f; + if (kb.downArrowKey.isPressed) dir.y -= 1f; + if (kb.upArrowKey.isPressed) dir.y += 1f; } // Edge-pan: mouse near screen edge adds to keyboard direction. diff --git a/Assets/_Project/Scripts/Gameplay/Draft/BuilderSpellDraftOption.cs b/Assets/_Project/Scripts/Gameplay/Draft/BuilderSpellDraftOption.cs index 416fc03..7582ea2 100644 --- a/Assets/_Project/Scripts/Gameplay/Draft/BuilderSpellDraftOption.cs +++ b/Assets/_Project/Scripts/Gameplay/Draft/BuilderSpellDraftOption.cs @@ -37,5 +37,14 @@ namespace TD.Gameplay.Draft var loadout = PlayerSpellLoadout.GetForClient(clientId); return loadout != null && loadout.ServerGrantSpell(Kind); } + + /// Inherits the granted spell's icon (resolved from the pool by + /// ) unless this option assigns an override. + public override Sprite ResolveIcon() + { + if (Icon != null) return Icon; + var def = BuilderSpellPool.Instance != null ? BuilderSpellPool.Instance.Get(Kind) : null; + return def != null ? def.Icon : null; + } } } diff --git a/Assets/_Project/Scripts/Gameplay/Draft/DraftOption.cs b/Assets/_Project/Scripts/Gameplay/Draft/DraftOption.cs index 8ae8e94..c098caf 100644 --- a/Assets/_Project/Scripts/Gameplay/Draft/DraftOption.cs +++ b/Assets/_Project/Scripts/Gameplay/Draft/DraftOption.cs @@ -34,9 +34,19 @@ namespace TD.Gameplay.Draft [TextArea(2, 4)] public string Description; - [Tooltip("Icon shown on the draft card. Optional for placeholder content.")] + [Tooltip("OPTIONAL override for the draft card icon. Leave empty to inherit the icon of " + + "the item this option grants (its tower / spell); assign one only when you want " + + "to override that inherited icon.")] public Sprite Icon; + /// + /// The icon actually shown on the draft card. Returns the explicit + /// override when one is assigned; otherwise subclasses fall back to the icon of the item + /// they grant (tower, spell). The base class has no referenced item, so it just returns + /// (which may be null). + /// + public virtual Sprite ResolveIcon() => Icon; + [Header("Generation")] [Tooltip("Relative draw weight. Higher = offered more often. Rarer rewards use " + "lower weights. Must be > 0.")] diff --git a/Assets/_Project/Scripts/Gameplay/Draft/NewTowerDraftOption.cs b/Assets/_Project/Scripts/Gameplay/Draft/NewTowerDraftOption.cs index aab2a98..e7af9f6 100644 --- a/Assets/_Project/Scripts/Gameplay/Draft/NewTowerDraftOption.cs +++ b/Assets/_Project/Scripts/Gameplay/Draft/NewTowerDraftOption.cs @@ -48,5 +48,9 @@ namespace TD.Gameplay.Draft return deck.ServerGrantTower(typeId); } + + /// Inherits the granted tower's icon unless this option assigns an override. + public override Sprite ResolveIcon() + => Icon != null ? Icon : (Tower != null ? Tower.Icon : null); } } diff --git a/Assets/_Project/Scripts/Gameplay/PlayerSpellLoadout.cs b/Assets/_Project/Scripts/Gameplay/PlayerSpellLoadout.cs index a6a1f68..ef994bb 100644 --- a/Assets/_Project/Scripts/Gameplay/PlayerSpellLoadout.cs +++ b/Assets/_Project/Scripts/Gameplay/PlayerSpellLoadout.cs @@ -1,4 +1,5 @@ // Assets/_Project/Scripts/Gameplay/PlayerSpellLoadout.cs +using System.Collections; using System.Collections.Generic; using Unity.Netcode; using UnityEngine; @@ -20,9 +21,12 @@ namespace TD.Gameplay /// slot index and an aimed world point. The server re-validates everything (slot exists, /// off cooldown, ) since client-side checks in /// are UX-only, resolves the - /// via , and calls - /// . A successful cast starts the cooldown - /// and fires so every peer plays the same visual. + /// via . An instant + /// spell ( == 0) resolves on cast: a hit starts + /// the cooldown and fires ; a miss is a no-op. A delayed + /// spell (a projectile, e.g. the Fireball meteor) commits on the throw — cooldown + the falling + /// visual fire immediately — while its damage and impact sound are held until the projectile + /// lands seconds later. /// public class PlayerSpellLoadout : NetworkBehaviour { @@ -142,7 +146,7 @@ namespace TD.Gameplay /// at . All validation happens /// here on the server; the client only uses this to trigger an attempt. /// - [Rpc(SendTo.Server, RequireOwnership = true)] + [Rpc(SendTo.Server, InvokePermission = RpcInvokePermission.Owner)] public void RequestCastSpellRpc(int slot, Vector3 targetPoint) { if (MatchState.Instance == null || MatchState.Instance.Phase != MatchPhase.Playing) @@ -160,18 +164,69 @@ namespace TD.Gameplay return; } - if (!definition.ServerCast(OwnerClientId, targetPoint)) return; + if (definition.ImpactDelay <= 0f) + { + // Instant spell (e.g. Slow Area): resolve on cast. A miss (hit nothing) is a no-op + // and does NOT start the cooldown — unchanged behavior. + if (!definition.ServerCast(OwnerClientId, targetPoint)) return; + StartCooldown(slot, definition); + PlayVfxClientRpc(slotValue.Kind, targetPoint); + } + else + { + // Delayed spell (e.g. the Fireball meteor): the projectile has to fall before it + // lands, so the cast is COMMITTED on the throw — cooldown starts and the falling + // visual spawns now — while damage and the impact sound wait until it hits the + // ground (ImpactDelay later). Enemies are re-scanned at impact, so movement during + // the fall resolves correctly. + StartCooldown(slot, definition); + PlayVfxClientRpc(slotValue.Kind, targetPoint); + StartCoroutine(ServerResolveImpactAfterDelay( + slotValue.Kind, OwnerClientId, targetPoint, definition.ImpactDelay)); + } + } + + // Server-only: stamp the slot's cooldown from the definition and replicate it. + private void StartCooldown(int slot, BuilderSpellDefinition definition) + { + var slotValue = spells[slot]; slotValue.CooldownEndServerTime = NetworkManager.ServerTime.Time + definition.Cooldown; spells[slot] = slotValue; + } - PlayVfxClientRpc(slotValue.Kind, targetPoint); + // Server-only: apply a delayed spell's effect once its projectile has landed. Re-resolves + // targets at impact — the enemy set may have shifted during the fall. + private IEnumerator ServerResolveImpactAfterDelay( + BuilderSpellKind kind, ulong clientId, Vector3 targetPoint, float delay) + { + yield return new WaitForSeconds(delay); + if (!IsServer) yield break; + BuilderSpellPool.Instance?.Get(kind)?.ServerCast(clientId, targetPoint); } [ClientRpc] private void PlayVfxClientRpc(BuilderSpellKind kind, Vector3 targetPoint) { - BuilderSpellPool.Instance?.Get(kind)?.ClientPlayVfx(targetPoint); + var def = BuilderSpellPool.Instance?.Get(kind); + if (def == null) return; + + def.ClientSpawnVfx(targetPoint); // spawn the (possibly falling) visual now + + if (def.ImpactDelay <= 0f) + def.ClientPlayImpact(targetPoint); + else + StartCoroutine(ClientPlayImpactAfterDelay(kind, targetPoint, def.ImpactDelay)); + } + + // Client-side: play the impact (sound + any contact visual) when the projectile lands. + // Timed locally off the same ImpactDelay so it stays in lockstep with this peer's own + // falling visual — no second RPC, no double latency. + private IEnumerator ClientPlayImpactAfterDelay( + BuilderSpellKind kind, Vector3 targetPoint, float delay) + { + yield return new WaitForSeconds(delay); + BuilderSpellPool.Instance?.Get(kind)?.ClientPlayImpact(targetPoint); } } } diff --git a/Assets/_Project/Scripts/UI/HUDController.cs b/Assets/_Project/Scripts/UI/HUDController.cs index 7d17387..03cb3b0 100644 --- a/Assets/_Project/Scripts/UI/HUDController.cs +++ b/Assets/_Project/Scripts/UI/HUDController.cs @@ -116,13 +116,17 @@ namespace TD.UI private bool draftSubscribed; private PlayerDraft subscribedDraft; - // Spell hotbar (bottom-ui Section 6). Frame is display:none while the local player + // Spell hotbar (bottom-ui Section 6). Frame is visibility:hidden (but still occupies + // its reserved width, so the centered command bar never shifts) while the local player // has no granted spells; rebuilt on grant (append-only, so this is rare). Cooldown // state changes continuously and has no change event, so it's polled every Update. private VisualElement spellHotbarFrame; private VisualElement spellHotbar; private bool spellLoadoutSubscribed; private PlayerSpellLoadout subscribedSpellLoadout; + // The loadout the hotbar is currently showing — the SELECTED builder's, or null when + // no builder is selected (hotbar hidden). Cooldown polling reads this. + private PlayerSpellLoadout displayedSpellLoadout; private readonly List spellSlotUis = new List(); private readonly struct SpellSlotUi @@ -419,9 +423,10 @@ namespace TD.UI title.style.marginBottom = 6; card.Add(title); - if (option.Icon != null) + var iconSprite = option.ResolveIcon(); + if (iconSprite != null) { - var img = new Image { sprite = option.Icon }; + var img = new Image { sprite = iconSprite }; img.style.width = 48; img.style.height = 48; img.style.marginBottom = 6; @@ -475,23 +480,41 @@ namespace TD.UI // ----- Spell hotbar ------------------------------------------------- - // Rebuilds the hotbar cells from the local player's current loadout. Called on - // OnLoadoutChanged (a new spell granted) — spells are append-only, so this is rare, - // not a per-frame concern. + // Rebuilds the hotbar cells for the SELECTED builder's loadout. Called on selection + // change and on OnLoadoutChanged (a new spell granted). Spells are append-only, so + // this is rare, not a per-frame concern. + // + // The hotbar follows selection: it shows the selected builder's spells and is removed + // entirely when no builder is selected (spells belong to the builder). While a builder + // IS selected, the frame keeps its reserved width (visibility toggle, not display) so + // granting a spell mid-selection doesn't reflow/shift the centered command bar. private void RebuildSpellHotbar() { if (spellHotbar == null) return; spellHotbar.Clear(); spellSlotUis.Clear(); - var loadout = PlayerSpellLoadout.Local; - int slotCount = loadout?.SlotCount ?? 0; + var loadout = GetSelectedBuilderLoadout(); + displayedSpellLoadout = loadout; if (spellHotbarFrame != null) - spellHotbarFrame.style.display = slotCount > 0 ? DisplayStyle.Flex : DisplayStyle.None; + { + if (loadout == null) + { + // No builder selected → remove the slot (the command grid is hidden too). + spellHotbarFrame.style.display = DisplayStyle.None; + return; + } + // Builder selected → keep the reserved slot in layout; toggle only visibility so + // a mid-selection spell grant doesn't jump the command bar. + spellHotbarFrame.style.display = DisplayStyle.Flex; + spellHotbarFrame.style.visibility = + loadout.SlotCount > 0 ? Visibility.Visible : Visibility.Hidden; + } if (loadout == null) return; + int slotCount = loadout.SlotCount; var layout = SpellHotkeys.Layout; for (int i = 0; i < slotCount; i++) { @@ -531,6 +554,17 @@ namespace TD.UI } } + // The loadout the spell hotbar should display: the currently-selected builder's + // (resolved via its owner, so it shows whichever builder is selected — normally the + // local player's), or null when the selection isn't a builder → hotbar hidden. + private PlayerSpellLoadout GetSelectedBuilderLoadout() + { + var selected = SelectionState.Instance?.SelectedObject; + if (selected is Builder builder) + return PlayerSpellLoadout.GetForClient(builder.OwnerClientId); + return null; + } + // Per-frame: dims each slot while on cooldown and shows the remaining whole seconds. // Cooldown has no change event (it advances continuously with server time), so this // has to be polled — cheap at hotbar scale (at most MaxSpellSlots cells). @@ -538,7 +572,7 @@ namespace TD.UI { if (spellSlotUis.Count == 0) return; - var loadout = PlayerSpellLoadout.Local; + var loadout = displayedSpellLoadout; if (loadout == null) return; for (int i = 0; i < spellSlotUis.Count; i++) @@ -1403,6 +1437,10 @@ namespace TD.UI // hides via PopulateGridForSelection when there are no actions. PopulateInfoPanel(selection); PopulateGridForSelection(selection); + + // Section 6 (spell hotbar) follows selection: show the selected builder's spells, + // hide entirely when the selection isn't a builder. + RebuildSpellHotbar(); } /// diff --git a/Assets/_Project/UI/HUD.uss b/Assets/_Project/UI/HUD.uss index 08f154b..34c2a1e 100644 --- a/Assets/_Project/UI/HUD.uss +++ b/Assets/_Project/UI/HUD.uss @@ -169,8 +169,11 @@ flex-shrink: 0; flex-direction: row; align-items: flex-end; /* short sections hug the bottom */ - justify-content: flex-start; - padding: 0 100px; /* margin on either side — the X regions */ + justify-content: center; /* keep the command bar centered at ANY resolution — the row + auto-centers, and re-centers symmetrically when the spell + hotbar appears/disappears */ + padding: 0; /* was 0 100px; reclaimed so a smaller reference resolution + (= bigger HUD) still fits the bar without clipping */ background-color: rgba(0, 0, 0, 0); } diff --git a/Assets/_Project/UI/HUD.uxml b/Assets/_Project/UI/HUD.uxml index f458a3b..d3164ce 100644 --- a/Assets/_Project/UI/HUD.uxml +++ b/Assets/_Project/UI/HUD.uxml @@ -76,7 +76,7 @@ - + /// + /// Volume is the authored scaled by the player's music slider + /// (). Unlike one-shot SFX, the track is + /// continuous, so this subscribes to and + /// re-applies live while the slider is dragged. + /// [RequireComponent(typeof(AudioSource))] public class MusicPlayer : MonoBehaviour { @@ -14,14 +20,36 @@ namespace TD.Audio [Range(0f, 1f)] [SerializeField] private float volume = 1f; + private AudioSource source; + + private void Awake() + { + source = GetComponent(); + } + + private void OnEnable() + { + AudioVolumeSettings.OnChanged += ApplyVolume; + } + + private void OnDisable() + { + AudioVolumeSettings.OnChanged -= ApplyVolume; + } + private void Start() { - var src = GetComponent(); - src.clip = clip; - src.volume = volume; - src.loop = true; - src.playOnAwake = false; - src.Play(); + source.clip = clip; + source.loop = true; + source.playOnAwake = false; + ApplyVolume(); + source.Play(); + } + + private void ApplyVolume() + { + if (source == null) return; + source.volume = volume * AudioVolumeSettings.MusicScalar; } } } diff --git a/Assets/_Project/Scripts/Gameplay/BuilderInputController.cs b/Assets/_Project/Scripts/Gameplay/BuilderInputController.cs index 41eeee6..955f301 100644 --- a/Assets/_Project/Scripts/Gameplay/BuilderInputController.cs +++ b/Assets/_Project/Scripts/Gameplay/BuilderInputController.cs @@ -139,10 +139,11 @@ namespace TD.Gameplay // Escape: clear selection. Allowed during placement mode too — Escape never // means anything else here, and clearing selection during placement is fine. - // Suppressed while chat (or any HUD text field) has focus, since Escape there - // means "cancel typing" and should not also clear the unit selection. + // Suppressed while chat (or any HUD text field) has focus or the gear menu is + // open, since Escape there means "cancel typing" / "back out of the menu" and + // should not also clear the unit selection. if (keyboard != null && keyboard.escapeKey.wasPressedThisFrame - && !HUDController.IsTextInputActive) + && !HUDController.IsUiCapturingInput) { SelectionState.Instance?.Clear(); } @@ -153,7 +154,7 @@ namespace TD.Gameplay // Tab: select the builder, or (if already selected) recenter the camera on it. if (keyboard != null && keyboard.tabKey.wasPressedThisFrame - && !HUDController.IsTextInputActive) + && !HUDController.IsUiCapturingInput) { var selection = SelectionState.Instance; if (selection != null && selection.IsSelected(builder)) diff --git a/Assets/_Project/Scripts/Gameplay/BuilderSpellCastController.cs b/Assets/_Project/Scripts/Gameplay/BuilderSpellCastController.cs index 745ebe8..557fe3d 100644 --- a/Assets/_Project/Scripts/Gameplay/BuilderSpellCastController.cs +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpellCastController.cs @@ -95,7 +95,7 @@ namespace TD.Gameplay private void Update() { - if (!HUDController.IsTextInputActive) + if (!HUDController.IsUiCapturingInput) ScanHotkeys(); if (activeSlot < 0) return; // idle — nothing to aim diff --git a/Assets/_Project/Scripts/Gameplay/CameraController.cs b/Assets/_Project/Scripts/Gameplay/CameraController.cs index bd071d6..4a2009a 100644 --- a/Assets/_Project/Scripts/Gameplay/CameraController.cs +++ b/Assets/_Project/Scripts/Gameplay/CameraController.cs @@ -229,9 +229,10 @@ namespace TD.Gameplay // Keyboard: arrow keys only. WASD is reserved for tower-build hotkeys (the command // grid) — camera panning is arrow keys plus the mouse edge-pan below. Suppressed - // entirely while the player is typing so arrow keys in chat navigate text instead of - // panning. (Edge-pan below stays active since it's mouse-driven.) - var kb = HUDController.IsTextInputActive ? null : Keyboard.current; + // entirely while the player is typing (so arrow keys in chat navigate text instead + // of panning) or while the gear menu is open. Edge-pan below is mouse-driven and + // gated separately by the pointer-over-HUD check, which the menu overlay satisfies. + var kb = HUDController.IsUiCapturingInput ? null : Keyboard.current; if (kb != null) { if (kb.leftArrowKey.isPressed) dir.x -= 1f; diff --git a/Assets/_Project/Scripts/Gameplay/TowerPaintController.cs b/Assets/_Project/Scripts/Gameplay/TowerPaintController.cs index e6c52e0..05a1613 100644 --- a/Assets/_Project/Scripts/Gameplay/TowerPaintController.cs +++ b/Assets/_Project/Scripts/Gameplay/TowerPaintController.cs @@ -73,10 +73,11 @@ namespace TD.Gameplay var keyboard = Keyboard.current; // Right-click or Escape exits paint mode. (Escape is ignored while a HUD text - // field has focus so it means "cancel typing" there, matching other systems.) + // field has focus or the gear menu is open, so it means "cancel typing" / + // "back out of the menu" there, matching other systems.) bool escape = keyboard != null && keyboard.escapeKey.wasPressedThisFrame - && !HUDController.IsTextInputActive; + && !HUDController.IsUiCapturingInput; if (mouse.rightButton.wasPressedThisFrame || escape) { CancelPaint(); diff --git a/Assets/_Project/Scripts/UI/GameMenuView.cs b/Assets/_Project/Scripts/UI/GameMenuView.cs new file mode 100644 index 0000000..7db20bd --- /dev/null +++ b/Assets/_Project/Scripts/UI/GameMenuView.cs @@ -0,0 +1,407 @@ +// Assets/_Project/Scripts/UI/GameMenuView.cs +using UnityEngine; +using UnityEngine.UIElements; +using TD.Audio; + +namespace TD.UI +{ + /// + /// The in-match menu: a gear button in the top-right of the HUD top bar plus a modal + /// overlay with two options — Return to Title Screen and Audio Settings. + /// + /// + /// Ownership. A plain class (not a MonoBehaviour), constructed by + /// and given the HUD's root element — same pattern as + /// MinimapView. Everything is built programmatically and appended last, so it + /// z-orders above the rest of the HUD with no extra UIDocument or PanelSettings. + /// + /// Modality. The overlay is full-screen with + /// , which both dims the match and makes + /// true everywhere — so clicks + /// can't reach towers or the ground underneath. HUDController also sets + /// while it's open, which gates keyboard-driven + /// gameplay (camera pan, hotkeys, Escape handlers). The match does not pause: + /// this is a multiplayer game and waves keep running. + /// + /// Pages. One panel, three swapped bodies: the option list, the audio mixer, + /// and a confirm step for leaving the match. Escape backs out one page at a time and + /// closes from the root page. + /// + public class GameMenuView + { + private enum Page { Root, Audio, ConfirmLeave } + + // ----- Wiring ----------------------------------------------------- + + private readonly System.Action onReturnToTitle; + + private readonly VisualElement overlay; + private readonly Label header; + private readonly VisualElement rootPage; + private readonly VisualElement audioPage; + private readonly VisualElement confirmPage; + + private readonly SliderInt musicSlider; + private readonly Label musicValue; + private readonly SliderInt sfxSlider; + private readonly Label sfxValue; + + private Page page = Page.Root; + + // ----- Public API ------------------------------------------------- + + public bool IsOpen { get; private set; } + + /// The HUD's rootVisualElement. The overlay is appended to it. + /// The top-bar "menu-button" from HUD.uxml. May be null + /// (Escape still works); the gear glyph is painted into it here. + /// Optional sprite for the gear. When null, the icon is drawn + /// procedurally so the button never depends on an art asset existing. + /// Invoked once the player confirms leaving the match. + public GameMenuView(VisualElement root, Button gearButton, Sprite gearIcon, + System.Action onReturnToTitle) + { + this.onReturnToTitle = onReturnToTitle; + + if (gearButton != null) + { + gearButton.text = string.Empty; + gearButton.Add(CreateGearIcon(gearIcon)); + gearButton.clicked += Toggle; + gearButton.tooltip = "Menu (Esc)"; + } + + // ----- Overlay + panel shell ---------------------------------- + + overlay = new VisualElement(); + overlay.style.position = Position.Absolute; + overlay.style.left = 0; + overlay.style.right = 0; + overlay.style.top = 0; + overlay.style.bottom = 0; + overlay.style.alignItems = Align.Center; + overlay.style.justifyContent = Justify.Center; + overlay.style.backgroundColor = new Color(0f, 0f, 0f, 0.55f); + overlay.style.display = DisplayStyle.None; + overlay.pickingMode = PickingMode.Position; + + var panel = new VisualElement(); + panel.style.minWidth = 360; + panel.style.paddingTop = panel.style.paddingBottom = 24; + panel.style.paddingLeft = panel.style.paddingRight = 32; + panel.style.backgroundColor = new Color(0.08f, 0.08f, 0.10f, 0.97f); + panel.style.borderTopWidth = panel.style.borderBottomWidth = + panel.style.borderLeftWidth = panel.style.borderRightWidth = 2; + var border = new Color(0.4f, 0.4f, 0.45f); + panel.style.borderTopColor = panel.style.borderBottomColor = + panel.style.borderLeftColor = panel.style.borderRightColor = border; + panel.style.alignItems = Align.Center; + overlay.Add(panel); + + header = new Label("Menu"); + header.style.fontSize = 24; + header.style.color = Color.white; + header.style.marginBottom = 18; + header.style.unityFontStyleAndWeight = FontStyle.Bold; + panel.Add(header); + + // ----- Page 1: option list ------------------------------------ + + rootPage = new VisualElement(); + rootPage.style.alignItems = Align.Center; + rootPage.Add(MakeMenuButton("Return to Title Screen", () => GoTo(Page.ConfirmLeave))); + rootPage.Add(MakeMenuButton("Audio Settings", () => GoTo(Page.Audio))); + rootPage.Add(MakeMenuButton("Resume", Close)); + panel.Add(rootPage); + + // ----- Page 2: audio mixer ------------------------------------ + + audioPage = new VisualElement(); + audioPage.style.alignItems = Align.Stretch; + audioPage.style.display = DisplayStyle.None; + + audioPage.Add(BuildVolumeRow("Music", AudioVolumeSettings.MusicVolume, + v => AudioVolumeSettings.MusicVolume = v, + out musicSlider, out musicValue)); + audioPage.Add(BuildVolumeRow("Sound Effects", AudioVolumeSettings.SfxVolume, + v => AudioVolumeSettings.SfxVolume = v, + out sfxSlider, out sfxValue)); + + var audioNote = new Label("Sound effects covers spells, towers, building, and enemies."); + audioNote.style.fontSize = 11; + audioNote.style.color = new Color(0.6f, 0.6f, 0.65f); + audioNote.style.marginTop = 4; + audioNote.style.marginBottom = 12; + audioNote.style.whiteSpace = WhiteSpace.Normal; + audioPage.Add(audioNote); + + var audioBack = MakeMenuButton("Back", () => GoTo(Page.Root)); + audioBack.style.alignSelf = Align.Center; + audioPage.Add(audioBack); + panel.Add(audioPage); + + // ----- Page 3: leave confirmation ----------------------------- + + confirmPage = new VisualElement(); + confirmPage.style.alignItems = Align.Center; + confirmPage.style.display = DisplayStyle.None; + + var confirmText = new Label("Leave the match and return to the title screen?"); + confirmText.style.color = new Color(0.88f, 0.88f, 0.9f); + confirmText.style.whiteSpace = WhiteSpace.Normal; + confirmText.style.marginBottom = 16; + confirmText.style.unityTextAlign = TextAnchor.MiddleCenter; + confirmPage.Add(confirmText); + + var confirmRow = new VisualElement(); + confirmRow.style.flexDirection = FlexDirection.Row; + confirmPage.Add(confirmRow); + + var leaveBtn = MakeMenuButton("Leave Match", ConfirmLeave); + leaveBtn.style.marginRight = 12; + leaveBtn.style.minWidth = 150; + confirmRow.Add(leaveBtn); + + var cancelBtn = MakeMenuButton("Cancel", () => GoTo(Page.Root)); + cancelBtn.style.minWidth = 150; + confirmRow.Add(cancelBtn); + panel.Add(confirmPage); + + root.Add(overlay); + } + + public void Open() + { + if (IsOpen) return; + IsOpen = true; + GoTo(Page.Root); + overlay.style.display = DisplayStyle.Flex; + } + + public void Close() + { + if (!IsOpen) return; + IsOpen = false; + overlay.style.display = DisplayStyle.None; + // Volume setters only touch the in-memory pref so a slider drag stays cheap; + // write it out now that the player is done adjusting. + AudioVolumeSettings.Flush(); + } + + public void Toggle() + { + if (IsOpen) Close(); + else Open(); + } + + /// + /// Escape while the menu is open: back out one page, or close from the root page. + /// + public void Back() + { + if (page == Page.Root) Close(); + else GoTo(Page.Root); + } + + // ----- Pages ------------------------------------------------------ + + private void GoTo(Page next) + { + page = next; + + rootPage.style.display = next == Page.Root ? DisplayStyle.Flex : DisplayStyle.None; + audioPage.style.display = next == Page.Audio ? DisplayStyle.Flex : DisplayStyle.None; + confirmPage.style.display = next == Page.ConfirmLeave ? DisplayStyle.Flex : DisplayStyle.None; + + header.text = next switch + { + Page.Audio => "Audio Settings", + Page.ConfirmLeave => "Leave Match", + _ => "Menu", + }; + + // Another surface could have changed the volumes since this page was last + // shown (a future title-screen mixer, a debug command). Re-sync on entry so + // the sliders never display a stale value. + if (next == Page.Audio) SyncSlidersFromSettings(); + } + + private void SyncSlidersFromSettings() + { + // SetValueWithoutNotify: writing the settings value back through the change + // callback would be a no-op today (the setter early-outs on an unchanged value) + // but it's the wrong direction of data flow, so don't. + musicSlider.SetValueWithoutNotify(AudioVolumeSettings.MusicVolume); + musicValue.text = AudioVolumeSettings.MusicVolume.ToString(); + sfxSlider.SetValueWithoutNotify(AudioVolumeSettings.SfxVolume); + sfxValue.text = AudioVolumeSettings.SfxVolume.ToString(); + } + + private void ConfirmLeave() + { + AudioVolumeSettings.Flush(); + IsOpen = false; + overlay.style.display = DisplayStyle.None; + onReturnToTitle?.Invoke(); + } + + // ----- Element builders ------------------------------------------- + + private static Button MakeMenuButton(string text, System.Action onClick) + { + var btn = new Button(() => onClick?.Invoke()) { text = text }; + btn.style.minWidth = 260; + btn.style.height = 40; + btn.style.fontSize = 16; + btn.style.marginBottom = 8; + return btn; + } + + // One mixer row: name, 0..100 slider, live numeric readout. + private static VisualElement BuildVolumeRow(string label, int initial, + System.Action onChange, + out SliderInt slider, out Label valueLabel) + { + var row = new VisualElement(); + row.style.flexDirection = FlexDirection.Row; + // FlexStart, not Center: the labels are aligned to the slider's track by + // AlignLabelsToTrack below, which needs every child's box to start at the same + // top edge. See that method for why centering the boxes isn't enough. + row.style.alignItems = Align.FlexStart; + row.style.marginBottom = 10; + + var name = new Label(label); + name.style.color = new Color(0.88f, 0.88f, 0.9f); + name.style.fontSize = 14; + name.style.width = 110; + name.style.flexShrink = 0; + name.style.unityTextAlign = TextAnchor.MiddleLeft; + row.Add(name); + + slider = new SliderInt(AudioVolumeSettings.MinVolume, AudioVolumeSettings.MaxVolume); + slider.style.width = 200; + slider.style.flexShrink = 0; + slider.SetValueWithoutNotify(initial); + row.Add(slider); + + // Fixed width + right-align so the slider doesn't shift as the number goes + // from 1 to 3 digits while dragging. + var value = new Label(initial.ToString()); + value.style.color = Color.white; + value.style.fontSize = 14; + value.style.width = 40; + value.style.flexShrink = 0; + value.style.unityTextAlign = TextAnchor.MiddleRight; + row.Add(value); + + AlignLabelsToTrack(row, slider, name, value); + + var captured = value; + slider.RegisterValueChangedCallback(evt => + { + captured.text = evt.newValue.ToString(); + onChange(evt.newValue); + }); + + valueLabel = value; + return row; + } + + // Vertically lines the row's text up with the groove the player actually sees. + // + // The default runtime theme gives a horizontal slider a box that's taller than its + // track and does NOT center the track inside it, so `align-items: center` on the row + // centers the *boxes* and leaves the text sitting well below the groove. The exact + // offset is a theme detail, so it's measured rather than hardcoded: with the row + // aligned FlexStart every child's box starts at the same top edge, so giving a label + // a height of twice the track's offset from that edge puts its vertically-centered + // text exactly on the track's center line. + // + // Runs on GeometryChangedEvent (not once at build time) because layout hasn't + // happened yet during construction, and because it needs to re-solve when the panel + // is rescaled or the menu is reopened at a different resolution. + private static void AlignLabelsToTrack(VisualElement row, SliderInt slider, + params Label[] labels) + { + // Align to the *tracker* — the thin groove. Not the drag-container: that's the + // full hit area, tall enough to hold the dragger handle (which overhangs the + // groove on both sides), so its center sits below the groove. Fall back through + // the container to the slider itself if the theme's internal names ever change; + // worst case is the old box-centered look, not a broken layout. + VisualElement track = slider.Q(className: "unity-base-slider__tracker") + ?? slider.Q(className: "unity-base-slider__drag-container") + ?? slider; + + void Align(GeometryChangedEvent _) + { + float rowTop = row.worldBound.y; + float trackCenter = track.worldBound.center.y; + float half = trackCenter - rowTop; + if (half <= 0f || float.IsNaN(half)) return; // pre-layout; a later event fixes it + + foreach (var label in labels) + label.style.height = half * 2f; + } + + row.RegisterCallback(Align); + track.RegisterCallback(Align); + } + + // Gear glyph. Drawn with Painter2D rather than a font glyph or a texture: Unity's + // default runtime font has no U+2699 gear, and a procedural icon keeps the button + // working in any scene without an imported sprite. Pass a sprite to override. + private static VisualElement CreateGearIcon(Sprite icon) + { + var el = new VisualElement(); + el.pickingMode = PickingMode.Ignore; + el.style.flexGrow = 1; + + if (icon != null) + { + el.style.backgroundImage = new StyleBackground(icon); + return el; + } + + el.generateVisualContent += PaintGear; + // generateVisualContent runs against contentRect, which is 0×0 until the first + // layout pass — repaint once the element actually has a size. + el.RegisterCallback(_ => el.MarkDirtyRepaint()); + return el; + } + + private static void PaintGear(MeshGenerationContext ctx) + { + var rect = ctx.visualElement.contentRect; + if (rect.width < 4f || rect.height < 4f) return; + + var painter = ctx.painter2D; + Vector2 center = rect.center; + float outer = Mathf.Min(rect.width, rect.height) * 0.5f - 1f; + float ring = outer * 0.62f; + float hub = outer * 0.24f; + + painter.strokeColor = new Color(0.95f, 0.93f, 0.75f); + painter.lineWidth = Mathf.Max(1.5f, outer * 0.20f); + + // Teeth: radial spokes from just inside the ring out to the edge. + const int teeth = 8; + painter.BeginPath(); + for (int i = 0; i < teeth; i++) + { + float angle = i * Mathf.PI * 2f / teeth; + var dir = new Vector2(Mathf.Cos(angle), Mathf.Sin(angle)); + painter.MoveTo(center + dir * (ring * 0.85f)); + painter.LineTo(center + dir * outer); + } + painter.Stroke(); + + painter.BeginPath(); + painter.Arc(center, ring, new Angle(0f, AngleUnit.Degree), new Angle(360f, AngleUnit.Degree)); + painter.Stroke(); + + painter.BeginPath(); + painter.Arc(center, hub, new Angle(0f, AngleUnit.Degree), new Angle(360f, AngleUnit.Degree)); + painter.Stroke(); + } + } +} diff --git a/Assets/_Project/Scripts/UI/GameMenuView.cs.meta b/Assets/_Project/Scripts/UI/GameMenuView.cs.meta new file mode 100644 index 0000000..0d488ea --- /dev/null +++ b/Assets/_Project/Scripts/UI/GameMenuView.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 0f5b5b3bcd6ea4765a92a784b9c8de13 \ No newline at end of file diff --git a/Assets/_Project/Scripts/UI/HUDController.cs b/Assets/_Project/Scripts/UI/HUDController.cs index 9ff9ca4..488cea9 100644 --- a/Assets/_Project/Scripts/UI/HUDController.cs +++ b/Assets/_Project/Scripts/UI/HUDController.cs @@ -43,6 +43,10 @@ namespace TD.UI [Header("Settings")] [SerializeField] private float rejectionMessageDuration = 2.5f; + [Tooltip("Optional icon for the top-right menu button. Leave empty to use the " + + "procedurally-drawn gear (no art asset required).")] + [SerializeField] private Sprite menuButtonIcon; + [Tooltip("Maximum visible height of the chat feed in pixels. Content past this " + "height is clipped — older messages scroll off the top of the visible area " + "but stay in history (scroll up while chat is open to view).")] @@ -159,6 +163,21 @@ namespace TD.UI // instead of every gameplay script needing to know about every input widget. public static bool IsTextInputActive { get; internal set; } + /// + /// True while a modal UI surface (currently the gear menu) owns the screen. Gameplay + /// systems should treat this exactly like — see + /// , which is the flag they actually gate on. + /// + public static bool IsModalUiOpen { get; private set; } + + /// + /// True when any UI surface is consuming keyboard/mouse input this frame: a focused + /// text field OR an open modal menu. Gameplay input handlers (camera, selection, + /// hotkeys, Escape-to-cancel) gate on this so typing or a menu never doubles as a + /// gameplay command. + /// + public static bool IsUiCapturingInput => IsTextInputActive || IsModalUiOpen; + // Frame until which chat's "Enter opens chat" behavior is suppressed. Other // standalone text-input surfaces (e.g. TD.Dev.DebugConsole) set this when their // own Enter-driven submit/close already consumed the keypress, so the same @@ -183,6 +202,7 @@ namespace TD.UI private bool deckSubscribed; // true once we've hooked the local PlayerTowerDeck.OnDeckChanged private PlayerTowerDeck subscribedDeck; // the deck we hooked, so we can unsubscribe the same instance private MinimapView minimapView; + private GameMenuView gameMenu; // gear button + modal menu overlay private IPanel myPanel; // tracked separately so OnDestroy only clears the static if it still points at us // ----- Hotkeys ---------------------------------------------------- @@ -703,6 +723,12 @@ namespace TD.UI // ChatService.PostLocalSystem on every peer. BuildChatPanel(root); + // Gear menu (top-right of the top bar). Built last so its overlay z-orders + // above every other HUD surface. "Return to Title Screen" reuses the same + // disconnect path as the match-end overlay's button. + gameMenu = new GameMenuView(root, Require public enum EnemyAbilityKind : byte { - /// No ability rolled. Never a real pool entry — only the sentinel value - /// reports before/absent a roll. + /// Sentinel for "no ability". Never a real pool entry. None = 0, + + /// Dies into several smaller, faster copies of itself. SplitOnDeath = 1, + + /// Grounded enemies take to the air, ignoring the maze entirely. + Flight = 2, + + /// Teleports a short distance further along its path on a timer. + Blink = 3, + + /// Grants no kill bounty. + NoBounty = 4, + + /// Steals gold from the player whose zone it escaped, on top of the life cost. + GoldTheft = 5, } } diff --git a/Assets/_Project/Scripts/Core/Enums.cs b/Assets/_Project/Scripts/Core/Enums.cs index 95f979a..7d49400 100644 --- a/Assets/_Project/Scripts/Core/Enums.cs +++ b/Assets/_Project/Scripts/Core/Enums.cs @@ -68,8 +68,12 @@ namespace TD.Core /// /// /// None is a sentinel value used in OwnerGrid to mark tiles not owned by any player zone. - /// Player1..Player9 cover the maximum supported player count. Maps using fewer players use a - /// contiguous prefix (e.g., a 3-player map uses Player1, Player2, Player3 only). + /// Maps use a contiguous prefix of the player values. + /// + /// The enum runs to 9, but only slots are ever + /// allocated. Lobbies capped at 3 for the 2.0 design; the surplus values are kept because + /// they are baked into existing LevelData owner grids, and renumbering the enum would + /// force a re-bake of every map to no runtime benefit. /// /// /// Global phase of a match, driven by MatchState. @@ -92,6 +96,28 @@ namespace TD.Core Defeat = 4, } + /// + /// Which step of the between-encounters sequence is currently running. Replicated by + /// WaveManager so every HUD can label the shared countdown correctly. + /// + /// + /// These run strictly in order and never overlap: players take their personal draft, then vote + /// on the buff for the wave they just cleared, then build. The build timer deliberately does + /// NOT run concurrently with the choices — "after all players have chosen" only means + /// something if it isn't racing a clock players also want to spend on their maze. + /// + public enum InterWaveStage : byte + { + /// No inter-wave step running — a wave is spawning or being fought. + None = 0, + /// Players are picking their personal draft reward. + Draft = 1, + /// Players are voting on the buff for the wave they just cleared. + Vote = 2, + /// Build countdown before the next wave spawns. + Build = 3, + } + /// /// Stable identifier per race. Values 1-16 reserve slots for the planned /// 16-race grid in the lobby; only races with a corresponding diff --git a/Assets/_Project/Scripts/Core/MatchRules.cs b/Assets/_Project/Scripts/Core/MatchRules.cs new file mode 100644 index 0000000..d698547 --- /dev/null +++ b/Assets/_Project/Scripts/Core/MatchRules.cs @@ -0,0 +1,26 @@ +// Assets/_Project/Scripts/Core/MatchRules.cs +namespace TD.Core +{ + /// + /// Match-wide constants that several unrelated systems have to agree on. + /// + public static class MatchRules + { + /// + /// Maximum players in one lobby. + /// + /// + /// Reduced from 9 to 3 for the 2.0 design as a deliberate scope cut: three players + /// is enough for the shared-lives and shared-vote mechanics to matter, and it shrinks map + /// authoring, balance surface, and network load all at once. + /// + /// Why still runs to 9. Shrinking the enum would + /// invalidate the owner grids baked into existing LevelData assets and force a + /// re-bake of every map, for no runtime benefit — the extra values are simply never + /// allocated. Slot allocation caps here instead, which is the only place that decides who + /// gets a slot at all. Per-slot arrays stay sized to the enum, so they hold a few unused + /// entries; that is intentional and costs nothing. + /// + public const int MaxPlayers = 3; + } +} diff --git a/Assets/_Project/Scripts/Core/MatchRules.cs.meta b/Assets/_Project/Scripts/Core/MatchRules.cs.meta new file mode 100644 index 0000000..74bb050 --- /dev/null +++ b/Assets/_Project/Scripts/Core/MatchRules.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ac169573e8a2fd046a3ebac7d2e03c8c \ No newline at end of file diff --git a/Assets/_Project/Scripts/Core/PoolWeightAttribute.cs b/Assets/_Project/Scripts/Core/PoolWeightAttribute.cs new file mode 100644 index 0000000..0bb29d0 --- /dev/null +++ b/Assets/_Project/Scripts/Core/PoolWeightAttribute.cs @@ -0,0 +1,35 @@ +// Assets/_Project/Scripts/Core/PoolWeightAttribute.cs +using UnityEngine; + +namespace TD.Core +{ + /// + /// Marks a float field as a 0–1 relative draw weight inside an authored pool. The + /// inspector renders it as a slider and, when the value is zero, shows a warning directly + /// beneath explaining that the entry can never be drawn. + /// + /// + /// Relative, not absolute. Weights are normalized against the summed weight of the + /// candidate set at draw time, so entries at equal weight are equally likely and an entry at + /// 0.5 is half as likely as one at 1.0. This is why every weight field defaults to 1 — + /// adding an entry to a pool then never silently re-weights the entries already in it. + /// + /// The warning is advisory. Muting an entry while tuning is a legitimate + /// workflow, so the drawer never clamps the value or blocks the edit. It exists because a + /// zero-weight entry is otherwise indistinguishable, in play, from one that simply hasn't come + /// up yet — the failure is silent, so the authoring surface has to be loud. + /// + public class PoolWeightAttribute : PropertyAttribute + { + /// + /// Noun used in the zero-weight warning ("this wave can never be drawn"). Keep it + /// singular and lowercase. + /// + public readonly string Noun; + + public PoolWeightAttribute(string noun = "entry") + { + Noun = string.IsNullOrWhiteSpace(noun) ? "entry" : noun; + } + } +} diff --git a/Assets/_Project/Scripts/Core/PoolWeightAttribute.cs.meta b/Assets/_Project/Scripts/Core/PoolWeightAttribute.cs.meta new file mode 100644 index 0000000..2ce9e75 --- /dev/null +++ b/Assets/_Project/Scripts/Core/PoolWeightAttribute.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e171856d7a8fe194f97091853672c19d \ No newline at end of file diff --git a/Assets/_Project/Scripts/Dev/DevWaveControls.cs b/Assets/_Project/Scripts/Dev/DevWaveControls.cs index 2b941b1..9ffa05e 100644 --- a/Assets/_Project/Scripts/Dev/DevWaveControls.cs +++ b/Assets/_Project/Scripts/Dev/DevWaveControls.cs @@ -33,6 +33,10 @@ namespace TD.Dev "verified now. Set to Key.None to use the OnGUI button only.")] [SerializeField] private Key grantTowerHotkey = Key.F8; + [Tooltip("Keyboard shortcut to skip every remaining encounter in the current phase and " + + "go straight to its boss. Set to Key.None to use the OnGUI button only.")] + [SerializeField] private Key skipToBossHotkey = Key.F7; + private void Update() { var kb = Keyboard.current; @@ -43,6 +47,9 @@ namespace TD.Dev if (grantTowerHotkey != Key.None && kb[grantTowerHotkey].wasPressedThisFrame) TryGrantNextTower(); + + if (skipToBossHotkey != Key.None && kb[skipToBossHotkey].wasPressedThisFrame) + TrySkipToBoss(); } private void OnGUI() @@ -59,11 +66,13 @@ namespace TD.Dev // Anchored below the top HUD bar so it doesn't overlap gold/wave/lives. const float topOffset = 90f; - GUI.Box(new Rect(10, topOffset, 180, 95), "Dev: Wave Controls"); + GUI.Box(new Rect(10, topOffset, 180, 128), "Dev: Wave Controls"); if (GUI.Button(new Rect(20, topOffset + 25, 160, 28), "Force Next Wave")) TryForceNextWave(); if (GUI.Button(new Rect(20, topOffset + 58, 160, 28), "Grant Next Tower")) TryGrantNextTower(); + if (GUI.Button(new Rect(20, topOffset + 91, 160, 28), "Skip To Boss")) + TrySkipToBoss(); } // Dev stand-in for the draft system: grants the local player the first catalog @@ -118,5 +127,27 @@ namespace TD.Dev Debug.Log("[DevWaveControls] Forcing next wave."); wm.ForceAdvanceToNextWave(); } + + // Skips straight to the phase boss so boss content can be tested without playing + // every cycle first. Server-only, like the other cheats. + private void TrySkipToBoss() + { + if (NetworkManager.Singleton == null || !NetworkManager.Singleton.IsServer) + { + Debug.LogWarning("[DevWaveControls] Skip-to-boss requested off the server. Ignored."); + return; + } + + var wm = WaveManager.Instance; + if (wm == null) + { + Debug.LogWarning("[DevWaveControls] WaveManager.Instance is null. " + + "Is the scene running with a WaveManager network-spawned?"); + return; + } + + Debug.Log("[DevWaveControls] Skipping to boss."); + wm.ForceAdvanceToBoss(); + } } } diff --git a/Assets/_Project/Scripts/Editor/Core.meta b/Assets/_Project/Scripts/Editor/Core.meta new file mode 100644 index 0000000..7db3e99 --- /dev/null +++ b/Assets/_Project/Scripts/Editor/Core.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 75cc168bfd0b91b41a313a4389d31910 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Scripts/Editor/Core/PoolWeightDrawer.cs b/Assets/_Project/Scripts/Editor/Core/PoolWeightDrawer.cs new file mode 100644 index 0000000..3321b16 --- /dev/null +++ b/Assets/_Project/Scripts/Editor/Core/PoolWeightDrawer.cs @@ -0,0 +1,66 @@ +// Assets/_Project/Scripts/Editor/Core/PoolWeightDrawer.cs +using UnityEditor; +using UnityEngine; +using TD.Core; + +namespace TD.Editor.Core +{ + /// + /// Draws a field as a 0–1 slider, with an inline warning + /// rendered directly beneath it whenever the weight is zero. + /// + /// + /// Deliberately does not clamp, revert, or disable the field — a designer muting an entry + /// while tuning is normal. The drawer's only job is to make the consequence visible at the + /// point of editing, since a zero-weight entry fails silently at runtime. + /// + [CustomPropertyDrawer(typeof(PoolWeightAttribute))] + public class PoolWeightDrawer : PropertyDrawer + { + // Two lines of text alongside the icon column need more than one line of box height. + private const float HelpBoxLines = 2.4f; + + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + float h = EditorGUIUtility.singleLineHeight; + + if (IsZero(property)) + h += EditorGUIUtility.standardVerticalSpacing + HelpBoxHeight(); + + return h; + } + + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + if (property.propertyType != SerializedPropertyType.Float) + { + EditorGUI.LabelField(position, label.text, "[PoolWeight] only supports float fields."); + return; + } + + var sliderRect = new Rect(position.x, position.y, position.width, + EditorGUIUtility.singleLineHeight); + EditorGUI.Slider(sliderRect, property, 0f, 1f, label); + + if (!IsZero(property)) return; + + var attr = (PoolWeightAttribute)attribute; + var boxRect = new Rect( + position.x, + position.y + EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing, + position.width, + HelpBoxHeight()); + + EditorGUI.HelpBox( + boxRect, + $"Weight is 0 — this {attr.Noun} can never be drawn and will not appear in game. " + + $"Raise it above 0 to put it back in the pool.", + MessageType.Warning); + } + + private static bool IsZero(SerializedProperty property) + => property.propertyType == SerializedPropertyType.Float && property.floatValue <= 0f; + + private static float HelpBoxHeight() => EditorGUIUtility.singleLineHeight * HelpBoxLines; + } +} diff --git a/Assets/_Project/Scripts/Editor/Core/PoolWeightDrawer.cs.meta b/Assets/_Project/Scripts/Editor/Core/PoolWeightDrawer.cs.meta new file mode 100644 index 0000000..3ec645e --- /dev/null +++ b/Assets/_Project/Scripts/Editor/Core/PoolWeightDrawer.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8ba57381fc7e6a3479e59d84e45720d9 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Editor/Gameplay/RunDefinitionEditor.cs b/Assets/_Project/Scripts/Editor/Gameplay/RunDefinitionEditor.cs new file mode 100644 index 0000000..0c08333 --- /dev/null +++ b/Assets/_Project/Scripts/Editor/Gameplay/RunDefinitionEditor.cs @@ -0,0 +1,69 @@ +// Assets/_Project/Scripts/Editor/Gameplay/RunDefinitionEditor.cs +using UnityEditor; +using UnityEngine; +using TD.Gameplay.Waves; + +namespace TD.Editor.Gameplay +{ + /// + /// Inspector for . Draws the normal fields, then a live + /// validation panel reporting whether the authored pools can actually produce a run. + /// + /// + /// The check that matters here is the distinct-enemy-type one: because enemy upgrades are + /// keyed to a wave slot, a phase must be able to fill its cycle with waves that use different + /// enemies. A pool can look healthy (plenty of entries) and still fail that. Reporting it in + /// the inspector turns a startup error into something a designer sees while authoring. + /// + [CustomEditor(typeof(RunDefinition))] + public class RunDefinitionEditor : UnityEditor.Editor + { + public override void OnInspectorGUI() + { + DrawDefaultInspector(); + + var run = (RunDefinition)target; + + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Validation", EditorStyles.boldLabel); + + bool ok = run.Validate(out string report); + EditorGUILayout.HelpBox(report, ok ? MessageType.Info : MessageType.Error); + + // Per-phase capacity readout — the fastest way to see how much headroom a pool has + // before the distinct-type requirement starts biting. + if (run.Phases != null) + { + EditorGUILayout.Space(); + EditorGUILayout.LabelField("Phase capacity", EditorStyles.boldLabel); + + for (int i = 0; i < run.Phases.Length; i++) + { + var phase = run.Phases[i]; + if (phase == null) + { + EditorGUILayout.LabelField($"Phase {i + 1}", "— empty —"); + continue; + } + + int distinct = phase.CountDistinctEnemyTypes(); + string value = $"{distinct} distinct enemy type(s) / {run.WavesPerCycle} needed"; + var style = new GUIStyle(EditorStyles.label) + { + normal = { textColor = distinct >= run.WavesPerCycle + ? EditorStyles.label.normal.textColor + : new Color(0.9f, 0.4f, 0.3f) } + }; + EditorGUILayout.LabelField(phase.Label, value, style); + } + } + + EditorGUILayout.Space(); + if (GUILayout.Button("Rebuild Wave Index")) + { + run.RebuildIndex(); + Debug.Log($"[RunDefinition] Rebuilt wave index: {run.WaveCount} distinct wave(s)."); + } + } + } +} diff --git a/Assets/_Project/Scripts/Editor/Gameplay/RunDefinitionEditor.cs.meta b/Assets/_Project/Scripts/Editor/Gameplay/RunDefinitionEditor.cs.meta new file mode 100644 index 0000000..2b46f6d --- /dev/null +++ b/Assets/_Project/Scripts/Editor/Gameplay/RunDefinitionEditor.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5f5e8e0197efd154b92817bbb3028b35 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/Draft/DraftService.cs b/Assets/_Project/Scripts/Gameplay/Draft/DraftService.cs index 3b9ea5f..f95a423 100644 --- a/Assets/_Project/Scripts/Gameplay/Draft/DraftService.cs +++ b/Assets/_Project/Scripts/Gameplay/Draft/DraftService.cs @@ -82,7 +82,7 @@ namespace TD.Gameplay.Draft draft.ServerOffer(resultScratch); } - /// Server-only: auto-resolve any unpicked drafts (called at prep end). + /// Server-only: auto-resolve any unpicked drafts (called when the timer expires). public void ServerAutoResolveAll() { if (!IsServer) return; @@ -90,6 +90,29 @@ namespace TD.Gameplay.Draft PlayerDraft.GetForClient(pms.OwnerClientId)?.ServerAutoResolve(); } + /// + /// True once every connected player has resolved their draft. The inter-wave step polls + /// this to end the draft timer early instead of making everyone wait out the clock. + /// + /// + /// Returns false when nobody is connected, so an empty lobby can't trip the barrier and + /// race the sequence forward. + /// + public static bool AllPlayersPicked + { + get + { + bool any = false; + foreach (var pms in PlayerMatchState.AllPlayers) + { + any = true; + var draft = PlayerDraft.GetForClient(pms.OwnerClientId); + if (draft != null && draft.HasActiveDraft) return false; + } + return any; + } + } + // ----- Generation ------------------------------------------------- // Weighted random draw WITHOUT replacement: picks `count` distinct option ids from diff --git a/Assets/_Project/Scripts/Gameplay/Draft/PlayerDraft.cs b/Assets/_Project/Scripts/Gameplay/Draft/PlayerDraft.cs index 41a7c04..1ac355b 100644 --- a/Assets/_Project/Scripts/Gameplay/Draft/PlayerDraft.cs +++ b/Assets/_Project/Scripts/Gameplay/Draft/PlayerDraft.cs @@ -18,7 +18,10 @@ namespace TD.Gameplay.Draft /// Authority. The server offers (), resolves /// ( / ), and applies the /// chosen option. The owning client only sends intent via - /// and . + /// . + /// + /// The paid reroll is disabled for the 2.0 MVP — see the commented-out block at + /// the bottom of this file for why it was kept rather than removed. /// /// Generation lives in ; this component is just /// the replicated state + the pick/buy entry points. @@ -143,25 +146,38 @@ namespace TD.Gameplay.Draft ServerResolve(optionId); } - /// - /// Owning client: buy a fresh roll of options for gold. Rejected if the player can't - /// afford it or already has an unresolved draft (resolve the current one first so a - /// free pick is never silently overwritten). - /// - [Rpc(SendTo.Server, InvokePermission = RpcInvokePermission.Owner)] - public void RequestBuyRerollRpc() - { - if (HasActiveDraft) return; // resolve the pending draft before buying another - - var service = DraftService.Instance; - if (service == null) return; - - var gold = PlayerGoldManager.GetForClient(OwnerClientId); - int cost = service.RerollCost; - if (gold == null || gold.CurrentGold < cost) return; - - gold.DeductGold(cost); - service.ServerOfferTo(OwnerClientId); - } + // ----- Extra-draft shop (DISABLED for the 2.0 MVP) -------------------- + // + // Kept rather than deleted: the shop is expected back, but as a SHARED gold sink — the + // whole lobby pools money toward one collective extra draft for everyone — rather than + // the per-player reroll implemented here. When it returns, this method is the wrong shape + // (per-player deduction, per-player offer) but the surrounding plumbing is right, so it + // stays as the reference for what to rebuild against. + // + // Re-enabling this alone would also break the inter-wave barrier: DraftService. + // AllPlayersPicked ends the draft stage the moment everyone has resolved, so a player + // buying a roll after that point would be offered cards the sequence has already moved + // past. + // + // /// + // /// Owning client: buy a fresh roll of options for gold. Rejected if the player can't + // /// afford it or already has an unresolved draft (resolve the current one first so a + // /// free pick is never silently overwritten). + // /// + // [Rpc(SendTo.Server, InvokePermission = RpcInvokePermission.Owner)] + // public void RequestBuyRerollRpc() + // { + // if (HasActiveDraft) return; // resolve the pending draft before buying another + // + // var service = DraftService.Instance; + // if (service == null) return; + // + // var gold = PlayerGoldManager.GetForClient(OwnerClientId); + // int cost = service.RerollCost; + // if (gold == null || gold.CurrentGold < cost) return; + // + // gold.DeductGold(cost); + // service.ServerOfferTo(OwnerClientId); + // } } } diff --git a/Assets/_Project/Scripts/Gameplay/Draft/TowerUpgradeDraftOption.cs b/Assets/_Project/Scripts/Gameplay/Draft/TowerUpgradeDraftOption.cs index 7746e3e..841d627 100644 --- a/Assets/_Project/Scripts/Gameplay/Draft/TowerUpgradeDraftOption.cs +++ b/Assets/_Project/Scripts/Gameplay/Draft/TowerUpgradeDraftOption.cs @@ -5,52 +5,62 @@ using TD.Towers; namespace TD.Gameplay.Draft { /// - /// Draft choice — "upgrade a tower you already have". Replaces - /// with in the player's : every - /// tower of that type placed from now on is the upgraded version. Already-placed towers - /// are unaffected. + /// Draft choice — "unlock an upgrade". Adds to the player's + /// set, letting them spend gold converting a placed + /// into it. The base tower stays buildable. /// /// - /// Mirrors , but swaps rather than adds. Only offered - /// while the player currently has unlocked — once taken, - /// is removed from the deck, which automatically makes this option - /// (and any sibling upgrade branching off the same base) invalid for future drafts. + /// Unlock, not swap. This option used to replace the base tower in the player's + /// deck, which made the draft pick itself the whole upgrade — free, instant, and retroactive to + /// every tower built afterward. The 2.0 model splits it: the draft grants access, gold + /// grants the tower. So the deck is untouched here and already-placed towers are + /// upgraded one at a time, each paid for. + /// + /// Prerequisites fall out of the tree. An upgrade is offerable only once its + /// parent is reachable — either the parent is a base tower in the player's deck, or it's an + /// upgrade node they've already unlocked. That single rule is what gates deep nodes behind + /// shallow ones without any explicit prerequisite list: authoring the tree in + /// is enough. /// [CreateAssetMenu(fileName = "TowerUpgradeOption", menuName = "TD/Draft/Tower Upgrade Option")] public class TowerUpgradeDraftOption : DraftOption { [Header("Payload")] - [Tooltip("The tower this option upgrades from. Must be present in the player's deck " + - "for this option to be offered.")] + [Tooltip("The tower this upgrade branches from — the tree node that must already be " + + "reachable (in the player's deck, or itself an unlocked upgrade) for this " + + "option to be offered.")] public TowerDefinition BaseTower; - [Tooltip("The tower this option upgrades to. Must also be present in the " + - "TowerPlacementManager catalog (that's where its TowerTypeId comes from).")] + [Tooltip("The tower this option unlocks as an upgrade target. Must be in the " + + "TowerPlacementManager catalog (that's where its TowerTypeId comes from) and " + + "should be listed in BaseTower's UpgradePaths so the conversion is legal.")] public TowerDefinition UpgradedTower; public override bool IsValidFor(ulong clientId) { - var deck = PlayerTowerDeck.GetForClient(clientId); - var pm = TowerPlacementManager.Instance; - if (deck == null || pm == null || BaseTower == null || UpgradedTower == null) return false; + var deck = PlayerTowerDeck.GetForClient(clientId); + var upgrades = PlayerTowerUpgrades.GetForClient(clientId); + var pm = TowerPlacementManager.Instance; - if (!pm.TryGetTypeId(BaseTower, out int baseTypeId)) return false; + if (deck == null || upgrades == null || pm == null) return false; + if (BaseTower == null || UpgradedTower == null) return false; - return deck.Contains(baseTypeId); + if (!pm.TryGetTypeId(BaseTower, out int baseTypeId)) return false; + if (!pm.TryGetTypeId(UpgradedTower, out int upgradedTypeId)) return false; + + // Already unlocked — offering it again would waste the pick. + if (upgrades.Contains(upgradedTypeId)) return false; + + // The parent must be reachable: a base tower they can build, or an upgrade they've + // already taken. This is the whole prerequisite mechanism. + return deck.Contains(baseTypeId) || upgrades.Contains(baseTypeId); } public override bool ServerApply(ulong clientId) { - var deck = PlayerTowerDeck.GetForClient(clientId); - var pm = TowerPlacementManager.Instance; - if (deck == null || pm == null || BaseTower == null || UpgradedTower == null) return false; - - if (!pm.TryGetTypeId(BaseTower, out int baseTypeId)) - { - Debug.LogError($"[TowerUpgradeDraftOption] '{BaseTower.name}' is not in the tower " + - $"catalog; cannot apply. Add it to TowerPlacementManager.towerDefinitions."); - return false; - } + var upgrades = PlayerTowerUpgrades.GetForClient(clientId); + var pm = TowerPlacementManager.Instance; + if (upgrades == null || pm == null || UpgradedTower == null) return false; if (!pm.TryGetTypeId(UpgradedTower, out int upgradedTypeId)) { @@ -60,7 +70,7 @@ namespace TD.Gameplay.Draft return false; } - return deck.ServerUpgradeTower(baseTypeId, upgradedTypeId); + return upgrades.ServerUnlock(upgradedTypeId); } /// Inherits the upgraded tower's icon unless this option assigns an override. diff --git a/Assets/_Project/Scripts/Gameplay/EnemyAbilities/BlinkAbilityDefinition.cs b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/BlinkAbilityDefinition.cs new file mode 100644 index 0000000..236c8b7 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/BlinkAbilityDefinition.cs @@ -0,0 +1,60 @@ +// Assets/_Project/Scripts/Gameplay/EnemyAbilities/BlinkAbilityDefinition.cs +using UnityEngine; +using TD.Core; + +namespace TD.Gameplay.EnemyAbilities +{ + /// + /// Every few seconds, the enemy teleports a short distance further along its path — skipping + /// tiles, and the towers covering them. + /// + /// + /// Blinks follow the path rather than cutting toward the goal, so the maze still shapes the + /// route; the buff shortens time-under-fire rather than bypassing walls. See + /// EnemyMovement.ServerBlinkForward. + /// + /// The cooldown lives in this enemy's own timer slot rather than on the asset. A field + /// here would be shared by every enemy carrying the buff, so the whole wave would blink in + /// perfect unison — which looks like a bug even when the timing is right. + /// + [CreateAssetMenu(fileName = "BlinkAbility", menuName = "TD/Enemy Abilities/Blink")] + public class BlinkAbilityDefinition : EnemyAbilityDefinition + { + public override EnemyAbilityKind Kind => EnemyAbilityKind.Blink; + + [Header("Blink")] + [Tooltip("Seconds between blinks.")] + [Min(0.1f)] + public float IntervalSeconds = 4f; + + [Tooltip("How many path waypoints to skip per blink. Note that path smoothing can make " + + "one waypoint span several tiles, so this is a coarser dial than it looks.")] + [Min(1)] + public int BlinkWaypoints = 2; + + [Tooltip("Random spread (seconds) added to each enemy's first blink so a wave doesn't " + + "blink in one synchronized block. Applied once, at spawn.")] + [Min(0f)] + public float StartJitterSeconds = 1.5f; + + public override void ServerOnSpawn(EnemyAbility instance, int abilityIndex) + { + // Seed each enemy's cooldown with a different negative offset so the wave's first + // blink is staggered. Done once, here, rather than on the first tick — a tick-time + // check would have to distinguish "never started" from "just blinked", and both + // states read as a zero timer. + if (StartJitterSeconds > 0f) + instance.TimerFor(abilityIndex) = -Random.Range(0f, StartJitterSeconds); + } + + public override void ServerTick(EnemyAbility instance, int abilityIndex, float dt) + { + ref float timer = ref instance.TimerFor(abilityIndex); + timer += dt; + if (timer < IntervalSeconds) return; + + timer = 0f; + instance.GetComponent()?.ServerBlinkForward(BlinkWaypoints); + } + } +} diff --git a/Assets/_Project/Scripts/Gameplay/EnemyAbilities/BlinkAbilityDefinition.cs.meta b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/BlinkAbilityDefinition.cs.meta new file mode 100644 index 0000000..b7af88b --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/BlinkAbilityDefinition.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4fbb09f55384ac44399ac4655b2b53ec \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemyAbilityDefinition.cs b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemyAbilityDefinition.cs index 349b0ee..d80b430 100644 --- a/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemyAbilityDefinition.cs +++ b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemyAbilityDefinition.cs @@ -5,21 +5,28 @@ using TD.Core; namespace TD.Gameplay.EnemyAbilities { /// - /// Base class for one enemy ability (e.g. "split into smaller enemies on death"). Rolled - /// at random for each spawned enemy by and applied - /// via . + /// Base class for one enemy ability (e.g. "split into smaller enemies on death"). Abilities + /// are attached to a wave slot by the post-wave player vote, and every enemy that wave + /// spawns from then on carries the whole accumulated set. /// /// - /// One asset per kind. is fixed per subclass, same as - /// . uses - /// it to build a fixed-size, enum-indexed lookup table. + /// Assignment is deterministic, not random. This system originally rolled an + /// ability per individual enemy against a no-ability weight. Under the 2.0 design the players + /// choose it, it applies to every enemy in the wave, and it persists for the rest of the phase + /// — so the roll is gone and WaveManager reads the slot's set instead. What survived is + /// the shape: one asset per kind, server-only hooks. /// - /// Server-only hooks. All three hooks below only ever run on the server — - /// only calls them when IsServer is true. and are no-ops for abilities that don't - /// need spawn-time setup or a per-frame timer (e.g. Split on Death uses neither); they exist - /// so a future cooldown-driven ability (disable towers, teleport) doesn't need a base-class - /// change. + /// Abilities stack. A wave can collect several across a phase's cycles, so an + /// enemy holds a list and every hook below runs once per ability. Implementations must not + /// assume they are the only ability on the enemy. + /// + /// Server-only hooks. All hooks run on the server only — + /// gates every call on IsServer. They default to no-ops so a new card only overrides the + /// one or two it actually needs. + /// + /// No per-enemy state on the asset. A single asset is shared by every enemy + /// carrying the ability, across every wave and match. Anything per-instance belongs on the + /// component or the enemy itself. /// public abstract class EnemyAbilityDefinition : ScriptableObject { @@ -27,29 +34,74 @@ namespace TD.Gameplay.EnemyAbilities public abstract EnemyAbilityKind Kind { get; } [Header("Presentation")] - [Tooltip("Name shown in debug logs and future enemy-info UI.")] + [Tooltip("Name shown in debug logs and the enemy-info panel.")] public string DisplayName; - [Tooltip("Short description shown in future enemy-info UI.")] + [Tooltip("Short description shown in the enemy-info panel.")] [TextArea(2, 4)] public string Description; - [Header("Selection")] - [Tooltip("Relative weight of this ability being rolled, vs. the pool's other abilities " + - "and its no-ability chance. Same semantics as DraftOption.Weight.")] - [Min(0f)] - public float Weight = 1f; + // ----- Spawn-time stat modification -------------------------------- - /// Server-only: called once, right after this ability is assigned (before the + /// + /// Server-only: alter what this enemy spawns as, before it is built. Runs for every enemy + /// of the buffed wave. Default no-op. + /// + /// + /// This is the hook for cards that change what an enemy fundamentally is — flight, + /// health, speed, size. It must run before the enemy exists, because spawn position + /// (flyers are raised) and EnemyHealth/EnemyMovement initialization all read + /// these values once and keep them. + /// + /// When several abilities stack, they see each other's edits in application order, + /// so multiplicative modifiers compose naturally. Prefer multiplying over assigning for + /// anything numeric, or the last card to run silently wins. + /// + public virtual void ServerModifySpawn(ref EnemySpawnContext context) { } + + // ----- Lifetime hooks ---------------------------------------------- + + /// Server-only: called once, right after the ability set is assigned (before the /// enemy's NetworkObject is spawned to clients). Default no-op. - public virtual void ServerOnSpawn(EnemyAbility instance) { } + /// This ability's slot on — the + /// same index receives, so per-enemy timers can be seeded here. + public virtual void ServerOnSpawn(EnemyAbility instance, int abilityIndex) { } - /// Server-only: called every frame this ability is active on a live enemy. - /// Default no-op. - public virtual void ServerTick(EnemyAbility instance, float dt) { } + /// + /// Server-only: called every frame this ability is active on a live enemy. Default no-op. + /// + /// This ability's slot on . Pass it + /// to to reach a per-enemy float this ability owns. + /// + /// The asset holds no per-enemy state. One + /// instance is shared by every enemy carrying the ability, so a cooldown stored in a field + /// here would be shared by the entire wave — every enemy would blink in lockstep, or worse, + /// race each other's writes. gives each enemy its own + /// slot by reference, which is enough for the timer-driven abilities and costs no + /// allocation. + /// + public virtual void ServerTick(EnemyAbility instance, int abilityIndex, float dt) { } /// Server-only: called the instant the enemy's HP reaches zero, before the /// death animation/despawn sequence plays. Default no-op. public virtual void ServerOnDeath(EnemyAbility instance, EnemyHealth health) { } + + // ----- Economy hooks ----------------------------------------------- + + /// + /// Server-only: adjust the gold a player earns for killing this enemy. Returns the reward + /// to pass on; default is unchanged. + /// + /// + /// Chained across a stacked ability set, each ability receiving the previous one's result. + /// Callers clamp the final value at zero, so returning a negative is safe but pointless. + /// + public virtual int ServerModifyKillReward(EnemyAbility instance, int reward) => reward; + + /// + /// Server-only: called when this enemy reaches the defense point, after lives have been + /// deducted. The hook for leak-punishing cards that cost more than lives. Default no-op. + /// + public virtual void ServerOnReachedGoal(EnemyAbility instance, PlayerSlot originZone) { } } } diff --git a/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemyAbilityPool.cs b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemyAbilityPool.cs index 30fe26c..09a0880 100644 --- a/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemyAbilityPool.cs +++ b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemyAbilityPool.cs @@ -13,8 +13,12 @@ namespace TD.Gameplay.EnemyAbilities /// /// /// Plain MonoBehaviour: identical on every peer (same assets), so there is nothing to sync. - /// Only the server calls (at enemy spawn time, in - /// WaveManager.SpawnEnemy). + /// + /// Lookup only — no rolling. This pool used to draw a random ability per spawned + /// enemy against a "no ability" weight. Under the 2.0 design abilities are chosen by the + /// players' post-wave vote and apply to every enemy in the wave, so the draw moved to + /// WaveVote (over cards, not abilities) and this is purely the kind→asset table + /// WaveManager resolves against at spawn time. /// public class EnemyAbilityPool : MonoBehaviour { @@ -25,11 +29,6 @@ namespace TD.Gameplay.EnemyAbilities "its slot.")] [SerializeField] private EnemyAbilityDefinition[] abilities; - [Tooltip("Relative weight of an enemy rolling no ability at all, vs. the combined " + - "weight of every entry in 'abilities'. Higher = abilities are rarer.")] - [Min(0f)] - [SerializeField] private float noAbilityWeight = 100f; - // Fixed-size, enum-indexed lookup built once in Awake. Sized to the enum's entry count, // not authored count, so an out-of-range Kind is a compile-time impossibility rather // than a bounds check we'd otherwise need on every Get(). @@ -68,35 +67,5 @@ namespace TD.Gameplay.EnemyAbilities int i = (int)kind; return (byKind != null && i >= 0 && i < byKind.Length) ? byKind[i] : null; } - - /// - /// Server-only: weighted random draw across every authored ability plus the - /// no-ability bucket. Returns null when "no ability" is drawn, or when the pool has - /// nothing authored. - /// - public EnemyAbilityDefinition RollRandom() - { - if (abilities == null || abilities.Length == 0) return null; - - float total = noAbilityWeight; - for (int i = 0; i < abilities.Length; i++) - if (abilities[i] != null) total += abilities[i].Weight; - - if (total <= 0f) return null; - - float roll = UnityEngine.Random.Range(0f, total); - if (roll < noAbilityWeight) return null; - roll -= noAbilityWeight; - - for (int i = 0; i < abilities.Length; i++) - { - var def = abilities[i]; - if (def == null) continue; - if (roll < def.Weight) return def; - roll -= def.Weight; - } - - return null; - } } } diff --git a/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemySpawnContext.cs b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemySpawnContext.cs new file mode 100644 index 0000000..d643fcf --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemySpawnContext.cs @@ -0,0 +1,42 @@ +// Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemySpawnContext.cs +namespace TD.Gameplay.EnemyAbilities +{ + /// + /// Mutable per-spawn copy of an enemy's stats, handed to each of its abilities before the + /// enemy is built so they can alter what it spawns as. + /// + /// + /// Why a context rather than more parameters. Wave buffs like "grounded enemies become + /// flying" or "enemies spawn at half health" have to land before + /// EnemyHealth.InitializeServer and before the spawn position is computed (flyers are + /// raised by their flight height). Threading each new stat through SpawnEnemy as another + /// argument was already unwieldy at two; this keeps the signature flat and gives abilities one + /// obvious place to write. + /// + /// Seeded from the , never written back to it — the + /// definition is a shared asset and a buff that mutated it would leak across waves, matches, + /// and (in the editor) sessions. + /// + public struct EnemySpawnContext + { + public float MaxHp; + public float MoveSpeed; + public bool IsFlying; + public float FlightHeight; + public int LivesCost; + + /// Uniform transform scale relative to the prefab's authored scale. + public float VisualScale; + + /// Seeds a context from an enemy definition's authored stats. + public static EnemySpawnContext FromDefinition(EnemyDefinition def) => new EnemySpawnContext + { + MaxHp = def.MaxHp, + MoveSpeed = def.MoveSpeed, + IsFlying = def.IsFlying, + FlightHeight = def.FlightHeight, + LivesCost = def.LivesCost, + VisualScale = 1f, + }; + } +} diff --git a/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemySpawnContext.cs.meta b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemySpawnContext.cs.meta new file mode 100644 index 0000000..d812b43 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemySpawnContext.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2f4b0f77b422a474cbe82f3967e6195b \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/EnemyAbilities/FlightAbilityDefinition.cs b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/FlightAbilityDefinition.cs new file mode 100644 index 0000000..322b2cf --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/FlightAbilityDefinition.cs @@ -0,0 +1,53 @@ +// Assets/_Project/Scripts/Gameplay/EnemyAbilities/FlightAbilityDefinition.cs +using UnityEngine; +using TD.Core; + +namespace TD.Gameplay.EnemyAbilities +{ + /// + /// Grounded enemies take to the air: they path over the baked terrain grid instead of through + /// the maze, and towers flagged ground-only can no longer touch them. + /// + /// + /// The single most punishing card in the set, because it doesn't weaken the maze — it + /// deletes it. Everything a player built to lengthen the route stops mattering for that wave, + /// and only their anti-air coverage counts. Weight it accordingly in the pools. + /// + /// Purely a spawn-time change: EnemyMovement reads the flying flag once at + /// initialization to pick which grid to path on and to opt out of re-path scheduling, and + /// TowerCombat reads the replicated flag on EnemyHealth when filtering targets. + /// Both are already wired for flight — this card only has to flip the bit before the enemy is + /// built. + /// + [CreateAssetMenu(fileName = "FlightAbility", menuName = "TD/Enemy Abilities/Flight")] + public class FlightAbilityDefinition : EnemyAbilityDefinition + { + public override EnemyAbilityKind Kind => EnemyAbilityKind.Flight; + + [Header("Flight")] + [Tooltip("Height above the ground these enemies hover at. Keep modest — tower targeting " + + "uses 3D range, so altitude eats into the effective reach of anything that CAN " + + "shoot them.")] + [Min(0f)] + public float FlightHeight = 3f; + + [Tooltip("Speed multiplier applied when the enemy takes flight. Flying enemies travel a " + + "much shorter route, so values below 1 are a reasonable counterweight.")] + [Range(0.1f, 2f)] + public float SpeedMultiplier = 1f; + + public override void ServerModifySpawn(ref EnemySpawnContext context) + { + // Already-flying enemies keep their authored height rather than being overwritten by + // this card's — the wave was designed around it, and stacking Flight onto a flier + // shouldn't quietly relocate it. + if (!context.IsFlying) + { + context.IsFlying = true; + context.FlightHeight = FlightHeight; + } + + context.MoveSpeed *= SpeedMultiplier; + } + } +} diff --git a/Assets/_Project/Scripts/Gameplay/EnemyAbilities/FlightAbilityDefinition.cs.meta b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/FlightAbilityDefinition.cs.meta new file mode 100644 index 0000000..82e8217 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/FlightAbilityDefinition.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: be77d353621f07e40bbdab2e9cc37f51 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/EnemyAbilities/GoldTheftAbilityDefinition.cs b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/GoldTheftAbilityDefinition.cs new file mode 100644 index 0000000..974b59f --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/GoldTheftAbilityDefinition.cs @@ -0,0 +1,53 @@ +// Assets/_Project/Scripts/Gameplay/EnemyAbilities/GoldTheftAbilityDefinition.cs +using UnityEngine; +using TD.Core; + +namespace TD.Gameplay.EnemyAbilities +{ + /// + /// An enemy that reaches the defense point doesn't just cost a life — it robs the player whose + /// maze it escaped. + /// + /// + /// Charged to the origin zone, not the whole team. Lives are a shared pool, so a leak + /// already punishes everyone equally; billing the gold to whoever let it through is the part + /// that makes this card bite differently from "enemies cost 2 lives". It also keeps the blame + /// legible — the player who leaked is the player who pays. + /// + /// Deducting more gold than a player has simply empties them; there is no debt. Going + /// negative would silently disable building until they clawed back to zero, which reads as a + /// broken HUD rather than a penalty. + /// + [CreateAssetMenu(fileName = "GoldTheftAbility", menuName = "TD/Enemy Abilities/Gold Theft")] + public class GoldTheftAbilityDefinition : EnemyAbilityDefinition + { + public override EnemyAbilityKind Kind => EnemyAbilityKind.GoldTheft; + + [Header("Theft")] + [Tooltip("Flat gold taken from the leaking player, on top of the normal life cost.")] + [Min(0)] + public int GoldStolen = 15; + + public override void ServerOnReachedGoal(EnemyAbility instance, PlayerSlot originZone) + { + if (GoldStolen <= 0 || originZone == PlayerSlot.None) return; + + var pms = PlayerMatchState.GetForSlot(originZone); + if (pms == null) return; + + var gold = PlayerGoldManager.GetForClient(pms.OwnerClientId); + if (gold == null) return; + + // Clamp to what they actually hold — a leak shouldn't be able to put a player in debt. + int taken = Mathf.Min(GoldStolen, gold.CurrentGold); + if (taken <= 0) return; + + gold.DeductGold(taken); + + // Surface it in-world on every peer so the loss isn't just a number quietly ticking + // down in the corner. Routed through WaveManager because the popup has to reach + // clients and a ScriptableObject has no NetworkBehaviour to send from. + WaveManager.Instance?.ServerBroadcastGoldLoss(instance.transform.position, taken); + } + } +} diff --git a/Assets/_Project/Scripts/Gameplay/EnemyAbilities/GoldTheftAbilityDefinition.cs.meta b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/GoldTheftAbilityDefinition.cs.meta new file mode 100644 index 0000000..aa23919 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/GoldTheftAbilityDefinition.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3b770ce042b78f44d9a3df537fe25db0 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/EnemyAbilities/NoBountyAbilityDefinition.cs b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/NoBountyAbilityDefinition.cs new file mode 100644 index 0000000..42d2bab --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/NoBountyAbilityDefinition.cs @@ -0,0 +1,34 @@ +// Assets/_Project/Scripts/Gameplay/EnemyAbilities/NoBountyAbilityDefinition.cs +using UnityEngine; +using TD.Core; + +namespace TD.Gameplay.EnemyAbilities +{ + /// + /// Killing these enemies pays little or nothing. The wave gets no harder to survive — it gets + /// harder to profit from. + /// + /// + /// Attacks the economy, not the maze. Every other card makes a wave more dangerous; + /// this one makes clearing it worthless, which compounds instead across cycles — a wave that + /// pays nothing on cycle 1 also pays nothing on cycles 2 and 3, so the players who voted it in + /// are choosing to be poorer for the rest of the phase. That slow squeeze is the point, and + /// it's why the card reads as mild and isn't. + /// + /// Wave-completion and no-leak bonuses are untouched — those are paid per player by + /// WaveManager, not per kill, so a wave carrying this still rewards clearing it. + /// + [CreateAssetMenu(fileName = "NoBountyAbility", menuName = "TD/Enemy Abilities/No Bounty")] + public class NoBountyAbilityDefinition : EnemyAbilityDefinition + { + public override EnemyAbilityKind Kind => EnemyAbilityKind.NoBounty; + + [Header("Bounty")] + [Tooltip("Fraction of the normal kill bounty these enemies still pay. 0 = nothing at all.")] + [Range(0f, 1f)] + public float BountyMultiplier = 0f; + + public override int ServerModifyKillReward(EnemyAbility instance, int reward) + => Mathf.FloorToInt(reward * BountyMultiplier); + } +} diff --git a/Assets/_Project/Scripts/Gameplay/EnemyAbilities/NoBountyAbilityDefinition.cs.meta b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/NoBountyAbilityDefinition.cs.meta new file mode 100644 index 0000000..a2f48ff --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/NoBountyAbilityDefinition.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: fd5b12948b24e9c4c8840ef3470b437e \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/EnemyAbilities/SplitOnDeathAbilityDefinition.cs b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/SplitOnDeathAbilityDefinition.cs index 48bf7c6..1d96391 100644 --- a/Assets/_Project/Scripts/Gameplay/EnemyAbilities/SplitOnDeathAbilityDefinition.cs +++ b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/SplitOnDeathAbilityDefinition.cs @@ -7,32 +7,60 @@ namespace TD.Gameplay.EnemyAbilities /// /// On death, spawns smaller copies of the dying enemy's own type at /// the corpse's position, continuing on toward the goal instead of restarting from the wave's - /// spawner. There's no separate "minion" EnemyDefinition to author — the mini copies reuse - /// whichever EnemyDefinition/prefab the dying enemy itself was spawned from, scaled down by - /// /. + /// spawner. /// + /// + /// No separate minion asset. The copies reuse whichever + /// and prefab the dying enemy was spawned from; every stat is expressed here as a percentage + /// of what the parent actually spawned with, so one card covers any enemy it lands on. + /// + /// Percentages are of the PARENT, not the asset. If other cards on the same wave + /// have already modified the enemy, the minions scale off the modified values — a split of a + /// buffed enemy produces buffed minions, which is what players will expect from watching it. + /// + /// Minions inherit no abilities at all — not even this one. That is what makes the + /// recursion terminate: a minion of a splitting enemy is a plain enemy, so a wave carrying + /// Split produces exactly one extra generation regardless of how many other cards it has + /// collected. Enforced at the spawn site, not here. + /// [CreateAssetMenu(fileName = "SplitOnDeathAbility", menuName = "TD/Enemy Abilities/Split On Death")] public class SplitOnDeathAbilityDefinition : EnemyAbilityDefinition { public override EnemyAbilityKind Kind => EnemyAbilityKind.SplitOnDeath; [Header("Split")] - [Tooltip("How many mini copies spawn on death.")] + [Tooltip("How many copies spawn when the parent dies.")] [Min(1)] public int SplitCount = 2; - [Tooltip("Each mini copy's MaxHp = the dying enemy's own MaxHp * this multiplier.")] - [Range(0.01f, 1f)] - public float HpMultiplier = 0.5f; + [Header("Minion stats (percent of the parent's spawned values)")] + [Tooltip("Minion max HP as a fraction of the parent's max HP.")] + [Range(0.01f, 2f)] + public float HpPercent = 0.5f; - [Tooltip("Uniform transform scale applied to each mini copy, relative to the normal " + - "prefab scale. Requires the enemy prefab's NetworkTransform to sync scale, " + - "or the mini will render full-size on remote peers.")] - [Range(0.1f, 1f)] - public float ScaleMultiplier = 0.6f; + [Tooltip("Minion move speed as a fraction of the parent's speed. Above 1 makes the split " + + "faster than what died — the classic 'smaller and quicker' read.")] + [Range(0.01f, 3f)] + public float SpeedPercent = 1.25f; - [Tooltip("Random scatter radius (world units) applied to each split spawn so they don't " + - "spawn exactly on top of each other.")] + [Tooltip("Minion transform scale as a fraction of the parent's scale. Requires the enemy " + + "prefab's NetworkTransform to sync scale, or minions render full-size on remote peers.")] + [Range(0.1f, 2f)] + public float ScalePercent = 0.6f; + + [Tooltip("Minion lives cost as a fraction of the parent's, rounded down but never below 1 " + + "— a leak always has to hurt, or splits become a way to farm free ground.")] + [Range(0f, 2f)] + public float LivesCostPercent = 1f; + + [Tooltip("Minion flight height as a fraction of the parent's. Only meaningful when the " + + "parent is flying; ground splits ignore it.")] + [Range(0.1f, 2f)] + public float FlightHeightPercent = 1f; + + [Header("Placement")] + [Tooltip("Random scatter radius (world units) applied to each spawn so minions don't " + + "stack exactly on top of each other.")] [Min(0f)] public float ScatterRadius = 0.5f; @@ -41,12 +69,24 @@ namespace TD.Gameplay.EnemyAbilities var def = health.Definition; if (def == null) return; - var movement = instance.GetComponent(); - var atTile = GridCoordinates.WorldToGrid(instance.transform.position); + var movement = instance.GetComponent(); + var atTile = GridCoordinates.WorldToGrid(instance.transform.position); var ownerSlot = movement != null ? movement.OriginZone : PlayerSlot.None; + // Derive the minion's stats from what the parent actually spawned as. + var parent = instance.SpawnContext; + var minion = new EnemySpawnContext + { + MaxHp = Mathf.Max(1f, parent.MaxHp * HpPercent), + MoveSpeed = Mathf.Max(0.01f, parent.MoveSpeed * SpeedPercent), + IsFlying = parent.IsFlying, + FlightHeight = parent.FlightHeight * FlightHeightPercent, + LivesCost = Mathf.Max(1, Mathf.FloorToInt(parent.LivesCost * LivesCostPercent)), + VisualScale = parent.VisualScale * ScalePercent, + }; + WaveManager.Instance?.ServerSpawnSplitEnemies( - def, SplitCount, atTile, ownerSlot, ScatterRadius, HpMultiplier, ScaleMultiplier); + def, SplitCount, atTile, ownerSlot, ScatterRadius, minion); } } } diff --git a/Assets/_Project/Scripts/Gameplay/EnemyAbility.cs b/Assets/_Project/Scripts/Gameplay/EnemyAbility.cs index 93a577c..8913543 100644 --- a/Assets/_Project/Scripts/Gameplay/EnemyAbility.cs +++ b/Assets/_Project/Scripts/Gameplay/EnemyAbility.cs @@ -1,4 +1,5 @@ // Assets/_Project/Scripts/Gameplay/EnemyAbility.cs +using System.Collections.Generic; using Unity.Netcode; using UnityEngine; using TD.Core; @@ -7,57 +8,101 @@ using TD.Gameplay.EnemyAbilities; namespace TD.Gameplay { /// - /// Per-enemy ability slot. Holds the rolled for this - /// instance (if any) and drives its server-only hooks. + /// Per-enemy ability set. Holds every its wave has + /// accumulated and drives their server-only hooks. /// /// /// Initialization: Call on the server immediately after /// Instantiate and before NetworkObject.Spawn(), following the same pattern as /// EnemyHealth.InitializeServer / EnemyMovement.InitializeServer. /// + /// A set, not a slot. This used to hold one ability rolled at random per enemy. Wave + /// buffs stack across a phase's cycles, so it now holds a list and fans every hook out over + /// all of them. replicates the set so clients can show players what + /// they're facing. + /// /// Optional component: Not required by EnemyHealth or EnemyMovement — - /// WaveManager.SpawnEnemy only rolls and assigns an ability when this component is - /// present on the prefab, so existing enemy prefabs are unaffected until it's added to them. + /// WaveManager.SpawnEnemy only assigns abilities when this component is present on the + /// prefab, so enemy prefabs without it simply never carry wave buffs. /// /// On-death hook is not event-driven: WaveManager.HandleEnemyKilled calls - /// directly (via ) - /// rather than this component subscribing to EnemyHealth.OnDied itself — that keeps a - /// split-spawn's activeEnemyCount increment ordered before the triggering kill's - /// decrement, regardless of NetworkBehaviour subscription order. + /// directly rather than this component subscribing to + /// EnemyHealth.OnDied itself — that keeps a split-spawn's activeEnemyCount + /// increment ordered before the triggering kill's decrement, regardless of NetworkBehaviour + /// subscription order. /// [RequireComponent(typeof(NetworkObject))] public class EnemyAbility : NetworkBehaviour { - private readonly NetworkVariable kind = new NetworkVariable( - (byte)EnemyAbilityKind.None, - NetworkVariableReadPermission.Everyone, - NetworkVariableWritePermission.Server); + // Replicated ability kinds carried by this enemy. Empty means no wave buffs. Exists so + // clients can render "this wave splits and flies" in the enemy-info panel without + // re-deriving it from run state. + private NetworkList kinds; // ----- Pre-spawn init (server-local) ---------------------------------- - private EnemyAbilityDefinition pendingDefinition; - private bool hasPendingInit; + private readonly List pendingDefinitions = new List(); + private bool hasPendingInit; // ----- Public state ----------------------------------------------------- - /// The ability rolled for this enemy, or null if none was rolled. - public EnemyAbilityDefinition Definition { get; private set; } + private readonly List definitions = new List(); - /// Replicated kind of the rolled ability. if - /// none was rolled. - public EnemyAbilityKind Kind => (EnemyAbilityKind)kind.Value; + /// The abilities this enemy carries. Server-side; empty on clients. + public IReadOnlyList Definitions => definitions; + + /// True if this enemy carries no abilities at all. + public bool IsPlain => definitions.Count == 0; + + /// + /// The stats this enemy actually spawned with, after every ability's spawn modification. + /// Server-side. + /// + /// + /// Kept so on-death abilities can derive from what the enemy really was rather than from + /// its . Split-on-death needs this: its minions are a + /// percentage of "the enemy that died", which is not the authored asset once other cards + /// on the same wave have modified it. + /// + public EnemySpawnContext SpawnContext { get; private set; } + + private void Awake() + { + kinds = new NetworkList(); + } + + /// Replicated check for a specific ability. Safe on any peer. + public bool HasKind(EnemyAbilityKind kind) + { + byte target = (byte)kind; + for (int i = 0; i < kinds.Count; i++) + if (kinds[i] == target) return true; + return false; + } // ----- Server-only pre-spawn init ------------------------------------- /// /// Called by WaveManager on the server after Instantiate and before - /// NetworkObject.Spawn(). may be null, meaning no - /// ability was rolled for this enemy. + /// NetworkObject.Spawn(). may be null or empty, + /// meaning this enemy carries no wave buffs. /// - public void InitializeServer(EnemyAbilityDefinition definition) + /// + /// Copies rather than retains the caller's list — WaveManager reuses one scratch + /// buffer across every enemy in a wave, so holding the reference would alias every enemy + /// to the same (later mutated) contents. + /// + public void InitializeServer(IReadOnlyList abilities, + EnemySpawnContext spawnContext) { - pendingDefinition = definition; - hasPendingInit = true; + pendingDefinitions.Clear(); + if (abilities != null) + { + for (int i = 0; i < abilities.Count; i++) + if (abilities[i] != null) pendingDefinitions.Add(abilities[i]); + } + SpawnContext = spawnContext; + hasPendingInit = true; } // ----- NGO lifecycle -------------------------------------------------- @@ -66,22 +111,89 @@ namespace TD.Gameplay { if (!IsServer || !hasPendingInit) return; - Definition = pendingDefinition; - kind.Value = (byte)(Definition != null ? Definition.Kind : EnemyAbilityKind.None); + definitions.Clear(); + definitions.AddRange(pendingDefinitions); hasPendingInit = false; - if (Definition != null) - Debug.Log($"[EnemyAbility] {name} rolled {Definition.Kind}."); + timers = definitions.Count > 0 + ? new float[definitions.Count] + : System.Array.Empty(); - Definition?.ServerOnSpawn(this); + kinds.Clear(); + for (int i = 0; i < definitions.Count; i++) + kinds.Add((byte)definitions[i].Kind); + + for (int i = 0; i < definitions.Count; i++) + definitions[i].ServerOnSpawn(this, i); } // ----- Server tick ------------------------------------------------ private void Update() { - if (!IsServer || Definition == null) return; - Definition.ServerTick(this, Time.deltaTime); + if (!IsServer || definitions.Count == 0) return; + + float dt = Time.deltaTime; + for (int i = 0; i < definitions.Count; i++) + definitions[i].ServerTick(this, i, dt); + } + + // ----- Per-enemy ability scratch ---------------------------------- + + // One float per carried ability, owned by that ability. Exists because the definitions + // are shared ScriptableObjects: a cooldown stored on the asset would be shared by every + // enemy in the wave, making them all fire in lockstep. Allocated once at init, sized to + // the ability count — never resized, since the set is fixed at spawn. + private float[] timers = System.Array.Empty(); + + /// + /// A per-enemy float owned by the ability at , returned by + /// reference so it can be read and written in place. Typically a cooldown accumulator. + /// + public ref float TimerFor(int abilityIndex) + { + if (abilityIndex < 0 || abilityIndex >= timers.Length) + { + // Out-of-range means a caller passed an index that doesn't match its slot. Hand + // back a scratch cell rather than throwing mid-tick; the ability just won't + // accumulate, which is visible in play but not fatal. + Debug.LogError($"[EnemyAbility] TimerFor({abilityIndex}) is out of range on " + + $"{name}. The ability will not keep time."); + return ref timerFallback; + } + return ref timers[abilityIndex]; + } + + private float timerFallback; + + // ----- Server hook fan-out ---------------------------------------- + + /// Server-only: run every carried ability's on-death hook. + public void ServerInvokeOnDeath(EnemyHealth health) + { + if (!IsServer) return; + for (int i = 0; i < definitions.Count; i++) + definitions[i].ServerOnDeath(this, health); + } + + /// + /// Server-only: chain every carried ability's kill-reward modifier. Result is clamped at + /// zero so a stack of reward-suppressing cards can't hand out negative gold. + /// + public int ServerModifyKillReward(int reward) + { + if (!IsServer) return reward; + for (int i = 0; i < definitions.Count; i++) + reward = definitions[i].ServerModifyKillReward(this, reward); + return Mathf.Max(0, reward); + } + + /// Server-only: run every carried ability's reached-goal hook. + public void ServerInvokeReachedGoal(PlayerSlot originZone) + { + if (!IsServer) return; + for (int i = 0; i < definitions.Count; i++) + definitions[i].ServerOnReachedGoal(this, originZone); } } } diff --git a/Assets/_Project/Scripts/Gameplay/EnemyHealth.cs b/Assets/_Project/Scripts/Gameplay/EnemyHealth.cs index 10256d2..ddd2e6a 100644 --- a/Assets/_Project/Scripts/Gameplay/EnemyHealth.cs +++ b/Assets/_Project/Scripts/Gameplay/EnemyHealth.cs @@ -1,5 +1,6 @@ // Assets/_Project/Scripts/Gameplay/EnemyHealth.cs using System.Collections; +using System.Collections.Generic; using Unity.Netcode; using UnityEngine; using TD.Core; @@ -67,6 +68,7 @@ namespace TD.Gameplay private int pendingLivesCost = 1; private bool pendingIsFlying; private bool pendingIsHeld; + private bool pendingIsBoss; private bool hasPendingInit; // ----- Server-local runtime state ------------------------------------- @@ -103,6 +105,13 @@ namespace TD.Gameplay NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Server); + // Set for enemies spawned by a phase's boss encounter. Replicated because the HUD's boss + // bar is client-side and has to recognise a boss without asking the server. + private readonly NetworkVariable isBoss = new NetworkVariable( + false, + NetworkVariableReadPermission.Everyone, + NetworkVariableWritePermission.Server); + // ----- Public state --------------------------------------------------- public float CurrentHp => hp.Value; @@ -117,6 +126,19 @@ namespace TD.Gameplay /// public bool IsFlying => isFlying.Value; + /// True if this enemy was spawned by a phase's boss encounter. Replicated. + public bool IsBoss => isBoss.Value; + + /// + /// Every live boss, on every peer. Maintained by spawn/despawn so the HUD can render a + /// boss bar without polling the scene. + /// + /// + /// A list rather than a single reference because the boss encounter spawns one boss per + /// player zone — there are as many simultaneous bosses as there are players. + /// + public static readonly List ActiveBosses = new List(); + // ----- Events --------------------------------------------------------- /// @@ -136,12 +158,14 @@ namespace TD.Gameplay /// and before NetworkObject.Spawn(). Mirrors the /// TowerInstance.InitializeServer pattern. /// - public void InitializeServer(float maxHp, int livesCost, bool flying, bool held = false) + public void InitializeServer(float maxHp, int livesCost, bool flying, bool held = false, + bool boss = false) { pendingMaxHp = maxHp; pendingLivesCost = livesCost; pendingIsFlying = flying; pendingIsHeld = held; + pendingIsBoss = boss; hasPendingInit = true; // Cache locally on the server immediately — clients resolve via NV. @@ -158,6 +182,7 @@ namespace TD.Gameplay hp.Value = pendingMaxHp; isFlying.Value = pendingIsFlying; isHeld.Value = pendingIsHeld; + isBoss.Value = pendingIsBoss; hasPendingInit = false; } @@ -165,6 +190,9 @@ namespace TD.Gameplay if (!IsServer) MaxHp = hp.Value; + if (isBoss.Value && !ActiveBosses.Contains(this)) + ActiveBosses.Add(this); + // Apply initial held state on all peers and watch for future changes. // isHeld.OnValueChanged doesn't fire for the initial replication, so we // apply it explicitly here as well. @@ -174,6 +202,8 @@ namespace TD.Gameplay public override void OnNetworkDespawn() { + ActiveBosses.Remove(this); + // If this enemy was the locally-selected ISelectable, clear the // selection so the HUD doesn't keep displaying a stale corpse. // SelectionState is a local UI singleton, safe to query on any peer. diff --git a/Assets/_Project/Scripts/Gameplay/EnemyMovement.cs b/Assets/_Project/Scripts/Gameplay/EnemyMovement.cs index 7eec0d1..147eaf9 100644 --- a/Assets/_Project/Scripts/Gameplay/EnemyMovement.cs +++ b/Assets/_Project/Scripts/Gameplay/EnemyMovement.cs @@ -282,6 +282,45 @@ namespace TD.Gameplay NetworkObject.Despawn(); } + // ----- Ability-driven movement ---------------------------------------- + + /// + /// Server-only: teleport this enemy forward along its existing path by up to + /// waypoints. Used by the Blink wave buff. + /// + /// + /// Follows the path rather than the straight line to the goal. Jumping toward the + /// goal as the crow flies would let a grounded enemy blink through walls, which is the + /// flying buff's job, not this one. Skipping waypoints keeps the enemy inside the maze — + /// it cuts corners, it doesn't ignore them. + /// + /// Zone tracking still runs on the destination tile, so an enemy that blinks out of + /// its origin zone still credits its owner a leak. Skipping that would make the buff a way + /// to launder leaks past the no-leak bonus. + /// + /// Blinking onto the final waypoint resolves as a normal goal arrival, despawn and + /// life cost included. + /// + public void ServerBlinkForward(int tiles) + { + if (!IsServer || tiles <= 0) return; + if (hasReachedGoal || remainingPath.Count == 0) return; + if (health != null && health.IsHeld) return; + + int skip = Mathf.Min(tiles, remainingPath.Count); + Vector2Int destination = remainingPath[skip - 1]; + remainingPath.RemoveRange(0, skip); + + // Preserve Y so flyers stay at altitude and grounded pivots don't sink. + Vector3 world = GridCoordinates.GridToWorld(destination); + transform.position = new Vector3(world.x, transform.position.y, world.z); + + CheckZoneTransition(destination); + + if (remainingPath.Count == 0) + HandleGoalReached(); + } + // ----- Path invalidation ---------------------------------------------- // Called by PathfindingService's budgeted scheduler after a walkability change diff --git a/Assets/_Project/Scripts/Gameplay/EnemyUpgrades.meta b/Assets/_Project/Scripts/Gameplay/EnemyUpgrades.meta new file mode 100644 index 0000000..f5ba3d6 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyUpgrades.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 95ac4e8d1714a07489dad0c283970bf8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/AbilityEnemyUpgradeOption.cs b/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/AbilityEnemyUpgradeOption.cs new file mode 100644 index 0000000..3576d6b --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/AbilityEnemyUpgradeOption.cs @@ -0,0 +1,62 @@ +// Assets/_Project/Scripts/Gameplay/EnemyUpgrades/AbilityEnemyUpgradeOption.cs +using UnityEngine; +using TD.Gameplay.EnemyAbilities; +using TD.Gameplay.Waves; + +namespace TD.Gameplay.EnemyUpgrades +{ + /// + /// The workhorse enemy-buff card: grants an to a wave + /// slot. Every enemy spawned by that wave, in every later cycle of the phase, carries the + /// ability. + /// + /// + /// There is nothing to do at vote-resolution time — recording the option id on the slot IS the + /// effect, because the spawn path builds each enemy's ability set from the slot's recorded + /// options. is what that lookup resolves to. + /// + [CreateAssetMenu(fileName = "EnemyUpgrade_Ability", + menuName = "TD/Enemy Upgrades/Ability Card", order = 20)] + public class AbilityEnemyUpgradeOption : EnemyUpgradeOption + { + [Header("Payload")] + [Tooltip("The ability every enemy in this wave gains. Must also be present in the scene's " + + "EnemyAbilityPool so it can be resolved at spawn time.")] + public EnemyAbilityDefinition Ability; + + public override bool IsValidForSlot(RunState run, int slot) + { + if (Ability == null) return false; + + // Don't offer an ability the slot already has by another card's hand. Exact-id repeats + // are filtered by the caller, but two different cards can grant the same ability, and + // stacking one twice is a no-op the players would rightly feel cheated by. + return !SlotAlreadyHasAbility(run, slot); + } + + // Shared scratch: validation runs on the server during vote generation, which is + // single-threaded, so one reused list beats allocating per candidate per slot. + private static readonly System.Collections.Generic.List s_idScratch + = new System.Collections.Generic.List(); + + private bool SlotAlreadyHasAbility(RunState run, int slot) + { + var pool = EnemyUpgradePool.Instance; + if (run == null || pool == null) return false; + + var ids = s_idScratch; + run.GetUpgradesForSlot(slot, ids); + + foreach (int id in ids) + { + if (pool.Get(id) is AbilityEnemyUpgradeOption other && other.Ability == Ability) + return true; + } + return false; + } + + /// Inherits nothing automatically — carries no + /// icon, so the card's own is the only source. + public override Sprite ResolveIcon() => Icon; + } +} diff --git a/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/AbilityEnemyUpgradeOption.cs.meta b/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/AbilityEnemyUpgradeOption.cs.meta new file mode 100644 index 0000000..f619df4 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/AbilityEnemyUpgradeOption.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d075c66b381872a4781b3916296ccdc9 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/DoubleUpEnemyUpgradeOption.cs b/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/DoubleUpEnemyUpgradeOption.cs new file mode 100644 index 0000000..882dd8f --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/DoubleUpEnemyUpgradeOption.cs @@ -0,0 +1,48 @@ +// Assets/_Project/Scripts/Gameplay/EnemyUpgrades/DoubleUpEnemyUpgradeOption.cs +using UnityEngine; +using TD.Gameplay.Waves; + +namespace TD.Gameplay.EnemyUpgrades +{ + /// + /// Vote-meta card: the next time this wave is cleared, it takes several buffs automatically + /// and the players get no say in which. + /// + /// + /// Not an enemy ability. Nothing about the enemies changes when this is voted in — it + /// changes how the next vote on this slot resolves. That's why it derives from + /// directly instead of wrapping an + /// EnemyAbilityDefinition: the spawn path builds ability sets only from ability cards, + /// so this one is recorded on the slot and otherwise invisible to enemies. + /// + /// The trade is agency for information. Voting this in is choosing to make one + /// future wave worse in exchange for it not being the worst option — the auto-draw is weighted + /// and slot-filtered exactly like a real vote, so it's a gamble on the pool, not a punishment. + /// It also disarms itself after firing (ServerConsumeAutoApply), so a slot can only be + /// doubled once per card. + /// + /// Repeats are prevented by the normal offer filter: the slot records this card like any + /// other, so it can't be offered to the same slot twice in a phase. + /// + [CreateAssetMenu(fileName = "EnemyUpgrade_DoubleUp", + menuName = "TD/Enemy Upgrades/Double Up Card", order = 22)] + public class DoubleUpEnemyUpgradeOption : EnemyUpgradeOption + { + [Header("Payload")] + [Tooltip("How many buffs the wave takes automatically in place of its next vote.")] + [Min(2)] + public int BuffsToAutoApply = 2; + + public override bool IsValidForSlot(RunState run, int slot) + { + // Pointless to offer while the slot is already armed — the player would be trading a + // vote away for nothing. + return run != null && run.GetAutoApplyCount(slot) <= 0; + } + + public override void ServerOnApplied(RunState run, int slot) + { + run?.ServerSetAutoApply(slot, BuffsToAutoApply); + } + } +} diff --git a/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/DoubleUpEnemyUpgradeOption.cs.meta b/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/DoubleUpEnemyUpgradeOption.cs.meta new file mode 100644 index 0000000..ca93bb2 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/DoubleUpEnemyUpgradeOption.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f5e90fe6b8e439e4f99769a6923c2262 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/EnemyUpgradeGroup.cs b/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/EnemyUpgradeGroup.cs new file mode 100644 index 0000000..1e0f9f2 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/EnemyUpgradeGroup.cs @@ -0,0 +1,75 @@ +// Assets/_Project/Scripts/Gameplay/EnemyUpgrades/EnemyUpgradeGroup.cs +using System; +using System.Collections.Generic; +using UnityEngine; +using TD.Core; + +namespace TD.Gameplay.EnemyUpgrades +{ + /// + /// One weighted candidate inside an . + /// + /// + /// Weight is relative and normalized at draw time — see . + /// Kept on the entry rather than on the option asset for the same reason wave weights are: + /// a card can be a staple of one phase's pool and a rarity in another's. + /// + [Serializable] + public class EnemyUpgradePoolEntry + { + [Tooltip("The enemy-buff card that may be offered from this group.")] + public EnemyUpgradeOption Option; + + [Tooltip("Relative draw weight within the pool this group contributes to. Entries at " + + "equal weight are equally likely; 0.5 is half as likely as 1.0.")] + [PoolWeight("buff")] + public float Weight = 1f; + } + + /// + /// A named, reusable bag of enemy-buff cards. Groups are the unit designers move between + /// phases: dragging a group into Phase 2's list makes every card in it votable from phase 2 + /// onward, without touching the cards themselves. + /// + /// + /// Buffs are gated by phase, not by cycle — every card a phase allows is votable from + /// its very first wave. Gating by cycle was considered and rejected: the whole point of the + /// cyclical structure is that players choose how hard to make their own next lap, and holding + /// the interesting cards back until cycle 3 would flatten that decision into a formality. + /// + [CreateAssetMenu(fileName = "EnemyUpgradeGroup", + menuName = "TD/Enemy Upgrades/Upgrade Group", order = 21)] + public class EnemyUpgradeGroup : ScriptableObject + { + [Tooltip("Designer-facing name, shown in validation messages. Falls back to the asset name.")] + public string DisplayName; + + [Tooltip("Cards in this group, each with a relative draw weight.")] + public EnemyUpgradePoolEntry[] Options; + + /// Name used in validation and log messages. Falls back to the asset name. + public string Label => string.IsNullOrWhiteSpace(DisplayName) ? name : DisplayName; + + /// + /// Appends every non-null, non-zero-weight entry across into + /// . Zero-weight entries are filtered here so "weight 0 means it + /// can never appear" lives in exactly one place. + /// + public static void CollectCandidates(EnemyUpgradeGroup[] groups, List into) + { + into.Clear(); + if (groups == null) return; + + foreach (var group in groups) + { + if (group?.Options == null) continue; + foreach (var entry in group.Options) + { + if (entry?.Option == null) continue; + if (entry.Weight <= 0f) continue; + into.Add(entry); + } + } + } + } +} diff --git a/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/EnemyUpgradeGroup.cs.meta b/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/EnemyUpgradeGroup.cs.meta new file mode 100644 index 0000000..3410908 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/EnemyUpgradeGroup.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4202a767d96e70f41b6a7e84eb08a832 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/EnemyUpgradeOption.cs b/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/EnemyUpgradeOption.cs new file mode 100644 index 0000000..ac43085 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/EnemyUpgradeOption.cs @@ -0,0 +1,66 @@ +// Assets/_Project/Scripts/Gameplay/EnemyUpgrades/EnemyUpgradeOption.cs +using UnityEngine; +using TD.Gameplay.Waves; + +namespace TD.Gameplay.EnemyUpgrades +{ + /// + /// Base class for one card in the post-wave enemy-buff vote. Players collectively choose one + /// of these to permanently attach to the wave they just cleared; it takes effect the next time + /// that wave comes round in the cycle. + /// + /// + /// Mirrors DraftOption deliberately. Same shape — abstract SO, one asset + /// per card, concrete subclasses carry the payload — so the two authoring surfaces read the + /// same way. The difference is who it targets: a draft option applies to a player, an enemy + /// upgrade applies to a wave slot. + /// + /// Identity. Options live in and cross the network + /// as their pool index, the same stable-within-a-match id pattern used by the tower catalog + /// and draft pool. + /// + /// Recording is not this type's job. WaveVote records the winning option id + /// onto the slot via RunState.ServerAddUpgrade; is only + /// for cards that need a side effect beyond being recorded (the vote-meta cards). + /// Ability cards need nothing here — the spawn path reads the slot's recorded set. + /// + public abstract class EnemyUpgradeOption : ScriptableObject + { + [Header("Presentation")] + [Tooltip("Name shown on the vote card.")] + public string DisplayName; + + [Tooltip("Short description shown on the vote card. Say what it does to the enemies, in " + + "the players' terms — this is the only thing they get to judge the vote on.")] + [TextArea(2, 4)] + public string Description; + + [Tooltip("OPTIONAL override for the vote card icon. Leave empty to inherit the icon of " + + "whatever this option grants.")] + public Sprite Icon; + + /// + /// Icon actually shown on the vote card. Subclasses override to fall back to the icon of + /// the thing they grant; the base has nothing to inherit from, so it returns + /// (which may be null). + /// + public virtual Sprite ResolveIcon() => Icon; + + /// + /// Server-only: may this option be OFFERED for right now? Default + /// true; override for cards with prerequisites or ones that would be a no-op. + /// + /// + /// Callers already skip options the slot has taken before, so implementations don't need + /// to re-check that. + /// + public virtual bool IsValidForSlot(RunState run, int slot) => true; + + /// + /// Server-only: side effect to run after this option has been recorded onto + /// . Default no-op — most cards do their work at enemy-spawn time + /// by virtue of being on the slot, not at vote-resolution time. + /// + public virtual void ServerOnApplied(RunState run, int slot) { } + } +} diff --git a/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/EnemyUpgradeOption.cs.meta b/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/EnemyUpgradeOption.cs.meta new file mode 100644 index 0000000..37a9369 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/EnemyUpgradeOption.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 6b1e9770be72a694a96169d9a9032528 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/EnemyUpgradePool.cs b/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/EnemyUpgradePool.cs new file mode 100644 index 0000000..f6c51e8 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/EnemyUpgradePool.cs @@ -0,0 +1,94 @@ +// Assets/_Project/Scripts/Gameplay/EnemyUpgrades/EnemyUpgradePool.cs +using System.Collections.Generic; +using UnityEngine; + +namespace TD.Gameplay.EnemyUpgrades +{ + /// + /// Scene singleton holding every that can appear anywhere in + /// this match. The array index is the option's EnemyUpgradeOptionId — the stable + /// identifier used to replicate vote offers, ballots, and the upgrades recorded on wave slots. + /// + /// + /// Why a flat pool and per-phase groups. The pool supplies network identity: one + /// array, one index per card, identical on every peer. PhaseDefinition.EnemyUpgradeGroups + /// supplies gating: which of those cards a given phase may offer. Folding gating into the pool + /// would make ids phase-relative and therefore unstable across a phase change, which is + /// exactly when replicated slot upgrades are being cleared and rewritten. + /// + /// Plain MonoBehaviour — identical assets on every peer, so there is nothing to sync. + /// The server reads it to generate and resolve votes; clients read it to render vote cards + /// from replicated ids. + /// + public class EnemyUpgradePool : MonoBehaviour + { + public static EnemyUpgradePool Instance { get; private set; } + + [Tooltip("Every EnemyUpgradeOption asset that can appear this match. Array index is the " + + "id used over the network — reordering mid-development is fine, but not between " + + "a host and its clients.")] + [SerializeField] private EnemyUpgradeOption[] options; + + private void Awake() + { + if (Instance != null && Instance != this) + { + Debug.LogError("[EnemyUpgradePool] Multiple instances detected. Only one per scene."); + return; + } + Instance = this; + } + + private void OnDestroy() + { + if (Instance == this) Instance = null; + } + + /// Number of options in the pool. + public int Count => options?.Length ?? 0; + + /// Returns the option at , or null if out of range. + public EnemyUpgradeOption Get(int id) + => (options != null && id >= 0 && id < options.Length) ? options[id] : null; + + /// Resolves an option asset back to its pool id, or -1 if it isn't in the pool. + public int GetId(EnemyUpgradeOption option) + { + if (options == null || option == null) return -1; + for (int i = 0; i < options.Length; i++) + if (options[i] == option) return i; + return -1; + } + + /// + /// Collects the pool ids of every card the given phase groups allow. Cards missing from + /// the pool are reported once and skipped — an authored group referencing an unpooled + /// card is a wiring mistake that would otherwise silently shrink the vote. + /// + public void CollectAllowedIds(EnemyUpgradeGroup[] phaseGroups, + List entryScratch, + List intoIds, + List intoWeights) + { + intoIds.Clear(); + intoWeights.Clear(); + + EnemyUpgradeGroup.CollectCandidates(phaseGroups, entryScratch); + + foreach (var entry in entryScratch) + { + int id = GetId(entry.Option); + if (id < 0) + { + Debug.LogWarning($"[EnemyUpgradePool] '{entry.Option.name}' is referenced by a " + + $"phase's upgrade groups but is not in the pool — it can " + + $"never be offered. Add it to the pool's options array."); + continue; + } + + intoIds.Add(id); + intoWeights.Add(entry.Weight); + } + } + } +} diff --git a/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/EnemyUpgradePool.cs.meta b/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/EnemyUpgradePool.cs.meta new file mode 100644 index 0000000..161d578 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/EnemyUpgradePool.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c4d98a01d9b9a7b438a6f91b0b7f498f \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/WaveVote.cs b/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/WaveVote.cs new file mode 100644 index 0000000..4d8e872 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/WaveVote.cs @@ -0,0 +1,419 @@ +// Assets/_Project/Scripts/Gameplay/EnemyUpgrades/WaveVote.cs +using System.Collections.Generic; +using Unity.Netcode; +using UnityEngine; +using TD.Core; +using TD.Gameplay.Waves; + +namespace TD.Gameplay.EnemyUpgrades +{ + /// + /// The shared, open-ballot vote held after each wave clears: players collectively pick + /// which permanent buff the wave they just beat will carry into the next cycle. + /// + /// + /// Ballots are public by design. replicates to everyone the + /// instant a vote is cast, and the HUD paints each voter's slot badge onto the card they chose. + /// That visibility is the point of the mechanic — seeing two teammates converge on "Flying" is + /// what lets the third decide whether to join them or split the vote. A private tally would + /// reduce this to a dice roll with extra steps. + /// + /// Votes stay changeable until the vote resolves, for the same reason. The + /// consequence is that the last player to vote ends the vote instantly (see + /// ), locking their choice in with no chance for anyone to + /// respond. If that reads badly in playtest, the fix is a short grace period after the final + /// ballot rather than closing the ballots. + /// + /// Scene singleton, server-authoritative. Unlike PlayerDraft (one per + /// player) this is one shared object, so votes arrive as plain server RPCs and the server maps + /// the sender to a itself rather than trusting an owner claim. + /// + public class WaveVote : NetworkBehaviour + { + // ----- Singleton --------------------------------------------------- + + public static WaveVote Instance { get; private set; } + + // ----- Inspector --------------------------------------------------- + + [Tooltip("How many buff cards the vote offers. Standard is 3.")] + [SerializeField] private int optionsPerVote = 3; + + // ----- Networked state --------------------------------------------- + + // The EnemyUpgradeOptionIds on the table. Empty when no vote is open. + private NetworkList offeredOptionIds; + + // Ballots indexed by (int)PlayerSlot, sized 10 (slots 0-9; index 0 = PlayerSlot.None and + // is never written). Value is the option id voted for, or NoVote. Public read permission + // is deliberate — see the class remarks. + private NetworkList ballots; + + /// Sentinel stored in for a player who hasn't voted. + public const int NoVote = -1; + + // Wave slot this vote will upgrade, or -1 when no vote is open. + private readonly NetworkVariable targetSlot = new NetworkVariable( + -1, NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Server); + + /// Fired on every peer when the offered set, any ballot, or the open/closed + /// state changes. The HUD subscribes to rebuild the vote panel and its voter badges. + public event System.Action OnVoteChanged; + + // ----- Lifecycle ---------------------------------------------------- + + private void Awake() + { + offeredOptionIds = new NetworkList(); + ballots = new NetworkList(); + } + + public override void OnNetworkSpawn() + { + if (Instance != null && Instance != this) + { + Debug.LogError("[WaveVote] Duplicate WaveVote detected. Only one may exist per scene."); + return; + } + Instance = this; + + if (IsServer) + { + // One entry per PlayerSlot value (None + Player1..Player9). + for (int i = 0; i < 10; i++) ballots.Add(NoVote); + } + + offeredOptionIds.OnListChanged += HandleListChanged; + ballots.OnListChanged += HandleListChanged; + targetSlot.OnValueChanged += HandleTargetChanged; + } + + public override void OnNetworkDespawn() + { + offeredOptionIds.OnListChanged -= HandleListChanged; + ballots.OnListChanged -= HandleListChanged; + targetSlot.OnValueChanged -= HandleTargetChanged; + + if (Instance == this) Instance = null; + } + + private void HandleListChanged(NetworkListEvent _) => OnVoteChanged?.Invoke(); + private void HandleTargetChanged(int _, int __) => OnVoteChanged?.Invoke(); + + // ----- Read API ------------------------------------------------------ + + /// True while a vote is open for players to cast or change a ballot. + public bool IsOpen => targetSlot.Value >= 0; + + /// Wave slot this vote will upgrade, or -1 when closed. + public int TargetSlot => targetSlot.Value; + + public int OptionCount => offeredOptionIds.Count; + + public int GetOptionId(int index) + => (index >= 0 && index < offeredOptionIds.Count) ? offeredOptionIds[index] : -1; + + /// The option voted for, or . + public int GetBallot(PlayerSlot slot) + { + int i = (int)slot; + return (i >= 0 && i < ballots.Count) ? ballots[i] : NoVote; + } + + /// + /// Appends every player slot that voted for . Drives the voter + /// badges the HUD paints onto each card. + /// + public void GetVotersFor(int optionId, List into) + { + into.Clear(); + if (optionId < 0) return; + + foreach (var pms in PlayerMatchState.AllPlayers) + { + if (pms.Slot == PlayerSlot.None) continue; + if (GetBallot(pms.Slot) == optionId) into.Add(pms.Slot); + } + } + + /// + /// True when every connected player with a real slot has cast a ballot. The inter-wave + /// step uses this to end the vote early instead of burning the whole timer. + /// + public bool AllPlayersVoted + { + get + { + if (!IsOpen) return false; + + bool any = false; + foreach (var pms in PlayerMatchState.AllPlayers) + { + if (pms.Slot == PlayerSlot.None) continue; + any = true; + if (GetBallot(pms.Slot) == NoVote) return false; + } + return any; + } + } + + // ----- Server: open / resolve ---------------------------------------- + + // Scratch reused across vote generation; server is single-threaded. + private readonly List entryScratch = new List(); + private readonly List idScratch = new List(); + private readonly List weightScratch = new List(); + private readonly List tiedScratch = new List(); + + /// + /// Server-only: open a vote for , drawing cards from the + /// current phase's allowed pool. Returns false (and opens nothing) if there is nothing + /// legal left to offer — a wave that has already collected every card its phase allows + /// simply gets no vote rather than an empty panel. + /// + public bool ServerOpenVote(int waveSlot) + { + if (!IsServer) return false; + + var run = RunState.Instance; + var pool = EnemyUpgradePool.Instance; + if (run == null || pool == null) + { + Debug.LogWarning("[WaveVote] No RunState or EnemyUpgradePool in scene — " + + "skipping the enemy-buff vote."); + return false; + } + + if (!CollectCandidatesFor(waveSlot, run, pool)) + { + Debug.Log($"[WaveVote] No enemy-buff cards left to offer for wave slot " + + $"{waveSlot}; skipping the vote."); + return false; + } + + // Weighted draw without replacement. + offeredOptionIds.Clear(); + int draws = Mathf.Min(optionsPerVote, idScratch.Count); + for (int n = 0; n < draws; n++) + { + int pick = DrawWeightedIndex(weightScratch); + if (pick < 0) break; + + offeredOptionIds.Add(idScratch[pick]); + idScratch.RemoveAt(pick); + weightScratch.RemoveAt(pick); + } + + ServerClearBallots(); + targetSlot.Value = waveSlot; + return true; + } + + /// + /// Server-only: tally the ballots, apply the winner to the target slot, and close the + /// vote. Returns the winning option id, or -1 if no vote was open. + /// + /// + /// Ties resolve randomly among the tied options. At three players and three cards a 1/1/1 + /// split is common, and with open ballots the players can see it coming and break it + /// themselves — which is the intended pressure, not a flaw in the tie-break. + /// + /// If nobody voted at all (everyone idle), one of the offered cards is chosen at + /// random. Skipping the buff entirely would quietly make idling the optimal play. + /// + public int ServerResolve() + { + if (!IsServer || !IsOpen) return -1; + + int slot = targetSlot.Value; + int winner = TallyWinner(); + + if (winner >= 0) + { + var run = RunState.Instance; + var pool = EnemyUpgradePool.Instance; + + run?.ServerAddUpgrade(slot, winner); + pool?.Get(winner)?.ServerOnApplied(run, slot); + + Debug.Log($"[WaveVote] Wave slot {slot} gains " + + $"'{pool?.Get(winner)?.DisplayName ?? winner.ToString()}'."); + } + + ServerClose(); + return winner; + } + + /// + /// Server-only: apply buffs to outright, + /// with no vote. Returns how many actually landed. Used by the vote-meta cards that trade + /// a future vote away for extra buffs. + /// + /// + /// Deliberately opens no ballot: the card's whole cost is that the players don't get + /// to choose this time. Drawing from the same weighted, slot-filtered candidate set the + /// vote would have used keeps the outcome fair rather than worst-case. + /// + public int ServerAutoApply(int slot, int count) + { + if (!IsServer || count <= 0) return 0; + + var run = RunState.Instance; + var pool = EnemyUpgradePool.Instance; + if (run == null || pool == null) return 0; + + var phase = run.CurrentPhase; + if (phase == null) return 0; + + int applied = 0; + for (int n = 0; n < count; n++) + { + // Re-collect each time: applying one buff can invalidate another (a card the slot + // now has, or one whose prerequisite just changed). + if (!CollectCandidatesFor(slot, run, pool)) break; + + int pick = DrawWeightedIndex(weightScratch); + if (pick < 0) break; + + int id = idScratch[pick]; + run.ServerAddUpgrade(slot, id); + pool.Get(id)?.ServerOnApplied(run, slot); + applied++; + + Debug.Log($"[WaveVote] Auto-applied '{pool.Get(id)?.DisplayName ?? id.ToString()}' " + + $"to wave slot {slot}."); + } + + return applied; + } + + /// Server-only: close the vote without applying anything. + public void ServerClose() + { + if (!IsServer) return; + targetSlot.Value = -1; + offeredOptionIds.Clear(); + ServerClearBallots(); + } + + private void ServerClearBallots() + { + for (int i = 0; i < ballots.Count; i++) ballots[i] = NoVote; + } + + // Highest vote count wins; ties broken at random. No votes cast → random offered card. + private int TallyWinner() + { + if (offeredOptionIds.Count == 0) return -1; + + int best = 0; + tiedScratch.Clear(); + + for (int i = 0; i < offeredOptionIds.Count; i++) + { + int id = offeredOptionIds[i]; + int count = 0; + + foreach (var pms in PlayerMatchState.AllPlayers) + { + if (pms.Slot == PlayerSlot.None) continue; + if (GetBallot(pms.Slot) == id) count++; + } + + if (count > best) + { + best = count; + tiedScratch.Clear(); + tiedScratch.Add(id); + } + else if (count == best && best > 0) + { + tiedScratch.Add(id); + } + } + + if (tiedScratch.Count == 0) + { + // Nobody voted — pick one of the offered cards rather than letting the wave + // escape unbuffed, which would make going idle the strongest play. + return offeredOptionIds[Random.Range(0, offeredOptionIds.Count)]; + } + + return tiedScratch[Random.Range(0, tiedScratch.Count)]; + } + + /// + /// Fills / with the cards this phase + /// allows that can still meaningfully take. Returns false when + /// nothing qualifies. + /// + private bool CollectCandidatesFor(int slot, RunState run, EnemyUpgradePool pool) + { + var phase = run.CurrentPhase; + if (phase == null) return false; + + pool.CollectAllowedIds(phase.EnemyUpgradeGroups, entryScratch, idScratch, weightScratch); + + // Filter to what this slot can actually take: not already applied, and the card itself + // agrees it's a meaningful offer. + for (int i = idScratch.Count - 1; i >= 0; i--) + { + int id = idScratch[i]; + var option = pool.Get(id); + + bool valid = option != null + && !run.SlotHasUpgrade(slot, id) + && option.IsValidForSlot(run, slot); + + if (!valid) + { + idScratch.RemoveAt(i); + weightScratch.RemoveAt(i); + } + } + + return idScratch.Count > 0; + } + + private static int DrawWeightedIndex(List weights) + { + if (weights == null || weights.Count == 0) return -1; + + float total = 0f; + for (int i = 0; i < weights.Count; i++) total += Mathf.Max(0f, weights[i]); + if (total <= 0f) return -1; + + float roll = Random.value * total; + for (int i = 0; i < weights.Count; i++) + { + roll -= Mathf.Max(0f, weights[i]); + if (roll <= 0f) return i; + } + return weights.Count - 1; // float drift fallback + } + + // ----- Client → server ------------------------------------------------ + + /// + /// Cast or change this player's vote. Any client may send; the server resolves the sender + /// to a slot itself and ignores anything it can't attribute or that isn't on the table. + /// + [Rpc(SendTo.Server)] + public void RequestVoteRpc(int optionId, RpcParams rpcParams = default) + { + if (!IsOpen) return; + + var senderSlot = PlayerMatchState.SlotForClient(rpcParams.Receive.SenderClientId); + if (senderSlot == PlayerSlot.None) return; + + // Only options actually on the table are accepted — a client can't vote a card in. + bool offered = false; + for (int i = 0; i < offeredOptionIds.Count; i++) + if (offeredOptionIds[i] == optionId) { offered = true; break; } + if (!offered) return; + + int index = (int)senderSlot; + if (index >= 0 && index < ballots.Count) ballots[index] = optionId; + } + } +} diff --git a/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/WaveVote.cs.meta b/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/WaveVote.cs.meta new file mode 100644 index 0000000..20d621a --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyUpgrades/WaveVote.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a18321dc2d138034fbdb5f705f19f893 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/GoldConfig.cs b/Assets/_Project/Scripts/Gameplay/GoldConfig.cs index 965ee7e..460223a 100644 --- a/Assets/_Project/Scripts/Gameplay/GoldConfig.cs +++ b/Assets/_Project/Scripts/Gameplay/GoldConfig.cs @@ -93,18 +93,26 @@ namespace TD.Gameplay [Tooltip("Gold each player starts the match with. Same for every player.")] public int StartingGold = 100; - [Tooltip("Per-wave gold rules. Element 0 = Wave 1. Match the order and length of " + - "WaveManager.waveDefinitions; extra entries are ignored, missing entries " + - "fall back to zero gold for that wave.")] + [Tooltip("Per-encounter gold rules. Element 0 = the run's first encounter. Encounters " + + "are counted continuously across the whole run — cycles do NOT restart the " + + "count — so a phase of 5 waves × 3 cycles + a boss needs 16 entries. Missing " + + "entries fall back to zero gold for that encounter.")] public WaveGoldEntry[] Waves; /// - /// Returns the gold entry for the given 1-based wave number, or null if out of range. + /// Returns the gold entry for the given 1-based encounter number + /// (RunState.GlobalEncounterNumber), or null if out of range. /// - public WaveGoldEntry GetWaveEntry(int waveNumber) + /// + /// Keyed by encounter, not by wave slot. Under the cyclical run structure the same + /// five waves come round three times per phase, so a slot-keyed table would pay the same + /// on cycle 3 as on cycle 1 while the enemies got steadily stronger. A run-long counter + /// lets payouts climb monotonically with difficulty. + /// + public WaveGoldEntry GetWaveEntry(int encounterNumber) { if (Waves == null) return null; - int index = waveNumber - 1; + int index = encounterNumber - 1; if (index < 0 || index >= Waves.Length) return null; return Waves[index]; } diff --git a/Assets/_Project/Scripts/Gameplay/PlayerMatchState.cs b/Assets/_Project/Scripts/Gameplay/PlayerMatchState.cs index 212dbd7..d572bd7 100644 --- a/Assets/_Project/Scripts/Gameplay/PlayerMatchState.cs +++ b/Assets/_Project/Scripts/Gameplay/PlayerMatchState.cs @@ -210,17 +210,21 @@ namespace TD.Gameplay // --- Slot allocation (server-only) ------------------------------- + // Caps at MatchRules.MaxPlayers rather than at the PlayerSlot enum's range — the enum + // still runs to 9 so baked LevelData owner grids stay valid, but only the first + // MaxPlayers slots are ever handed out. See MatchRules for why. private static PlayerSlot AllocateNextSlot() { - for (int i = 1; i <= 9; i++) + for (int i = 1; i <= MatchRules.MaxPlayers; i++) { var candidate = (PlayerSlot)i; if (!s_assignedSlots.Contains(candidate)) return candidate; } - Debug.LogError("[PlayerMatchState] No free PlayerSlot (already 9 players). " + - "Returning None — this client will be unable to play."); + Debug.LogError($"[PlayerMatchState] No free PlayerSlot (lobby is full at " + + $"{MatchRules.MaxPlayers} players). Returning None — this client " + + $"will be unable to play."); return PlayerSlot.None; } } diff --git a/Assets/_Project/Scripts/Gameplay/PlayerTowerUpgrades.cs b/Assets/_Project/Scripts/Gameplay/PlayerTowerUpgrades.cs new file mode 100644 index 0000000..0b17d88 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/PlayerTowerUpgrades.cs @@ -0,0 +1,116 @@ +// Assets/_Project/Scripts/Gameplay/PlayerTowerUpgrades.cs +using System.Collections.Generic; +using Unity.Netcode; +using UnityEngine; + +namespace TD.Gameplay +{ + /// + /// Per-player set of unlocked tower upgrade nodes — the tower types this player is + /// allowed to convert an existing tower into. Lives on the Player prefab alongside + /// . + /// + /// + /// Distinct from the deck, deliberately. is what you + /// can build from scratch; this is what you can upgrade into. They have to be + /// separate sets because the 2.0 model is two-step: a draft pick unlocks a node, and gold spent + /// on an already-placed tower converts it. Unlocking an upgrade must not make it directly + /// buildable, or the gold step — the entire cost of the upgrade — is bypassed. + /// + /// The tree lives in the data. Edges are TowerDefinition.UpgradePaths; this + /// component only records which nodes a player has earned the right to use. Whether a + /// particular tower can take a particular upgrade is a question for the tree (is it a child of + /// what's placed?) crossed with this set (has the player unlocked it?). + /// + /// Append-only within a match, mirroring the deck. Reset happens by re-initializing at + /// match start, so Retry / return-to-lobby cycles start clean. + /// + public class PlayerTowerUpgrades : NetworkBehaviour + { + // ----- Static registry (mirrors PlayerTowerDeck / PlayerGoldManager) ----- + + private static readonly Dictionary s_byClientId + = new Dictionary(); + + public static PlayerTowerUpgrades GetForClient(ulong clientId) + { + s_byClientId.TryGetValue(clientId, out var upgrades); + return upgrades; + } + + public static PlayerTowerUpgrades Local + { + get + { + var nm = NetworkManager.Singleton; + if (nm == null || !nm.IsClient) return null; + return GetForClient(nm.LocalClientId); + } + } + + // ----- Networked state -------------------------------------------- + + // TowerTypeIds (catalog indices) this player may upgrade into. + private NetworkList unlockedNodes; + + /// Fired on every peer when the unlocked set changes. The HUD subscribes so a + /// selected tower's upgrade buttons appear the moment a draft grants them. + public event System.Action OnUpgradesChanged; + + private void Awake() + { + unlockedNodes = new NetworkList(); + } + + public override void OnNetworkSpawn() + { + s_byClientId[OwnerClientId] = this; + unlockedNodes.OnListChanged += HandleListChanged; + } + + public override void OnNetworkDespawn() + { + unlockedNodes.OnListChanged -= HandleListChanged; + if (s_byClientId.TryGetValue(OwnerClientId, out var registered) && registered == this) + s_byClientId.Remove(OwnerClientId); + } + + private void HandleListChanged(NetworkListEvent _) => OnUpgradesChanged?.Invoke(); + + // ----- Read API --------------------------------------------------- + + public int Count => unlockedNodes.Count; + + public int GetTypeIdAt(int index) => unlockedNodes[index]; + + /// True if this player has unlocked the given upgrade node. + public bool Contains(int towerTypeId) + { + for (int i = 0; i < unlockedNodes.Count; i++) + if (unlockedNodes[i] == towerTypeId) return true; + return false; + } + + // ----- Server API ------------------------------------------------- + + /// Server-only: clear the unlocked set. Called at match start. + public void ServerInitialize() + { + if (!IsServer) return; + unlockedNodes.Clear(); + } + + /// + /// Server-only: unlock an upgrade node. Returns false if already unlocked (so a draft + /// option can report a wasted pick rather than silently succeeding). + /// + public bool ServerUnlock(int towerTypeId) + { + if (!IsServer) return false; + if (towerTypeId < 0 || Contains(towerTypeId)) return false; + + unlockedNodes.Add(towerTypeId); + return true; + } + } +} diff --git a/Assets/_Project/Scripts/Gameplay/PlayerTowerUpgrades.cs.meta b/Assets/_Project/Scripts/Gameplay/PlayerTowerUpgrades.cs.meta new file mode 100644 index 0000000..c0821f7 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/PlayerTowerUpgrades.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f60f6928562351f4891142ad59ab6352 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/TowerInstance.cs b/Assets/_Project/Scripts/Gameplay/TowerInstance.cs index dfd73a8..6128ab4 100644 --- a/Assets/_Project/Scripts/Gameplay/TowerInstance.cs +++ b/Assets/_Project/Scripts/Gameplay/TowerInstance.cs @@ -303,6 +303,10 @@ namespace TD.Gameplay ApplyTint(); paintColor.OnValueChanged += HandlePaintColorChanged; + // An upgrade swaps the replicated TypeId out from under every peer; re-resolve so + // clients pick up the new stats and tint instead of holding the pre-upgrade asset. + definitionTypeId.OnValueChanged += HandleDefinitionTypeChanged; + // Register for minimap rendering. MinimapEntityRegistry.Register(this); @@ -332,7 +336,8 @@ namespace TD.Gameplay public override void OnNetworkDespawn() { - paintColor.OnValueChanged -= HandlePaintColorChanged; + paintColor.OnValueChanged -= HandlePaintColorChanged; + definitionTypeId.OnValueChanged -= HandleDefinitionTypeChanged; // Un-stamp the footprint when the tower is destroyed (sold, wave end, etc.) // so the tiles become walkable and buildable again. @@ -412,6 +417,152 @@ namespace TD.Gameplay upgradeCount.Value += 1; } + // ----- Upgrading ------------------------------------------------------ + + /// + /// Fired on every peer when this tower's definition changes (i.e. it was upgraded). + /// The HUD subscribes to relabel a selected tower's action grid. + /// + public event System.Action OnDefinitionChanged; + + /// + /// Gold cost to convert this tower into . The target's own + /// is the price — upgrade nodes are never placed + /// directly, so their cost field is free to mean "what this upgrade costs". + /// + public static int GetUpgradeCost(TowerDefinition target) => target != null ? target.GoldCost : 0; + + /// + /// True if is a legal upgrade of this tower's current type: a + /// direct child in the upgrade tree, with a matching footprint. + /// + /// + /// The footprint check is not cosmetic. A tower's occupied/unwalkable tiles are + /// stamped into the grid at its current size; converting to a differently-sized node would + /// leave the stamp describing a shape the tower no longer has, corrupting both pathfinding + /// and future placement checks. Growing a tower's footprint needs a stamp-swap (and a + /// re-validation that the new tiles are even free), which the tree doesn't currently need — + /// so it's rejected loudly rather than half-supported. + /// + public bool CanUpgradeTo(TowerDefinition target) + { + if (target == null || resolvedDefinition == null) return false; + if (resolvedDefinition.UpgradePaths == null) return false; + + bool isChild = false; + foreach (var path in resolvedDefinition.UpgradePaths) + { + if (path == target) { isChild = true; break; } + } + if (!isChild) return false; + + return target.FootprintSize == resolvedDefinition.FootprintSize; + } + + /// + /// Collects the upgrades can currently apply to this tower: + /// direct children of its type that the player has unlocked. Does not filter on gold — + /// the HUD shows unaffordable upgrades disabled rather than hiding them, so players can + /// see what they're saving for. + /// + public void CollectAvailableUpgrades(ulong clientId, List<(TowerDefinition Def, int TypeId)> into) + { + into.Clear(); + + var unlocked = PlayerTowerUpgrades.GetForClient(clientId); + var pm = TowerPlacementManager.Instance; + if (unlocked == null || pm == null || resolvedDefinition?.UpgradePaths == null) return; + + foreach (var path in resolvedDefinition.UpgradePaths) + { + if (path == null) continue; + if (!pm.TryGetTypeId(path, out int typeId)) continue; + if (!unlocked.Contains(typeId)) continue; + if (!CanUpgradeTo(path)) continue; + + into.Add((path, typeId)); + } + } + + /// + /// Client → server request to convert this tower into . + /// Accepted only from the owner, only for a node they've unlocked, only along a real tree + /// edge, and only if they can pay. + /// + /// + /// Every check is repeated here even though the HUD already filters — the HUD is a + /// convenience, this is the authority. Same posture as placement, paint, and sell. + /// + [Rpc(SendTo.Server)] + public void RequestUpgradeServerRpc(int targetTypeId, RpcParams rpcParams = default) + { + if (!IsServer) return; + if (serverSold) return; // mid-sell; nothing to upgrade + + ulong senderClientId = rpcParams.Receive.SenderClientId; + PlayerSlot senderSlot = PlayerMatchState.SlotForClient(senderClientId); + if (senderSlot == PlayerSlot.None || senderSlot != ownerSlot.Value) + { + Debug.Log($"[TowerInstance] Upgrade rejected: client {senderClientId} " + + $"({senderSlot}) does not own tower owned by {ownerSlot.Value}."); + return; + } + + var target = TowerPlacementManager.GetDefinition(targetTypeId); + if (target == null) + { + Debug.Log($"[TowerInstance] Upgrade rejected: TypeId {targetTypeId} is not in the catalog."); + return; + } + + if (!CanUpgradeTo(target)) + { + Debug.Log($"[TowerInstance] Upgrade rejected: '{target.name}' is not a " + + $"same-footprint child of '{resolvedDefinition?.name}'."); + return; + } + + var unlocked = PlayerTowerUpgrades.GetForClient(senderClientId); + if (unlocked == null || !unlocked.Contains(targetTypeId)) + { + Debug.Log($"[TowerInstance] Upgrade rejected: client {senderClientId} has not " + + $"unlocked '{target.name}'."); + return; + } + + int cost = GetUpgradeCost(target); + var gold = PlayerGoldManager.GetForClient(senderClientId); + if (gold == null || gold.CurrentGold < cost) + { + Debug.Log($"[TowerInstance] Upgrade rejected: client {senderClientId} cannot " + + $"afford '{target.name}' ({cost}g)."); + return; + } + + if (cost > 0) gold.DeductGold(cost); + + // Record the spend before switching type, so the refund reflects everything sunk in + // and the tower loses any full-refund-while-unupgraded status. + ServerAddUpgradeInvestment(cost); + + // Switching the replicated TypeId is the upgrade: TowerCombat re-reads Definition + // every tick, so the new stats take effect on the next shot with nothing to notify. + definitionTypeId.Value = targetTypeId; + resolvedDefinition = target; + + OnDefinitionChanged?.Invoke(); + } + + // Re-resolve and re-tint on clients when the type changes under them (an upgrade landed). + private void HandleDefinitionTypeChanged(int previous, int current) + { + if (previous == current) return; + + resolvedDefinition = TowerPlacementManager.GetDefinition(current); + ApplyTint(); + OnDefinitionChanged?.Invoke(); + } + /// /// Client → server request to sell this tower. Accepted only from the tower's owner /// (same ownership rule as placement and paint). The server refunds gold, broadcasts diff --git a/Assets/_Project/Scripts/Gameplay/WaveDefinition.cs b/Assets/_Project/Scripts/Gameplay/WaveDefinition.cs index 7398dd0..f23c5fa 100644 --- a/Assets/_Project/Scripts/Gameplay/WaveDefinition.cs +++ b/Assets/_Project/Scripts/Gameplay/WaveDefinition.cs @@ -41,5 +41,64 @@ namespace TD.Gameplay [Tooltip("Enemy groups that make up this wave. Processed in order.")] public WaveEntry[] Entries; + + /// + /// The enemy type this wave is "about" — the first assigned entry's type. Null if the + /// wave has no usable entries. + /// + /// + /// The 2.0 design gives each wave a single enemy type, and enemy upgrades are keyed to a + /// wave slot, so this is the identity the phase draw uses to keep slots distinct and the + /// HUD uses to label an upcoming wave. still supports multiple + /// groups (useful for staggering counts of the same type), but mixing types within + /// one wave makes this ambiguous — see . + /// + public EnemyDefinition PrimaryEnemyType + { + get + { + if (Entries == null) return null; + foreach (var e in Entries) + { + if (e.EnemyType != null && e.Count > 0) return e.EnemyType; + } + return null; + } + } + + /// + /// True if every usable entry in this wave spawns the same enemy type. False means + /// is only telling part of the story — the run validator + /// warns on these rather than rejecting them, since a mixed wave still plays fine, it + /// just labels and upgrades oddly. + /// + public bool HasSingleEnemyType + { + get + { + var first = PrimaryEnemyType; + if (first == null) return false; + foreach (var e in Entries) + { + if (e.EnemyType != null && e.Count > 0 && e.EnemyType != first) return false; + } + return true; + } + } + + /// Total enemies spawned per zone by this wave, across all entries. + public int TotalEnemyCount + { + get + { + if (Entries == null) return 0; + int total = 0; + foreach (var e in Entries) + { + if (e.EnemyType != null && e.Count > 0) total += e.Count; + } + return total; + } + } } } diff --git a/Assets/_Project/Scripts/Gameplay/WaveManager.cs b/Assets/_Project/Scripts/Gameplay/WaveManager.cs index ce61ce2..b393f9f 100644 --- a/Assets/_Project/Scripts/Gameplay/WaveManager.cs +++ b/Assets/_Project/Scripts/Gameplay/WaveManager.cs @@ -6,44 +6,54 @@ using TD.Core; using TD.Gameplay.BuilderEffects; using TD.Gameplay.Draft; using TD.Gameplay.EnemyAbilities; +using TD.Gameplay.EnemyUpgrades; +using TD.Gameplay.Waves; using TD.Levels; using TD.UI; namespace TD.Gameplay { /// - /// Server-authoritative wave controller. Spawns enemies across all player zones, - /// tracks wave completion, awards kill gold, and manages the shared lives pool. + /// Server-authoritative encounter driver. Spawns enemies across all player zones, tracks + /// completion, awards kill gold, and manages the shared lives pool. Which encounter to + /// run comes from ; this class only runs it. /// /// - /// Wave lifecycle: + /// Encounter lifecycle: /// - /// When is entered, - /// advances - /// immediately (so the HUD shows the wave number during prep), then waits - /// before spawning. - /// Each spawns Count enemies per player zone, - /// one zone per frame-group, with SpawnInterval seconds between - /// individual enemies in the group. - /// After all entries are spawned, the wave is considered complete only when - /// every active enemy is either killed or has reached the goal. - /// All waves exhausted → . + /// When is entered, asks + /// to draw phase 1 and then runs its first wave. + /// Each encounter is: inter-wave step (draft, then the enemy-buff vote, then the + /// build countdown) → spawn → mop up. See . + /// Each spawns Count enemies per player zone. All + /// spawn held, then release in 10% chunks on ReleaseInterval. + /// The encounter is complete only when every spawned enemy is dead or has leaked. + /// then decides what comes next. + /// Final phase's boss dies → . /// Lives drop to 0 → . /// /// + /// Why the wave list moved out. Waves used to be a hand-ordered array walked + /// start-to-finish, so "which wave is next" was just an index++. Under the 2.0 cyclical + /// design the same five waves repeat across three cycles while accumulating player-voted + /// upgrades, and each phase draws a fresh five — progression that no longer fits in an index. + /// owns it; this class asks it what to run. + /// /// Kill gold: When an enemy dies, names /// the tower's player. resolves the /// OwnerClientId, and awards - /// the gold. + /// the gold. GoldConfig is indexed by + /// — a run-long counter, not a per-cycle one, so + /// per-wave payouts keep climbing as the cycles repeat instead of resetting. /// /// Zone leak counts: is a NetworkList - /// indexed by (int)PlayerSlot (indices 0–8). It is incremented when an enemy + /// indexed by (int)PlayerSlot. It is incremented when an enemy /// crosses from one player zone into another, giving the HUD a per-player leak score. /// Index 0 corresponds to and is unused. /// /// Inspector setup: /// - /// Assign in order (Wave 1 at index 0). + /// Assign a RunDefinition to the scene's . /// Set to match your level design intent. /// /// @@ -55,12 +65,18 @@ namespace TD.Gameplay // ----- Inspector -------------------------------------------------- - [Tooltip("Wave definitions in order. Index 0 = Wave 1.")] - [SerializeField] private WaveDefinition[] waveDefinitions; - [Tooltip("Shared lives pool at the start of a match.")] [SerializeField] private int startingLives = 20; + [Tooltip("Seconds players get to make their personal draft pick. Ends early once every " + + "player has picked. Be generous — this is reading time, not reaction time.")] + [SerializeField] private float draftTimeSeconds = 30f; + + [Tooltip("Seconds players get to vote on the enemy buff. Ends early once every player " + + "has voted. Generous enough that players can watch each other's votes land and " + + "change their own in response.")] + [SerializeField] private float voteTimeSeconds = 25f; + [Tooltip("Single source of truth for every gold tunable: starting gold, per-wave " + "kill rewards, completion bonus, no-leak bonus. Required for a real match; " + "if unset the game falls back to per-player startingGold defaults and grants " + @@ -95,14 +111,27 @@ namespace TD.Gameplay readPerm: NetworkVariableReadPermission.Everyone, writePerm: NetworkVariableWritePermission.Server); + // Which inter-wave stage the countdown above belongs to. One countdown serves all three + // stages (they never overlap), so the HUD needs this to label it correctly. + private readonly NetworkVariable interWaveStage = + new NetworkVariable( + value: InterWaveStage.None, + readPerm: NetworkVariableReadPermission.Everyone, + writePerm: NetworkVariableWritePermission.Server); + // ----- Server-local runtime state --------------------------------- private int remainingLives; private int activeEnemyCount; private bool spawningComplete; - private int currentWaveIndex = -1; // -1 = not yet started + private bool runStarted; private Coroutine activeWaveCoroutine; + // Wave slot the NEXT inter-wave vote will buff — captured when an encounter clears, before + // the run advances past it. -1 means "no vote due": the run's first encounter (nothing has + // been beaten yet) or straight after a boss (the phase's slots are being wiped). + private int pendingVoteSlot = -1; + private readonly System.Collections.Generic.List heldEnemies = new System.Collections.Generic.List(); @@ -178,6 +207,11 @@ namespace TD.Gameplay { var deck = PlayerTowerDeck.GetForClient(pms.OwnerClientId); if (deck != null) deck.ServerInitialize(startingTypeIds); + + // Upgrade nodes start empty — every one is earned through the draft. Cleared + // rather than left alone so Retry / return-to-lobby doesn't carry a previous + // run's unlocks into a new one. + PlayerTowerUpgrades.GetForClient(pms.OwnerClientId)?.ServerInitialize(); } } else @@ -187,7 +221,7 @@ namespace TD.Gameplay } if (ms.Phase == MatchPhase.Playing) - StartNextWave(); + StartRun(); } public override void OnNetworkDespawn() @@ -200,13 +234,6 @@ namespace TD.Gameplay // ----- Public accessors ------------------------------------------- - /// - /// Total number of waves in this match. Same on every peer because - /// is a serialized prefab field, identical - /// on host and clients. Returns 0 if the array is unassigned. - /// - public int TotalWaves => waveDefinitions?.Length ?? 0; - /// /// Number of times enemies have leaked out of the given player's zone over the /// entire match. Replicated — safe to call on any peer. @@ -230,34 +257,82 @@ namespace TD.Gameplay /// public float PrepCountdown => prepCountdown.Value; + /// + /// Which inter-wave step the current countdown belongs to, or + /// while a wave is spawning or being fought. Replicated; + /// safe on any peer. The HUD uses it to label the shared countdown. + /// + public InterWaveStage CurrentInterWaveStage => interWaveStage.Value; + + + /// + /// 1-based encounter number since the run began, or 0 before it starts. This is the key + /// is indexed by. Replicated via , so it's + /// safe on any peer. + /// + public int CurrentEncounterNumber + => RunState.Instance != null && runStarted ? RunState.Instance.GlobalEncounterNumber : 0; // ----- Phase handling --------------------------------------------- private void HandlePhaseChanged(MatchPhase previous, MatchPhase next) { if (!IsServer) return; - if (next == MatchPhase.Playing && currentWaveIndex < 0) - StartNextWave(); + if (next == MatchPhase.Playing) StartRun(); } - // ----- Wave coroutine --------------------------------------------- + // ----- Run control ------------------------------------------------ - private void StartNextWave(bool skipPrep = false) + /// + /// Server-only: begin the run. Draws phase 1 and starts its first encounter. Idempotent — + /// re-entering won't restart a run in progress. + /// + private void StartRun() { - currentWaveIndex++; + if (!IsServer || runStarted) return; - if (waveDefinitions == null || currentWaveIndex >= waveDefinitions.Length) + var run = RunState.Instance; + if (run == null) { - Debug.Log("[WaveManager] All waves complete. Victory."); - MatchState.Instance?.SetPhase(MatchPhase.Victory); + Debug.LogError("[WaveManager] No RunState in the scene — no waves can run. " + + "Add a RunState object and assign it a RunDefinition."); return; } - // Advance the replicated wave counter at the START of prep so the HUD - // shows the upcoming wave number during the countdown. - MatchState.Instance?.SetCurrentWave(currentWaveIndex + 1); // 1-based + if (!run.ServerBeginRun()) + { + // ServerBeginRun already logged the specific reason (missing asset, unplayable + // pools). Bail rather than spawn an empty encounter that can never complete. + Debug.LogError("[WaveManager] Run could not be started; see the RunState error above."); + return; + } - // Reset per-wave bookkeeping for the wave that's about to begin: + runStarted = true; + StartEncounter(skipInterWave: false); + } + + /// + /// Server-only: run whatever encounter is currently pointing at. + /// + /// Skip the draft/vote/build step and spawn immediately. + /// Used by the dev force-advance cheat. + private void StartEncounter(bool skipInterWave) + { + var run = RunState.Instance; + var def = run?.CurrentWave; + + if (def == null) + { + Debug.LogError($"[WaveManager] No wave drawn for {run?.ProgressLabel ?? "?"} — " + + $"the run cannot continue."); + return; + } + + // Publish the run-long encounter number so the HUD and the gold lookup agree on + // which encounter's payout table applies. + MatchState.Instance?.SetCurrentWave(run.GlobalEncounterNumber); + + // Reset per-wave bookkeeping for the encounter that's about to begin: // - waveLeakCounts: per-slot leaks this wave, used for the no-leak bonus. // - PlayerGoldManager.goldEarnedThisWave: HUD top-bar resets so the // "+N g/wave" counter starts at 0. @@ -272,23 +347,91 @@ namespace TD.Gameplay activeEnemyCount = 0; spawningComplete = false; - activeWaveCoroutine = StartCoroutine( - RunWave(waveDefinitions[currentWaveIndex], skipPrep)); + activeWaveCoroutine = StartCoroutine(RunEncounter(def, skipInterWave)); + } + + /// + /// Server-only: the encounter is over — ask what's next and either + /// start it or end the match. + /// + private void AdvanceRun() + { + var run = RunState.Instance; + if (run == null) return; + + switch (run.ServerAdvance()) + { + case RunAdvance.RunComplete: + Debug.Log("[WaveManager] Final boss defeated. Victory."); + MatchState.Instance?.SetPhase(MatchPhase.Victory); + return; + + case RunAdvance.BossReady: + Debug.Log($"[WaveManager] All cycles cleared — boss incoming " + + $"({run.ProgressLabel})."); + break; + + case RunAdvance.NextPhase: + Debug.Log($"[WaveManager] Boss down. New phase drawn: {run.ProgressLabel}. " + + $"Enemy upgrades wiped."); + break; + + case RunAdvance.NextCycle: + Debug.Log($"[WaveManager] Cycle complete — same waves return upgraded " + + $"({run.ProgressLabel})."); + break; + } + + StartEncounter(skipInterWave: false); } // ----- Dev / cheats ----------------------------------------------- /// - /// Dev cheat: skip the rest of the current wave (despawn any remaining - /// enemies, kill the prep timer) and start the next wave immediately. - /// Server-only — silently no-ops on clients. Safe to call during prep, - /// mid-spawn, or while enemies are alive. + /// Dev cheat: skip the rest of the current encounter (despawn any remaining enemies, kill + /// the timers) and start the next one immediately. Server-only — silently no-ops on + /// clients. Safe to call during the inter-wave step, mid-spawn, or while enemies are alive. /// public void ForceAdvanceToNextWave() { - if (!IsServer) return; + if (!IsServer || !runStarted) return; + ClearFieldAndStopEncounter(); + AdvanceRun(); + } - // Stop the current wave's coroutine (cancels prep timer + remaining spawns). + /// + /// Dev cheat: skip whole encounters until the run reaches this phase's boss. Useful for + /// testing boss content without playing fifteen waves. Server-only. + /// + public void ForceAdvanceToBoss() + { + if (!IsServer || !runStarted) return; + + var run = RunState.Instance; + if (run == null || run.IsBossStage) return; + + ClearFieldAndStopEncounter(); + + // Advance until the boss is up (or the run ends, which shouldn't happen from a + // non-boss encounter but is guarded anyway). + int guard = run.EncountersPerPhase + 1; + while (!run.IsBossStage && guard-- > 0) + { + if (run.ServerAdvance() == RunAdvance.RunComplete) + { + MatchState.Instance?.SetPhase(MatchPhase.Victory); + return; + } + } + + StartEncounter(skipInterWave: false); + } + + // Shared teardown for the dev cheats: stop the running encounter, wipe the field, and + // resolve anything the players had open so nothing is left dangling mid-skip. + private void ClearFieldAndStopEncounter() + { + // Stop the current encounter's coroutine (cancels timers + remaining spawns). if (activeWaveCoroutine != null) { StopCoroutine(activeWaveCoroutine); @@ -316,59 +459,40 @@ namespace TD.Gameplay } } - // Reset bookkeeping and start the next wave's RunWave coroutine, - // skipping the prep timer so spawning starts immediately. activeEnemyCount = 0; spawningComplete = false; heldEnemies.Clear(); - // Force-advancing interrupts the prep phase, so resolve any drafts the players - // had open before skipping ahead. + // Skipping ahead interrupts the inter-wave step, so resolve anything the players had + // open before moving on. The draft auto-resolves (a free reward shouldn't vanish + // because a dev pressed a key); the vote is closed WITHOUT resolving, since applying a + // buff nobody finished voting on would silently rewrite the run. DraftService.Instance?.ServerAutoResolveAll(); + WaveVote.Instance?.ServerClose(); - StartNextWave(skipPrep: true); + interWaveStage.Value = InterWaveStage.None; + prepCountdown.Value = 0f; } - private IEnumerator RunWave(WaveDefinition def, bool skipPrep = false) + // ----- Encounter coroutine ---------------------------------------- + + private IEnumerator RunEncounter(WaveDefinition def, bool skipInterWave = false) { - // Prep phase — players build while the countdown ticks. Skipped when - // a dev cheat forces the wave to start immediately. We tick the - // replicated prepCountdown each frame so every HUD can render the - // remaining time consistently. Server is the only writer; clients - // observe the value via NetworkVariable replication. - if (!skipPrep) - { - // Open a draft for every player at the start of the build phase. They pick - // during prep; any unpicked draft is auto-resolved when the timer expires. - DraftService.Instance?.ServerOfferToAll(); + // Draft, enemy-buff vote, then the build countdown. Skipped entirely when a dev + // cheat forces the encounter to start immediately. + if (!skipInterWave) + yield return RunInterWave(def); - prepCountdown.Value = def.PrepTime; - float remaining = def.PrepTime; - // Throttle network sync to ~10 Hz. NetworkVariable replicates on every - // mutation; at 60 fps we'd send ~600 deltas per 10s prep purely to - // animate text that only changes once per second on the HUD. 0.1s - // gives a smooth-enough fall while keeping bandwidth minimal. - const float NetworkSyncInterval = 0.1f; - float nextSync = def.PrepTime - NetworkSyncInterval; - while (remaining > 0f) - { - yield return null; - remaining = Mathf.Max(0f, remaining - Time.deltaTime); - if (remaining <= nextSync || remaining <= 0f) - { - prepCountdown.Value = remaining; - nextSync = remaining - NetworkSyncInterval; - } - } - - // Prep timer expired — auto-resolve any draft the player didn't pick so - // the free reward isn't wasted. - DraftService.Instance?.ServerAutoResolveAll(); - } // Ensure the countdown reads zero entering the spawn phase, regardless of - // whether prep was skipped or just expired. + // whether the build step was skipped or just expired. prepCountdown.Value = 0f; + // Resolve this wave slot's voted buffs once, here — the set is fixed for the whole + // encounter, so doing it per enemy would repeat the same lookup hundreds of times. + // Must run AFTER the inter-wave step, since the vote that just closed may have added + // to a slot this very encounter re-runs on a later cycle. + ResolveCurrentWaveAbilities(); + // Spawn all enemies at once in a held (untargetable, immobile) state. if (def.Entries != null) { @@ -405,6 +529,145 @@ namespace TD.Gameplay CheckWaveComplete(); } + // ----- Inter-wave step --------------------------------------------- + + /// + /// The step between encounters: players take their personal draft, then vote on the buff + /// the wave they just cleared will carry into the next cycle, then build. + /// + /// + /// The three stages run strictly in sequence and never overlap. The build countdown used + /// to double as the draft window, which made "wait until everyone has chosen" impossible + /// to express — players who wanted to build were paying for teammates who wanted to read + /// their cards. Separating them costs a few seconds per wave and makes both steps mean + /// what they say. + /// + /// Each stage ends early the moment every player has acted, so the generous timers + /// are a ceiling for deliberation, not a floor everyone sits through. + /// + private IEnumerator RunInterWave(WaveDefinition def) + { + // ----- 1. Personal draft ----- + // Offered to everyone at once. Anyone who hasn't picked when the timer expires has + // their draft auto-resolved, so an idle player never wastes a free reward. + interWaveStage.Value = InterWaveStage.Draft; + DraftService.Instance?.ServerOfferToAll(); + yield return TickCountdown(draftTimeSeconds, () => DraftService.AllPlayersPicked); + DraftService.Instance?.ServerAutoResolveAll(); + + // ----- 2. Enemy-buff vote ----- + // Votes on the wave that was just cleared, which is the slot captured before the run + // advanced. Skipped on the run's first encounter (nothing has been defeated yet) and + // after a boss (that phase's slots are being wiped anyway). + if (pendingVoteSlot >= 0) + { + var vote = WaveVote.Instance; + var run = RunState.Instance; + + // A vote-meta card may have armed this slot to skip its next vote and take + // several buffs outright. That's the card's whole effect, so it pre-empts the + // normal vote rather than running alongside it. + int autoCount = run != null ? run.GetAutoApplyCount(pendingVoteSlot) : 0; + + if (autoCount > 0 && vote != null) + { + int applied = vote.ServerAutoApply(pendingVoteSlot, autoCount); + run.ServerConsumeAutoApply(pendingVoteSlot); + Debug.Log($"[WaveManager] Wave slot {pendingVoteSlot} auto-took {applied} " + + $"buff(s); no vote held."); + } + else if (vote != null && vote.ServerOpenVote(pendingVoteSlot)) + { + interWaveStage.Value = InterWaveStage.Vote; + yield return TickCountdown(voteTimeSeconds, () => vote.AllPlayersVoted); + vote.ServerResolve(); + } + + pendingVoteSlot = -1; + } + + // ----- 3. Build ----- + interWaveStage.Value = InterWaveStage.Build; + yield return TickCountdown(def.PrepTime); + + interWaveStage.Value = InterWaveStage.None; + } + + /// + /// Ticks down from to zero, + /// exiting early once returns true. + /// + /// + /// Network sync is throttled to ~10 Hz. NetworkVariable replicates on every + /// mutation, so ticking at frame rate would push ~600 deltas across a 10-second countdown + /// purely to animate text that changes once a second. A tenth of a second still falls + /// smoothly while keeping the traffic negligible. + /// + private IEnumerator TickCountdown(float seconds, System.Func finishedEarly = null) + { + const float NetworkSyncInterval = 0.1f; + + prepCountdown.Value = seconds; + float remaining = seconds; + float nextSync = seconds - NetworkSyncInterval; + + while (remaining > 0f) + { + if (finishedEarly != null && finishedEarly()) break; + + yield return null; + remaining = Mathf.Max(0f, remaining - Time.deltaTime); + + if (remaining <= nextSync || remaining <= 0f) + { + prepCountdown.Value = remaining; + nextSync = remaining - NetworkSyncInterval; + } + } + + prepCountdown.Value = 0f; + } + + // ----- Wave ability resolution ------------------------------------- + + // Abilities carried by every enemy of the encounter currently spawning. Rebuilt once per + // encounter (not per enemy) since a wave's buff set is fixed for its whole duration. + private readonly System.Collections.Generic.List currentWaveAbilities + = new System.Collections.Generic.List(); + + private readonly System.Collections.Generic.List upgradeIdScratch + = new System.Collections.Generic.List(); + + /// + /// Server-only: resolve the current wave slot's voted upgrades into the ability list every + /// enemy of this encounter will carry. + /// + /// + /// Called once at the top of an encounter's spawn phase. Cards that resolve to nothing + /// (missing pool entry, non-ability card) are skipped silently here — the vote already + /// validated them, and a warning per enemy would flood the log. + /// + private void ResolveCurrentWaveAbilities() + { + currentWaveAbilities.Clear(); + + var run = RunState.Instance; + var pool = EnemyUpgradePool.Instance; + if (run == null || pool == null) return; + + run.GetUpgradesForSlot(run.CurrentUpgradeSlot, upgradeIdScratch); + + foreach (int id in upgradeIdScratch) + { + if (pool.Get(id) is AbilityEnemyUpgradeOption card && card.Ability != null) + currentWaveAbilities.Add(card.Ability); + } + + if (currentWaveAbilities.Count > 0) + Debug.Log($"[WaveManager] {run.ProgressLabel} enemies carry " + + $"{currentWaveAbilities.Count} wave buff(s)."); + } + // ----- Spawn helpers ---------------------------------------------- private void SpawnEnemyInAllZones(EnemyDefinition def, bool held = false) @@ -430,7 +693,9 @@ namespace TD.Gameplay // PlayerZoneVolume (so OwnerGrid[spawnerTile] = None). var spawner = zone.Spawners[0]; (float xHalf, float zHalf) = ComputeSpawnerHalfExtents(spawner.TileArea); - SpawnEnemy(def, spawner.TilePosition, zone.Owner, xHalf, zHalf, held, spawner.Facing); + SpawnEnemy(def, spawner.TilePosition, zone.Owner, currentWaveAbilities, + xHalfExtent: xHalf, zHalfExtent: zHalf, held: held, + facing: spawner.Facing); } } @@ -455,10 +720,18 @@ namespace TD.Gameplay return (xHalf, zHalf); } + /// + /// Server-only: build and spawn one enemy. + /// + /// Wave buffs this enemy carries. Null/empty for a plain enemy. + /// Pre-computed stats to spawn with, bypassing both the + /// definition's values and ' spawn modifications. Used by + /// split-on-death, whose minions are derived from the parent rather than the asset. private void SpawnEnemy(EnemyDefinition def, Vector2Int spawnerTile, PlayerSlot ownerSlot, + System.Collections.Generic.IReadOnlyList abilities, + EnemySpawnContext? contextOverride = null, float xHalfExtent = 0f, float zHalfExtent = 0f, bool held = false, - Direction facing = Direction.South, bool canRollAbility = true, - float hpMultiplier = 1f, float visualScale = 1f) + Direction facing = Direction.South) { if (def.EnemyPrefab == null) { @@ -466,6 +739,16 @@ namespace TD.Gameplay return; } + // Resolve the stats this enemy will actually spawn with. Abilities get first say — + // flight, health and size all have to be settled before the position is computed and + // before EnemyHealth/EnemyMovement read them, since each is captured once. + var context = contextOverride ?? EnemySpawnContext.FromDefinition(def); + if (contextOverride == null && abilities != null) + { + for (int i = 0; i < abilities.Count; i++) + abilities[i]?.ServerModifySpawn(ref context); + } + Vector3 spawnPos = GridCoordinates.GridToWorld(spawnerTile); if (xHalfExtent > 0f) spawnPos.x += Random.Range(-xHalfExtent, xHalfExtent); @@ -475,8 +758,8 @@ namespace TD.Gameplay // Flying enemies spawn elevated so they visually soar over towers. The // movement code preserves Y per-frame, so this height persists for the // enemy's whole flight. NetworkTransform replicates the raised position. - if (def.IsFlying) - spawnPos.y += def.FlightHeight; + if (context.IsFlying) + spawnPos.y += context.FlightHeight; float yaw = facing switch { @@ -492,11 +775,11 @@ namespace TD.Gameplay spawnPos, Quaternion.Euler(0f, yaw, 0f)); - // Scales the whole prefab hierarchy uniformly (used for split-on-death minions). + // Scales the whole prefab hierarchy uniformly (split minions, size-changing buffs). // Relies on the enemy prefab's NetworkTransform syncing scale to clients — verify // that's enabled if a scaled spawn doesn't look smaller on remote peers. - if (visualScale != 1f) - go.transform.localScale *= visualScale; + if (!Mathf.Approximately(context.VisualScale, 1f)) + go.transform.localScale *= context.VisualScale; var health = go.GetComponent(); var movement = go.GetComponent(); @@ -509,16 +792,24 @@ namespace TD.Gameplay return; } - health.InitializeServer(def.MaxHp * hpMultiplier, def.LivesCost, def.IsFlying, held); - movement.InitializeServer(def.MoveSpeed, spawnerTile, ownerSlot, def.IsFlying); + // Boss-ness comes from the run's position (this is the phase's boss encounter), not + // from the wave asset — the same WaveDefinition could legally sit in both a cycle pool + // and a boss pool, and it's only a boss when drawn as one. Split minions inherit it + // via the context override path, which never sets the flag. + bool isBoss = contextOverride == null && (RunState.Instance?.IsBossStage ?? false); - // Optional — only prefabs with an EnemyAbility component roll an ability. See + health.InitializeServer(context.MaxHp, context.LivesCost, context.IsFlying, held, isBoss); + movement.InitializeServer(context.MoveSpeed, spawnerTile, ownerSlot, context.IsFlying); + + // Optional — only prefabs with an EnemyAbility component can carry wave buffs. See // EnemyAbility's remarks for why on-death abilities aren't event-subscription driven. - // canRollAbility is false for split-spawned minions (see ServerSpawnSplitEnemies) so - // they can never chain into further splits or pick up any other ability. var ability = go.GetComponent(); if (ability != null) - ability.InitializeServer(canRollAbility ? EnemyAbilityPool.Instance?.RollRandom() : null); + ability.InitializeServer(abilities, context); + else if (abilities != null && abilities.Count > 0) + Debug.LogWarning($"[WaveManager] '{def.EnemyPrefab.name}' has no EnemyAbility " + + $"component, so this wave's {abilities.Count} buff(s) will not " + + $"apply to it. Add the component to the prefab."); if (held) heldEnemies.Add(health); @@ -540,18 +831,26 @@ namespace TD.Gameplay /// activeEnemyCount/event-wiring bookkeeping as any other spawn. /// /// - /// Split-spawned minions never roll an ability of their own — they're always plain, - /// so a split can't chain into further splits (or any other ability) regardless of - /// which EnemyDefinition/prefab is used for . + /// Minions inherit nothing. They are spawned with an empty ability list, so a split + /// can never chain into further splits or pick up any other buff the parent's wave carries. + /// That is the whole termination argument for the recursion — one extra generation, always, + /// however many cards the wave has collected. + /// + /// Their stats come entirely from , which the calling + /// ability derives from the parent's own spawned values. Passing it as an override also + /// bypasses spawn modification, which is correct: those modifiers already applied to the + /// parent and are baked into what's being scaled here. /// public void ServerSpawnSplitEnemies(EnemyDefinition def, int count, Vector2Int atTile, PlayerSlot ownerSlot, float scatterRadius, - float hpMultiplier = 1f, float visualScale = 1f) + EnemySpawnContext context) { if (!IsServer) return; for (int i = 0; i < count; i++) - SpawnEnemy(def, atTile, ownerSlot, scatterRadius, scatterRadius, canRollAbility: false, - hpMultiplier: hpMultiplier, visualScale: visualScale); + SpawnEnemy(def, atTile, ownerSlot, + abilities: null, + contextOverride: context, + xHalfExtent: scatterRadius, zHalfExtent: scatterRadius); } // ----- Enemy event handlers (server-only) ------------------------- @@ -562,9 +861,16 @@ namespace TD.Gameplay // every enemy in the wave regardless of EnemyDefinition type. Missing config // or out-of-range wave → 0 reward (gold flow disabled, designer-error mode). int killReward = 0; - var goldEntry = goldConfig?.GetWaveEntry(currentWaveIndex + 1); + var goldEntry = goldConfig?.GetWaveEntry(CurrentEncounterNumber); if (goldEntry != null) killReward = goldEntry.GoldPerEnemy; + // Wave buffs get to alter the bounty before anything else sees it — this is what + // reward-suppressing cards hook. Applied before the builder's gold-per-kill bonus so + // a card that zeroes the bounty doesn't also cancel a player's own upgrade. + var enemyAbility = health.GetComponent(); + if (enemyAbility != null) + killReward = enemyAbility.ServerModifyKillReward(killReward); + // Award kill gold to the tower owner that landed the killing blow. The builder's // "gold per kill" effect (if granted) is queried live here rather than cached on // the killing tower — see BuilderUpgradeManager's "query, don't snapshot" note. @@ -591,12 +897,11 @@ namespace TD.Gameplay if (totalReward > 0) ShowGoldRewardClientRpc(health.transform.position, totalReward); - // Resolve any on-death ability BEFORE unsubscribing/decrementing. A split-spawn's + // Resolve on-death abilities BEFORE unsubscribing/decrementing. A split-spawn's // activeEnemyCount++ (inside ServerSpawnSplitEnemies -> SpawnEnemy) must land before // this kill's activeEnemyCount-- below, or a split on a wave's last enemy could let // CheckWaveComplete see activeEnemyCount hit 0 and advance the wave prematurely. - var ability = health.GetComponent(); - ability?.Definition?.ServerOnDeath(ability, health); + enemyAbility?.ServerInvokeOnDeath(health); UnsubscribeEnemy(health); DecrementAndCheckComplete(); @@ -624,6 +929,11 @@ namespace TD.Gameplay if (livesCost > 0) ShowLifeLossClientRpc(leakPos, livesCost); + // Wave buffs that punish leaks beyond the life cost hook here, while the enemy is + // still alive enough to be queried. Runs before the defeat check so a leak that ends + // the match still applies its full penalty. + movement.GetComponent()?.ServerInvokeReachedGoal(movement.OriginZone); + UnsubscribeEnemy(movement.GetComponent()); remainingLives = Mathf.Max(0, remainingLives - livesCost); @@ -656,6 +966,23 @@ namespace TD.Gameplay OnLifeLost?.Invoke(amount); } + [ClientRpc] + private void ShowGoldLossClientRpc(Vector3 worldPos, int amount) + { + FloatingTextSpawner.Instance?.SpawnGoldLoss(worldPos, amount); + } + + /// + /// Server-only: show a "-N gold" popup on every peer. Exposed because enemy abilities run + /// inside ScriptableObjects, which have no NetworkBehaviour of their own to send a + /// ClientRpc from. + /// + public void ServerBroadcastGoldLoss(Vector3 worldPos, int amount) + { + if (!IsServer || amount <= 0) return; + ShowGoldLossClientRpc(worldPos, amount); + } + // ----- Local-only notification events ----------------------------- /// @@ -704,8 +1031,15 @@ namespace TD.Gameplay // no-leak bonus only if the player's waveLeakCounts entry is exactly 0. AwardWaveCompletionBonuses(); - Debug.Log($"[WaveManager] Wave {currentWaveIndex + 1} complete. Starting next wave."); - StartNextWave(); + // Capture which slot the upcoming vote will buff BEFORE advancing past it — the vote + // is on "the wave you just beat", but by the time the inter-wave step runs the run has + // already moved on. A boss clear is excluded: its phase's slots are about to be wiped, + // so voting a buff onto them would be voting into a bin. + var run = RunState.Instance; + pendingVoteSlot = (run != null && !run.IsBossStage) ? run.CurrentUpgradeSlot : -1; + + Debug.Log($"[WaveManager] {run?.ProgressLabel ?? "Encounter"} complete."); + AdvanceRun(); } // Server-only. Iterates active players, awards CompletionBonus to each, plus @@ -714,7 +1048,7 @@ namespace TD.Gameplay // Skipped silently if no goldConfig or no entry for this wave. private void AwardWaveCompletionBonuses() { - var entry = goldConfig?.GetWaveEntry(currentWaveIndex + 1); + var entry = goldConfig?.GetWaveEntry(CurrentEncounterNumber); if (entry == null) return; int completionBonus = entry.CompletionBonus; diff --git a/Assets/_Project/Scripts/Gameplay/Waves.meta b/Assets/_Project/Scripts/Gameplay/Waves.meta new file mode 100644 index 0000000..67bd139 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/Waves.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f65ba25aee224c24dad3648d9e5e953e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Scripts/Gameplay/Waves/PhaseDefinition.cs b/Assets/_Project/Scripts/Gameplay/Waves/PhaseDefinition.cs new file mode 100644 index 0000000..2700d59 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/Waves/PhaseDefinition.cs @@ -0,0 +1,102 @@ +// Assets/_Project/Scripts/Gameplay/Waves/PhaseDefinition.cs +using System.Collections.Generic; +using UnityEngine; + +namespace TD.Gameplay.Waves +{ + /// + /// One phase of a run: the pool its cycle waves are drawn from, and the pool its boss is + /// drawn from. A phase runs the same drawn wave set for every one of its cycles, then ends + /// in a boss. + /// + /// + /// Groups, not waves. Both pools are lists of assets rather + /// than flat wave lists, so re-balancing a run means dragging a group between phases instead + /// of re-authoring individual entries. Listing the same group in two phases is legal — the + /// draws are independent. + /// + /// Draw contract. RunState draws WavesPerCycle waves from + /// with distinct enemy types, because enemy upgrades are keyed + /// to a wave slot and two slots sharing an enemy type would make "which wave did this buff + /// apply to" ambiguous. That makes the real authoring requirement stricter than the entry + /// count: a phase needs at least WavesPerCycle distinct enemy types across its groups, + /// not just that many waves. exists so the draw can + /// fail loudly at match start rather than mid-run. + /// + [CreateAssetMenu(fileName = "PhaseDefinition", menuName = "TD/Run/Phase Definition", order = 11)] + public class PhaseDefinition : ScriptableObject + { + [Tooltip("Designer-facing name for this phase, shown in validation messages. " + + "Falls back to the asset name when empty.")] + public string DisplayName; + + [Tooltip("Groups this phase's cycle waves are drawn from. All groups are pooled " + + "together for the draw; group membership is an authoring convenience, not a " + + "draw boundary.")] + public WaveGroup[] WaveGroups; + + [Tooltip("Groups this phase's boss is drawn from. A boss is an ordinary WaveDefinition " + + "that happens to spawn a single powerful enemy.")] + public WaveGroup[] BossGroups; + + [Tooltip("Enemy-buff cards votable during this phase. Gating is per PHASE, not per cycle " + + "— every card listed here can be voted on from this phase's very first wave. " + + "Cards must also appear in the scene's EnemyUpgradePool to be offerable.")] + public EnemyUpgrades.EnemyUpgradeGroup[] EnemyUpgradeGroups; + + /// Name used in validation and log messages. Falls back to the asset name. + public string Label => string.IsNullOrWhiteSpace(DisplayName) ? name : DisplayName; + + /// + /// Appends every non-null, non-zero-weight entry across into + /// . Zero-weight entries are filtered here (not at draw time) so + /// "weight 0 means it can never appear" is enforced in exactly one place. + /// + public static void CollectCandidates(WaveGroup[] groups, List into) + { + into.Clear(); + if (groups == null) return; + + for (int g = 0; g < groups.Length; g++) + { + var group = groups[g]; + if (group?.Waves == null) continue; + + for (int i = 0; i < group.Waves.Length; i++) + { + var entry = group.Waves[i]; + if (entry?.Wave == null) continue; + if (entry.Weight <= 0f) continue; + into.Add(entry); + } + } + } + + /// Collects this phase's cycle-wave candidates. + public void CollectWaveCandidates(List into) + => CollectCandidates(WaveGroups, into); + + /// Collects this phase's boss candidates. + public void CollectBossCandidates(List into) + => CollectCandidates(BossGroups, into); + + /// + /// How many distinct enemy types are reachable across this phase's wave groups. The + /// upper bound on how many wave slots this phase can fill, since the draw requires + /// distinct types. + /// + public int CountDistinctEnemyTypes() + { + var candidates = new List(); + CollectWaveCandidates(candidates); + + var seen = new HashSet(); + foreach (var entry in candidates) + { + var type = entry.Wave.PrimaryEnemyType; + if (type != null) seen.Add(type); + } + return seen.Count; + } + } +} diff --git a/Assets/_Project/Scripts/Gameplay/Waves/PhaseDefinition.cs.meta b/Assets/_Project/Scripts/Gameplay/Waves/PhaseDefinition.cs.meta new file mode 100644 index 0000000..c397855 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/Waves/PhaseDefinition.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8f73fcf0261654d44a6d0939bdc9b88f \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/Waves/RunDefinition.cs b/Assets/_Project/Scripts/Gameplay/Waves/RunDefinition.cs new file mode 100644 index 0000000..6b0feb3 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/Waves/RunDefinition.cs @@ -0,0 +1,209 @@ +// Assets/_Project/Scripts/Gameplay/Waves/RunDefinition.cs +using System.Collections.Generic; +using System.Text; +using UnityEngine; + +namespace TD.Gameplay.Waves +{ + /// + /// The whole run: how many waves make a cycle, how many cycles make a phase, and the + /// per-phase pools everything is drawn from. One asset assigned to RunState in the + /// match scene; replaces WaveManager's old flat, hand-ordered wave array. + /// + /// + /// Stable wave ids. Waves are replicated by index into a flat list this asset builds + /// by walking its phases, groups, and entries in declaration order (see + /// ). Because every peer loads the identical asset, the same walk + /// produces the same ids everywhere — the same trick the tower catalog and + /// DraftPool already use, and the reason the server can say "wave slot 2 is wave #7" + /// in a single int. + /// + /// The index is frozen for the match. RunState builds it once on spawn + /// and never rebuilds, so editing this asset mid-play-session cannot renumber ids out from + /// under in-flight replication. Edit-time changes invalidate the cache normally. + /// + [CreateAssetMenu(fileName = "RunDefinition", menuName = "TD/Run/Run Definition", order = 12)] + public class RunDefinition : ScriptableObject + { + [Header("Structure")] + [Tooltip("Waves in one cycle. The phase draws this many distinct-enemy-type waves and " + + "replays them every cycle.")] + [Min(1)] + public int WavesPerCycle = 5; + + [Tooltip("Cycles before the phase's boss appears. The same drawn waves repeat each " + + "cycle, carrying whatever upgrades players voted onto them.")] + [Min(1)] + public int CyclesPerPhase = 3; + + [Tooltip("Phases in order. Beating the last phase's boss wins the run. The MVP ships " + + "one phase; the full design is three.")] + public PhaseDefinition[] Phases; + + // ----- Flat wave index (network identity) -------------------------- + + // Built lazily and cached. Null means "not built yet". Rebuilt only on explicit request + // or on edit-time validation — never spontaneously during play, since ids in flight + // would be invalidated. + private List waveIndex; + private Dictionary waveIds; + + /// Number of distinct waves reachable anywhere in this run. + public int WaveCount + { + get { EnsureIndex(); return waveIndex.Count; } + } + + /// Resolves a replicated wave id back to its asset, or null if out of range. + public WaveDefinition GetWave(int waveId) + { + EnsureIndex(); + return (waveId >= 0 && waveId < waveIndex.Count) ? waveIndex[waveId] : null; + } + + /// Resolves a wave asset to its replicated id. + public bool TryGetWaveId(WaveDefinition wave, out int waveId) + { + EnsureIndex(); + if (wave != null && waveIds.TryGetValue(wave, out waveId)) return true; + waveId = -1; + return false; + } + + /// + /// Rebuilds the flat wave index from the current asset contents. Called once by + /// RunState on every peer at match start so ids agree, and by the editor when + /// the asset changes. + /// + public void RebuildIndex() + { + waveIndex ??= new List(); + waveIds ??= new Dictionary(); + waveIndex.Clear(); + waveIds.Clear(); + + if (Phases == null) return; + + // Declaration-order walk. Every peer runs this over the same asset, so the + // resulting ids match without any negotiation. Zero-weight entries are indexed + // too: they can't be drawn, but indexing them keeps ids stable if a designer + // re-weights between sessions. + foreach (var phase in Phases) + { + if (phase == null) continue; + IndexGroups(phase.WaveGroups); + IndexGroups(phase.BossGroups); + } + } + + private void IndexGroups(WaveGroup[] groups) + { + if (groups == null) return; + foreach (var group in groups) + { + if (group?.Waves == null) continue; + foreach (var entry in group.Waves) + { + if (entry?.Wave == null) continue; + if (waveIds.ContainsKey(entry.Wave)) continue; // first occurrence wins + waveIds[entry.Wave] = waveIndex.Count; + waveIndex.Add(entry.Wave); + } + } + } + + private void EnsureIndex() + { + if (waveIndex == null || waveIds == null) RebuildIndex(); + } + + // ----- Validation -------------------------------------------------- + + /// + /// Checks that this run can actually be played: at least one phase, every phase able to + /// fill slots with distinct enemy types, and every phase able + /// to produce a boss. Returns true when the run is playable; + /// carries the problems either way (it may hold warnings even + /// on success). + /// + /// + /// The distinct-enemy-type requirement is the one that bites in practice: a phase can + /// hold twenty waves and still be unplayable if they all point at the same three enemies. + /// Checking it up front turns that into a startup error instead of a draw that silently + /// runs short a wave. + /// + public bool Validate(out string report) + { + var sb = new StringBuilder(); + bool ok = true; + + if (Phases == null || Phases.Length == 0) + { + sb.AppendLine("• No phases assigned — the run has nothing to play."); + report = sb.ToString(); + return false; + } + + var candidates = new List(); + + for (int i = 0; i < Phases.Length; i++) + { + var phase = Phases[i]; + string label = phase != null ? phase.Label : $"Phase {i + 1}"; + + if (phase == null) + { + sb.AppendLine($"• {label}: slot is empty."); + ok = false; + continue; + } + + int distinctTypes = phase.CountDistinctEnemyTypes(); + if (distinctTypes < WavesPerCycle) + { + sb.AppendLine($"• {label}: needs {WavesPerCycle} distinct enemy types to fill " + + $"a cycle but only {distinctTypes} are reachable. Add waves " + + $"using other enemies, or lower Waves Per Cycle."); + ok = false; + } + + phase.CollectBossCandidates(candidates); + if (candidates.Count == 0) + { + sb.AppendLine($"• {label}: no boss candidates (every boss group is empty, " + + $"unassigned, or entirely zero-weight)."); + ok = false; + } + + // Warnings — these don't block a run, they just play oddly. + phase.CollectWaveCandidates(candidates); + foreach (var entry in candidates) + { + if (entry.Wave.PrimaryEnemyType == null) + sb.AppendLine($"• (warning) {label}: '{entry.Wave.name}' has no usable " + + $"enemy entries and can never be drawn meaningfully."); + else if (!entry.Wave.HasSingleEnemyType) + sb.AppendLine($"• (warning) {label}: '{entry.Wave.name}' mixes enemy " + + $"types. Upgrades and HUD labels will use " + + $"'{entry.Wave.PrimaryEnemyType.name}' only."); + } + } + + report = sb.Length > 0 ? sb.ToString() : "Run structure OK."; + return ok; + } + +#if UNITY_EDITOR + private void OnValidate() + { + // Only invalidate outside play mode. Clearing the cache mid-match would renumber + // wave ids while replicated slot references are still pointing at the old numbering. + if (!Application.isPlaying) + { + waveIndex = null; + waveIds = null; + } + } +#endif + } +} diff --git a/Assets/_Project/Scripts/Gameplay/Waves/RunDefinition.cs.meta b/Assets/_Project/Scripts/Gameplay/Waves/RunDefinition.cs.meta new file mode 100644 index 0000000..6c2d0d3 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/Waves/RunDefinition.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2b73bb9876b7fdb4480b13ff6bb8bd67 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/Waves/RunState.cs b/Assets/_Project/Scripts/Gameplay/Waves/RunState.cs new file mode 100644 index 0000000..5f0cd92 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/Waves/RunState.cs @@ -0,0 +1,468 @@ +// Assets/_Project/Scripts/Gameplay/Waves/RunState.cs +using System.Collections.Generic; +using Unity.Netcode; +using UnityEngine; + +namespace TD.Gameplay.Waves +{ + /// + /// Outcome of advancing the run by one encounter. Returned by + /// so WaveManager can react without + /// re-deriving the progression maths. + /// + public enum RunAdvance : byte + { + /// Moved to the next wave inside the current cycle. + NextWave = 0, + /// Moved to the first wave of a new cycle — the same waves come round again, + /// now carrying whatever upgrades players voted onto them. + NextCycle = 1, + /// Every cycle in the phase is done; the boss is up next. + BossReady = 2, + /// The boss died and a new phase was drawn. Upgrades were wiped. + NextPhase = 3, + /// The final phase's boss died — the run is won. + RunComplete = 4, + } + + /// + /// Server-authoritative owner of run progression: which phase and cycle we're in, which waves + /// this phase drew, and which upgrades the players have voted onto each wave slot. + /// + /// + /// Split of duties with WaveManager. This type is the run's state — + /// counters, draws, upgrade sets — and knows nothing about spawning. WaveManager is the + /// driver: it runs an encounter, and when the field is clear it calls + /// and acts on the returned . Keeping them + /// apart is what stops WaveManager (already a large class) from also owning pool draws and + /// upgrade bookkeeping. + /// + /// Linear encounter index. Rather than replicate cycle and wave separately and + /// keep them in sync, one counter runs + /// 0 .. CyclesPerPhase*WavesPerCycle inclusive, with the final value meaning "boss". + /// Cycle and wave slot are derived from it, so they cannot disagree. + /// + /// Upgrades are keyed by wave slot, not enemy type. The phase draw guarantees the + /// slots hold distinct enemy types, which makes slot and type interchangeable as a key — and + /// slot is the one that survives a phase change cleanly, since the next phase reassigns every + /// slot to a fresh enemy anyway. + /// + public class RunState : NetworkBehaviour + { + // ----- Singleton -------------------------------------------------- + + public static RunState Instance { get; private set; } + + // ----- Inspector -------------------------------------------------- + + [Tooltip("The run this match plays: phase pools, waves per cycle, cycles per phase. " + + "Required — without it no waves can be drawn.")] + [SerializeField] private RunDefinition runDefinition; + + // ----- Networked state -------------------------------------------- + + private readonly NetworkVariable phaseIndex = new NetworkVariable( + 0, NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Server); + + // 0 .. (CyclesPerPhase * WavesPerCycle), where the top value means "boss". + private readonly NetworkVariable encounterInPhase = new NetworkVariable( + 0, NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Server); + + // Wave ids (indices into RunDefinition's flat index) drawn for this phase's slots. + // Exactly WavesPerCycle entries once a phase has been drawn. + private NetworkList drawnWaveIds; + + private readonly NetworkVariable bossWaveId = new NetworkVariable( + -1, NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Server); + + // Upgrades voted onto wave slots, packed as (slot << SlotShift) | optionId. A flat + // append-only list rather than a per-slot structure because NGO has no nested-collection + // support and the counts here are tiny (a handful per slot, per phase). + private NetworkList waveUpgrades; + + private const int SlotShift = 16; + private const int OptionMask = (1 << SlotShift) - 1; + + // Per-slot count of buffs to apply automatically, skipping the next vote for that slot. + // Indexed by upgrade slot (0..WavesPerCycle, the last being the boss). Zero means a normal + // vote. Written by the vote-meta cards, consumed by the inter-wave step. + private NetworkList autoApplyCounts; + + /// + /// Fired on every peer whenever run progression or the drawn/upgraded wave set changes. + /// The HUD subscribes to relabel without polling. + /// + public event System.Action OnRunChanged; + + // ----- Lifecycle --------------------------------------------------- + + private void Awake() + { + drawnWaveIds = new NetworkList(); + waveUpgrades = new NetworkList(); + autoApplyCounts = new NetworkList(); + } + + public override void OnNetworkSpawn() + { + if (Instance != null && Instance != this) + { + Debug.LogError("[RunState] Duplicate RunState detected. Only one may exist per scene."); + return; + } + Instance = this; + + // Freeze the wave index on EVERY peer (not just the server) before any id crosses + // the wire. Same asset, same declaration-order walk, same numbering. + runDefinition?.RebuildIndex(); + + // One auto-apply counter per upgrade slot, plus one for the boss slot. + if (IsServer) + { + for (int i = 0; i <= WavesPerCycle; i++) autoApplyCounts.Add(0); + } + + phaseIndex.OnValueChanged += HandleIntChanged; + encounterInPhase.OnValueChanged += HandleIntChanged; + bossWaveId.OnValueChanged += HandleIntChanged; + drawnWaveIds.OnListChanged += HandleListChanged; + waveUpgrades.OnListChanged += HandleListChanged; + } + + public override void OnNetworkDespawn() + { + phaseIndex.OnValueChanged -= HandleIntChanged; + encounterInPhase.OnValueChanged -= HandleIntChanged; + bossWaveId.OnValueChanged -= HandleIntChanged; + drawnWaveIds.OnListChanged -= HandleListChanged; + waveUpgrades.OnListChanged -= HandleListChanged; + + if (Instance == this) Instance = null; + } + + private void HandleIntChanged(int _, int __) => OnRunChanged?.Invoke(); + private void HandleListChanged(NetworkListEvent _) => OnRunChanged?.Invoke(); + + // ----- Structure accessors ----------------------------------------- + + /// The run asset driving this match, or null if unassigned (designer error). + public RunDefinition Definition => runDefinition; + + public int WavesPerCycle => runDefinition != null ? Mathf.Max(1, runDefinition.WavesPerCycle) : 5; + public int CyclesPerPhase => runDefinition != null ? Mathf.Max(1, runDefinition.CyclesPerPhase) : 3; + public int PhaseCount => runDefinition?.Phases?.Length ?? 0; + + /// Encounters in one phase, counting its boss. + public int EncountersPerPhase => CyclesPerPhase * WavesPerCycle + 1; + + // ----- Progression accessors --------------------------------------- + + /// Zero-based phase index. + public int PhaseIndex => phaseIndex.Value; + + /// + /// The phase currently being played, or null if the run isn't set up. Read by the vote + /// generator to find which enemy-buff cards this phase allows. + /// + public PhaseDefinition CurrentPhase + { + get + { + var phases = runDefinition?.Phases; + if (phases == null) return null; + int i = phaseIndex.Value; + return (i >= 0 && i < phases.Length) ? phases[i] : null; + } + } + + /// Zero-based cycle index within the current phase. Reads as the last cycle + /// while the boss is up (the boss belongs to the phase, not to a fourth cycle). + public int CycleIndex => Mathf.Min(encounterInPhase.Value / WavesPerCycle, CyclesPerPhase - 1); + + /// Zero-based wave slot within the current cycle. Meaningless while + /// is true. + public int WaveSlot => encounterInPhase.Value % WavesPerCycle; + + /// True when the next/current encounter is this phase's boss. + public bool IsBossStage => encounterInPhase.Value >= CyclesPerPhase * WavesPerCycle; + + /// + /// 1-based count of encounters since the run began, including bosses. This is the key + /// GoldConfig is indexed by, so its per-wave entries scale monotonically across the + /// whole run rather than resetting every cycle. + /// + public int GlobalEncounterNumber + => phaseIndex.Value * EncountersPerPhase + encounterInPhase.Value + 1; + + /// Human-readable progress line for the HUD, e.g. "Phase 1 · Cycle 2 · Wave 3/5". + public string ProgressLabel + => IsBossStage + ? $"Phase {phaseIndex.Value + 1} · BOSS" + : $"Phase {phaseIndex.Value + 1} · Cycle {CycleIndex + 1} · " + + $"Wave {WaveSlot + 1}/{WavesPerCycle}"; + + // ----- Wave accessors ---------------------------------------------- + + /// The wave asset drawn for , or null if not drawn yet. + public WaveDefinition GetSlotWave(int slot) + { + if (runDefinition == null) return null; + if (slot < 0 || slot >= drawnWaveIds.Count) return null; + return runDefinition.GetWave(drawnWaveIds[slot]); + } + + /// This phase's boss wave, or null if not drawn yet. + public WaveDefinition BossWave + => runDefinition != null ? runDefinition.GetWave(bossWaveId.Value) : null; + + /// The wave the run is currently pointing at — boss or cycle wave. + public WaveDefinition CurrentWave => IsBossStage ? BossWave : GetSlotWave(WaveSlot); + + /// + /// The slot key upgrades attach to for the current encounter. The boss occupies the slot + /// one past the last cycle wave, so boss upgrades (if ever voted) don't collide with it. + /// + public int CurrentUpgradeSlot => IsBossStage ? WavesPerCycle : WaveSlot; + + // ----- Upgrade accessors ------------------------------------------- + + /// + /// Collects the upgrade option ids voted onto , in the order they + /// were applied. Safe on any peer. + /// + public void GetUpgradesForSlot(int slot, List into) + { + into.Clear(); + for (int i = 0; i < waveUpgrades.Count; i++) + { + int packed = waveUpgrades[i]; + if ((packed >> SlotShift) == slot) into.Add(packed & OptionMask); + } + } + + /// How many upgrades are stacked on . + public int CountUpgradesForSlot(int slot) + { + int n = 0; + for (int i = 0; i < waveUpgrades.Count; i++) + if ((waveUpgrades[i] >> SlotShift) == slot) n++; + return n; + } + + /// True if already carries . + /// Used to keep the vote from offering a buff a wave already has. + public bool SlotHasUpgrade(int slot, int optionId) + { + int packed = (slot << SlotShift) | (optionId & OptionMask); + for (int i = 0; i < waveUpgrades.Count; i++) + if (waveUpgrades[i] == packed) return true; + return false; + } + + /// Server-only: stack an upgrade onto a wave slot. Ignores exact duplicates. + public void ServerAddUpgrade(int slot, int optionId) + { + if (!IsServer) return; + if (slot < 0 || optionId < 0) return; + if (SlotHasUpgrade(slot, optionId)) return; + + waveUpgrades.Add((slot << SlotShift) | (optionId & OptionMask)); + } + + // ----- Auto-apply (vote-meta cards) -------------------------------- + + /// + /// How many buffs will take automatically instead of holding its + /// next vote. Zero means a normal vote. + /// + public int GetAutoApplyCount(int slot) + => (slot >= 0 && slot < autoApplyCounts.Count) ? autoApplyCounts[slot] : 0; + + /// + /// Server-only: arm to auto-take buffs in + /// place of its next vote. Takes the larger value if already armed, so two vote-meta cards + /// on one slot don't cancel each other down. + /// + public void ServerSetAutoApply(int slot, int count) + { + if (!IsServer) return; + if (slot < 0 || slot >= autoApplyCounts.Count || count <= 0) return; + autoApplyCounts[slot] = Mathf.Max(autoApplyCounts[slot], count); + } + + /// Server-only: disarm after its auto-apply has fired. + public void ServerConsumeAutoApply(int slot) + { + if (!IsServer) return; + if (slot < 0 || slot >= autoApplyCounts.Count) return; + autoApplyCounts[slot] = 0; + } + + private void ServerClearAutoApply() + { + for (int i = 0; i < autoApplyCounts.Count; i++) autoApplyCounts[i] = 0; + } + + // ----- Server: run control ------------------------------------------ + + /// + /// Server-only: start the run at phase 0 and draw its waves. Returns false if the run + /// definition is missing or unplayable — the caller should treat that as fatal rather + /// than limping along with an empty schedule. + /// + public bool ServerBeginRun() + { + if (!IsServer) return false; + + if (runDefinition == null) + { + Debug.LogError("[RunState] No RunDefinition assigned — cannot start a run."); + return false; + } + + if (!runDefinition.Validate(out string report)) + { + Debug.LogError($"[RunState] RunDefinition '{runDefinition.name}' is not playable:\n{report}"); + return false; + } + + phaseIndex.Value = 0; + encounterInPhase.Value = 0; + waveUpgrades.Clear(); + ServerClearAutoApply(); + + return ServerDrawPhase(0); + } + + /// + /// Server-only: advance one encounter, drawing a new phase (and wiping upgrades) when the + /// boss falls. See for what the caller should do with each result. + /// + public RunAdvance ServerAdvance() + { + if (!IsServer) return RunAdvance.NextWave; + + // Boss just died: the phase is over. Either draw the next one or win the run. + if (IsBossStage) + { + int next = phaseIndex.Value + 1; + if (next >= PhaseCount) return RunAdvance.RunComplete; + + phaseIndex.Value = next; + encounterInPhase.Value = 0; + + // A new phase means five brand-new waves, so every upgrade voted onto the old + // slots is meaningless — wiped by design, not by omission. Armed auto-applies go + // with them: they were promises made about waves that no longer exist. + waveUpgrades.Clear(); + ServerClearAutoApply(); + ServerDrawPhase(next); + return RunAdvance.NextPhase; + } + + int previousCycle = CycleIndex; + encounterInPhase.Value++; + + if (IsBossStage) return RunAdvance.BossReady; + if (CycleIndex != previousCycle) return RunAdvance.NextCycle; + return RunAdvance.NextWave; + } + + // ----- Server: phase draw ------------------------------------------- + + // Scratch list reused across draws; server is single-threaded so sharing is safe. + private readonly List candidateScratch = new List(); + + /// + /// Server-only: draw this phase's cycle waves and boss. Cycle waves are drawn by relative + /// weight without replacement and with distinct enemy types; the boss is a plain + /// weighted draw. + /// + private bool ServerDrawPhase(int index) + { + if (!IsServer) return false; + + var phases = runDefinition?.Phases; + if (phases == null || index < 0 || index >= phases.Length || phases[index] == null) + { + Debug.LogError($"[RunState] Phase {index + 1} is missing — cannot draw waves."); + return false; + } + + var phase = phases[index]; + int needed = WavesPerCycle; + + phase.CollectWaveCandidates(candidateScratch); + drawnWaveIds.Clear(); + + for (int drawn = 0; drawn < needed; drawn++) + { + var pick = DrawWeighted(candidateScratch); + if (pick == null) + { + Debug.LogError( + $"[RunState] {phase.Label}: ran out of candidates after {drawn} of " + + $"{needed} wave(s). The phase needs {needed} waves with DISTINCT enemy " + + $"types — check the RunDefinition inspector's phase-capacity readout."); + return false; + } + + if (!runDefinition.TryGetWaveId(pick.Wave, out int waveId)) + { + Debug.LogError($"[RunState] Wave '{pick.Wave.name}' is not in the run's wave " + + $"index. This should be impossible — the index is built from " + + $"the same pools. Skipping."); + candidateScratch.Remove(pick); + drawn--; + continue; + } + + drawnWaveIds.Add(waveId); + + // Retire every remaining candidate sharing this enemy type, so distinctness is + // enforced by shrinking the pool rather than by reject-and-retry. + var type = pick.Wave.PrimaryEnemyType; + candidateScratch.RemoveAll( + e => e.Wave == pick.Wave || (type != null && e.Wave.PrimaryEnemyType == type)); + } + + // Boss draw — independent pool, no distinctness constraint. + phase.CollectBossCandidates(candidateScratch); + var boss = DrawWeighted(candidateScratch); + if (boss == null || !runDefinition.TryGetWaveId(boss.Wave, out int bossId)) + { + Debug.LogError($"[RunState] {phase.Label}: no boss could be drawn."); + bossWaveId.Value = -1; + return false; + } + bossWaveId.Value = bossId; + + Debug.Log($"[RunState] Drew {phase.Label}: {needed} wave(s) + boss " + + $"'{boss.Wave.name}'."); + return true; + } + + // Relative-weight draw. Weights are normalized against the candidate set's total, so a + // pool of three 1.0 entries is uniform and a 0.5 entry is half as likely as a 1.0 one. + // Zero-weight entries never reach here — PhaseDefinition filters them during collection. + private static WavePoolEntry DrawWeighted(List candidates) + { + if (candidates == null || candidates.Count == 0) return null; + + float total = 0f; + for (int i = 0; i < candidates.Count; i++) + total += Mathf.Max(0f, candidates[i].Weight); + + if (total <= 0f) return null; + + float roll = Random.value * total; + for (int i = 0; i < candidates.Count; i++) + { + roll -= Mathf.Max(0f, candidates[i].Weight); + if (roll <= 0f) return candidates[i]; + } + + return candidates[candidates.Count - 1]; // float drift fallback + } + } +} diff --git a/Assets/_Project/Scripts/Gameplay/Waves/RunState.cs.meta b/Assets/_Project/Scripts/Gameplay/Waves/RunState.cs.meta new file mode 100644 index 0000000..4905373 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/Waves/RunState.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a293cf6dca91dd2478c9f4e799cf9e0d \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/Waves/WaveGroup.cs b/Assets/_Project/Scripts/Gameplay/Waves/WaveGroup.cs new file mode 100644 index 0000000..d870d94 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/Waves/WaveGroup.cs @@ -0,0 +1,69 @@ +// Assets/_Project/Scripts/Gameplay/Waves/WaveGroup.cs +using System; +using UnityEngine; +using TD.Core; + +namespace TD.Gameplay.Waves +{ + /// + /// One weighted candidate inside a : a wave that may be drawn, + /// and how likely it is to be drawn relative to the group's other entries. + /// + /// + /// Weight is RELATIVE, not an absolute probability. The draw normalizes every + /// candidate's weight against the summed weight of the whole candidate set, so three + /// entries at 1.0 each are equally likely (33% apiece) and an entry at 0.5 is half as + /// likely to be drawn as one at 1.0. This is what makes the default sane: new entries + /// start at 1.0, so adding a wave to a group never silently re-weights the others. + /// + /// A class rather than a struct specifically so can carry a + /// field initializer — Unity runs it when the inspector creates a fresh array element, + /// which is what gives new entries their equal-by-default weighting. Mirrors + /// . + /// + [Serializable] + public class WavePoolEntry + { + [Tooltip("The wave that may be drawn from this group.")] + public WaveDefinition Wave; + + [Tooltip("Relative draw weight within this group's pool. Entries at equal weight are " + + "equally likely; an entry at 0.5 is half as likely as one at 1.0. NOT an " + + "absolute percentage.")] + [PoolWeight("wave")] + public float Weight = 1f; + } + + /// + /// A named, reusable bag of candidate waves. Groups are the unit designers move between + /// phases: dragging a group asset from Phase 1's pool to Phase 2's moves every wave in it + /// (and their weights) in one action. + /// + /// + /// Why weights live on the entry, not on . Weight is a + /// property of "how common is this wave in this pool", not of the wave itself. Keeping + /// it here means the same asset can be a staple of one group and + /// a rarity in another, and a group carries its tuning with it when moved between phases. + /// + /// Boss groups use the same type. A boss wave is just a + /// whose entries spawn a single powerful enemy, so boss pools + /// are ordinary s referenced from + /// . + /// + [CreateAssetMenu(fileName = "WaveGroup", menuName = "TD/Run/Wave Group", order = 10)] + public class WaveGroup : ScriptableObject + { + [Tooltip("Designer-facing name for this group, shown in run-structure validation " + + "messages. Falls back to the asset name when empty.")] + public string DisplayName; + + [Tooltip("Candidate waves in this group, each with a relative draw weight.")] + public WavePoolEntry[] Waves; + + /// Name used in validation and log messages. Falls back to the asset name. + public string Label => string.IsNullOrWhiteSpace(DisplayName) ? name : DisplayName; + + /// Number of entries, including any that are null or zero-weight. + public int Count => Waves?.Length ?? 0; + } +} diff --git a/Assets/_Project/Scripts/Gameplay/Waves/WaveGroup.cs.meta b/Assets/_Project/Scripts/Gameplay/Waves/WaveGroup.cs.meta new file mode 100644 index 0000000..817269e --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/Waves/WaveGroup.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5625bd25f378bda429666820a4940cee \ No newline at end of file diff --git a/Assets/_Project/Scripts/UI/FloatingTextSpawner.cs b/Assets/_Project/Scripts/UI/FloatingTextSpawner.cs index 392b1a2..49b4e66 100644 --- a/Assets/_Project/Scripts/UI/FloatingTextSpawner.cs +++ b/Assets/_Project/Scripts/UI/FloatingTextSpawner.cs @@ -74,6 +74,11 @@ namespace TD.UI public void SpawnGoldReward(Vector3 worldPos, int amount) => SpawnInternal(worldPos, $"+{amount}", goldColor); + /// Spawns a gold-loss popup (e.g. "-15") at the given world position. Same colour + /// as a reward so it reads as gold; the sign carries the meaning. + public void SpawnGoldLoss(Vector3 worldPos, int amount) + => SpawnInternal(worldPos, $"-{amount}", goldColor); + /// Spawns a life-loss popup (e.g. "-1") at the given world position. public void SpawnLifeLoss(Vector3 worldPos, int amount) => SpawnInternal(worldPos, $"-{amount}", livesColor); diff --git a/Assets/_Project/Scripts/UI/HUDController.cs b/Assets/_Project/Scripts/UI/HUDController.cs index 488cea9..29e2b0f 100644 --- a/Assets/_Project/Scripts/UI/HUDController.cs +++ b/Assets/_Project/Scripts/UI/HUDController.cs @@ -10,6 +10,8 @@ using TD.Core; using TD.Gameplay; using TD.Gameplay.BuilderSpells; using TD.Gameplay.Draft; +using TD.Gameplay.EnemyUpgrades; +using TD.Gameplay.Waves; using TD.Towers; using TD.UI.Minimap; @@ -112,10 +114,34 @@ namespace TD.UI // shown when no draft is pending so a paid roll can be bought any time. private VisualElement draftPanel; private VisualElement draftCardRow; - private Button draftBuyButton; private bool draftSubscribed; private PlayerDraft subscribedDraft; + // Enemy-buff vote overlay. Shares the draft overlay's position and card styling, but the + // cards are shared rather than per-player and carry live voter badges. + private VisualElement votePanel; + private VisualElement voteCardRow; + private Label voteTitle; + private bool voteSubscribed; + private WaveVote subscribedVote; + + // Boss health bar. Shown only while a boss is alive; polled per frame like lives/gold + // rather than event-driven, since HP changes continuously anyway. + private VisualElement bossBarPanel; + private VisualElement bossHealthFill; + private Label bossHealthText; + private Label bossNameLabel; + + // Reused when painting voter badges so a rebuild-per-ballot doesn't allocate a list per + // card. The HUD is single-threaded, so one shared buffer is safe. + private readonly System.Collections.Generic.List voteVoterScratch + = new System.Collections.Generic.List(); + + // Reused when building a selected tower's upgrade buttons. + private readonly System.Collections.Generic.List<(TowerDefinition Def, int TypeId)> + upgradeOptionScratch + = new System.Collections.Generic.List<(TowerDefinition, int)>(); + // Spell hotbar (bottom-ui Section 6). Frame is visibility:hidden (but still occupies // its reserved width, so the centered command bar never shifts) while the local player // has no granted spells; rebuilt on grant (append-only, so this is rare). Cooldown @@ -201,6 +227,8 @@ namespace TD.UI private bool matchStateSubscribed; // true once OnPhaseChanged is hooked private bool deckSubscribed; // true once we've hooked the local PlayerTowerDeck.OnDeckChanged private PlayerTowerDeck subscribedDeck; // the deck we hooked, so we can unsubscribe the same instance + private bool upgradesSubscribed; // true once we've hooked the local PlayerTowerUpgrades + private PlayerTowerUpgrades subscribedUpgrades; private MinimapView minimapView; private GameMenuView gameMenu; // gear button + modal menu overlay private IPanel myPanel; // tracked separately so OnDestroy only clears the static if it still points at us @@ -330,6 +358,19 @@ namespace TD.UI PopulateGridForSelection(SelectionState.Instance?.SelectedObject); } + // Same idea for unlocked upgrade nodes: a draft pick can grant an upgrade while the + // player already has the target tower selected, and the new branch should appear in the + // action grid without needing a reselect. + private void TrySubscribeUpgrades() + { + var upgrades = PlayerTowerUpgrades.Local; + if (upgrades == null) return; + upgrades.OnUpgradesChanged += HandleDeckChanged; + subscribedUpgrades = upgrades; + upgradesSubscribed = true; + PopulateGridForSelection(SelectionState.Instance?.SelectedObject); + } + // Hook the local player's draft so the overlay rebuilds when options are offered, // picked, or rerolled. Retried each Update until the local PlayerDraft exists. private void TrySubscribeDraft() @@ -366,9 +407,9 @@ namespace TD.UI // ----- Draft overlay ---------------------------------------------- - // Non-modal draft UI: a card row floats at top-center while a draft is active, and - // a "Buy Roll" button shows when no draft is pending. The host panel ignores picks - // so empty space clicks through to the world — the player keeps building during prep. + // Non-modal draft UI: a card row floats at top-center while the local player has an + // unresolved offer. The host panel ignores picks so empty space clicks through to the + // world — the player can still pan and inspect their maze while deciding. private void BuildDraftOverlay(VisualElement root) { draftPanel = new VisualElement(); @@ -390,12 +431,8 @@ namespace TD.UI draftCardRow.pickingMode = PickingMode.Ignore; box.Add(draftCardRow); - draftBuyButton = new Button(() => PlayerDraft.Local?.RequestBuyRerollRpc()) - { - text = "Buy Roll" - }; - draftBuyButton.style.marginTop = 6; - box.Add(draftBuyButton); + // The "Buy Roll" button lived here. Removed with the extra-draft shop for the 2.0 MVP + // — see PlayerDraft's commented-out RequestBuyRerollRpc for why the backend was kept. draftPanel.Add(box); root.Add(draftPanel); @@ -474,35 +511,318 @@ namespace TD.UI return card; } - // Per-frame: toggles the card row vs. the buy button and keeps the buy button's - // label/enabled state in sync with gold. Cheap (mirrors the gold label's per-frame - // refresh); only allocates a string while the buy button is shown. + // Shows the draft row only while the local player has an unresolved offer. With the + // extra-draft shop gone there is nothing else in this panel, so it hides entirely once + // the player has picked — which also gives them a clear "I'm done, waiting on others" + // signal during the barrier. private void UpdateDraftVisibility() { if (draftPanel == null) return; - var draft = PlayerDraft.Local; - var service = DraftService.Instance; - var gold = PlayerGoldManager.Local; - - bool hasDraft = draft != null && draft.HasActiveDraft; - bool canShowBuy = draft != null && service != null && !hasDraft; + var draft = PlayerDraft.Local; + bool hasDraft = draft != null && draft.HasActiveDraft; if (draftCardRow != null) draftCardRow.style.display = hasDraft ? DisplayStyle.Flex : DisplayStyle.None; - if (draftBuyButton != null) + draftPanel.style.display = hasDraft ? DisplayStyle.Flex : DisplayStyle.None; + } + + // ----- Enemy-buff vote overlay -------------------------------------- + + // Shared vote UI. Same anchor and card language as the draft row (they never show at the + // same time — the inter-wave stages are strictly sequential), but every peer sees the same + // three cards, and each card carries badges for the players currently voting for it. + private void BuildVoteOverlay(VisualElement root) + { + votePanel = new VisualElement(); + votePanel.style.position = Position.Absolute; + votePanel.style.left = 0; + votePanel.style.right = 0; + votePanel.style.top = 70; // below the top bar, same as the draft row + votePanel.style.alignItems = Align.Center; + votePanel.pickingMode = PickingMode.Ignore; + votePanel.style.display = DisplayStyle.None; + + var box = new VisualElement(); + box.style.flexDirection = FlexDirection.Column; + box.style.alignItems = Align.Center; + box.pickingMode = PickingMode.Ignore; + + voteTitle = new Label("Choose how this wave comes back"); + voteTitle.style.fontSize = 15; + voteTitle.style.color = new Color(0.95f, 0.72f, 0.55f); + voteTitle.style.unityFontStyleAndWeight = FontStyle.Bold; + voteTitle.style.marginBottom = 6; + box.Add(voteTitle); + + voteCardRow = new VisualElement(); + voteCardRow.style.flexDirection = FlexDirection.Row; + voteCardRow.pickingMode = PickingMode.Ignore; + box.Add(voteCardRow); + + votePanel.Add(box); + root.Add(votePanel); + + UpdateVoteVisibility(); + } + + // Hook the shared vote so the panel rebuilds whenever a ballot lands. Retried each Update + // until the scene's WaveVote has network-spawned. + private void TrySubscribeVote() + { + var vote = WaveVote.Instance; + if (vote == null) return; + vote.OnVoteChanged += HandleVoteChanged; + subscribedVote = vote; + voteSubscribed = true; + RebuildVoteCards(); + } + + private void HandleVoteChanged() + { + RebuildVoteCards(); + } + + // Rebuilt on every ballot change, not just when the offered set changes — the voter + // badges are the point of the panel, so they have to track votes as they land. + private void RebuildVoteCards() + { + if (voteCardRow == null) return; + voteCardRow.Clear(); + + var vote = WaveVote.Instance; + var pool = EnemyUpgradePool.Instance; + + if (vote != null && pool != null && vote.IsOpen) { - draftBuyButton.style.display = canShowBuy ? DisplayStyle.Flex : DisplayStyle.None; - if (canShowBuy) + for (int i = 0; i < vote.OptionCount; i++) { - int cost = service.RerollCost; - draftBuyButton.text = $"Buy Roll ({cost}g)"; - draftBuyButton.SetEnabled(gold != null && gold.CurrentGold >= cost); + int id = vote.GetOptionId(i); + var option = pool.Get(id); + if (option == null) continue; + voteCardRow.Add(CreateVoteCard(option, id, vote)); } } - draftPanel.style.display = (hasDraft || canShowBuy) ? DisplayStyle.Flex : DisplayStyle.None; + UpdateVoteVisibility(); + } + + private VisualElement CreateVoteCard(EnemyUpgradeOption option, int optionId, WaveVote vote) + { + var localSlot = PlayerMatchState.Local != null + ? PlayerMatchState.Local.Slot + : PlayerSlot.None; + bool isLocalChoice = localSlot != PlayerSlot.None + && vote.GetBallot(localSlot) == optionId; + + var card = new VisualElement(); + card.style.width = 160; + card.style.marginLeft = card.style.marginRight = 4; + card.style.paddingTop = card.style.paddingBottom = 10; + card.style.paddingLeft = card.style.paddingRight = 10; + card.style.backgroundColor = new Color(0.13f, 0.09f, 0.09f, 0.96f); + card.style.borderTopWidth = card.style.borderBottomWidth = + card.style.borderLeftWidth = card.style.borderRightWidth = 2; + + // The local player's current choice gets a bright border so they can tell at a glance + // which one is theirs among everyone else's badges. + var border = isLocalChoice + ? new Color(0.95f, 0.72f, 0.35f) + : new Color(0.45f, 0.30f, 0.30f); + card.style.borderTopColor = card.style.borderBottomColor = + card.style.borderLeftColor = card.style.borderRightColor = border; + card.style.alignItems = Align.Center; + + var title = new Label(option.DisplayName); + title.style.fontSize = 14; + title.style.color = Color.white; + title.style.unityFontStyleAndWeight = FontStyle.Bold; + title.style.whiteSpace = WhiteSpace.Normal; + title.style.unityTextAlign = TextAnchor.MiddleCenter; + title.style.marginBottom = 6; + card.Add(title); + + var iconSprite = option.ResolveIcon(); + if (iconSprite != null) + { + var img = new Image { sprite = iconSprite }; + img.style.width = 48; + img.style.height = 48; + img.style.marginBottom = 6; + card.Add(img); + } + + var desc = new Label(option.Description ?? ""); + desc.style.fontSize = 11; + desc.style.color = new Color(0.82f, 0.82f, 0.82f); + desc.style.whiteSpace = WhiteSpace.Normal; + desc.style.unityTextAlign = TextAnchor.MiddleCenter; + desc.style.marginBottom = 8; + card.Add(desc); + + // Live voter badges — one per player currently voting for this card, in their own + // player color. This row is why the panel rebuilds on every ballot change. + var badgeRow = new VisualElement(); + badgeRow.style.flexDirection = FlexDirection.Row; + badgeRow.style.justifyContent = Justify.Center; + badgeRow.style.minHeight = 24; + badgeRow.style.marginBottom = 6; + + voteVoterScratch.Clear(); + vote.GetVotersFor(optionId, voteVoterScratch); + foreach (var voter in voteVoterScratch) + badgeRow.Add(CreateVoterBadge(voter)); + + card.Add(badgeRow); + + var pick = new Button(() => WaveVote.Instance?.RequestVoteRpc(optionId)) + { + text = isLocalChoice ? "Voted" : "Vote" + }; + card.Add(pick); + + return card; + } + + // Small filled circle carrying the player's slot number, in their canonical player color. + // Same visual vocabulary as the race-selection overlay's picker badges, so players read it + // as "who" without a legend. + private VisualElement CreateVoterBadge(PlayerSlot slot) + { + var badge = new Label(((int)slot).ToString()); + badge.style.width = 20; + badge.style.height = 20; + badge.style.marginLeft = badge.style.marginRight = 2; + badge.style.backgroundColor = PlayerColors.Get(slot); + badge.style.color = Color.black; + badge.style.fontSize = 11; + badge.style.unityFontStyleAndWeight = FontStyle.Bold; + badge.style.unityTextAlign = TextAnchor.MiddleCenter; + badge.style.borderTopLeftRadius = badge.style.borderTopRightRadius = + badge.style.borderBottomLeftRadius = badge.style.borderBottomRightRadius = 10; + return badge; + } + + private void UpdateVoteVisibility() + { + if (votePanel == null) return; + + var vote = WaveVote.Instance; + bool open = vote != null && vote.IsOpen && vote.OptionCount > 0; + votePanel.style.display = open ? DisplayStyle.Flex : DisplayStyle.None; + } + + // ----- Boss bar ----------------------------------------------------- + + // Prominent health bar for the phase boss. Hidden whenever no boss is alive, so it costs + // nothing outside a boss encounter. + private void BuildBossBar(VisualElement root) + { + bossBarPanel = new VisualElement(); + bossBarPanel.style.position = Position.Absolute; + bossBarPanel.style.left = 0; + bossBarPanel.style.right = 0; + bossBarPanel.style.top = 70; + bossBarPanel.style.alignItems = Align.Center; + bossBarPanel.pickingMode = PickingMode.Ignore; + bossBarPanel.style.display = DisplayStyle.None; + + var box = new VisualElement(); + box.style.width = 440; + box.style.alignItems = Align.Center; + box.pickingMode = PickingMode.Ignore; + + bossNameLabel = new Label("BOSS"); + bossNameLabel.style.fontSize = 18; + bossNameLabel.style.color = new Color(0.95f, 0.45f, 0.4f); + bossNameLabel.style.unityFontStyleAndWeight = FontStyle.Bold; + bossNameLabel.style.marginBottom = 3; + box.Add(bossNameLabel); + + var track = new VisualElement(); + track.style.width = 440; + track.style.height = 18; + track.style.backgroundColor = new Color(0.08f, 0.06f, 0.06f, 0.95f); + track.style.borderTopWidth = track.style.borderBottomWidth = + track.style.borderLeftWidth = track.style.borderRightWidth = 2; + var trackBorder = new Color(0.5f, 0.25f, 0.22f); + track.style.borderTopColor = track.style.borderBottomColor = + track.style.borderLeftColor = track.style.borderRightColor = trackBorder; + track.pickingMode = PickingMode.Ignore; + + bossHealthFill = new VisualElement(); + bossHealthFill.style.height = Length.Percent(100); + bossHealthFill.style.width = Length.Percent(100); + bossHealthFill.style.backgroundColor = new Color(0.75f, 0.18f, 0.16f); + bossHealthFill.pickingMode = PickingMode.Ignore; + track.Add(bossHealthFill); + + bossHealthText = new Label(""); + bossHealthText.style.position = Position.Absolute; + bossHealthText.style.left = 0; + bossHealthText.style.right = 0; + bossHealthText.style.top = 0; + bossHealthText.style.bottom = 0; + bossHealthText.style.fontSize = 12; + bossHealthText.style.color = Color.white; + bossHealthText.style.unityTextAlign = TextAnchor.MiddleCenter; + bossHealthText.pickingMode = PickingMode.Ignore; + track.Add(bossHealthText); + + box.Add(track); + bossBarPanel.Add(box); + root.Add(bossBarPanel); + } + + // Polled from the per-frame refresh, like lives and gold. Picks the boss in the local + // player's own zone when there is one — the boss encounter spawns one per zone, and the + // one actually walking through your maze is the one you need to watch. + private void RefreshBossBar() + { + if (bossBarPanel == null) return; + + var boss = ResolveDisplayedBoss(); + if (boss == null) + { + bossBarPanel.style.display = DisplayStyle.None; + return; + } + + bossBarPanel.style.display = DisplayStyle.Flex; + + float max = Mathf.Max(1f, boss.MaxHp); + float pct = Mathf.Clamp01(boss.CurrentHp / max); + bossHealthFill.style.width = Length.Percent(pct * 100f); + bossHealthText.text = $"{Mathf.CeilToInt(boss.CurrentHp)} / {Mathf.CeilToInt(max)}"; + bossNameLabel.text = boss.DisplayName; + } + + private EnemyHealth ResolveDisplayedBoss() + { + var bosses = EnemyHealth.ActiveBosses; + if (bosses.Count == 0) return null; + + var localSlot = PlayerMatchState.Local != null + ? PlayerMatchState.Local.Slot + : PlayerSlot.None; + + EnemyHealth fallback = null; + for (int i = 0; i < bosses.Count; i++) + { + var boss = bosses[i]; + if (boss == null || boss.IsDead) continue; + + fallback ??= boss; + + if (localSlot != PlayerSlot.None) + { + var movement = boss.GetComponent(); + if (movement != null && movement.OriginZone == localSlot) return boss; + } + } + + return fallback; } // ----- Spell hotbar ------------------------------------------------- @@ -715,9 +1035,17 @@ namespace TD.UI BuildMatchEndOverlay(root); // Build the draft overlay (roguelike between-waves draft). Hidden until the - // local player has an active draft (or to show the paid "Buy Roll" button). + // local player has an active draft. BuildDraftOverlay(root); + // Build the shared enemy-buff vote overlay. Hidden until a vote is open; never shows + // at the same time as the draft row, since the inter-wave stages run in sequence. + BuildVoteOverlay(root); + + // Boss health bar. Shares the top-centre anchor with the draft/vote rows, which is + // safe because a boss is only ever alive once the inter-wave stages have finished. + BuildBossBar(root); + // Chat feed + input. Anchored bottom-left, just above the portrait/bottom-ui bar. // Player typing toggled with Enter; system messages (e.g. life lost) post via // ChatService.PostLocalSystem on every peer. @@ -777,6 +1105,13 @@ namespace TD.UI deckSubscribed = false; subscribedDeck = null; + if (upgradesSubscribed && subscribedUpgrades != null) + { + subscribedUpgrades.OnUpgradesChanged -= HandleDeckChanged; + } + upgradesSubscribed = false; + subscribedUpgrades = null; + if (draftSubscribed && subscribedDraft != null) { subscribedDraft.OnDraftChanged -= HandleDraftChanged; @@ -784,6 +1119,13 @@ namespace TD.UI draftSubscribed = false; subscribedDraft = null; + if (voteSubscribed && subscribedVote != null) + { + subscribedVote.OnVoteChanged -= HandleVoteChanged; + } + voteSubscribed = false; + subscribedVote = null; + if (spellLoadoutSubscribed && subscribedSpellLoadout != null) { subscribedSpellLoadout.OnLoadoutChanged -= HandleSpellLoadoutChanged; @@ -813,9 +1155,15 @@ namespace TD.UI if (!deckSubscribed) TrySubscribeDeck(); + if (!upgradesSubscribed) + TrySubscribeUpgrades(); + if (!draftSubscribed) TrySubscribeDraft(); + if (!voteSubscribed) + TrySubscribeVote(); + if (!spellLoadoutSubscribed) TrySubscribeSpellLoadout(); @@ -992,27 +1340,40 @@ namespace TD.UI if (livesLabel != null) livesLabel.text = ms != null ? $"lives: {ms.Lives}" : "lives: --"; + RefreshBossBar(); + + // Run progress reads "Phase 1 · Cycle 2 · Wave 3/5" (or "· BOSS"). RunState builds + // the string since it owns the phase/cycle/slot maths; the HUD just displays it. if (waveLabel != null) { - int total = wm?.TotalWaves ?? 0; - waveLabel.text = ms != null && ms.CurrentWave > 0 && total > 0 - ? $"Wave {ms.CurrentWave} / {total}" + var run = RunState.Instance; + waveLabel.text = run != null && ms != null && ms.CurrentWave > 0 + ? run.ProgressLabel : "Wave --"; } - // Next-wave countdown. Shows during prep ("next: 0:12") and clears the - // moment the wave actually starts spawning. WaveManager.PrepCountdown + // Inter-wave countdown. One timer serves all three stages (they never overlap), so + // the label is prefixed with which stage is running — "draft: 0:12", "vote: 0:08", + // "build: 0:15". Clears the moment the wave starts spawning. WaveManager.PrepCountdown // is networked so this reads the same value on every peer. if (nextWaveLabel != null) { float t = wm != null ? wm.PrepCountdown : 0f; if (t > 0f) { + string stage = wm.CurrentInterWaveStage switch + { + InterWaveStage.Draft => "draft", + InterWaveStage.Vote => "vote", + InterWaveStage.Build => "build", + _ => "next", + }; + // Ceiling so the user sees a full "0:01" tick before "0:00". int seconds = Mathf.CeilToInt(t); int mm = seconds / 60; int ss = seconds % 60; - nextWaveLabel.text = $"next: {mm}:{ss:00}"; + nextWaveLabel.text = $"{stage}: {mm}:{ss:00}"; } else { @@ -1276,8 +1637,27 @@ namespace TD.UI } else if (selection is TowerInstance tower) { - // WC3 layout convention: primary action top-left (Q), sell bottom-right (B). - cells[0] = CreateUpgradeButton(tower, HotkeyLayout[0]); + // WC3 layout convention: primary actions top-left (Q onward), sell bottom-right. + // One button per unlocked upgrade branch rather than a single generic "Upgrade" — + // a tree node can have several children, and a lone button couldn't express the + // choice between them without an extra submenu layer. + upgradeOptionScratch.Clear(); + var localClientId = NetworkManager.Singleton != null + ? NetworkManager.Singleton.LocalClientId + : 0UL; + bool ownsTower = PlayerMatchState.Local != null + && tower.Owner == PlayerMatchState.Local.Slot; + + if (ownsTower) + tower.CollectAvailableUpgrades(localClientId, upgradeOptionScratch); + + int upgradeSlots = Mathf.Min(upgradeOptionScratch.Count, GRID_MAX - 1); + for (int i = 0; i < upgradeSlots; i++) + { + var (def, typeId) = upgradeOptionScratch[i]; + cells[i] = CreateUpgradeButton(tower, def, typeId, HotkeyLayout[i]); + } + cells[GRID_MAX - 1] = CreateSellButton(tower, HotkeyLayout[GRID_MAX - 1]); } else if (selection is BuildSiteVisual bsv) @@ -1439,19 +1819,35 @@ namespace TD.UI return btn; } - // Upgrade and Sell — visuals + hotkeys wired; click is a no-op because the - // upgrade/sell systems aren't built yet. Buttons are SetEnabled(false) so the - // hotkey handler also skips them (it gates on enabledSelf). - private VisualElement CreateUpgradeButton(TowerInstance tower, Key hotkey) + // One button per unlocked upgrade branch on the selected tower. A tree node can have + // several children, so a single generic "Upgrade" button couldn't express the choice + // between them without an extra submenu layer — the grid already has the slots. + private VisualElement CreateUpgradeButton(TowerInstance tower, TowerDefinition target, + int targetTypeId, Key hotkey) { + int cost = TowerInstance.GetUpgradeCost(target); + var gold = PlayerGoldManager.Local; + bool affordable = gold != null && gold.CurrentGold >= cost; + var btn = CreateActionButton( - costText: "", // tier cost unknown until upgrade system lands + costText: cost > 0 ? $"{cost}g" : "", hotkey: hotkey, - onClick: () => - { - /* TODO: upgrade flow */ - }); - btn.SetEnabled(false); + onClick: () => tower.RequestUpgradeServerRpc(targetTypeId)); + + if (target.Icon != null) + { + var img = new Image { sprite = target.Icon }; + img.AddToClassList("cmd-icon"); + img.pickingMode = PickingMode.Ignore; + btn.Insert(0, img); + } + + btn.tooltip = $"Upgrade to {target.DisplayName}"; + + // Shown but disabled when unaffordable, rather than hidden — a player saving toward + // an upgrade should be able to see the price. Disabling also makes the hotkey handler + // skip it, since that gates on enabledSelf. + btn.SetEnabled(affordable); return btn; } @@ -1659,8 +2055,7 @@ namespace TD.UI // Bounty is per-wave now (GoldConfig.Waves[N].GoldPerEnemy) rather than // per-enemy-type. Read the current wave's value so the tooltip is accurate. var wm = WaveManager.Instance; - int currentWave = MatchState.Instance != null ? MatchState.Instance.CurrentWave : 0; - var goldEntry = wm?.GoldConfig?.GetWaveEntry(currentWave); + var goldEntry = wm?.GoldConfig?.GetWaveEntry(wm.CurrentEncounterNumber); if (goldEntry != null) AddStatLine($"Bounty: {goldEntry.GoldPerEnemy} g"); // (Weaknesses/resistances will go here once the resistance system lands.) diff --git a/Docs/2.0_Setup_Checklist.md b/Docs/2.0_Setup_Checklist.md new file mode 100644 index 0000000..8ddc037 --- /dev/null +++ b/Docs/2.0_Setup_Checklist.md @@ -0,0 +1,129 @@ +# 2.0 Refactor — Editor Setup Checklist + +The 2.0 code landed on `2.0_design_refactor` and compiles clean, but the new systems are +**data- and scene-driven**. Nothing runs until the assets below exist and the scene objects are +wired. Work top to bottom — each section depends on the ones above it. + +--- + +## 1. Scene objects (both `9Player` and `Main`) + +Three new scene objects are required. Two are plain MonoBehaviours; one needs a `NetworkObject`. + +| GameObject | Component | NetworkObject? | Notes | +|---|---|---|---| +| `RunState` | `RunState` | **Yes** | Assign the `RunDefinition` asset from §3. | +| `WaveVote` | `WaveVote` | **Yes** | `Options Per Vote` defaults to 3. | +| `EnemyUpgradePool` | `EnemyUpgradePool` | No | Fill `options` with every card asset from §2. | + +`WaveManager` **no longer has a `waveDefinitions` array** — that field is gone. Its two new +serialized fields are `Draft Time Seconds` (30) and `Vote Time Seconds` (25). + +> Both new NetworkBehaviours are scene objects, so they must be present *before* the host starts. + +--- + +## 2. Enemy-buff cards + +Two asset layers, because network identity and phase gating are separate concerns. + +**Abilities** (`TD/Enemy Abilities/…`) — what a buffed enemy *does*: + +- Split On Death — already exists; **re-check its fields**, they changed. It now has + `SplitCount`, `HpPercent`, `SpeedPercent`, `ScalePercent`, `LivesCostPercent`, + `FlightHeightPercent`, `ScatterRadius`. +- Flight, Blink, No Bounty, Gold Theft — new, need assets creating. + +Add every ability asset to the scene's existing `EnemyAbilityPool`. +Its `noAbilityWeight` field is **gone** (abilities are voted in now, not rolled). + +**Cards** (`TD/Enemy Upgrades/…`) — what players vote on: + +- One `Ability Card` per ability above, each pointing at its `EnemyAbilityDefinition`. +- One `Double Up Card` (vote-meta; grants no ability). + +Then: add every card to `EnemyUpgradePool.options`, and group them into one or more +`EnemyUpgradeGroup` assets for phase gating. + +--- + +## 3. Run structure + +Build bottom-up: + +1. **`WaveGroup`** assets (`TD/Run/Wave Group`) — bags of weighted `WaveDefinition` entries. + Weights are **relative** 0–1 and default to 1 (equal odds). A zero weight warns inline and + means the wave can never be drawn. +2. **`PhaseDefinition`** (`TD/Run/Phase Definition`) — `WaveGroups`, `BossGroups`, + `EnemyUpgradeGroups`. +3. **`RunDefinition`** (`TD/Run/Run Definition`) — `WavesPerCycle` (5), `CyclesPerPhase` (3), + and the `Phases` array. **MVP needs one phase.** + +The `RunDefinition` inspector shows a live validation panel and a per-phase capacity readout. +Get it green before pressing play. + +### The constraint that will bite + +A phase must supply **`WavesPerCycle` waves with DISTINCT enemy types**. Enemy buffs are keyed to +a wave slot, so two slots sharing an enemy type would make "which wave did this buff apply to" +ambiguous. Ten waves in a pool is *not* enough if they only use three enemies. The inspector +reports distinct-type count per phase; the draw fails loudly at match start otherwise. + +Ten wave definitions and ten enemy definitions already exist, so the content floor is met — but +check the type spread. + +--- + +## 4. Gold config + +`GoldConfig.Waves` is now indexed by **global encounter number**, counted continuously across the +whole run — cycles do **not** reset it. One phase of 5 waves × 3 cycles + a boss needs +**16 entries**. Missing entries pay zero for that encounter. + +--- + +## 5. Player prefab + +Add **`PlayerTowerUpgrades`** to `Player.prefab`, alongside `PlayerTowerDeck` / `PlayerDraft`. +Without it, tower-upgrade draft options can't apply and the Upgrade buttons never appear. + +--- + +## 6. Enemy prefabs + +Any enemy that should be able to carry wave buffs needs an **`EnemyAbility`** component on its +root. `WaveManager` logs a warning naming the prefab if a buffed wave spawns an enemy without one. + +`SplitOnDeath` and any size-changing buff need the prefab's **`NetworkTransform` to sync scale**, +or minions render full-size on remote peers. + +--- + +## 7. Tower upgrade trees + +1. Author upgraded towers as ordinary `TowerDefinition` assets and add them to + `TowerPlacementManager.towerDefinitions` (**not** to `startingDeck`). +2. Wire the tree by filling each parent's `UpgradePaths` array with its children. +3. Each upgrade node's **`GoldCost` is its upgrade price** — upgrade nodes are never placed + directly, so the field is free to mean that. +4. **Footprint must match the parent.** A differently-sized upgrade is rejected: the tower's + occupied/unwalkable tiles are stamped at its current size, and converting would leave the grid + describing a shape the tower no longer has. +5. Create a `TD/Draft/Tower Upgrade Option` per node (`BaseTower` → `UpgradedTower`) and add it to + `DraftPool`. Prerequisites need no explicit list — a node is offered only once its parent is + reachable (in the deck, or itself unlocked). + +Existing `TowerUpgradeDraftOption` assets **changed meaning**: they used to swap the deck entry, +they now unlock an upgrade node. Re-check any that exist. + +--- + +## Known gaps + +- **Upgraded towers keep the parent's mesh.** Switching the definition changes stats immediately + (`TowerCombat` re-reads it every tick) but not the model — visual swap is an art task. +- **No 3-player map yet.** `MatchRules.MaxPlayers` is 3 and slot allocation caps there, but + `9Player` is still the only authored level. +- **Tower vulnerability is not built** — Savage, Mind Control, AOE EMP, Fart Miasma and Dummy all + need towers to be damageable/disableable, which doesn't exist. Deferred by agreement. +- **Relics** untouched, as agreed. diff --git a/Project_Context.md b/Project_Context.md index fd56cfd..540f001 100644 --- a/Project_Context.md +++ b/Project_Context.md @@ -10,10 +10,11 @@ Last substantial update: 2026-07-14. ## Game overview -A **co-op tower-defense / roguelike hybrid** for up to 9 players. +A **co-op tower-defense / roguelike hybrid** for up to **3 players** (reduced from 9 in the 2.0 design as a scope cut — see `TD.Core.MatchRules.MaxPlayers`; the `PlayerSlot` enum still runs to 9 so baked `LevelData` owner grids stay valid). - **Maze defense (Wintermaul-style):** players build towers to force enemies along a longer path through their own zone. Lives are a **shared pool**; gold is **per-player**. -- **Roguelike layer (now core to the design):** every player starts with the **same three towers** and builds out a personal "deck"/"build" through a **3-option draft** presented at match start and after every wave. Choices span new towers, systemic upgrades, builder abilities, enemy debuffs, and relic quests. See [`Project_Roadmap.md`](Project_Roadmap.md) for the full design. +- **Cyclical run structure (2.0):** 5 waves = a **cycle**, 3 cycles = a **phase**, each phase ends in a **boss**, 3 phases wins the run. A phase draws 5 waves with **distinct enemy types** and replays them every cycle. Beating the last phase's boss is Victory. +- **Roguelike layer (core):** every player starts with the same three towers and grows a personal deck through a **3-option draft**. After each wave the sequence is: personal draft → shared **enemy-buff vote** (open ballots, visible per-player) → build countdown. The vote permanently buffs the wave just cleared, so it comes back harder next cycle; buffs are wiped when a new phase draws fresh waves. See [`Project_Roadmap.md`](Project_Roadmap.md) for the full design. - **Target platform:** Steam (Windows / Linux / Steam Deck). - **Visual direction (aspirational):** "painted tabletop miniature" look with Spider-Verse-style stepped (on-2s) enemy animation. Current visuals are **placeholder** (primitive meshes / cones, sourced creature models). @@ -32,11 +33,13 @@ Unity **6.4 (6000.4.4f1)**, URP, IL2CPP, .NET Standard 2.1, Linear color space, ## Architecture & conventions - **Server-authoritative gameplay; local-only UI/visual state.** Only gameplay-meaningful state is networked. Selection, placement ghosts, animation, and the paint cursor are client-local. -- **Data-driven via ScriptableObjects:** `TowerDefinition`, `EnemyDefinition`, `WaveDefinition`, `RaceDefinition`, `GoldConfig`, `BuffDefinition`/`BuffCategory`, `DraftOption` (+ `NewTowerDraftOption`). Designers tune stats in assets, not code. -- **Per-player state pattern:** `NetworkBehaviour`s on the **Player prefab** with a static `GetForClient(clientId)` / `Local` registry. Current set: `PlayerGoldManager`, `PlayerMatchState`, `PlayerBuffManager`, `PlayerTowerDeck`, `PlayerDraft`. -- **Networked identifiers are catalog indices.** `TowerTypeId` indexes `TowerPlacementManager.towerDefinitions[]`; `DraftOptionId` indexes `DraftPool`. Stable **within a match**, not across sessions — cross-match persistence will need stable IDs (asset GUID or a serialized StableId). -- **Namespaces:** `TD.Core` (enums, palettes, grid math), `TD.Gameplay` (builder, placement, match/wave/pathfinding state, economy, enemies, deck), `TD.Gameplay.Draft` (draft system), `TD.Combat` (TowerCombat/Projectile), `TD.Levels` (in-engine authoring + bake), `TD.UI`, `TD.Net`. -- **Scenes:** `MainMenu` → `Lobby` → a Match level (`9Player`, `Main`). +- **Data-driven via ScriptableObjects:** `TowerDefinition`, `EnemyDefinition`, `WaveDefinition`, `RaceDefinition`, `GoldConfig`, `DraftOption` (+ subclasses), `EnemyAbilityDefinition` (+ subclasses), `EnemyUpgradeOption` (+ subclasses), and the run structure — `WaveGroup` → `PhaseDefinition` → `RunDefinition`, plus `EnemyUpgradeGroup`. Designers tune stats in assets, not code. +- **Pools are authored as draggable groups.** Wave and enemy-buff pools are lists of *group* assets, so rebalancing a phase means dragging a group between phases rather than re-authoring entries. Draw weights are **relative** 0–1 values on each entry (`[PoolWeight]`), normalized at draw time; a zero weight means "never drawn" and the inspector warns inline. +- **Per-player state pattern:** `NetworkBehaviour`s on the **Player prefab** with a static `GetForClient(clientId)` / `Local` registry. Current set: `PlayerGoldManager`, `PlayerMatchState`, `PlayerTowerDeck`, `PlayerTowerUpgrades`, `PlayerDraft`, `PlayerSpellLoadout`, `BuilderUpgradeManager`. +- **Networked identifiers are catalog indices.** `TowerTypeId` indexes `TowerPlacementManager.towerDefinitions[]`; `DraftOptionId` indexes `DraftPool`; `EnemyUpgradeOptionId` indexes `EnemyUpgradePool`; wave ids index a flat list `RunDefinition` builds by walking its phases/groups/entries in declaration order (identical on every peer). Stable **within a match**, not across sessions. +- **Run progression lives in `RunState`, not `WaveManager`.** `RunState` owns phase/cycle position, the drawn wave slots, and the per-slot enemy-buff sets; `WaveManager` only runs the encounter it is pointed at and calls `ServerAdvance()` when the field clears. +- **Namespaces:** `TD.Core` (enums, palettes, grid math, match rules), `TD.Gameplay` (builder, placement, match/pathfinding state, economy, enemies, deck), `TD.Gameplay.Waves` (run structure + progression), `TD.Gameplay.Draft` (per-player draft), `TD.Gameplay.EnemyAbilities` (what buffed enemies *do*), `TD.Gameplay.EnemyUpgrades` (the vote + its cards), `TD.Combat` (TowerCombat/Projectile), `TD.Levels` (in-engine authoring + bake), `TD.UI`, `TD.Net`. +- **Scenes:** `MainMenu` → `Lobby` → a Match level (`9Player`, `Main`). `9Player` is **legacy** at 3-player scope — a new 3-player map is pending. ### Engineering principles (carried across sessions) From 16706a1ecfa12b28f93d057f1aef8535032e035f Mon Sep 17 00:00:00 2001 From: Matt F Date: Fri, 31 Jul 2026 00:32:33 -0700 Subject: [PATCH 53/58] Scale difficulty by run position; wipe towers at phase end Follow-up pass on the 2.0 refactor, closing the gap between "waves are drawn at random" and "difficulty still lives in the enemy assets". - Enemy health is no longer authored per enemy type. New EnemyScalingConfig scales a per-zone HP *budget* by encounter number; per-enemy health is that budget divided by the wave's enemy count. Scaling the total rather than the per-enemy value keeps enemy count a texture knob (few tanks vs many swarmers) instead of a second, uncontrolled difficulty axis. EnemyDefinition.MaxHp becomes HpMultiplier, a deviation around 1.0. Speed stays archetype-only and unscaled -- escalating it compounds with health and invalidates tower balance mid-run. - GoldConfig entries no longer reference a WaveDefinition. Payout is a property of run position, not of which wave got drawn: WaveGoldEntry -> EncounterGoldEntry, Waves -> Encounters, keyed by global encounter number. Its inspector labels elements "Encounter N" and projects cumulative earnings. - The wave's voted buffs now show as icon badges in the top bar, read from the same RunState slot the spawn path uses so the display can't drift from what the enemies actually carry. Hover names the buff; unillustrated cards fall back to a lettered badge rather than vanishing. - Clearing a phase's boss destroys every built tower, unrefunded. Queued build jobs still refund -- those towers were never delivered. Runs with the field empty, so the walkability churn doesn't hit the re-path scheduler. - Fixed an RPC codegen break: [ClientRpc] requires a ClientRpc suffix, unlike the newer [Rpc(SendTo...)] style this file doesn't use. - Setup checklist reordered into dependency order; it previously asked for a RunDefinition two sections before creating one. Also carries the editor-side asset reorganisation into Definitions/RunDefinitions and the sprite move into Enemy/Player draft icon folders. Co-Authored-By: Claude Opus 5 --- .../_Project/Art/Sprites/EnemyDraftIcons.meta | 8 + .../Art/Sprites/EnemyDraftIcons/BlinkIcon.png | 3 + .../EnemyDraftIcons/BlinkIcon.png.meta | 117 ++++++++++ .../Sprites/EnemyDraftIcons/DoubleUpIcon.png | 3 + .../EnemyDraftIcons/DoubleUpIcon.png.meta | 117 ++++++++++ .../Sprites/EnemyDraftIcons/FlightIcon.png | 3 + .../EnemyDraftIcons/FlightIcon.png.meta | 117 ++++++++++ .../Sprites/EnemyDraftIcons/NoBountyIcon.png | 3 + .../EnemyDraftIcons/NoBountyIcon.png.meta | 117 ++++++++++ .../Art/Sprites/EnemyDraftIcons/SplitIcon.png | 3 + .../EnemyDraftIcons/SplitIcon.png.meta | 117 ++++++++++ .../Art/Sprites/EnemyDraftIcons/ThiefIcon.png | 3 + .../EnemyDraftIcons/ThiefIcon.png.meta | 117 ++++++++++ .../Art/Sprites/PlayerDraftIcons.meta | 8 + .../{ => PlayerDraftIcons}/Spells.meta | 0 .../Spells/FireballSpell.png | 0 .../Spells/FireballSpell.png.meta | 0 .../Spells/SlowSpell.png | 0 .../Spells/SlowSpell.png.meta | 0 .../{ => PlayerDraftIcons}/Towers.meta | 0 .../PlayerDraftIcons/Towers/ArrowTower.meta | 8 + .../Towers/ArrowTower/ArrowTowerUpgrade_1.png | 3 + .../ArrowTower/ArrowTowerUpgrade_1.png.meta | 117 ++++++++++ .../Towers/ArrowTower}/arrow.png | 0 .../Towers/ArrowTower}/arrow.png.meta | 0 .../{ => PlayerDraftIcons}/Towers/siege.png | 0 .../Towers/siege.png.meta | 0 Assets/_Project/Art/Sprites/RaceIcons.meta | 8 + .../Sprites/{ => RaceIcons}/BloodAngels.jpg | 0 .../{ => RaceIcons}/BloodAngels.jpg.meta | 0 .../Sprites/{ => RaceIcons}/Ultramarines.jpg | 0 .../{ => RaceIcons}/Ultramarines.jpg.meta | 0 ...01_Enemy_CrystalGolemBlue_Definition.asset | 4 +- .../02_Enemy_CyclopsGrey_Definition.asset | 2 +- .../03_Enemy_EntGreen_Definition.asset | 4 +- ..._Enemy_CrystalGolemYellow_Definition.asset | 4 +- .../05_Enemy_CyclopsGreen_Definition.asset | 4 +- .../06_Enemy_EntBlack_Definition.asset | 4 +- .../07_Enemy_CrystalGolemRed_Definition.asset | 4 +- .../08_Enemy_CyclopsRed_Definition.asset | 4 +- .../09_Enemy_EntOrange_Definition.asset | 4 +- .../10_Enemy_UndeadDrakeBone_Definition.asset | 6 +- .../_Project/Definitions/RunDefinitions.meta | 8 + .../{ => RunDefinitions}/Draft.meta | 0 .../RunDefinitions/Draft/EnemyDraft.meta | 8 + .../Draft/EnemyDraft/EnemyUpgrade_Blink.asset | 18 ++ .../EnemyDraft/EnemyUpgrade_Blink.asset.meta | 8 + .../EnemyDraft/EnemyUpgrade_DoubleUp.asset | 19 ++ .../EnemyUpgrade_DoubleUp.asset.meta | 8 + .../EnemyDraft/EnemyUpgrade_Flight.asset | 18 ++ .../EnemyDraft/EnemyUpgrade_Flight.asset.meta | 8 + .../EnemyDraft/EnemyUpgrade_NoBounty.asset | 18 ++ .../EnemyUpgrade_NoBounty.asset.meta | 8 + .../Draft/EnemyDraft/EnemyUpgrade_Split.asset | 19 ++ .../EnemyDraft/EnemyUpgrade_Split.asset.meta | 8 + .../Draft/EnemyDraft/EnemyUpgrade_Theft.asset | 18 ++ .../EnemyDraft/EnemyUpgrade_Theft.asset.meta | 8 + .../RunDefinitions/Draft/PlayerDraft.meta | 8 + .../Draft_BuilderEffect_GoldPerKill.asset | 0 ...Draft_BuilderEffect_GoldPerKill.asset.meta | 0 .../Draft_BuilderSpellOption_Fireball.asset | 0 ...aft_BuilderSpellOption_Fireball.asset.meta | 0 .../Draft_BuilderSpellOption_SlowArea.asset | 0 ...aft_BuilderSpellOption_SlowArea.asset.meta | 0 ...t_BuilderSpellOption_SlowAreaUpgrade.asset | 0 ...lderSpellOption_SlowAreaUpgrade.asset.meta | 0 .../Draft_NewTower_SiegeCannon.asset | 0 .../Draft_NewTower_SiegeCannon.asset.meta | 0 .../Draft_NewTower_TeslaCoil.asset | 0 .../Draft_NewTower_TeslaCoil.asset.meta | 0 .../PlayerDraft}/Draft_NewTower_Wall.asset | 0 .../Draft_NewTower_Wall.asset.meta | 0 .../Draft_TowerUpgrade_Arrow_1.asset | 21 ++ .../Draft_TowerUpgrade_Arrow_1.asset.meta | 8 + .../{ => RunDefinitions}/EnemyAbilities.meta | 0 .../EnemyAbilities/BlinkAbility.asset | 19 ++ .../EnemyAbilities/BlinkAbility.asset.meta | 8 + .../EnemyAbilities/FlightAbility.asset | 18 ++ .../EnemyAbilities/FlightAbility.asset.meta | 8 + .../EnemyAbilities/GoldTheftAbility.asset | 17 ++ .../GoldTheftAbility.asset.meta | 8 + .../EnemyAbilities/NoBountyAbility.asset | 17 ++ .../EnemyAbilities/NoBountyAbility.asset.meta | 8 + .../EnemyAbilities/SplitOnDeathAbility.asset | 0 .../SplitOnDeathAbility.asset.meta | 0 .../RunDefinitions/EnemyScalingConfig.asset | 17 ++ .../EnemyScalingConfig.asset.meta | 8 + .../{ => RunDefinitions}/GoldConfig.asset | 0 .../GoldConfig.asset.meta | 0 .../RunDefinitions/RunStructure.meta | 8 + .../EnemyUpgradeGroup_Phase1_Basics.asset | 28 +++ ...EnemyUpgradeGroup_Phase1_Basics.asset.meta | 8 + .../RunDefinitions/RunStructure/Phase1.asset | 21 ++ .../RunStructure/Phase1.asset.meta | 8 + .../RunStructure/Test_Run_Definition.asset | 18 ++ .../Test_Run_Definition.asset.meta | 8 + .../WaveGroup_Phase1_Bosses.asset | 18 ++ .../WaveGroup_Phase1_Bosses.asset.meta | 8 + .../WaveGroup_Phase1_Normal.asset | 34 +++ .../WaveGroup_Phase1_Normal.asset.meta | 8 + .../{ => RunDefinitions}/Waves.meta | 0 .../Waves/Wave10Definition.asset | 4 +- .../Waves/Wave10Definition.asset.meta | 0 .../Waves/Wave1Definition.asset | 0 .../Waves/Wave1Definition.asset.meta | 0 .../Waves/Wave2Definition.asset | 0 .../Waves/Wave2Definition.asset.meta | 0 .../Waves/Wave3Definition.asset | 0 .../Waves/Wave3Definition.asset.meta | 0 .../Waves/Wave4Definition.asset | 0 .../Waves/Wave4Definition.asset.meta | 0 .../Waves/Wave5Definition.asset | 0 .../Waves/Wave5Definition.asset.meta | 0 .../Waves/Wave6Definition.asset | 0 .../Waves/Wave6Definition.asset.meta | 0 .../Waves/Wave7Definition.asset | 0 .../Waves/Wave7Definition.asset.meta | 0 .../Waves/Wave8Definition.asset | 0 .../Waves/Wave8Definition.asset.meta | 0 .../Waves/Wave9Definition.asset | 0 .../Waves/Wave9Definition.asset.meta | 0 .../Definitions/Towers/BasicArrowTower.asset | 8 +- .../Towers/BasicArrowTower_Upgrade_1.asset | 41 ++++ .../BasicArrowTower_Upgrade_1.asset.meta | 8 + .../Enemies/Enemy_CrystalGolem_Red.prefab | 16 +- .../Enemies/Enemy_CrystalGolem_Yellow.prefab | 14 ++ .../Enemies/Enemy_Cyclops_Green.prefab | 18 +- .../Prefabs/Enemies/Enemy_Cyclops_Grey.prefab | 14 ++ .../Prefabs/Enemies/Enemy_Cyclops_Red.prefab | 14 ++ .../Prefabs/Enemies/Enemy_Ent_Black.prefab | 14 ++ .../Prefabs/Enemies/Enemy_Ent_Green.prefab | 14 ++ .../Prefabs/Enemies/Enemy_Ent_Orange.prefab | 14 ++ .../Enemies/Enemy_UndeadDrake_Bone.prefab | 14 ++ Assets/_Project/Prefabs/Player/Player.prefab | 44 +++- Assets/_Project/Scenes/Levels/9Player.unity | 221 +++++++++++++++++- .../Gameplay/EncounterGoldEntryDrawer.cs | 122 ++++++++++ .../Gameplay/EncounterGoldEntryDrawer.cs.meta | 2 + .../Editor/Gameplay/WaveGoldEntryDrawer.cs | 112 --------- .../Gameplay/WaveGoldEntryDrawer.cs.meta | 2 - .../EnemyAbilities/EnemySpawnContext.cs | 30 ++- .../Scripts/Gameplay/EnemyDefinition.cs | 19 +- .../_Project/Scripts/Gameplay/EnemyHealth.cs | 6 +- .../Scripts/Gameplay/EnemyScalingConfig.cs | 85 +++++++ .../Gameplay/EnemyScalingConfig.cs.meta | 2 + .../_Project/Scripts/Gameplay/GoldConfig.cs | 149 ++++++------ .../Scripts/Gameplay/TowerPlacementManager.cs | 70 ++++++ .../Scripts/Gameplay/WaveDefinition.cs | 6 + .../_Project/Scripts/Gameplay/WaveManager.cs | 100 +++++++- .../Scripts/Gameplay/Waves/RunState.cs | 2 +- .../Scripts/Gameplay/Waves/WaveGroup.cs | 2 +- Assets/_Project/Scripts/UI/HUDController.cs | 117 +++++++++- Assets/_Project/UI/HUD.uss | 28 +++ Assets/_Project/UI/HUD.uxml | 4 + Docs/2.0_Setup_Checklist.md | 161 ++++++++++--- 154 files changed, 2608 insertions(+), 287 deletions(-) create mode 100644 Assets/_Project/Art/Sprites/EnemyDraftIcons.meta create mode 100644 Assets/_Project/Art/Sprites/EnemyDraftIcons/BlinkIcon.png create mode 100644 Assets/_Project/Art/Sprites/EnemyDraftIcons/BlinkIcon.png.meta create mode 100644 Assets/_Project/Art/Sprites/EnemyDraftIcons/DoubleUpIcon.png create mode 100644 Assets/_Project/Art/Sprites/EnemyDraftIcons/DoubleUpIcon.png.meta create mode 100644 Assets/_Project/Art/Sprites/EnemyDraftIcons/FlightIcon.png create mode 100644 Assets/_Project/Art/Sprites/EnemyDraftIcons/FlightIcon.png.meta create mode 100644 Assets/_Project/Art/Sprites/EnemyDraftIcons/NoBountyIcon.png create mode 100644 Assets/_Project/Art/Sprites/EnemyDraftIcons/NoBountyIcon.png.meta create mode 100644 Assets/_Project/Art/Sprites/EnemyDraftIcons/SplitIcon.png create mode 100644 Assets/_Project/Art/Sprites/EnemyDraftIcons/SplitIcon.png.meta create mode 100644 Assets/_Project/Art/Sprites/EnemyDraftIcons/ThiefIcon.png create mode 100644 Assets/_Project/Art/Sprites/EnemyDraftIcons/ThiefIcon.png.meta create mode 100644 Assets/_Project/Art/Sprites/PlayerDraftIcons.meta rename Assets/_Project/Art/Sprites/{ => PlayerDraftIcons}/Spells.meta (100%) rename Assets/_Project/Art/Sprites/{ => PlayerDraftIcons}/Spells/FireballSpell.png (100%) rename Assets/_Project/Art/Sprites/{ => PlayerDraftIcons}/Spells/FireballSpell.png.meta (100%) rename Assets/_Project/Art/Sprites/{ => PlayerDraftIcons}/Spells/SlowSpell.png (100%) rename Assets/_Project/Art/Sprites/{ => PlayerDraftIcons}/Spells/SlowSpell.png.meta (100%) rename Assets/_Project/Art/Sprites/{ => PlayerDraftIcons}/Towers.meta (100%) create mode 100644 Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower.meta create mode 100644 Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower/ArrowTowerUpgrade_1.png create mode 100644 Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower/ArrowTowerUpgrade_1.png.meta rename Assets/_Project/Art/Sprites/{Towers => PlayerDraftIcons/Towers/ArrowTower}/arrow.png (100%) rename Assets/_Project/Art/Sprites/{Towers => PlayerDraftIcons/Towers/ArrowTower}/arrow.png.meta (100%) rename Assets/_Project/Art/Sprites/{ => PlayerDraftIcons}/Towers/siege.png (100%) rename Assets/_Project/Art/Sprites/{ => PlayerDraftIcons}/Towers/siege.png.meta (100%) create mode 100644 Assets/_Project/Art/Sprites/RaceIcons.meta rename Assets/_Project/Art/Sprites/{ => RaceIcons}/BloodAngels.jpg (100%) rename Assets/_Project/Art/Sprites/{ => RaceIcons}/BloodAngels.jpg.meta (100%) rename Assets/_Project/Art/Sprites/{ => RaceIcons}/Ultramarines.jpg (100%) rename Assets/_Project/Art/Sprites/{ => RaceIcons}/Ultramarines.jpg.meta (100%) create mode 100644 Assets/_Project/Definitions/RunDefinitions.meta rename Assets/_Project/Definitions/{ => RunDefinitions}/Draft.meta (100%) create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Blink.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Blink.asset.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_DoubleUp.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_DoubleUp.asset.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Flight.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Flight.asset.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_NoBounty.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_NoBounty.asset.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Split.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Split.asset.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Theft.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Theft.asset.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft.meta rename Assets/_Project/Definitions/{Draft => RunDefinitions/Draft/PlayerDraft}/Draft_BuilderEffect_GoldPerKill.asset (100%) rename Assets/_Project/Definitions/{Draft => RunDefinitions/Draft/PlayerDraft}/Draft_BuilderEffect_GoldPerKill.asset.meta (100%) rename Assets/_Project/Definitions/{Draft => RunDefinitions/Draft/PlayerDraft}/Draft_BuilderSpellOption_Fireball.asset (100%) rename Assets/_Project/Definitions/{Draft => RunDefinitions/Draft/PlayerDraft}/Draft_BuilderSpellOption_Fireball.asset.meta (100%) rename Assets/_Project/Definitions/{Draft => RunDefinitions/Draft/PlayerDraft}/Draft_BuilderSpellOption_SlowArea.asset (100%) rename Assets/_Project/Definitions/{Draft => RunDefinitions/Draft/PlayerDraft}/Draft_BuilderSpellOption_SlowArea.asset.meta (100%) rename Assets/_Project/Definitions/{Draft => RunDefinitions/Draft/PlayerDraft}/Draft_BuilderSpellOption_SlowAreaUpgrade.asset (100%) rename Assets/_Project/Definitions/{Draft => RunDefinitions/Draft/PlayerDraft}/Draft_BuilderSpellOption_SlowAreaUpgrade.asset.meta (100%) rename Assets/_Project/Definitions/{Draft => RunDefinitions/Draft/PlayerDraft}/Draft_NewTower_SiegeCannon.asset (100%) rename Assets/_Project/Definitions/{Draft => RunDefinitions/Draft/PlayerDraft}/Draft_NewTower_SiegeCannon.asset.meta (100%) rename Assets/_Project/Definitions/{Draft => RunDefinitions/Draft/PlayerDraft}/Draft_NewTower_TeslaCoil.asset (100%) rename Assets/_Project/Definitions/{Draft => RunDefinitions/Draft/PlayerDraft}/Draft_NewTower_TeslaCoil.asset.meta (100%) rename Assets/_Project/Definitions/{Draft => RunDefinitions/Draft/PlayerDraft}/Draft_NewTower_Wall.asset (100%) rename Assets/_Project/Definitions/{Draft => RunDefinitions/Draft/PlayerDraft}/Draft_NewTower_Wall.asset.meta (100%) create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_TowerUpgrade_Arrow_1.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_TowerUpgrade_Arrow_1.asset.meta rename Assets/_Project/Definitions/{ => RunDefinitions}/EnemyAbilities.meta (100%) create mode 100644 Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/BlinkAbility.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/BlinkAbility.asset.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/FlightAbility.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/FlightAbility.asset.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/GoldTheftAbility.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/GoldTheftAbility.asset.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/NoBountyAbility.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/NoBountyAbility.asset.meta rename Assets/_Project/Definitions/{ => RunDefinitions}/EnemyAbilities/SplitOnDeathAbility.asset (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/EnemyAbilities/SplitOnDeathAbility.asset.meta (100%) create mode 100644 Assets/_Project/Definitions/RunDefinitions/EnemyScalingConfig.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/EnemyScalingConfig.asset.meta rename Assets/_Project/Definitions/{ => RunDefinitions}/GoldConfig.asset (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/GoldConfig.asset.meta (100%) create mode 100644 Assets/_Project/Definitions/RunDefinitions/RunStructure.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/RunStructure/EnemyUpgradeGroup_Phase1_Basics.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/RunStructure/EnemyUpgradeGroup_Phase1_Basics.asset.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/RunStructure/Phase1.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/RunStructure/Phase1.asset.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/RunStructure/Test_Run_Definition.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/RunStructure/Test_Run_Definition.asset.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Bosses.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Bosses.asset.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Normal.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Normal.asset.meta rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves.meta (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave10Definition.asset (93%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave10Definition.asset.meta (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave1Definition.asset (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave1Definition.asset.meta (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave2Definition.asset (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave2Definition.asset.meta (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave3Definition.asset (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave3Definition.asset.meta (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave4Definition.asset (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave4Definition.asset.meta (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave5Definition.asset (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave5Definition.asset.meta (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave6Definition.asset (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave6Definition.asset.meta (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave7Definition.asset (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave7Definition.asset.meta (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave8Definition.asset (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave8Definition.asset.meta (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave9Definition.asset (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave9Definition.asset.meta (100%) create mode 100644 Assets/_Project/Definitions/Towers/BasicArrowTower_Upgrade_1.asset create mode 100644 Assets/_Project/Definitions/Towers/BasicArrowTower_Upgrade_1.asset.meta create mode 100644 Assets/_Project/Scripts/Editor/Gameplay/EncounterGoldEntryDrawer.cs create mode 100644 Assets/_Project/Scripts/Editor/Gameplay/EncounterGoldEntryDrawer.cs.meta delete mode 100644 Assets/_Project/Scripts/Editor/Gameplay/WaveGoldEntryDrawer.cs delete mode 100644 Assets/_Project/Scripts/Editor/Gameplay/WaveGoldEntryDrawer.cs.meta create mode 100644 Assets/_Project/Scripts/Gameplay/EnemyScalingConfig.cs create mode 100644 Assets/_Project/Scripts/Gameplay/EnemyScalingConfig.cs.meta diff --git a/Assets/_Project/Art/Sprites/EnemyDraftIcons.meta b/Assets/_Project/Art/Sprites/EnemyDraftIcons.meta new file mode 100644 index 0000000..4257bdb --- /dev/null +++ b/Assets/_Project/Art/Sprites/EnemyDraftIcons.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 42ccb4a3b6aaaab47b73147c8be319bb +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Art/Sprites/EnemyDraftIcons/BlinkIcon.png b/Assets/_Project/Art/Sprites/EnemyDraftIcons/BlinkIcon.png new file mode 100644 index 0000000..f2a24b8 --- /dev/null +++ b/Assets/_Project/Art/Sprites/EnemyDraftIcons/BlinkIcon.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b119eb6ab2d6c01573bce480df9fdb6676449398f4afde46673c3c2c2710fcc +size 13324 diff --git a/Assets/_Project/Art/Sprites/EnemyDraftIcons/BlinkIcon.png.meta b/Assets/_Project/Art/Sprites/EnemyDraftIcons/BlinkIcon.png.meta new file mode 100644 index 0000000..8523ae6 --- /dev/null +++ b/Assets/_Project/Art/Sprites/EnemyDraftIcons/BlinkIcon.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: df5903159b157404d8e92942029f08f7 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Art/Sprites/EnemyDraftIcons/DoubleUpIcon.png b/Assets/_Project/Art/Sprites/EnemyDraftIcons/DoubleUpIcon.png new file mode 100644 index 0000000..6503be4 --- /dev/null +++ b/Assets/_Project/Art/Sprites/EnemyDraftIcons/DoubleUpIcon.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5569ff4e8d0780e2d79dfb9575f34856d59cb99ac751dd4f8caf4c2219eb7976 +size 8730 diff --git a/Assets/_Project/Art/Sprites/EnemyDraftIcons/DoubleUpIcon.png.meta b/Assets/_Project/Art/Sprites/EnemyDraftIcons/DoubleUpIcon.png.meta new file mode 100644 index 0000000..eef1834 --- /dev/null +++ b/Assets/_Project/Art/Sprites/EnemyDraftIcons/DoubleUpIcon.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: e81c6ebff6b98ac44b884d3006611ae6 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Art/Sprites/EnemyDraftIcons/FlightIcon.png b/Assets/_Project/Art/Sprites/EnemyDraftIcons/FlightIcon.png new file mode 100644 index 0000000..7ef1d14 --- /dev/null +++ b/Assets/_Project/Art/Sprites/EnemyDraftIcons/FlightIcon.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4779891d6890994436e47c586b11768d6a8eead32c4e740f4c99713598783fea +size 15796 diff --git a/Assets/_Project/Art/Sprites/EnemyDraftIcons/FlightIcon.png.meta b/Assets/_Project/Art/Sprites/EnemyDraftIcons/FlightIcon.png.meta new file mode 100644 index 0000000..eb15613 --- /dev/null +++ b/Assets/_Project/Art/Sprites/EnemyDraftIcons/FlightIcon.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: 39ac5850677a092479550234de13e868 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Art/Sprites/EnemyDraftIcons/NoBountyIcon.png b/Assets/_Project/Art/Sprites/EnemyDraftIcons/NoBountyIcon.png new file mode 100644 index 0000000..ffb3b3e --- /dev/null +++ b/Assets/_Project/Art/Sprites/EnemyDraftIcons/NoBountyIcon.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e2d28ff550b9a9e83fe317c6c692115d3f5ef27f20f9aa9220e7f5aeb91768f +size 15522 diff --git a/Assets/_Project/Art/Sprites/EnemyDraftIcons/NoBountyIcon.png.meta b/Assets/_Project/Art/Sprites/EnemyDraftIcons/NoBountyIcon.png.meta new file mode 100644 index 0000000..42c8511 --- /dev/null +++ b/Assets/_Project/Art/Sprites/EnemyDraftIcons/NoBountyIcon.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: ea9802d37489c9442ba2ffd4a41c6cb2 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Art/Sprites/EnemyDraftIcons/SplitIcon.png b/Assets/_Project/Art/Sprites/EnemyDraftIcons/SplitIcon.png new file mode 100644 index 0000000..e57b4db --- /dev/null +++ b/Assets/_Project/Art/Sprites/EnemyDraftIcons/SplitIcon.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f0919f710e6673a55f44b1dbd55a16e19105fa5fe7d643330a4baea97eff095 +size 19587 diff --git a/Assets/_Project/Art/Sprites/EnemyDraftIcons/SplitIcon.png.meta b/Assets/_Project/Art/Sprites/EnemyDraftIcons/SplitIcon.png.meta new file mode 100644 index 0000000..57b7944 --- /dev/null +++ b/Assets/_Project/Art/Sprites/EnemyDraftIcons/SplitIcon.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: 43490fdb6e2477643a275956ce5f4596 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Art/Sprites/EnemyDraftIcons/ThiefIcon.png b/Assets/_Project/Art/Sprites/EnemyDraftIcons/ThiefIcon.png new file mode 100644 index 0000000..92cd276 --- /dev/null +++ b/Assets/_Project/Art/Sprites/EnemyDraftIcons/ThiefIcon.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90a7787cfc6120d1e6816d59a523093250f0f21200d3ad29fc6c99974837a7ef +size 18309 diff --git a/Assets/_Project/Art/Sprites/EnemyDraftIcons/ThiefIcon.png.meta b/Assets/_Project/Art/Sprites/EnemyDraftIcons/ThiefIcon.png.meta new file mode 100644 index 0000000..6198141 --- /dev/null +++ b/Assets/_Project/Art/Sprites/EnemyDraftIcons/ThiefIcon.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: 315be3feae908714a911f596b8533317 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Art/Sprites/PlayerDraftIcons.meta b/Assets/_Project/Art/Sprites/PlayerDraftIcons.meta new file mode 100644 index 0000000..16c1caf --- /dev/null +++ b/Assets/_Project/Art/Sprites/PlayerDraftIcons.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 319f59716d010174aa75cc757855ffd3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Art/Sprites/Spells.meta b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Spells.meta similarity index 100% rename from Assets/_Project/Art/Sprites/Spells.meta rename to Assets/_Project/Art/Sprites/PlayerDraftIcons/Spells.meta diff --git a/Assets/_Project/Art/Sprites/Spells/FireballSpell.png b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Spells/FireballSpell.png similarity index 100% rename from Assets/_Project/Art/Sprites/Spells/FireballSpell.png rename to Assets/_Project/Art/Sprites/PlayerDraftIcons/Spells/FireballSpell.png diff --git a/Assets/_Project/Art/Sprites/Spells/FireballSpell.png.meta b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Spells/FireballSpell.png.meta similarity index 100% rename from Assets/_Project/Art/Sprites/Spells/FireballSpell.png.meta rename to Assets/_Project/Art/Sprites/PlayerDraftIcons/Spells/FireballSpell.png.meta diff --git a/Assets/_Project/Art/Sprites/Spells/SlowSpell.png b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Spells/SlowSpell.png similarity index 100% rename from Assets/_Project/Art/Sprites/Spells/SlowSpell.png rename to Assets/_Project/Art/Sprites/PlayerDraftIcons/Spells/SlowSpell.png diff --git a/Assets/_Project/Art/Sprites/Spells/SlowSpell.png.meta b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Spells/SlowSpell.png.meta similarity index 100% rename from Assets/_Project/Art/Sprites/Spells/SlowSpell.png.meta rename to Assets/_Project/Art/Sprites/PlayerDraftIcons/Spells/SlowSpell.png.meta diff --git a/Assets/_Project/Art/Sprites/Towers.meta b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers.meta similarity index 100% rename from Assets/_Project/Art/Sprites/Towers.meta rename to Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers.meta diff --git a/Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower.meta b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower.meta new file mode 100644 index 0000000..3e3ff27 --- /dev/null +++ b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 06352dd9c76072941bbe7ad909c5f2f9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower/ArrowTowerUpgrade_1.png b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower/ArrowTowerUpgrade_1.png new file mode 100644 index 0000000..d7e8a96 --- /dev/null +++ b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower/ArrowTowerUpgrade_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e1b3dd4114b2639901392675da17a1c33146aa112157663fa13cf1dbb718cf4 +size 7076 diff --git a/Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower/ArrowTowerUpgrade_1.png.meta b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower/ArrowTowerUpgrade_1.png.meta new file mode 100644 index 0000000..bbe72c7 --- /dev/null +++ b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower/ArrowTowerUpgrade_1.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: a140f62a10b8dc04e84625f8008e0c24 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Art/Sprites/Towers/arrow.png b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower/arrow.png similarity index 100% rename from Assets/_Project/Art/Sprites/Towers/arrow.png rename to Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower/arrow.png diff --git a/Assets/_Project/Art/Sprites/Towers/arrow.png.meta b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower/arrow.png.meta similarity index 100% rename from Assets/_Project/Art/Sprites/Towers/arrow.png.meta rename to Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower/arrow.png.meta diff --git a/Assets/_Project/Art/Sprites/Towers/siege.png b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/siege.png similarity index 100% rename from Assets/_Project/Art/Sprites/Towers/siege.png rename to Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/siege.png diff --git a/Assets/_Project/Art/Sprites/Towers/siege.png.meta b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/siege.png.meta similarity index 100% rename from Assets/_Project/Art/Sprites/Towers/siege.png.meta rename to Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/siege.png.meta diff --git a/Assets/_Project/Art/Sprites/RaceIcons.meta b/Assets/_Project/Art/Sprites/RaceIcons.meta new file mode 100644 index 0000000..361ea99 --- /dev/null +++ b/Assets/_Project/Art/Sprites/RaceIcons.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 45b4fc03b527ce444a7c37579965d990 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Art/Sprites/BloodAngels.jpg b/Assets/_Project/Art/Sprites/RaceIcons/BloodAngels.jpg similarity index 100% rename from Assets/_Project/Art/Sprites/BloodAngels.jpg rename to Assets/_Project/Art/Sprites/RaceIcons/BloodAngels.jpg diff --git a/Assets/_Project/Art/Sprites/BloodAngels.jpg.meta b/Assets/_Project/Art/Sprites/RaceIcons/BloodAngels.jpg.meta similarity index 100% rename from Assets/_Project/Art/Sprites/BloodAngels.jpg.meta rename to Assets/_Project/Art/Sprites/RaceIcons/BloodAngels.jpg.meta diff --git a/Assets/_Project/Art/Sprites/Ultramarines.jpg b/Assets/_Project/Art/Sprites/RaceIcons/Ultramarines.jpg similarity index 100% rename from Assets/_Project/Art/Sprites/Ultramarines.jpg rename to Assets/_Project/Art/Sprites/RaceIcons/Ultramarines.jpg diff --git a/Assets/_Project/Art/Sprites/Ultramarines.jpg.meta b/Assets/_Project/Art/Sprites/RaceIcons/Ultramarines.jpg.meta similarity index 100% rename from Assets/_Project/Art/Sprites/Ultramarines.jpg.meta rename to Assets/_Project/Art/Sprites/RaceIcons/Ultramarines.jpg.meta diff --git a/Assets/_Project/Definitions/Enemies/01_Enemy_CrystalGolemBlue_Definition.asset b/Assets/_Project/Definitions/Enemies/01_Enemy_CrystalGolemBlue_Definition.asset index 5a7e5c4..39b2af6 100644 --- a/Assets/_Project/Definitions/Enemies/01_Enemy_CrystalGolemBlue_Definition.asset +++ b/Assets/_Project/Definitions/Enemies/01_Enemy_CrystalGolemBlue_Definition.asset @@ -13,8 +13,8 @@ MonoBehaviour: m_Name: 01_Enemy_CrystalGolemBlue_Definition m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyDefinition DisplayName: Crystal Elemental (Young) - MaxHp: 100 - MoveSpeed: 3 + HpMultiplier: 1.15 + MoveSpeed: 2.6 IsFlying: 0 LivesCost: 1 EnemyPrefab: {fileID: 1455822126534880203, guid: 5839dc36140d67d4db94c4370a98ea2c, type: 3} diff --git a/Assets/_Project/Definitions/Enemies/02_Enemy_CyclopsGrey_Definition.asset b/Assets/_Project/Definitions/Enemies/02_Enemy_CyclopsGrey_Definition.asset index b616fca..2bad6f2 100644 --- a/Assets/_Project/Definitions/Enemies/02_Enemy_CyclopsGrey_Definition.asset +++ b/Assets/_Project/Definitions/Enemies/02_Enemy_CyclopsGrey_Definition.asset @@ -13,7 +13,7 @@ MonoBehaviour: m_Name: 02_Enemy_CyclopsGrey_Definition m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyDefinition DisplayName: Cyclops (Young) - MaxHp: 200 + HpMultiplier: 1.05 MoveSpeed: 3 IsFlying: 0 LivesCost: 1 diff --git a/Assets/_Project/Definitions/Enemies/03_Enemy_EntGreen_Definition.asset b/Assets/_Project/Definitions/Enemies/03_Enemy_EntGreen_Definition.asset index 48c0a11..6ca1cb8 100644 --- a/Assets/_Project/Definitions/Enemies/03_Enemy_EntGreen_Definition.asset +++ b/Assets/_Project/Definitions/Enemies/03_Enemy_EntGreen_Definition.asset @@ -13,8 +13,8 @@ MonoBehaviour: m_Name: 03_Enemy_EntGreen_Definition m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyDefinition DisplayName: Ent (Juvenile) - MaxHp: 400 - MoveSpeed: 3 + HpMultiplier: 0.85 + MoveSpeed: 3.4 IsFlying: 0 LivesCost: 1 EnemyPrefab: {fileID: 1455822126534880203, guid: dc462b86bdb8136488da56eb84d88ab5, type: 3} diff --git a/Assets/_Project/Definitions/Enemies/04_Enemy_CrystalGolemYellow_Definition.asset b/Assets/_Project/Definitions/Enemies/04_Enemy_CrystalGolemYellow_Definition.asset index 5129b58..ed14151 100644 --- a/Assets/_Project/Definitions/Enemies/04_Enemy_CrystalGolemYellow_Definition.asset +++ b/Assets/_Project/Definitions/Enemies/04_Enemy_CrystalGolemYellow_Definition.asset @@ -13,8 +13,8 @@ MonoBehaviour: m_Name: 04_Enemy_CrystalGolemYellow_Definition m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyDefinition DisplayName: Crystal Elemental (Adolescent) - MaxHp: 500 - MoveSpeed: 3 + HpMultiplier: 1.25 + MoveSpeed: 2.4 IsFlying: 0 LivesCost: 1 EnemyPrefab: {fileID: 1455822126534880203, guid: d4ca85138dd41244c9b0ab29c945f064, type: 3} diff --git a/Assets/_Project/Definitions/Enemies/05_Enemy_CyclopsGreen_Definition.asset b/Assets/_Project/Definitions/Enemies/05_Enemy_CyclopsGreen_Definition.asset index d516ea5..29dbef6 100644 --- a/Assets/_Project/Definitions/Enemies/05_Enemy_CyclopsGreen_Definition.asset +++ b/Assets/_Project/Definitions/Enemies/05_Enemy_CyclopsGreen_Definition.asset @@ -13,8 +13,8 @@ MonoBehaviour: m_Name: 05_Enemy_CyclopsGreen_Definition m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyDefinition DisplayName: Cyclops (Adult) - MaxHp: 600 - MoveSpeed: 3 + HpMultiplier: 1.1 + MoveSpeed: 2.9 IsFlying: 0 LivesCost: 1 EnemyPrefab: {fileID: 1455822126534880203, guid: 525e51e0dfac75744b39e4609b9245f9, type: 3} diff --git a/Assets/_Project/Definitions/Enemies/06_Enemy_EntBlack_Definition.asset b/Assets/_Project/Definitions/Enemies/06_Enemy_EntBlack_Definition.asset index dc74753..cd153bb 100644 --- a/Assets/_Project/Definitions/Enemies/06_Enemy_EntBlack_Definition.asset +++ b/Assets/_Project/Definitions/Enemies/06_Enemy_EntBlack_Definition.asset @@ -13,8 +13,8 @@ MonoBehaviour: m_Name: 06_Enemy_EntBlack_Definition m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyDefinition DisplayName: Ent (Mature) - MaxHp: 700 - MoveSpeed: 3 + HpMultiplier: 0.9 + MoveSpeed: 3.3 IsFlying: 0 LivesCost: 1 EnemyPrefab: {fileID: 1455822126534880203, guid: c3cae952216a68b458b9a934d89b8be8, type: 3} diff --git a/Assets/_Project/Definitions/Enemies/07_Enemy_CrystalGolemRed_Definition.asset b/Assets/_Project/Definitions/Enemies/07_Enemy_CrystalGolemRed_Definition.asset index 9b8a5b3..c0b1005 100644 --- a/Assets/_Project/Definitions/Enemies/07_Enemy_CrystalGolemRed_Definition.asset +++ b/Assets/_Project/Definitions/Enemies/07_Enemy_CrystalGolemRed_Definition.asset @@ -13,8 +13,8 @@ MonoBehaviour: m_Name: 07_Enemy_CrystalGolemRed_Definition m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyDefinition DisplayName: Crystal Elemental (Mature) - MaxHp: 800 - MoveSpeed: 3 + HpMultiplier: 1.35 + MoveSpeed: 2.2 IsFlying: 0 LivesCost: 1 EnemyPrefab: {fileID: 1455822126534880203, guid: 2f13fef371bd3464694526ff99edef03, type: 3} diff --git a/Assets/_Project/Definitions/Enemies/08_Enemy_CyclopsRed_Definition.asset b/Assets/_Project/Definitions/Enemies/08_Enemy_CyclopsRed_Definition.asset index 7ca2962..a71ed1a 100644 --- a/Assets/_Project/Definitions/Enemies/08_Enemy_CyclopsRed_Definition.asset +++ b/Assets/_Project/Definitions/Enemies/08_Enemy_CyclopsRed_Definition.asset @@ -13,8 +13,8 @@ MonoBehaviour: m_Name: 08_Enemy_CyclopsRed_Definition m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyDefinition DisplayName: Cyclops (Enraged) - MaxHp: 900 - MoveSpeed: 3 + HpMultiplier: 1.2 + MoveSpeed: 2.8 IsFlying: 0 LivesCost: 1 EnemyPrefab: {fileID: 1455822126534880203, guid: 729e11f4ecd916d4fbeaf26dbbae8b7d, type: 3} diff --git a/Assets/_Project/Definitions/Enemies/09_Enemy_EntOrange_Definition.asset b/Assets/_Project/Definitions/Enemies/09_Enemy_EntOrange_Definition.asset index e9d57fa..e2d0b3b 100644 --- a/Assets/_Project/Definitions/Enemies/09_Enemy_EntOrange_Definition.asset +++ b/Assets/_Project/Definitions/Enemies/09_Enemy_EntOrange_Definition.asset @@ -13,8 +13,8 @@ MonoBehaviour: m_Name: 09_Enemy_EntOrange_Definition m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyDefinition DisplayName: Ent (Ancient) - MaxHp: 1000 - MoveSpeed: 3 + HpMultiplier: 0.95 + MoveSpeed: 3.2 IsFlying: 0 LivesCost: 1 EnemyPrefab: {fileID: 1455822126534880203, guid: d6eed12cf96ab194ab8d35359e3bc8ee, type: 3} diff --git a/Assets/_Project/Definitions/Enemies/10_Enemy_UndeadDrakeBone_Definition.asset b/Assets/_Project/Definitions/Enemies/10_Enemy_UndeadDrakeBone_Definition.asset index 31d1eec..af46c2c 100644 --- a/Assets/_Project/Definitions/Enemies/10_Enemy_UndeadDrakeBone_Definition.asset +++ b/Assets/_Project/Definitions/Enemies/10_Enemy_UndeadDrakeBone_Definition.asset @@ -12,9 +12,9 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c0d2521d49d21fe4380434f5951944d1, type: 3} m_Name: 10_Enemy_UndeadDrakeBone_Definition m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyDefinition - DisplayName: Ent (Ancient) - MaxHp: 800 - MoveSpeed: 4 + DisplayName: Drake + HpMultiplier: 0.7 + MoveSpeed: 4.5 IsFlying: 1 FlightHeight: 3 LivesCost: 1 diff --git a/Assets/_Project/Definitions/RunDefinitions.meta b/Assets/_Project/Definitions/RunDefinitions.meta new file mode 100644 index 0000000..d07862f --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d1d72155425add944a007932c121c951 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/Draft.meta b/Assets/_Project/Definitions/RunDefinitions/Draft.meta similarity index 100% rename from Assets/_Project/Definitions/Draft.meta rename to Assets/_Project/Definitions/RunDefinitions/Draft.meta diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft.meta new file mode 100644 index 0000000..359e56c --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 465572754aa5c7e48b1c00843f1b5d7c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Blink.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Blink.asset new file mode 100644 index 0000000..98bd078 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Blink.asset @@ -0,0 +1,18 @@ +%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: d075c66b381872a4781b3916296ccdc9, type: 3} + m_Name: EnemyUpgrade_Blink + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyUpgrades.AbilityEnemyUpgradeOption + DisplayName: Blink + Description: Enemies occasionally teleport a short distance ahead. + Icon: {fileID: 21300000, guid: df5903159b157404d8e92942029f08f7, type: 3} + Ability: {fileID: 11400000, guid: 030f10c9a264e544ea3e0f4fdb4171bd, type: 2} diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Blink.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Blink.asset.meta new file mode 100644 index 0000000..6570ea6 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Blink.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: eef28ca7b8844504e9d75ff903a3bb61 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_DoubleUp.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_DoubleUp.asset new file mode 100644 index 0000000..daa0979 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_DoubleUp.asset @@ -0,0 +1,19 @@ +%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: f5e90fe6b8e439e4f99769a6923c2262, type: 3} + m_Name: EnemyUpgrade_DoubleUp + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyUpgrades.DoubleUpEnemyUpgradeOption + DisplayName: Double Dip + Description: Enemies from this wave gain no upgrades, but enemies from the next + wave have two upgrades selected automatically + Icon: {fileID: 21300000, guid: e81c6ebff6b98ac44b884d3006611ae6, type: 3} + BuffsToAutoApply: 2 diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_DoubleUp.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_DoubleUp.asset.meta new file mode 100644 index 0000000..db74d57 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_DoubleUp.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 46e2a6a59c0a3034f9fa44681d9ba422 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Flight.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Flight.asset new file mode 100644 index 0000000..5379694 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Flight.asset @@ -0,0 +1,18 @@ +%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: d075c66b381872a4781b3916296ccdc9, type: 3} + m_Name: EnemyUpgrade_Flight + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyUpgrades.AbilityEnemyUpgradeOption + DisplayName: Flight + Description: Enemies gain the power of flight + Icon: {fileID: 21300000, guid: 39ac5850677a092479550234de13e868, type: 3} + Ability: {fileID: 11400000, guid: cb2ec6bb70f57d0429b99b7cd4c7db73, type: 2} diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Flight.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Flight.asset.meta new file mode 100644 index 0000000..c49dfc4 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Flight.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 80fb851b702ff304183cb6e89c4aa245 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_NoBounty.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_NoBounty.asset new file mode 100644 index 0000000..58af079 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_NoBounty.asset @@ -0,0 +1,18 @@ +%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: d075c66b381872a4781b3916296ccdc9, type: 3} + m_Name: EnemyUpgrade_NoBounty + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyUpgrades.AbilityEnemyUpgradeOption + DisplayName: Peniless + Description: Enemies no longer drop gold upon death + Icon: {fileID: 21300000, guid: ea9802d37489c9442ba2ffd4a41c6cb2, type: 3} + Ability: {fileID: 11400000, guid: c64c7121b0456bb4a873acec9e0abf91, type: 2} diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_NoBounty.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_NoBounty.asset.meta new file mode 100644 index 0000000..bea9c35 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_NoBounty.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a67aa3644d2ad4847a47040f53fea26f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Split.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Split.asset new file mode 100644 index 0000000..2351102 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Split.asset @@ -0,0 +1,19 @@ +%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: d075c66b381872a4781b3916296ccdc9, type: 3} + m_Name: EnemyUpgrade_Split + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyUpgrades.AbilityEnemyUpgradeOption + DisplayName: Split on Death + Description: Enemies killed will spawn two more smaller, faster, weaker versions + of themselves. (This only triggers a single time per base enemy) + Icon: {fileID: 21300000, guid: 43490fdb6e2477643a275956ce5f4596, type: 3} + Ability: {fileID: 11400000, guid: 0305468bc8f912d429a8b20bf23f947c, type: 2} diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Split.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Split.asset.meta new file mode 100644 index 0000000..ca2e9c2 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Split.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f6bfb033a15b6d0419587b80a8286bd1 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Theft.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Theft.asset new file mode 100644 index 0000000..e0f0515 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Theft.asset @@ -0,0 +1,18 @@ +%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: d075c66b381872a4781b3916296ccdc9, type: 3} + m_Name: EnemyUpgrade_Theft + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyUpgrades.AbilityEnemyUpgradeOption + DisplayName: Thief + Description: Enemies that leak steal 15 gold on their way out + Icon: {fileID: 21300000, guid: 315be3feae908714a911f596b8533317, type: 3} + Ability: {fileID: 11400000, guid: a18691a20d75f17479a83b3e171759e7, type: 2} diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Theft.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Theft.asset.meta new file mode 100644 index 0000000..f4847ca --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Theft.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 37d761966a349ba4cb4141f913224d5c +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft.meta new file mode 100644 index 0000000..18e2f50 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4a6f4d6ffa10ef44da3ac0dd7c7734db +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/Draft/Draft_BuilderEffect_GoldPerKill.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderEffect_GoldPerKill.asset similarity index 100% rename from Assets/_Project/Definitions/Draft/Draft_BuilderEffect_GoldPerKill.asset rename to Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderEffect_GoldPerKill.asset diff --git a/Assets/_Project/Definitions/Draft/Draft_BuilderEffect_GoldPerKill.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderEffect_GoldPerKill.asset.meta similarity index 100% rename from Assets/_Project/Definitions/Draft/Draft_BuilderEffect_GoldPerKill.asset.meta rename to Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderEffect_GoldPerKill.asset.meta diff --git a/Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_Fireball.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_Fireball.asset similarity index 100% rename from Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_Fireball.asset rename to Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_Fireball.asset diff --git a/Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_Fireball.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_Fireball.asset.meta similarity index 100% rename from Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_Fireball.asset.meta rename to Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_Fireball.asset.meta diff --git a/Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_SlowArea.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_SlowArea.asset similarity index 100% rename from Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_SlowArea.asset rename to Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_SlowArea.asset diff --git a/Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_SlowArea.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_SlowArea.asset.meta similarity index 100% rename from Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_SlowArea.asset.meta rename to Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_SlowArea.asset.meta diff --git a/Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_SlowAreaUpgrade.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_SlowAreaUpgrade.asset similarity index 100% rename from Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_SlowAreaUpgrade.asset rename to Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_SlowAreaUpgrade.asset diff --git a/Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_SlowAreaUpgrade.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_SlowAreaUpgrade.asset.meta similarity index 100% rename from Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_SlowAreaUpgrade.asset.meta rename to Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_SlowAreaUpgrade.asset.meta diff --git a/Assets/_Project/Definitions/Draft/Draft_NewTower_SiegeCannon.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_NewTower_SiegeCannon.asset similarity index 100% rename from Assets/_Project/Definitions/Draft/Draft_NewTower_SiegeCannon.asset rename to Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_NewTower_SiegeCannon.asset diff --git a/Assets/_Project/Definitions/Draft/Draft_NewTower_SiegeCannon.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_NewTower_SiegeCannon.asset.meta similarity index 100% rename from Assets/_Project/Definitions/Draft/Draft_NewTower_SiegeCannon.asset.meta rename to Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_NewTower_SiegeCannon.asset.meta diff --git a/Assets/_Project/Definitions/Draft/Draft_NewTower_TeslaCoil.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_NewTower_TeslaCoil.asset similarity index 100% rename from Assets/_Project/Definitions/Draft/Draft_NewTower_TeslaCoil.asset rename to Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_NewTower_TeslaCoil.asset diff --git a/Assets/_Project/Definitions/Draft/Draft_NewTower_TeslaCoil.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_NewTower_TeslaCoil.asset.meta similarity index 100% rename from Assets/_Project/Definitions/Draft/Draft_NewTower_TeslaCoil.asset.meta rename to Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_NewTower_TeslaCoil.asset.meta diff --git a/Assets/_Project/Definitions/Draft/Draft_NewTower_Wall.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_NewTower_Wall.asset similarity index 100% rename from Assets/_Project/Definitions/Draft/Draft_NewTower_Wall.asset rename to Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_NewTower_Wall.asset diff --git a/Assets/_Project/Definitions/Draft/Draft_NewTower_Wall.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_NewTower_Wall.asset.meta similarity index 100% rename from Assets/_Project/Definitions/Draft/Draft_NewTower_Wall.asset.meta rename to Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_NewTower_Wall.asset.meta diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_TowerUpgrade_Arrow_1.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_TowerUpgrade_Arrow_1.asset new file mode 100644 index 0000000..016e045 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_TowerUpgrade_Arrow_1.asset @@ -0,0 +1,21 @@ +%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: aeec22f152a57ef5798eae035c091543, type: 3} + m_Name: Draft_TowerUpgrade_Arrow_1 + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.Draft.TowerUpgradeDraftOption + DisplayName: Arrow Tower Upgrade 1 + Description: Unlock the ability to upgrade Arrow Towers with more damage and a + faster attack speed + Icon: {fileID: 21300000, guid: a140f62a10b8dc04e84625f8008e0c24, type: 3} + Weight: 1 + BaseTower: {fileID: 11400000, guid: 0f693e29ca953e1439e10cb8f12e4b30, type: 2} + UpgradedTower: {fileID: 11400000, guid: 86d4c3ab00d4c654eb4c255280ee5701, type: 2} diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_TowerUpgrade_Arrow_1.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_TowerUpgrade_Arrow_1.asset.meta new file mode 100644 index 0000000..1009def --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_TowerUpgrade_Arrow_1.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0b9f4905752751f44b9959b84b620266 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/EnemyAbilities.meta b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities.meta similarity index 100% rename from Assets/_Project/Definitions/EnemyAbilities.meta rename to Assets/_Project/Definitions/RunDefinitions/EnemyAbilities.meta diff --git a/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/BlinkAbility.asset b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/BlinkAbility.asset new file mode 100644 index 0000000..6cc7cf7 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/BlinkAbility.asset @@ -0,0 +1,19 @@ +%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: 4fbb09f55384ac44399ac4655b2b53ec, type: 3} + m_Name: BlinkAbility + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbilities.BlinkAbilityDefinition + DisplayName: Blink + Description: Enemies occasionally teleport a short distance ahead. + IntervalSeconds: 4 + BlinkWaypoints: 2 + StartJitterSeconds: 1.5 diff --git a/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/BlinkAbility.asset.meta b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/BlinkAbility.asset.meta new file mode 100644 index 0000000..78c2c0b --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/BlinkAbility.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 030f10c9a264e544ea3e0f4fdb4171bd +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/FlightAbility.asset b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/FlightAbility.asset new file mode 100644 index 0000000..725338e --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/FlightAbility.asset @@ -0,0 +1,18 @@ +%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: be77d353621f07e40bbdab2e9cc37f51, type: 3} + m_Name: FlightAbility + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbilities.FlightAbilityDefinition + DisplayName: Flight + Description: Enemies gain flying + FlightHeight: 3 + SpeedMultiplier: 1 diff --git a/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/FlightAbility.asset.meta b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/FlightAbility.asset.meta new file mode 100644 index 0000000..0b5d052 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/FlightAbility.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cb2ec6bb70f57d0429b99b7cd4c7db73 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/GoldTheftAbility.asset b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/GoldTheftAbility.asset new file mode 100644 index 0000000..fc16c66 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/GoldTheftAbility.asset @@ -0,0 +1,17 @@ +%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: 3b770ce042b78f44d9a3df537fe25db0, type: 3} + m_Name: GoldTheftAbility + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbilities.GoldTheftAbilityDefinition + DisplayName: Thief + Description: Enemies that leak out of a player's maze steal 15 gold as they go. + GoldStolen: 15 diff --git a/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/GoldTheftAbility.asset.meta b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/GoldTheftAbility.asset.meta new file mode 100644 index 0000000..11247d1 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/GoldTheftAbility.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a18691a20d75f17479a83b3e171759e7 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/NoBountyAbility.asset b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/NoBountyAbility.asset new file mode 100644 index 0000000..0231479 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/NoBountyAbility.asset @@ -0,0 +1,17 @@ +%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: fd5b12948b24e9c4c8840ef3470b437e, type: 3} + m_Name: NoBountyAbility + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbilities.NoBountyAbilityDefinition + DisplayName: Penniless + Description: Enemies no longer drop gold on death + BountyMultiplier: 0 diff --git a/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/NoBountyAbility.asset.meta b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/NoBountyAbility.asset.meta new file mode 100644 index 0000000..8aede82 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/NoBountyAbility.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c64c7121b0456bb4a873acec9e0abf91 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/EnemyAbilities/SplitOnDeathAbility.asset b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/SplitOnDeathAbility.asset similarity index 100% rename from Assets/_Project/Definitions/EnemyAbilities/SplitOnDeathAbility.asset rename to Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/SplitOnDeathAbility.asset diff --git a/Assets/_Project/Definitions/EnemyAbilities/SplitOnDeathAbility.asset.meta b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/SplitOnDeathAbility.asset.meta similarity index 100% rename from Assets/_Project/Definitions/EnemyAbilities/SplitOnDeathAbility.asset.meta rename to Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/SplitOnDeathAbility.asset.meta diff --git a/Assets/_Project/Definitions/RunDefinitions/EnemyScalingConfig.asset b/Assets/_Project/Definitions/RunDefinitions/EnemyScalingConfig.asset new file mode 100644 index 0000000..509a039 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/EnemyScalingConfig.asset @@ -0,0 +1,17 @@ +%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: de25a6333a11d074280b5ade557aa8b9, type: 3} + m_Name: EnemyScalingConfig + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyScalingConfig + BaseHpBudget: 5000 + GrowthPerEncounter: 1.18 + BossHpMultiplier: 1.2 diff --git a/Assets/_Project/Definitions/RunDefinitions/EnemyScalingConfig.asset.meta b/Assets/_Project/Definitions/RunDefinitions/EnemyScalingConfig.asset.meta new file mode 100644 index 0000000..377b8a5 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/EnemyScalingConfig.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ae9fde0b564e20440ac2e20861fa1ca6 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/GoldConfig.asset b/Assets/_Project/Definitions/RunDefinitions/GoldConfig.asset similarity index 100% rename from Assets/_Project/Definitions/GoldConfig.asset rename to Assets/_Project/Definitions/RunDefinitions/GoldConfig.asset diff --git a/Assets/_Project/Definitions/GoldConfig.asset.meta b/Assets/_Project/Definitions/RunDefinitions/GoldConfig.asset.meta similarity index 100% rename from Assets/_Project/Definitions/GoldConfig.asset.meta rename to Assets/_Project/Definitions/RunDefinitions/GoldConfig.asset.meta diff --git a/Assets/_Project/Definitions/RunDefinitions/RunStructure.meta b/Assets/_Project/Definitions/RunDefinitions/RunStructure.meta new file mode 100644 index 0000000..5a3abf7 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/RunStructure.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 11ba3723e03690b47a4f2518bfc68a62 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/RunDefinitions/RunStructure/EnemyUpgradeGroup_Phase1_Basics.asset b/Assets/_Project/Definitions/RunDefinitions/RunStructure/EnemyUpgradeGroup_Phase1_Basics.asset new file mode 100644 index 0000000..8691b9a --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/RunStructure/EnemyUpgradeGroup_Phase1_Basics.asset @@ -0,0 +1,28 @@ +%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: 4202a767d96e70f41b6a7e84eb08a832, type: 3} + m_Name: EnemyUpgradeGroup_Phase1_Basics + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyUpgrades.EnemyUpgradeGroup + DisplayName: Upgrade Group Phase 1 + Options: + - Option: {fileID: 11400000, guid: eef28ca7b8844504e9d75ff903a3bb61, type: 2} + Weight: 1 + - Option: {fileID: 11400000, guid: 46e2a6a59c0a3034f9fa44681d9ba422, type: 2} + Weight: 1 + - Option: {fileID: 11400000, guid: 80fb851b702ff304183cb6e89c4aa245, type: 2} + Weight: 1 + - Option: {fileID: 11400000, guid: a67aa3644d2ad4847a47040f53fea26f, type: 2} + Weight: 1 + - Option: {fileID: 11400000, guid: f6bfb033a15b6d0419587b80a8286bd1, type: 2} + Weight: 1 + - Option: {fileID: 11400000, guid: 37d761966a349ba4cb4141f913224d5c, type: 2} + Weight: 1 diff --git a/Assets/_Project/Definitions/RunDefinitions/RunStructure/EnemyUpgradeGroup_Phase1_Basics.asset.meta b/Assets/_Project/Definitions/RunDefinitions/RunStructure/EnemyUpgradeGroup_Phase1_Basics.asset.meta new file mode 100644 index 0000000..04f87c2 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/RunStructure/EnemyUpgradeGroup_Phase1_Basics.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3dfcbf5323c0a184c84f6b9e80e37257 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/RunDefinitions/RunStructure/Phase1.asset b/Assets/_Project/Definitions/RunDefinitions/RunStructure/Phase1.asset new file mode 100644 index 0000000..34c811a --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/RunStructure/Phase1.asset @@ -0,0 +1,21 @@ +%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: 8f73fcf0261654d44a6d0939bdc9b88f, type: 3} + m_Name: Phase1 + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.Waves.PhaseDefinition + DisplayName: Phase 1 + WaveGroups: + - {fileID: 11400000, guid: 80eaa5ec98fd5df4e950131a8984fd31, type: 2} + BossGroups: + - {fileID: 11400000, guid: 2981ffffb36dfc440aa4517c17cfbbf4, type: 2} + EnemyUpgradeGroups: + - {fileID: 11400000, guid: 3dfcbf5323c0a184c84f6b9e80e37257, type: 2} diff --git a/Assets/_Project/Definitions/RunDefinitions/RunStructure/Phase1.asset.meta b/Assets/_Project/Definitions/RunDefinitions/RunStructure/Phase1.asset.meta new file mode 100644 index 0000000..7fea787 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/RunStructure/Phase1.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1d4f04f995c4c3b44be6e5f9d0f6e3f8 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/RunDefinitions/RunStructure/Test_Run_Definition.asset b/Assets/_Project/Definitions/RunDefinitions/RunStructure/Test_Run_Definition.asset new file mode 100644 index 0000000..c77b032 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/RunStructure/Test_Run_Definition.asset @@ -0,0 +1,18 @@ +%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: 2b73bb9876b7fdb4480b13ff6bb8bd67, type: 3} + m_Name: Test_Run_Definition + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.Waves.RunDefinition + WavesPerCycle: 5 + CyclesPerPhase: 3 + Phases: + - {fileID: 11400000, guid: 1d4f04f995c4c3b44be6e5f9d0f6e3f8, type: 2} diff --git a/Assets/_Project/Definitions/RunDefinitions/RunStructure/Test_Run_Definition.asset.meta b/Assets/_Project/Definitions/RunDefinitions/RunStructure/Test_Run_Definition.asset.meta new file mode 100644 index 0000000..bcf6074 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/RunStructure/Test_Run_Definition.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1bb81a966192c344d94cce2628c1832b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Bosses.asset b/Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Bosses.asset new file mode 100644 index 0000000..2e739af --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Bosses.asset @@ -0,0 +1,18 @@ +%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: 5625bd25f378bda429666820a4940cee, type: 3} + m_Name: WaveGroup_Phase1_Bosses + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.Waves.WaveGroup + DisplayName: Phase 1 Bosses + Waves: + - Wave: {fileID: 11400000, guid: 4db677d2940202340841471f90a5b73a, type: 2} + Weight: 1 diff --git a/Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Bosses.asset.meta b/Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Bosses.asset.meta new file mode 100644 index 0000000..174e980 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Bosses.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2981ffffb36dfc440aa4517c17cfbbf4 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Normal.asset b/Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Normal.asset new file mode 100644 index 0000000..265c492 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Normal.asset @@ -0,0 +1,34 @@ +%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: 5625bd25f378bda429666820a4940cee, type: 3} + m_Name: WaveGroup_Phase1_Normal + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.Waves.WaveGroup + DisplayName: + Waves: + - Wave: {fileID: 11400000, guid: 65f66289ea1233b4897f46cd997d9c7a, type: 2} + Weight: 1 + - Wave: {fileID: 11400000, guid: 190e39db44aa0794aa808fd60976f7c4, type: 2} + Weight: 1 + - Wave: {fileID: 11400000, guid: 39921b44a1a0a56478200028940c5202, type: 2} + Weight: 1 + - Wave: {fileID: 11400000, guid: 50f498bc5bfc46e44b064cc96403e2cb, type: 2} + Weight: 1 + - Wave: {fileID: 11400000, guid: 9ee6dee12f0660844b4d46880f01c02f, type: 2} + Weight: 0.5 + - Wave: {fileID: 11400000, guid: 41231de63e8f25d448f19f3816e0c22f, type: 2} + Weight: 0.5 + - Wave: {fileID: 11400000, guid: 6290df178cbd3144aa92a0f09833a7be, type: 2} + Weight: 0.5 + - Wave: {fileID: 11400000, guid: 86736fd52c18fa84e8ced40f30b514fa, type: 2} + Weight: 0.5 + - Wave: {fileID: 11400000, guid: 8fdf53cfc405a5f41a00f376198b8d84, type: 2} + Weight: 0.5 diff --git a/Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Normal.asset.meta b/Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Normal.asset.meta new file mode 100644 index 0000000..c2de13d --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Normal.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 80eaa5ec98fd5df4e950131a8984fd31 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/Waves.meta b/Assets/_Project/Definitions/RunDefinitions/Waves.meta similarity index 100% rename from Assets/_Project/Definitions/Waves.meta rename to Assets/_Project/Definitions/RunDefinitions/Waves.meta diff --git a/Assets/_Project/Definitions/Waves/Wave10Definition.asset b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave10Definition.asset similarity index 93% rename from Assets/_Project/Definitions/Waves/Wave10Definition.asset rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave10Definition.asset index eb49ceb..1bc8617 100644 --- a/Assets/_Project/Definitions/Waves/Wave10Definition.asset +++ b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave10Definition.asset @@ -13,7 +13,7 @@ MonoBehaviour: m_Name: Wave10Definition m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.WaveDefinition PrepTime: 10 + ReleaseInterval: 2 Entries: - EnemyType: {fileID: 11400000, guid: 1d9809612c00ed049848a955613a4619, type: 2} - Count: 50 - SpawnInterval: 0.5 + Count: 5 diff --git a/Assets/_Project/Definitions/Waves/Wave10Definition.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave10Definition.asset.meta similarity index 100% rename from Assets/_Project/Definitions/Waves/Wave10Definition.asset.meta rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave10Definition.asset.meta diff --git a/Assets/_Project/Definitions/Waves/Wave1Definition.asset b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave1Definition.asset similarity index 100% rename from Assets/_Project/Definitions/Waves/Wave1Definition.asset rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave1Definition.asset diff --git a/Assets/_Project/Definitions/Waves/Wave1Definition.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave1Definition.asset.meta similarity index 100% rename from Assets/_Project/Definitions/Waves/Wave1Definition.asset.meta rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave1Definition.asset.meta diff --git a/Assets/_Project/Definitions/Waves/Wave2Definition.asset b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave2Definition.asset similarity index 100% rename from Assets/_Project/Definitions/Waves/Wave2Definition.asset rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave2Definition.asset diff --git a/Assets/_Project/Definitions/Waves/Wave2Definition.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave2Definition.asset.meta similarity index 100% rename from Assets/_Project/Definitions/Waves/Wave2Definition.asset.meta rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave2Definition.asset.meta diff --git a/Assets/_Project/Definitions/Waves/Wave3Definition.asset b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave3Definition.asset similarity index 100% rename from Assets/_Project/Definitions/Waves/Wave3Definition.asset rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave3Definition.asset diff --git a/Assets/_Project/Definitions/Waves/Wave3Definition.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave3Definition.asset.meta similarity index 100% rename from Assets/_Project/Definitions/Waves/Wave3Definition.asset.meta rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave3Definition.asset.meta diff --git a/Assets/_Project/Definitions/Waves/Wave4Definition.asset b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave4Definition.asset similarity index 100% rename from Assets/_Project/Definitions/Waves/Wave4Definition.asset rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave4Definition.asset diff --git a/Assets/_Project/Definitions/Waves/Wave4Definition.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave4Definition.asset.meta similarity index 100% rename from Assets/_Project/Definitions/Waves/Wave4Definition.asset.meta rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave4Definition.asset.meta diff --git a/Assets/_Project/Definitions/Waves/Wave5Definition.asset b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave5Definition.asset similarity index 100% rename from Assets/_Project/Definitions/Waves/Wave5Definition.asset rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave5Definition.asset diff --git a/Assets/_Project/Definitions/Waves/Wave5Definition.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave5Definition.asset.meta similarity index 100% rename from Assets/_Project/Definitions/Waves/Wave5Definition.asset.meta rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave5Definition.asset.meta diff --git a/Assets/_Project/Definitions/Waves/Wave6Definition.asset b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave6Definition.asset similarity index 100% rename from Assets/_Project/Definitions/Waves/Wave6Definition.asset rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave6Definition.asset diff --git a/Assets/_Project/Definitions/Waves/Wave6Definition.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave6Definition.asset.meta similarity index 100% rename from Assets/_Project/Definitions/Waves/Wave6Definition.asset.meta rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave6Definition.asset.meta diff --git a/Assets/_Project/Definitions/Waves/Wave7Definition.asset b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave7Definition.asset similarity index 100% rename from Assets/_Project/Definitions/Waves/Wave7Definition.asset rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave7Definition.asset diff --git a/Assets/_Project/Definitions/Waves/Wave7Definition.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave7Definition.asset.meta similarity index 100% rename from Assets/_Project/Definitions/Waves/Wave7Definition.asset.meta rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave7Definition.asset.meta diff --git a/Assets/_Project/Definitions/Waves/Wave8Definition.asset b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave8Definition.asset similarity index 100% rename from Assets/_Project/Definitions/Waves/Wave8Definition.asset rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave8Definition.asset diff --git a/Assets/_Project/Definitions/Waves/Wave8Definition.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave8Definition.asset.meta similarity index 100% rename from Assets/_Project/Definitions/Waves/Wave8Definition.asset.meta rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave8Definition.asset.meta diff --git a/Assets/_Project/Definitions/Waves/Wave9Definition.asset b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave9Definition.asset similarity index 100% rename from Assets/_Project/Definitions/Waves/Wave9Definition.asset rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave9Definition.asset diff --git a/Assets/_Project/Definitions/Waves/Wave9Definition.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave9Definition.asset.meta similarity index 100% rename from Assets/_Project/Definitions/Waves/Wave9Definition.asset.meta rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave9Definition.asset.meta diff --git a/Assets/_Project/Definitions/Towers/BasicArrowTower.asset b/Assets/_Project/Definitions/Towers/BasicArrowTower.asset index 3a1c5c4..d39d8d9 100644 --- a/Assets/_Project/Definitions/Towers/BasicArrowTower.asset +++ b/Assets/_Project/Definitions/Towers/BasicArrowTower.asset @@ -17,8 +17,12 @@ MonoBehaviour: backbone of any maze. FootprintSize: {x: 2, y: 2} GoldCost: 25 + SellRefundPercent: 0.75 + FullRefundIfUnupgraded: 0 BuildTime: 0.5 TowerPrefab: {fileID: 6482414459531823157, guid: 1511641f145758b469e64376d2a0d434, type: 3} + ConstructionPhases: {fileID: 0} + Icon: {fileID: 21300000, guid: afe216737d1b46e783889299bda1c252, type: 3} DamageType: 0 TargetPriority: 0 TargetType: 0 @@ -34,5 +38,5 @@ MonoBehaviour: EffectDuration: 0 ProjectilePrefab: {fileID: 2664719039363295382, guid: dc2e4a4108e03874a8b2dab88dcc8fba, type: 3} ProjectileSpeed: 15 - UpgradePaths: [] - Icon: {fileID: 21300000, guid: afe216737d1b46e783889299bda1c252, type: 3} + UpgradePaths: + - {fileID: 11400000, guid: 86d4c3ab00d4c654eb4c255280ee5701, type: 2} diff --git a/Assets/_Project/Definitions/Towers/BasicArrowTower_Upgrade_1.asset b/Assets/_Project/Definitions/Towers/BasicArrowTower_Upgrade_1.asset new file mode 100644 index 0000000..226afff --- /dev/null +++ b/Assets/_Project/Definitions/Towers/BasicArrowTower_Upgrade_1.asset @@ -0,0 +1,41 @@ +%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: 7b353a757b6e6774d97e6fb8ba138fcc, type: 3} + m_Name: BasicArrowTower_Upgrade_1 + m_EditorClassIdentifier: Assembly-CSharp::TD.Towers.TowerDefinition + DisplayName: Basic Arrow Tower + Description: Single-target tower that fires arrows at ground and air enemies. The + backbone of any maze. + FootprintSize: {x: 2, y: 2} + GoldCost: 50 + SellRefundPercent: 0.75 + FullRefundIfUnupgraded: 0 + BuildTime: 1.5 + TowerPrefab: {fileID: 6482414459531823157, guid: 1511641f145758b469e64376d2a0d434, type: 3} + ConstructionPhases: {fileID: 0} + Icon: {fileID: 21300000, guid: a140f62a10b8dc04e84625f8008e0c24, type: 3} + DamageType: 0 + TargetPriority: 0 + TargetType: 0 + GroundedOnly: 0 + Damage: 15 + Range: 20 + AttacksPerSecond: 6 + SplashRadius: 0 + ChainCount: 0 + ChainRange: 0 + SlowFactor: 0 + DotDamagePerSecond: 0 + EffectDuration: 0 + ProjectilePrefab: {fileID: 2664719039363295382, guid: dc2e4a4108e03874a8b2dab88dcc8fba, type: 3} + ProjectileSpeed: 15 + UpgradePaths: [] diff --git a/Assets/_Project/Definitions/Towers/BasicArrowTower_Upgrade_1.asset.meta b/Assets/_Project/Definitions/Towers/BasicArrowTower_Upgrade_1.asset.meta new file mode 100644 index 0000000..facefe3 --- /dev/null +++ b/Assets/_Project/Definitions/Towers/BasicArrowTower_Upgrade_1.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 86d4c3ab00d4c654eb4c255280ee5701 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Red.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Red.prefab index f183f6e..d912bec 100644 --- a/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Red.prefab +++ b/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Red.prefab @@ -16,6 +16,7 @@ GameObject: - component: {fileID: 3283904430289710888} - component: {fileID: 3756613737869398948} - component: {fileID: 6036713598566100742} + - component: {fileID: 7515565462997402737} m_Layer: 10 m_Name: Enemy_CrystalGolem_Red m_TagString: Untagged @@ -52,7 +53,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} m_Name: m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 3715663997 + GlobalObjectIdHash: 3037368120 InScenePlacedSourceGlobalObjectIdHash: 0 DeferredDespawnTick: 0 Ownership: 1 @@ -202,6 +203,19 @@ CapsuleCollider: m_Height: 2 m_Direction: 1 m_Center: {x: 0, y: 1, z: 0} +--- !u!114 &7515565462997402737 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1455822126534880203} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9d1a26a32e8969cd29bce6010126a5f6, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbility + ShowTopMostFoldoutHeaderGroup: 1 --- !u!1 &5361867751622119598 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Yellow.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Yellow.prefab index 3144e35..bd7ac68 100644 --- a/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Yellow.prefab +++ b/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Yellow.prefab @@ -16,6 +16,7 @@ GameObject: - component: {fileID: 3283904430289710888} - component: {fileID: 3756613737869398948} - component: {fileID: 6036713598566100742} + - component: {fileID: -5265869660159140516} m_Layer: 10 m_Name: Enemy_CrystalGolem_Yellow m_TagString: Untagged @@ -202,6 +203,19 @@ CapsuleCollider: m_Height: 2 m_Direction: 1 m_Center: {x: 0, y: 1, z: 0} +--- !u!114 &-5265869660159140516 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1455822126534880203} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9d1a26a32e8969cd29bce6010126a5f6, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbility + ShowTopMostFoldoutHeaderGroup: 1 --- !u!1 &5361867751622119598 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Green.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Green.prefab index dfb934a..d721ee2 100644 --- a/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Green.prefab +++ b/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Green.prefab @@ -17,6 +17,7 @@ GameObject: - component: {fileID: 3756613737869398948} - component: {fileID: 6036713598566100742} - component: {fileID: -4695266156693656620} + - component: {fileID: -7800194977638654489} m_Layer: 10 m_Name: Enemy_Cyclops_Green m_TagString: Untagged @@ -215,9 +216,20 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 9df6fea9a86daafae998f8eecc44ee7d, type: 3} m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Combat.EnemyDeathSound - deathClips: - - {fileID: 8300000, guid: e007e19b827137ce395021d825927dcc, type: 3} - - {fileID: 8300000, guid: 6cea30689732db2f0a8989fe8f1a07a9, type: 3} + deathSounds: [] +--- !u!114 &-7800194977638654489 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1455822126534880203} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9d1a26a32e8969cd29bce6010126a5f6, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbility + ShowTopMostFoldoutHeaderGroup: 1 --- !u!1 &5361867751622119598 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Grey.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Grey.prefab index 055ef54..89ac836 100644 --- a/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Grey.prefab +++ b/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Grey.prefab @@ -16,6 +16,7 @@ GameObject: - component: {fileID: 3283904430289710888} - component: {fileID: 3756613737869398948} - component: {fileID: 6036713598566100742} + - component: {fileID: -5218620239817511880} m_Layer: 10 m_Name: Enemy_Cyclops_Grey m_TagString: Untagged @@ -202,6 +203,19 @@ CapsuleCollider: m_Height: 2 m_Direction: 1 m_Center: {x: 0, y: 1, z: 0} +--- !u!114 &-5218620239817511880 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1455822126534880203} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9d1a26a32e8969cd29bce6010126a5f6, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbility + ShowTopMostFoldoutHeaderGroup: 1 --- !u!1 &5361867751622119598 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Red.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Red.prefab index 5a0e904..f5ace60 100644 --- a/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Red.prefab +++ b/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Red.prefab @@ -16,6 +16,7 @@ GameObject: - component: {fileID: 3283904430289710888} - component: {fileID: 3756613737869398948} - component: {fileID: 6036713598566100742} + - component: {fileID: -7009934292190590155} m_Layer: 10 m_Name: Enemy_Cyclops_Red m_TagString: Untagged @@ -202,6 +203,19 @@ CapsuleCollider: m_Height: 2 m_Direction: 1 m_Center: {x: 0, y: 1, z: 0} +--- !u!114 &-7009934292190590155 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1455822126534880203} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9d1a26a32e8969cd29bce6010126a5f6, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbility + ShowTopMostFoldoutHeaderGroup: 1 --- !u!1 &5361867751622119598 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Black.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Black.prefab index 0e12a01..60b1291 100644 --- a/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Black.prefab +++ b/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Black.prefab @@ -16,6 +16,7 @@ GameObject: - component: {fileID: 3283904430289710888} - component: {fileID: 3756613737869398948} - component: {fileID: 6036713598566100742} + - component: {fileID: 3080180597758813642} m_Layer: 10 m_Name: Enemy_Ent_Black m_TagString: Untagged @@ -202,6 +203,19 @@ CapsuleCollider: m_Height: 2 m_Direction: 1 m_Center: {x: 0, y: 1, z: 0} +--- !u!114 &3080180597758813642 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1455822126534880203} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9d1a26a32e8969cd29bce6010126a5f6, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbility + ShowTopMostFoldoutHeaderGroup: 1 --- !u!1 &5361867751622119598 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Green.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Green.prefab index eeaca4c..2ab5755 100644 --- a/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Green.prefab +++ b/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Green.prefab @@ -16,6 +16,7 @@ GameObject: - component: {fileID: 3283904430289710888} - component: {fileID: 3756613737869398948} - component: {fileID: 6036713598566100742} + - component: {fileID: -2371779262468771447} m_Layer: 10 m_Name: Enemy_Ent_Green m_TagString: Untagged @@ -202,6 +203,19 @@ CapsuleCollider: m_Height: 2 m_Direction: 1 m_Center: {x: 0, y: 1, z: 0} +--- !u!114 &-2371779262468771447 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1455822126534880203} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9d1a26a32e8969cd29bce6010126a5f6, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbility + ShowTopMostFoldoutHeaderGroup: 1 --- !u!1 &5361867751622119598 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Orange.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Orange.prefab index 9b366bb..bca0e4a 100644 --- a/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Orange.prefab +++ b/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Orange.prefab @@ -16,6 +16,7 @@ GameObject: - component: {fileID: 3283904430289710888} - component: {fileID: 3756613737869398948} - component: {fileID: 6036713598566100742} + - component: {fileID: 2883007611589499530} m_Layer: 10 m_Name: Enemy_Ent_Orange m_TagString: Untagged @@ -202,6 +203,19 @@ CapsuleCollider: m_Height: 2 m_Direction: 1 m_Center: {x: 0, y: 1, z: 0} +--- !u!114 &2883007611589499530 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1455822126534880203} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9d1a26a32e8969cd29bce6010126a5f6, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbility + ShowTopMostFoldoutHeaderGroup: 1 --- !u!1 &5361867751622119598 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_UndeadDrake_Bone.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_UndeadDrake_Bone.prefab index 8acc7db..ef51e96 100644 --- a/Assets/_Project/Prefabs/Enemies/Enemy_UndeadDrake_Bone.prefab +++ b/Assets/_Project/Prefabs/Enemies/Enemy_UndeadDrake_Bone.prefab @@ -16,6 +16,7 @@ GameObject: - component: {fileID: 3283904430289710888} - component: {fileID: 3756613737869398948} - component: {fileID: 6036713598566100742} + - component: {fileID: 5647470509798016640} m_Layer: 10 m_Name: Enemy_UndeadDrake_Bone m_TagString: Untagged @@ -202,6 +203,19 @@ CapsuleCollider: m_Height: 2 m_Direction: 1 m_Center: {x: 0, y: 1, z: 0} +--- !u!114 &5647470509798016640 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1455822126534880203} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9d1a26a32e8969cd29bce6010126a5f6, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbility + ShowTopMostFoldoutHeaderGroup: 1 --- !u!1 &5361867751622119598 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/_Project/Prefabs/Player/Player.prefab b/Assets/_Project/Prefabs/Player/Player.prefab index ce17790..240ec88 100644 --- a/Assets/_Project/Prefabs/Player/Player.prefab +++ b/Assets/_Project/Prefabs/Player/Player.prefab @@ -18,6 +18,9 @@ GameObject: - component: {fileID: 5683786710272852339} - component: {fileID: 6856236869205671849} - component: {fileID: -4438158474568445526} + - component: {fileID: 2871545571532934715} + - component: {fileID: 1298503032983562452} + - component: {fileID: 8755797571419628899} m_Layer: 0 m_Name: Player m_TagString: Untagged @@ -52,7 +55,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} m_Name: m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 1552073510 + GlobalObjectIdHash: 121878297 InScenePlacedSourceGlobalObjectIdHash: 0 DeferredDespawnTick: 0 Ownership: 1 @@ -171,3 +174,42 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Dev.DebugCommandRelay ShowTopMostFoldoutHeaderGroup: 1 +--- !u!114 &2871545571532934715 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3493329038866903420} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f60f6928562351f4891142ad59ab6352, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.PlayerTowerUpgrades + ShowTopMostFoldoutHeaderGroup: 1 +--- !u!114 &1298503032983562452 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3493329038866903420} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b7e4c91a08f5d2461a3f8e6c25b09d74, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.PlayerTowerDeck + ShowTopMostFoldoutHeaderGroup: 1 +--- !u!114 &8755797571419628899 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3493329038866903420} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2b8f4d1e6c3a497051d8e2f7a9c1b063, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.Draft.PlayerDraft + ShowTopMostFoldoutHeaderGroup: 1 diff --git a/Assets/_Project/Scenes/Levels/9Player.unity b/Assets/_Project/Scenes/Levels/9Player.unity index dd7bef0..a08f1d5 100644 --- a/Assets/_Project/Scenes/Levels/9Player.unity +++ b/Assets/_Project/Scenes/Levels/9Player.unity @@ -2307,7 +2307,10 @@ MonoBehaviour: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbilities.EnemyAbilityPool abilities: - {fileID: 11400000, guid: 0305468bc8f912d429a8b20bf23f947c, type: 2} - noAbilityWeight: 100 + - {fileID: 11400000, guid: 030f10c9a264e544ea3e0f4fdb4171bd, type: 2} + - {fileID: 11400000, guid: cb2ec6bb70f57d0429b99b7cd4c7db73, type: 2} + - {fileID: 11400000, guid: a18691a20d75f17479a83b3e171759e7, type: 2} + - {fileID: 11400000, guid: c64c7121b0456bb4a873acec9e0abf91, type: 2} --- !u!4 &181002641 Transform: m_ObjectHideFlags: 0 @@ -13016,6 +13019,57 @@ BoxCollider: serializedVersion: 3 m_Size: {x: 24, y: 1, z: 30} m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &875833597 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 875833599} + - component: {fileID: 875833598} + m_Layer: 0 + m_Name: EnemyUpgradePool + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &875833598 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 875833597} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c4d98a01d9b9a7b438a6f91b0b7f498f, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyUpgrades.EnemyUpgradePool + options: + - {fileID: 11400000, guid: eef28ca7b8844504e9d75ff903a3bb61, type: 2} + - {fileID: 11400000, guid: 46e2a6a59c0a3034f9fa44681d9ba422, type: 2} + - {fileID: 11400000, guid: 80fb851b702ff304183cb6e89c4aa245, type: 2} + - {fileID: 11400000, guid: a67aa3644d2ad4847a47040f53fea26f, type: 2} + - {fileID: 11400000, guid: 37d761966a349ba4cb4141f913224d5c, type: 2} + - {fileID: 11400000, guid: f6bfb033a15b6d0419587b80a8286bd1, type: 2} +--- !u!4 &875833599 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 875833597} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 38.30481, y: 0.5, z: 155.93135} + 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 &902199259 GameObject: m_ObjectHideFlags: 0 @@ -13942,6 +13996,78 @@ BoxCollider: serializedVersion: 3 m_Size: {x: 17, y: 1, z: 13} m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &961493951 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 961493954} + - component: {fileID: 961493952} + - component: {fileID: 961493953} + m_Layer: 0 + m_Name: RunState + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &961493952 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 961493951} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject + GlobalObjectIdHash: 3660389945 + InScenePlacedSourceGlobalObjectIdHash: 0 + DeferredDespawnTick: 0 + Ownership: 1 + AlwaysReplicateAsRoot: 0 + SynchronizeTransform: 1 + ActiveSceneSynchronization: 0 + SceneMigrationSynchronization: 0 + SpawnWithObservers: 1 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 + SyncOwnerTransformWhenParented: 1 + AllowOwnerToParent: 0 +--- !u!114 &961493953 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 961493951} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a293cf6dca91dd2478c9f4e799cf9e0d, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.Waves.RunState + ShowTopMostFoldoutHeaderGroup: 1 + runDefinition: {fileID: 11400000, guid: 1bb81a966192c344d94cce2628c1832b, type: 2} +--- !u!4 &961493954 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 961493951} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 38.30481, y: 0.5, z: 155.93135} + 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 &993870443 GameObject: m_ObjectHideFlags: 0 @@ -14522,6 +14648,7 @@ MonoBehaviour: placementManager: {fileID: 1507514108} cameraController: {fileID: 1239994223} rejectionMessageDuration: 2.5 + menuButtonIcon: {fileID: 0} chatMaxHeight: 280 chatMaxMessages: 2147483647 chatSystemColor: {r: 1, g: 0.7, b: 0.2, a: 1} @@ -18307,19 +18434,11 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.WaveManager ShowTopMostFoldoutHeaderGroup: 1 - waveDefinitions: - - {fileID: 11400000, guid: 65f66289ea1233b4897f46cd997d9c7a, type: 2} - - {fileID: 11400000, guid: 190e39db44aa0794aa808fd60976f7c4, type: 2} - - {fileID: 11400000, guid: 39921b44a1a0a56478200028940c5202, type: 2} - - {fileID: 11400000, guid: 50f498bc5bfc46e44b064cc96403e2cb, type: 2} - - {fileID: 11400000, guid: 9ee6dee12f0660844b4d46880f01c02f, type: 2} - - {fileID: 11400000, guid: 41231de63e8f25d448f19f3816e0c22f, type: 2} - - {fileID: 11400000, guid: 6290df178cbd3144aa92a0f09833a7be, type: 2} - - {fileID: 11400000, guid: 86736fd52c18fa84e8ced40f30b514fa, type: 2} - - {fileID: 11400000, guid: 8fdf53cfc405a5f41a00f376198b8d84, type: 2} - - {fileID: 11400000, guid: 4db677d2940202340841471f90a5b73a, type: 2} startingLives: 40 + draftTimeSeconds: 30 + voteTimeSeconds: 25 goldConfig: {fileID: 11400000, guid: d5e01c919f14a1e4888ad494a159241b, type: 2} + enemyScalingConfig: {fileID: 11400000, guid: ae9fde0b564e20440ac2e20861fa1ca6, type: 2} --- !u!43 &1393870843 Mesh: m_ObjectHideFlags: 0 @@ -20189,6 +20308,7 @@ MonoBehaviour: - {fileID: 0} - {fileID: 11400000, guid: d5b2e8fa3c7e9b5f4a1d0c2e7f6b3a91, type: 2} - {fileID: 11400000, guid: 0f693e29ca953e1439e10cb8f12e4b30, type: 2} + - {fileID: 11400000, guid: 86d4c3ab00d4c654eb4c255280ee5701, type: 2} - {fileID: 11400000, guid: 04219895bbea4fb9a94fd62fef35bf2a, type: 2} - {fileID: 11400000, guid: e3f1a9c2b5d84e76a0c3f1e8d27b4905, type: 2} startingDeck: @@ -22897,6 +23017,7 @@ MonoBehaviour: m_EditorClassIdentifier: Assembly-CSharp::TD.Dev.DevWaveControls hotkey: 94 grantTowerHotkey: 101 + skipToBossHotkey: 100 --- !u!4 &1731269687 Transform: m_ObjectHideFlags: 0 @@ -27956,6 +28077,78 @@ Mesh: - serializedVersion: 1 m_IndexStart: 0 m_IndexCount: 0 +--- !u!1 &2021000666 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2021000669} + - component: {fileID: 2021000667} + - component: {fileID: 2021000668} + m_Layer: 0 + m_Name: WaveVote + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &2021000667 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2021000666} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject + GlobalObjectIdHash: 3520766009 + InScenePlacedSourceGlobalObjectIdHash: 0 + DeferredDespawnTick: 0 + Ownership: 1 + AlwaysReplicateAsRoot: 0 + SynchronizeTransform: 1 + ActiveSceneSynchronization: 0 + SceneMigrationSynchronization: 0 + SpawnWithObservers: 1 + DontDestroyWithOwner: 0 + AutoObjectParentSync: 1 + SyncOwnerTransformWhenParented: 1 + AllowOwnerToParent: 0 +--- !u!114 &2021000668 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2021000666} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a18321dc2d138034fbdb5f705f19f893, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyUpgrades.WaveVote + ShowTopMostFoldoutHeaderGroup: 1 + optionsPerVote: 3 +--- !u!4 &2021000669 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2021000666} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 38.30481, y: 0.5, z: 155.93135} + 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!43 &2024389666 Mesh: m_ObjectHideFlags: 0 @@ -28831,6 +29024,7 @@ MonoBehaviour: options: - {fileID: 11400000, guid: 6b1d3f8a2c5e4097b8a1d0c3e6f9b240, type: 2} - {fileID: 11400000, guid: f4a2b8d1c6e93f05a7b2d4c8e1f6a930, type: 2} + - {fileID: 11400000, guid: 0b9f4905752751f44b9959b84b620266, type: 2} - {fileID: 11400000, guid: 65ff25c1c8a89f7df8e88f71968c1c98, type: 2} - {fileID: 11400000, guid: 5f390de69ba43b2a6a0d89cf09580320, type: 2} - {fileID: 11400000, guid: 29b35841f7e5db454903798cb5d83434, type: 2} @@ -29237,3 +29431,6 @@ SceneRoots: - {fileID: 759470735} - {fileID: 954434161} - {fileID: 181002641} + - {fileID: 961493954} + - {fileID: 2021000669} + - {fileID: 875833599} diff --git a/Assets/_Project/Scripts/Editor/Gameplay/EncounterGoldEntryDrawer.cs b/Assets/_Project/Scripts/Editor/Gameplay/EncounterGoldEntryDrawer.cs new file mode 100644 index 0000000..737b34a --- /dev/null +++ b/Assets/_Project/Scripts/Editor/Gameplay/EncounterGoldEntryDrawer.cs @@ -0,0 +1,122 @@ +// Assets/_Project/Scripts/Editor/Gameplay/EncounterGoldEntryDrawer.cs +using UnityEditor; +using UnityEngine; +using TD.Gameplay; + +namespace TD.Editor.Gameplay +{ + /// + /// Custom property drawer for . Labels each element by its + /// run position ("Encounter 3") rather than "Element 2", and renders a projected-earnings + /// line beneath the fields so the economy can be tuned without arithmetic. + /// + /// + /// Projections are estimates by necessity. Kill income depends on how many enemies the + /// encounter spawns, and the wave filling each slot is drawn at runtime from a phase pool — + /// so the drawer multiplies against + /// instead. The cumulative figure is the number worth watching: it answers "how much could a + /// player have banked by this point in the run", which is what tower prices get balanced + /// against. + /// + [CustomPropertyDrawer(typeof(EncounterGoldEntry))] + public class EncounterGoldEntryDrawer : PropertyDrawer + { + private const float PreviewLineExtraHeight = 4f; + + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + if (!property.isExpanded) return EditorGUIUtility.singleLineHeight; + + float h = EditorGUIUtility.singleLineHeight; // foldout + h += SpacedLineHeight() * 3; // the three gold fields + h += SpacedLineHeight() * 2 + PreviewLineExtraHeight; // projection + cumulative + return h; + } + + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + int encounterNumber = EncounterNumberFrom(property); + + // Re-label the foldout by run position. Element indices are 0-based and read as + // off-by-one against everything else in the run (RunState, the HUD, the checklist), + // which made miscounting the boss slot easy. + var header = new GUIContent(encounterNumber > 0 + ? $"Encounter {encounterNumber}" + : label.text); + + Rect headerRect = new Rect(position.x, position.y, position.width, + EditorGUIUtility.singleLineHeight); + property.isExpanded = EditorGUI.Foldout(headerRect, property.isExpanded, header, + toggleOnLabelClick: true); + if (!property.isExpanded) return; + + float y = position.y + SpacedLineHeight(); + const float indent = 14f; + Rect Row() + { + Rect r = new Rect(position.x + indent, y, position.width - indent, + EditorGUIUtility.singleLineHeight); + y += SpacedLineHeight(); + return r; + } + + var perEnemyProp = property.FindPropertyRelative("GoldPerEnemy"); + var completionProp = property.FindPropertyRelative("CompletionBonus"); + var noLeaksProp = property.FindPropertyRelative("NoLeaksBonus"); + + EditorGUI.PropertyField(Row(), perEnemyProp); + EditorGUI.PropertyField(Row(), completionProp); + EditorGUI.PropertyField(Row(), noLeaksProp); + + // Read values off the SerializedProperties rather than the backing object: edits + // aren't applied to the instance until ApplyModifiedProperties runs at end of frame, + // so the object would show stale numbers while the designer is still typing. + int perEnemy = perEnemyProp.intValue; + int completion = completionProp.intValue; + int noLeaks = noLeaksProp.intValue; + + var config = property.serializedObject.targetObject as GoldConfig; + int assumed = config != null ? config.PreviewEnemiesPerEncounter : 0; + + int projected = perEnemy * assumed + completion + noLeaks; + + y += PreviewLineExtraHeight; + var style = new GUIStyle(EditorStyles.miniLabel) { fontStyle = FontStyle.Italic }; + + using (new EditorGUI.DisabledScope(true)) + { + EditorGUI.LabelField( + Row(), + $"Projected: {projected} g ({perEnemy} × {assumed} enemies " + + $"+ {completion} clear + {noLeaks} no-leak)", + style); + + // Cumulative only makes sense once we know where this entry sits in the run. + if (config != null && encounterNumber > 0) + { + EditorGUI.LabelField( + Row(), + $"Cumulative by here: {config.ProjectedCumulativeThrough(encounterNumber)} g " + + $"(incl. {config.StartingGold} starting)", + style); + } + } + } + + // Recovers the 1-based run position from a path like "Encounters.Array.data[2]". + // Returns 0 when the entry isn't being drawn as an array element. + private static int EncounterNumberFrom(SerializedProperty property) + { + string path = property.propertyPath; + int open = path.LastIndexOf('['); + int close = path.LastIndexOf(']'); + if (open < 0 || close < open) return 0; + + string inner = path.Substring(open + 1, close - open - 1); + return int.TryParse(inner, out int index) ? index + 1 : 0; + } + + private static float SpacedLineHeight() + => EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; + } +} diff --git a/Assets/_Project/Scripts/Editor/Gameplay/EncounterGoldEntryDrawer.cs.meta b/Assets/_Project/Scripts/Editor/Gameplay/EncounterGoldEntryDrawer.cs.meta new file mode 100644 index 0000000..74b7ba7 --- /dev/null +++ b/Assets/_Project/Scripts/Editor/Gameplay/EncounterGoldEntryDrawer.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 62f688cf14ba23b42bd0edd63a11ba62 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Editor/Gameplay/WaveGoldEntryDrawer.cs b/Assets/_Project/Scripts/Editor/Gameplay/WaveGoldEntryDrawer.cs deleted file mode 100644 index dff5ca8..0000000 --- a/Assets/_Project/Scripts/Editor/Gameplay/WaveGoldEntryDrawer.cs +++ /dev/null @@ -1,112 +0,0 @@ -// Assets/_Project/Scripts/Editor/Gameplay/WaveGoldEntryDrawer.cs -using UnityEditor; -using UnityEngine; -using TD.Gameplay; - -namespace TD.Editor.Gameplay -{ - /// - /// Custom property drawer for . Renders the standard fields - /// followed by a read-only "Preview Total" line computed from the entry's values, so - /// designers can see at a glance how much a single player could earn from a wave. - /// - /// - /// The preview includes the kill-reward portion only when the entry's Wave - /// reference is assigned (it's needed to count enemies in that wave). When unset, the - /// preview shows just CompletionBonus + NoLeaksBonus and labels itself so the - /// designer knows to drop a WaveDefinition in for a complete number. - /// - [CustomPropertyDrawer(typeof(WaveGoldEntry))] - public class WaveGoldEntryDrawer : PropertyDrawer - { - private const float PreviewLineExtraHeight = 4f; - - public override float GetPropertyHeight(SerializedProperty property, GUIContent label) - { - // Sum the children + one extra line for the preview label. We render children - // ourselves rather than using EditorGUI.PropertyField default since we want a - // foldout with our custom preview tacked onto the end. - if (!property.isExpanded) return EditorGUIUtility.singleLineHeight; - - float h = EditorGUIUtility.singleLineHeight; // foldout - h += SpacedLineHeight() * 4; // Wave + GoldPerEnemy + Completion + NoLeaks - h += SpacedLineHeight() + PreviewLineExtraHeight; // preview label - return h; - } - - public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) - { - // Foldout header. - Rect headerRect = new Rect(position.x, position.y, position.width, - EditorGUIUtility.singleLineHeight); - property.isExpanded = EditorGUI.Foldout(headerRect, property.isExpanded, label, - toggleOnLabelClick: true); - if (!property.isExpanded) return; - - float y = position.y + SpacedLineHeight(); - float indent = 14f; - Rect Row() - { - Rect r = new Rect(position.x + indent, y, position.width - indent, - EditorGUIUtility.singleLineHeight); - y += SpacedLineHeight(); - return r; - } - - // Standard property fields. - var waveProp = property.FindPropertyRelative("Wave"); - var perEnemyProp = property.FindPropertyRelative("GoldPerEnemy"); - var completionProp = property.FindPropertyRelative("CompletionBonus"); - var noLeaksProp = property.FindPropertyRelative("NoLeaksBonus"); - - EditorGUI.PropertyField(Row(), waveProp); - EditorGUI.PropertyField(Row(), perEnemyProp); - EditorGUI.PropertyField(Row(), completionProp); - EditorGUI.PropertyField(Row(), noLeaksProp); - - // Compute the preview total. We instantiate the same logic as the runtime - // property — read the serialized values, count enemies in the optional Wave, - // sum it all up. Done inline (rather than calling WaveGoldEntry.PreviewTotalGold - // directly) because SerializedProperty edits aren't applied to the target object - // until ApplyModifiedProperties runs at the end of the frame, so reading the - // backing class instance here would show stale data while the user is typing. - int perEnemy = perEnemyProp.intValue; - int completion = completionProp.intValue; - int noLeaks = noLeaksProp.intValue; - var waveAsset = waveProp.objectReferenceValue as WaveDefinition; - - int enemyCount = 0; - if (waveAsset != null && waveAsset.Entries != null) - { - foreach (var e in waveAsset.Entries) - { - if (e.EnemyType != null && e.Count > 0) - enemyCount += e.Count; - } - } - - int total = perEnemy * enemyCount + completion + noLeaks; - - // Preview line. Slightly dimmed style, italic, non-editable. Includes a - // breakdown so the designer can see where the number came from. - y += PreviewLineExtraHeight; - Rect previewRect = new Rect(position.x + indent, y, position.width - indent, - EditorGUIUtility.singleLineHeight); - - string breakdown = waveAsset != null - ? $"Preview Total: {total} g ({perEnemy} × {enemyCount} enemies " + - $"+ {completion} completion + {noLeaks} no-leak)" - : $"Preview Total: {completion + noLeaks} g (bonuses only — assign Wave " + - $"to include kill rewards)"; - - var prevStyle = new GUIStyle(EditorStyles.miniLabel) { fontStyle = FontStyle.Italic }; - using (new EditorGUI.DisabledScope(true)) - { - EditorGUI.LabelField(previewRect, breakdown, prevStyle); - } - } - - private static float SpacedLineHeight() - => EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; - } -} diff --git a/Assets/_Project/Scripts/Editor/Gameplay/WaveGoldEntryDrawer.cs.meta b/Assets/_Project/Scripts/Editor/Gameplay/WaveGoldEntryDrawer.cs.meta deleted file mode 100644 index b9c6f5d..0000000 --- a/Assets/_Project/Scripts/Editor/Gameplay/WaveGoldEntryDrawer.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: cc17000144b098340a210921594babca \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemySpawnContext.cs b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemySpawnContext.cs index d643fcf..67fda7b 100644 --- a/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemySpawnContext.cs +++ b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemySpawnContext.cs @@ -28,15 +28,25 @@ namespace TD.Gameplay.EnemyAbilities /// Uniform transform scale relative to the prefab's authored scale. public float VisualScale; - /// Seeds a context from an enemy definition's authored stats. - public static EnemySpawnContext FromDefinition(EnemyDefinition def) => new EnemySpawnContext - { - MaxHp = def.MaxHp, - MoveSpeed = def.MoveSpeed, - IsFlying = def.IsFlying, - FlightHeight = def.FlightHeight, - LivesCost = def.LivesCost, - VisualScale = 1f, - }; + /// + /// Seeds a context from an enemy definition's authored stats, with health supplied by the + /// caller. + /// + /// The type being spawned. Supplies everything except health. + /// Health this enemy spawns with, already resolved from the + /// encounter's budget and the type's — see + /// . Passed in rather than read off the + /// definition because it depends on run position and the wave's enemy count, neither of + /// which the asset knows about. + public static EnemySpawnContext FromDefinition(EnemyDefinition def, float resolvedMaxHp) + => new EnemySpawnContext + { + MaxHp = resolvedMaxHp, + MoveSpeed = def.MoveSpeed, + IsFlying = def.IsFlying, + FlightHeight = def.FlightHeight, + LivesCost = def.LivesCost, + VisualScale = 1f, + }; } } diff --git a/Assets/_Project/Scripts/Gameplay/EnemyDefinition.cs b/Assets/_Project/Scripts/Gameplay/EnemyDefinition.cs index 15f45f8..bda4e45 100644 --- a/Assets/_Project/Scripts/Gameplay/EnemyDefinition.cs +++ b/Assets/_Project/Scripts/Gameplay/EnemyDefinition.cs @@ -12,6 +12,13 @@ namespace TD.Gameplay /// in project assets, only the asset reference (or its fields) crosses runtime code. /// Replace with a real mesh/animator when art is ready — /// no code changes required. + /// + /// An enemy type is flavour, not a difficulty tier. There is deliberately no + /// absolute health field: health comes from based on how far + /// into the run the encounter sits, and this asset only says how the type deviates from that + /// (). Because waves are drawn at random from a phase pool, any + /// difficulty baked into the roster would be difficulty handed out by the luck of the draw. + /// Every type should be a viable occupant of any slot. /// [CreateAssetMenu(fileName = "EnemyDefinition", menuName = "TD/Enemy Definition", order = 3)] public class EnemyDefinition : ScriptableObject @@ -21,10 +28,16 @@ namespace TD.Gameplay public string DisplayName; [Header("Stats")] - [Tooltip("Maximum hit points for this enemy type.")] - public float MaxHp = 100f; + [Tooltip("How tough this enemy is RELATIVE to its encounter's budget — not an absolute " + + "hit-point value. 1.0 = exactly its share of the budget; 1.25 = a quarter " + + "tougher than the slot calls for. Keep it near 1.0 and let the wave's enemy " + + "count express tankiness (fewer enemies each get a bigger share).")] + [Min(0.01f)] + public float HpMultiplier = 1f; - [Tooltip("Movement speed in world units per second along the A* path.")] + [Tooltip("Movement speed in world units per second along the A* path. ABSOLUTE and " + + "unscaled — speed is a fixed character trait, not a progression axis. See " + + "EnemyScalingConfig for why.")] public float MoveSpeed = 3f; [Tooltip("When true this enemy flies: it paths on the baked terrain grid, ignoring " + diff --git a/Assets/_Project/Scripts/Gameplay/EnemyHealth.cs b/Assets/_Project/Scripts/Gameplay/EnemyHealth.cs index ddd2e6a..28f6ab9 100644 --- a/Assets/_Project/Scripts/Gameplay/EnemyHealth.cs +++ b/Assets/_Project/Scripts/Gameplay/EnemyHealth.cs @@ -73,9 +73,9 @@ namespace TD.Gameplay // ----- Server-local runtime state ------------------------------------- - // Kill gold is no longer carried per-enemy — it comes from - // GoldConfig.Waves[currentWaveIndex].GoldPerEnemy at the moment the kill - // is registered. See WaveManager.HandleEnemyKilled. + // Kill gold is no longer carried per-enemy — it comes from the GoldConfig entry for + // the current encounter (GoldConfig.GetEncounterEntry) at the moment the kill is + // registered. See WaveManager.HandleEnemyKilled. /// Lives deducted from the shared pool when this enemy reaches the goal. public int LivesCost { get; private set; } = 1; diff --git a/Assets/_Project/Scripts/Gameplay/EnemyScalingConfig.cs b/Assets/_Project/Scripts/Gameplay/EnemyScalingConfig.cs new file mode 100644 index 0000000..8a833ee --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyScalingConfig.cs @@ -0,0 +1,85 @@ +// Assets/_Project/Scripts/Gameplay/EnemyScalingConfig.cs +using UnityEngine; + +namespace TD.Gameplay +{ + /// + /// How enemy health scales across a run. Single source of truth for difficulty progression, + /// the health counterpart to . + /// + /// + /// The problem this solves. Waves are drawn at random from a phase pool, so difficulty + /// can no longer live in the assets — an enemy authored at + /// 1000 HP is brutal at encounter 1 and trivial at encounter 40, and the draw decides which + /// you get. Progression has to be a property of how far the players have come, exactly + /// as gold payouts are. + /// + /// Budget, not per-enemy HP. This config scales the total health an + /// encounter presents; per-enemy health is that budget divided by the wave's enemy count. If + /// the curve set per-enemy health instead, enemy count would silently become a second + /// difficulty axis and a 150-strong swarm would hit three times harder than a 50-strong wave + /// in the same slot. Dividing a fixed budget turns count into a texture knob: eight + /// giants and a hundred rats threaten equally, but demand different mazes. + /// + /// Budget is per zone. Every player zone spawns the full wave, so this is the + /// health one player faces, not the lobby total. It does not change with player count. + /// + /// Speed is deliberately absent. Speed stays on the + /// , unscaled. Escalating speed alongside health compounds into + /// a difficulty cliff and quietly invalidates tower balance as a run goes — projectile lead, + /// slow-effect value and time-under-fire all shift. Fast-versus-slow reads best as a fixed + /// character trait; health and the voted wave buffs carry escalation. + /// + [CreateAssetMenu(fileName = "EnemyScalingConfig", menuName = "TD/Enemy Scaling Config", order = 3)] + public class EnemyScalingConfig : ScriptableObject + { + [Header("Health curve")] + [Tooltip("Total enemy health the run's FIRST encounter presents, per player zone. " + + "Per-enemy health is this divided by the wave's enemy count.")] + [Min(1f)] + public float BaseHpBudget = 5000f; + + [Tooltip("Multiplier applied per encounter. 1.18 ≈ +18% health each encounter, so the " + + "budget roughly doubles every four. Encounters are counted continuously across " + + "the whole run, so cycle 2 is strictly harder than cycle 1.")] + [Min(1f)] + public float GrowthPerEncounter = 1.18f; + + [Header("Boss")] + [Tooltip("Extra multiplier on a boss encounter's budget, on top of the curve. Bosses " + + "spawn few enemies, so nearly all of this lands on the single boss body.")] + [Min(1f)] + public float BossHpMultiplier = 6f; + + /// + /// Total health budget for the given 1-based encounter number + /// (RunState.GlobalEncounterNumber), per player zone. + /// + public float GetEncounterHpBudget(int encounterNumber, bool isBoss) + { + int steps = Mathf.Max(0, encounterNumber - 1); + float budget = BaseHpBudget * Mathf.Pow(GrowthPerEncounter, steps); + if (isBoss) budget *= BossHpMultiplier; + return budget; + } + + /// + /// Health for one enemy in the given encounter: the encounter's budget shared across + /// bodies, then skewed by the enemy type's + /// . + /// + /// + /// The archetype multiplier is a deliberate deviation from budget, not a + /// redistribution of it — a wave of 1.25× enemies really is 25% tougher than its slot + /// calls for. Keep multipliers near 1.0 and let the wave's enemy count express tankiness; + /// that is the knob the budget is designed to divide. + /// + public float ResolvePerEnemyHp(int encounterNumber, bool isBoss, int waveEnemyCount, + float archetypeMultiplier) + { + int bodies = Mathf.Max(1, waveEnemyCount); + float share = GetEncounterHpBudget(encounterNumber, isBoss) / bodies; + return Mathf.Max(1f, share * Mathf.Max(0.01f, archetypeMultiplier)); + } + } +} diff --git a/Assets/_Project/Scripts/Gameplay/EnemyScalingConfig.cs.meta b/Assets/_Project/Scripts/Gameplay/EnemyScalingConfig.cs.meta new file mode 100644 index 0000000..a428b6f --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyScalingConfig.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: de25a6333a11d074280b5ade557aa8b9 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/GoldConfig.cs b/Assets/_Project/Scripts/Gameplay/GoldConfig.cs index 460223a..2707d91 100644 --- a/Assets/_Project/Scripts/Gameplay/GoldConfig.cs +++ b/Assets/_Project/Scripts/Gameplay/GoldConfig.cs @@ -1,91 +1,68 @@ // Assets/_Project/Scripts/Gameplay/GoldConfig.cs using System; using UnityEngine; +using UnityEngine.Serialization; namespace TD.Gameplay { /// - /// Per-wave gold rules nested under . Each entry maps to one - /// wave by array index in . + /// Gold rules for one encounter slot, addressed by position in the run rather than by + /// which wave happens to occupy it. /// /// - /// Pairing with WaveDefinition. The runtime pairing of gold entry to wave is by - /// array index — entry 0 applies to wave 1, etc. The reference here - /// is OPTIONAL and exists purely so the inspector can compute and display the - /// read-only value (which needs to know the wave's - /// total enemy count to multiply against ). Leaving it - /// unset just hides the kill-reward portion of the preview; runtime is unaffected. + /// Position, not identity. Under the 2.0 run structure the waves filling each slot are + /// drawn at random from a phase pool, so "the gold for wave 3" means the run's third + /// encounter, whatever spawns in it. Payouts are a property of how far the players have + /// progressed — not of which enemy they happened to draw. /// [Serializable] - public class WaveGoldEntry + public class EncounterGoldEntry { - [Tooltip("Optional reference to the WaveDefinition this entry pairs with. " + - "Used ONLY for the inspector preview total — runtime pairing is by " + - "array index in GoldConfig.Waves. Drag the matching WaveDefinition " + - "here to see the live total computed under this entry.")] - public WaveDefinition Wave; - - [Tooltip("Gold awarded to the killing player per enemy slain during this wave. " + - "Applies uniformly to every enemy type in the wave.")] + [Tooltip("Gold awarded to the killing player per enemy slain during this encounter. " + + "Applies uniformly to every enemy type.")] public int GoldPerEnemy = 10; - [Tooltip("Flat bonus gold awarded to every active player when this wave is fully " + + [Tooltip("Flat bonus gold awarded to every active player when this encounter is fully " + "cleared (all enemies dead or reached the goal).")] public int CompletionBonus = 50; - [Tooltip("Extra bonus gold awarded to a player who cleared this wave without any " + + [Tooltip("Extra bonus gold awarded to a player who cleared this encounter without any " + "enemy from their own zone escaping their leak volume. Stacks on top of " + - "CompletionBonus for the no-leak achievement.")] + "CompletionBonus.")] public int NoLeaksBonus = 50; /// - /// Read-only preview of the maximum gold a single player could earn in this wave: - /// GoldPerEnemy × totalEnemyCount + CompletionBonus + NoLeaksBonus. + /// Guaranteed gold for a player who clears this encounter: the two bonuses, with no + /// kill income counted. /// /// - /// Returns just CompletionBonus + NoLeaksBonus if is null - /// (no enemy count to multiply against). Pure computation — safe at edit time and - /// at runtime. The custom inspector under renders this as - /// a non-editable label under the entry's fields. + /// Kill income can't be known here — the wave occupying this slot is drawn at runtime, so + /// its enemy count varies per run. + /// supplies an estimate for the inspector's projected totals. /// - public int PreviewTotalGold - { - get - { - int total = CompletionBonus + NoLeaksBonus; - if (Wave != null && Wave.Entries != null) - { - int enemies = 0; - foreach (var e in Wave.Entries) - { - if (e.EnemyType != null && e.Count > 0) - enemies += e.Count; - } - total += GoldPerEnemy * enemies; - } - return total; - } - } + public int GuaranteedBonusGold => CompletionBonus + NoLeaksBonus; + + /// + /// Projected best-case earnings for one player this encounter, given an assumed enemy + /// count. Editor tuning aid only — nothing at runtime reads it. + /// + public int ProjectedTotal(int assumedEnemyCount) + => GoldPerEnemy * Mathf.Max(0, assumedEnemyCount) + GuaranteedBonusGold; } /// /// Single source of truth for every gold-related tunable in the game. /// /// - /// Inspector layout. StartingGold is at the top and applies to every player. - /// The Waves array follows, each element collapsible in the inspector with the - /// per-wave rules and a read-only preview total computed from the entry's data. + /// Wiring. Assign one GoldConfig asset to WaveManager.goldConfig in the Match + /// scene. WaveManager seeds per-player starting gold from , reads + /// for kill rewards, and awards the completion + /// and no-leak bonuses as each encounter clears. /// - /// Wiring. Assign one GoldConfig asset to WaveManager.goldConfig in - /// the Match scene. WaveManager initializes per-player starting gold from - /// at match start, uses - /// to compute kill rewards, and awards / - /// when each wave clears. - /// - /// No per-enemy-type bounties. Every enemy killed in wave N grants the same - /// regardless of . - /// If per-type variation becomes a design need, extend WaveGoldEntry with a per-type - /// table; the current model intentionally favors simplicity. + /// No per-enemy-type bounties. Every enemy killed in a given encounter grants the + /// same reward regardless of . With enemy types now drawn at + /// random per phase, per-type bounties would make income depend on the luck of the draw + /// rather than on progression. /// [CreateAssetMenu(fileName = "GoldConfig", menuName = "TD/Gold Config", order = 2)] public class GoldConfig : ScriptableObject @@ -93,28 +70,58 @@ namespace TD.Gameplay [Tooltip("Gold each player starts the match with. Same for every player.")] public int StartingGold = 100; - [Tooltip("Per-encounter gold rules. Element 0 = the run's first encounter. Encounters " + - "are counted continuously across the whole run — cycles do NOT restart the " + - "count — so a phase of 5 waves × 3 cycles + a boss needs 16 entries. Missing " + - "entries fall back to zero gold for that encounter.")] - public WaveGoldEntry[] Waves; + [Tooltip("Gold rules per encounter, in run order. Element 0 = the run's first encounter. " + + "Encounters are counted continuously — cycles do NOT restart the count — so one " + + "phase of 5 waves × 3 cycles + a boss needs 16 entries. Missing entries pay " + + "zero for that encounter.")] + [FormerlySerializedAs("Waves")] + public EncounterGoldEntry[] Encounters; + + [Header("Editor preview")] + [Tooltip("Assumed enemies per encounter, used ONLY to project totals in this inspector. " + + "Nothing at runtime reads it — the real count comes from whichever wave the run " + + "draws into each slot.")] + [Min(0)] + public int PreviewEnemiesPerEncounter = 40; /// - /// Returns the gold entry for the given 1-based encounter number + /// Returns the gold rules for the given 1-based encounter number /// (RunState.GlobalEncounterNumber), or null if out of range. /// /// - /// Keyed by encounter, not by wave slot. Under the cyclical run structure the same - /// five waves come round three times per phase, so a slot-keyed table would pay the same - /// on cycle 3 as on cycle 1 while the enemies got steadily stronger. A run-long counter - /// lets payouts climb monotonically with difficulty. + /// Keyed by run position, not by wave slot within a cycle. The same five waves come + /// round three times per phase, so a slot-keyed table would pay the same on cycle 3 as on + /// cycle 1 while the enemies grew steadily stronger from the buffs voted onto them. A + /// run-long counter lets payouts climb with the difficulty. /// - public WaveGoldEntry GetWaveEntry(int encounterNumber) + public EncounterGoldEntry GetEncounterEntry(int encounterNumber) { - if (Waves == null) return null; + if (Encounters == null) return null; int index = encounterNumber - 1; - if (index < 0 || index >= Waves.Length) return null; - return Waves[index]; + if (index < 0 || index >= Encounters.Length) return null; + return Encounters[index]; + } + + /// Number of authored encounter entries. + public int EncounterCount => Encounters?.Length ?? 0; + + /// + /// Editor tuning aid: cumulative projected earnings for one player from the run's first + /// encounter through inclusive, assuming + /// kills each time and no leaks. + /// + public int ProjectedCumulativeThrough(int encounterNumber) + { + if (Encounters == null) return StartingGold; + + int total = StartingGold; + int last = Mathf.Min(encounterNumber, Encounters.Length); + for (int i = 0; i < last; i++) + { + if (Encounters[i] == null) continue; + total += Encounters[i].ProjectedTotal(PreviewEnemiesPerEncounter); + } + return total; } } } diff --git a/Assets/_Project/Scripts/Gameplay/TowerPlacementManager.cs b/Assets/_Project/Scripts/Gameplay/TowerPlacementManager.cs index 9943dc5..3706dfb 100644 --- a/Assets/_Project/Scripts/Gameplay/TowerPlacementManager.cs +++ b/Assets/_Project/Scripts/Gameplay/TowerPlacementManager.cs @@ -388,6 +388,76 @@ namespace TD.Gameplay spawner.Play(worldPos); } + // ----- Phase teardown --------------------------------------------- + + /// + /// Server-only: destroys every built tower on the map, refunding nothing. Called when a + /// phase ends so the next phase starts from bare ground. + /// + /// How many towers were destroyed. + /// + /// Deliberately not the sell path. Selling refunds gold, plays the coin VFX and is + /// owner-gated; none of that applies here. This is confiscation, not a transaction — the + /// maze players spent a whole phase building is the price of the boss going down. + /// + /// Cleanup rides on despawn. + /// already un-stamps the footprint, deregisters from the minimap and clears any local + /// selection pointing at it, so this method only has to despawn. Shelved + /// s self-clean the same way; queued and in-progress jobs are + /// cancelled through their own Builder, which restores their footprint tiles. + /// + /// Queued jobs DO refund. Those towers were never delivered, so eating the + /// gold would punish players for having a build queued when the boss happened to die. The + /// no-refund rule applies to towers that got built. + /// + /// Timing matters for performance. Every despawn fires a walkability change, + /// and a full maze is a lot of them. This runs with the field empty — the boss is dead and + /// the next wave hasn't spawned — so no enemy is registered with the re-path scheduler and + /// the recompute storm that would cause mid-wave never happens. + /// + public int ServerDestroyAllTowers() + { + if (!IsServer) return 0; + + // Cancel build queues first. This despawns their non-shelved visuals and frees the + // footprint tiles they had reserved, so the sweep below only has to deal with what's + // left standing. + foreach (var pms in PlayerMatchState.AllPlayers) + { + var builder = Builder.GetForClient(pms.OwnerClientId); + builder?.ServerCancelAllJobs(); + } + + var spawnManager = NetworkManager.Singleton?.SpawnManager; + if (spawnManager == null) return 0; + + // Snapshot before iterating — despawning mutates the live spawned-objects collection. + var snapshot = new System.Collections.Generic.List( + spawnManager.SpawnedObjectsList); + + int destroyed = 0; + foreach (var no in snapshot) + { + if (no == null || !no.IsSpawned) continue; + + if (no.GetComponent() != null) + { + no.Despawn(destroy: true); + destroyed++; + continue; + } + + // Shelved build sites outlive their Builder's queue, so cancelling jobs above + // doesn't reach them. Left alone they'd sit on the map as ghosts of towers that + // no longer exist, still holding their footprint tiles occupied. + var visual = no.GetComponent(); + if (visual != null && visual.IsShelved) + no.Despawn(destroy: true); + } + + return destroyed; + } + // ----- Server-side commit hooks called by Builder ------------------ /// diff --git a/Assets/_Project/Scripts/Gameplay/WaveDefinition.cs b/Assets/_Project/Scripts/Gameplay/WaveDefinition.cs index f23c5fa..5eeb6e5 100644 --- a/Assets/_Project/Scripts/Gameplay/WaveDefinition.cs +++ b/Assets/_Project/Scripts/Gameplay/WaveDefinition.cs @@ -87,6 +87,12 @@ namespace TD.Gameplay } /// Total enemies spawned per zone by this wave, across all entries. + /// + /// Also the divisor for the encounter's health budget — see + /// . That makes count a texture + /// knob rather than a difficulty one: a wave of 8 spawns eight tanks, a wave of 150 spawns + /// a fragile swarm, and both present the same total health for their slot in the run. + /// public int TotalEnemyCount { get diff --git a/Assets/_Project/Scripts/Gameplay/WaveManager.cs b/Assets/_Project/Scripts/Gameplay/WaveManager.cs index b393f9f..a40ed28 100644 --- a/Assets/_Project/Scripts/Gameplay/WaveManager.cs +++ b/Assets/_Project/Scripts/Gameplay/WaveManager.cs @@ -83,6 +83,11 @@ namespace TD.Gameplay "no kill/wave rewards (designer-error indicator, not a supported runtime mode).")] [SerializeField] private GoldConfig goldConfig; + [Tooltip("How enemy health scales across the run. Required for a real match; if unset, " + + "every enemy spawns at a flat fallback health and difficulty never progresses " + + "(designer-error indicator, not a supported runtime mode).")] + [SerializeField] private EnemyScalingConfig enemyScalingConfig; + // ----- Networked state -------------------------------------------- // Per-slot total leak counters across the whole match. Index = (int)PlayerSlot; @@ -372,9 +377,18 @@ namespace TD.Gameplay break; case RunAdvance.NextPhase: + { + // A phase boundary resets the board as well as the enemies: the maze players + // spent the phase building is torn down, unrefunded, so the new phase starts + // from bare ground. Runs here rather than inside RunState.ServerAdvance + // because it touches player structures, which the run has no business owning. + int destroyed = TowerPlacementManager.Instance?.ServerDestroyAllTowers() ?? 0; + NotifyTowersWipedClientRpc(destroyed); + Debug.Log($"[WaveManager] Boss down. New phase drawn: {run.ProgressLabel}. " + - $"Enemy upgrades wiped."); + $"Enemy upgrades wiped; {destroyed} tower(s) destroyed."); break; + } case RunAdvance.NextCycle: Debug.Log($"[WaveManager] Cycle complete — same waves return upgraded " + @@ -492,6 +506,7 @@ namespace TD.Gameplay // Must run AFTER the inter-wave step, since the vote that just closed may have added // to a slot this very encounter re-runs on a later cycle. ResolveCurrentWaveAbilities(); + ResolveCurrentEncounterHealth(def); // Spawn all enemies at once in a held (untargetable, immobile) state. if (def.Entries != null) @@ -668,6 +683,58 @@ namespace TD.Gameplay $"{currentWaveAbilities.Count} wave buff(s)."); } + // ----- Encounter health resolution --------------------------------- + + // Health one enemy of this encounter gets BEFORE its type's HpMultiplier is applied: + // the encounter's budget divided across the wave's bodies. Resolved once per encounter + // for the same reason the ability list is — it's fixed for the whole wave, and the + // divisor would otherwise be recomputed for every spawn. + private float currentEncounterHpShare = FallbackEnemyHp; + + // Used only when no EnemyScalingConfig is assigned. Enemies stay killable so the match + // is still playable, but difficulty never progresses — see the field's tooltip. + private const float FallbackEnemyHp = 100f; + + /// + /// Server-only: work out the per-enemy health share for the encounter about to spawn. + /// + /// + /// Splits the encounter's total budget across the wave's enemy count, so a swarm and an + /// elite wave in the same slot present the same threat. The type's + /// is applied later, per enemy, so a wave + /// mixing types skews each one independently off the shared share. + /// + private void ResolveCurrentEncounterHealth(WaveDefinition def) + { + if (enemyScalingConfig == null) + { + currentEncounterHpShare = FallbackEnemyHp; + Debug.LogWarning("[WaveManager] No EnemyScalingConfig assigned — enemies spawn at " + + $"a flat {FallbackEnemyHp} HP and difficulty will not progress."); + return; + } + + var run = RunState.Instance; + int encounter = CurrentEncounterNumber; + bool isBoss = run?.IsBossStage ?? false; + + int bodies = def != null ? def.TotalEnemyCount : 0; + if (bodies <= 0) + { + // An empty wave can't be divided into. Nothing will spawn from it either, so this + // only guards against a divide-by-zero on a misauthored asset. + currentEncounterHpShare = FallbackEnemyHp; + return; + } + + currentEncounterHpShare = + enemyScalingConfig.ResolvePerEnemyHp(encounter, isBoss, bodies, archetypeMultiplier: 1f); + + Debug.Log($"[WaveManager] Encounter {encounter}{(isBoss ? " (BOSS)" : "")}: " + + $"{enemyScalingConfig.GetEncounterHpBudget(encounter, isBoss):0} HP budget " + + $"across {bodies} enemies = {currentEncounterHpShare:0} each before type modifiers."); + } + // ----- Spawn helpers ---------------------------------------------- private void SpawnEnemyInAllZones(EnemyDefinition def, bool held = false) @@ -742,7 +809,8 @@ namespace TD.Gameplay // Resolve the stats this enemy will actually spawn with. Abilities get first say — // flight, health and size all have to be settled before the position is computed and // before EnemyHealth/EnemyMovement read them, since each is captured once. - var context = contextOverride ?? EnemySpawnContext.FromDefinition(def); + var context = contextOverride + ?? EnemySpawnContext.FromDefinition(def, currentEncounterHpShare * def.HpMultiplier); if (contextOverride == null && abilities != null) { for (int i = 0; i < abilities.Count; i++) @@ -857,11 +925,11 @@ namespace TD.Gameplay private void HandleEnemyKilled(EnemyHealth health) { - // Kill reward comes from GoldConfig for the current wave — same value for - // every enemy in the wave regardless of EnemyDefinition type. Missing config - // or out-of-range wave → 0 reward (gold flow disabled, designer-error mode). + // Kill reward comes from GoldConfig for the current encounter — same value for + // every enemy in it regardless of EnemyDefinition type. Missing config or an + // unauthored encounter → 0 reward (gold flow disabled, designer-error mode). int killReward = 0; - var goldEntry = goldConfig?.GetWaveEntry(CurrentEncounterNumber); + var goldEntry = goldConfig?.GetEncounterEntry(CurrentEncounterNumber); if (goldEntry != null) killReward = goldEntry.GoldPerEnemy; // Wave buffs get to alter the bounty before anything else sees it — this is what @@ -983,8 +1051,24 @@ namespace TD.Gameplay ShowGoldLossClientRpc(worldPos, amount); } + // Announces the end-of-phase tower wipe on every peer. Sent rather than derived locally + // because the despawns arrive as individual NetworkObject removals with nothing tying them + // together — without this a client just watches its maze evaporate for no stated reason. + [ClientRpc] + private void NotifyTowersWipedClientRpc(int destroyedCount) + { + OnTowersWiped?.Invoke(destroyedCount); + } + // ----- Local-only notification events ----------------------------- + /// + /// Fired on every peer when a phase ends and every built tower is destroyed. Argument is + /// how many towers went down. HUD subscribes to explain what just happened; audio and + /// camera-shake hooks can use it too. + /// + public static event System.Action OnTowersWiped; + /// /// Fired on every peer immediately after a life-loss popup spawns. /// HUD subscribes to flash a centered banner; gameplay code can also @@ -1045,10 +1129,10 @@ namespace TD.Gameplay // Server-only. Iterates active players, awards CompletionBonus to each, plus // NoLeaksBonus to those whose per-wave leak counter is zero. Floating-text popups // are spawned at each player's builder position so the reward is visible in-world. - // Skipped silently if no goldConfig or no entry for this wave. + // Skipped silently if no goldConfig or no entry for this encounter. private void AwardWaveCompletionBonuses() { - var entry = goldConfig?.GetWaveEntry(CurrentEncounterNumber); + var entry = goldConfig?.GetEncounterEntry(CurrentEncounterNumber); if (entry == null) return; int completionBonus = entry.CompletionBonus; diff --git a/Assets/_Project/Scripts/Gameplay/Waves/RunState.cs b/Assets/_Project/Scripts/Gameplay/Waves/RunState.cs index 5f0cd92..b31b585 100644 --- a/Assets/_Project/Scripts/Gameplay/Waves/RunState.cs +++ b/Assets/_Project/Scripts/Gameplay/Waves/RunState.cs @@ -188,7 +188,7 @@ namespace TD.Gameplay.Waves /// /// 1-based count of encounters since the run began, including bosses. This is the key - /// GoldConfig is indexed by, so its per-wave entries scale monotonically across the + /// GoldConfig.Encounters is indexed by, so payouts scale monotonically across the /// whole run rather than resetting every cycle. /// public int GlobalEncounterNumber diff --git a/Assets/_Project/Scripts/Gameplay/Waves/WaveGroup.cs b/Assets/_Project/Scripts/Gameplay/Waves/WaveGroup.cs index d870d94..9d1c129 100644 --- a/Assets/_Project/Scripts/Gameplay/Waves/WaveGroup.cs +++ b/Assets/_Project/Scripts/Gameplay/Waves/WaveGroup.cs @@ -19,7 +19,7 @@ namespace TD.Gameplay.Waves /// A class rather than a struct specifically so can carry a /// field initializer — Unity runs it when the inspector creates a fresh array element, /// which is what gives new entries their equal-by-default weighting. Mirrors - /// . + /// . /// [Serializable] public class WavePoolEntry diff --git a/Assets/_Project/Scripts/UI/HUDController.cs b/Assets/_Project/Scripts/UI/HUDController.cs index 29e2b0f..7b51380 100644 --- a/Assets/_Project/Scripts/UI/HUDController.cs +++ b/Assets/_Project/Scripts/UI/HUDController.cs @@ -77,6 +77,19 @@ namespace TD.UI private Label nextWaveLabel; // prep countdown ("next: 0:12") private Label leakedLabel; // local player's origin-leak count ("leaked: 3") private Label incomeLabel; // top-bar per-wave gold-earned counter ("+150 g/wave") + + // Top-bar row of buff badges for the wave currently spawning. Rebuilt only when the + // underlying set changes — see waveBuffSignature. + private VisualElement waveBuffRow; + + // Cheap change-detector for the buff row. RefreshTopBar runs every frame, and rebuilding + // a handful of VisualElements at 60 Hz would churn the UI system for no reason. Encodes + // the slot plus the option ids on it, so it changes when the wave advances OR when a vote + // lands on the slot the players are about to face again. + private int waveBuffSignature = int.MinValue; + + private readonly System.Collections.Generic.List waveBuffScratch + = new System.Collections.Generic.List(); private VisualElement playerListContainer; // right-panel scoreboard rows private Label portraitName; private Label levelLabel; @@ -977,6 +990,7 @@ namespace TD.UI nextWaveLabel = Require