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/New Terrain.asset b/Assets/New Terrain.asset deleted file mode 100644 index e41b51b..0000000 Binary files a/Assets/New Terrain.asset and /dev/null differ diff --git a/Assets/New Terrain 1.asset b/Assets/_Project/Art/9PlayerTerrain.asset similarity index 93% rename from Assets/New Terrain 1.asset rename to Assets/_Project/Art/9PlayerTerrain.asset index c0dd0ee..050e58b 100644 Binary files a/Assets/New Terrain 1.asset and b/Assets/_Project/Art/9PlayerTerrain.asset differ 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 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/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/New Terrain.asset.meta b/Assets/_Project/Art/Materials/M_Gold.mat.meta similarity index 64% rename from Assets/New Terrain.asset.meta rename to Assets/_Project/Art/Materials/M_Gold.mat.meta index 830694d..1caa033 100644 --- a/Assets/New Terrain.asset.meta +++ b/Assets/_Project/Art/Materials/M_Gold.mat.meta @@ -1,8 +1,8 @@ fileFormatVersion: 2 -guid: e75cb6747dd151148b0f1bf06123e9cf +guid: 915f376be23f20941837c0809626fa5f NativeFormatImporter: externalObjects: {} - mainObjectFileID: 15600000 + mainObjectFileID: 2100000 userData: assetBundleName: assetBundleVariant: diff --git a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet.meta b/Assets/_Project/Art/Models/Blend Files.meta similarity index 77% rename from Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet.meta rename to Assets/_Project/Art/Models/Blend Files.meta index e070754..14a4fae 100644 --- a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet.meta +++ b/Assets/_Project/Art/Models/Blend Files.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 82e418e7a5a804747a9a4865648b7793 +guid: d70d84aef04e61749a232234c80f08ce folderAsset: yes DefaultImporter: externalObjects: {} 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/Definitions/Buffs.meta b/Assets/_Project/Art/Sprites/EnemyDraftIcons.meta similarity index 77% rename from Assets/_Project/Definitions/Buffs.meta rename to Assets/_Project/Art/Sprites/EnemyDraftIcons.meta index 98de849..4257bdb 100644 --- a/Assets/_Project/Definitions/Buffs.meta +++ b/Assets/_Project/Art/Sprites/EnemyDraftIcons.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: eef6329e4294d86c6978ff9453b56956 +guid: 42ccb4a3b6aaaab47b73147c8be319bb folderAsset: yes DefaultImporter: externalObjects: {} 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/PlayerDraftIcons/Spells.meta b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Spells.meta new file mode 100644 index 0000000..599da31 --- /dev/null +++ b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Spells.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b086eebc9f3f87543bf2c98de8c8e4af +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Art/Sprites/PlayerDraftIcons/Spells/FireballSpell.png b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Spells/FireballSpell.png new file mode 100644 index 0000000..6c62964 --- /dev/null +++ b/Assets/_Project/Art/Sprites/PlayerDraftIcons/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/PlayerDraftIcons/Spells/FireballSpell.png.meta b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Spells/FireballSpell.png.meta new file mode 100644 index 0000000..25bac7d --- /dev/null +++ b/Assets/_Project/Art/Sprites/PlayerDraftIcons/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/PlayerDraftIcons/Spells/SlowSpell.png b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Spells/SlowSpell.png new file mode 100644 index 0000000..9f0cdef --- /dev/null +++ b/Assets/_Project/Art/Sprites/PlayerDraftIcons/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/PlayerDraftIcons/Spells/SlowSpell.png.meta b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Spells/SlowSpell.png.meta new file mode 100644 index 0000000..98e89b4 --- /dev/null +++ b/Assets/_Project/Art/Sprites/PlayerDraftIcons/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/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/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/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_3.prefab.meta b/Assets/_Project/Art/VFX/FX_SellTower.prefab.meta similarity index 74% rename from Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_3.prefab.meta rename to Assets/_Project/Art/VFX/FX_SellTower.prefab.meta index dc59d87..2755a51 100644 --- a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_3.prefab.meta +++ b/Assets/_Project/Art/VFX/FX_SellTower.prefab.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: d00c71c0cfc7e8744b9f8c1d48c2d256 +guid: 31f8d8c320b42c54d886d610fb13a1e7 PrefabImporter: externalObjects: {} userData: 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/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_1.prefab.meta b/Assets/_Project/Art/VFX/FX_TowerDropReticle.prefab.meta similarity index 74% rename from Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_1.prefab.meta rename to Assets/_Project/Art/VFX/FX_TowerDropReticle.prefab.meta index 684c909..bc57b71 100644 --- a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_1.prefab.meta +++ b/Assets/_Project/Art/VFX/FX_TowerDropReticle.prefab.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: e7be86c29087e99439507b508425b612 +guid: f2a37509f5f2e4d4e86cdaf12f99c6c4 PrefabImporter: externalObjects: {} userData: 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/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/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_1.prefab b/Assets/_Project/Art/VFX/spells/Fireball.prefab similarity index 59% rename from Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_1.prefab rename to Assets/_Project/Art/VFX/spells/Fireball.prefab index 70ca06b..b7e0984 100644 --- a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_1.prefab +++ b/Assets/_Project/Art/VFX/spells/Fireball.prefab @@ -1,6 +1,6 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: ---- !u!1 &562891720401665892 +--- !u!1 &158073311046191680 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -8,47 +8,47 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 5433206400477731590} - - component: {fileID: 3041202948021905482} - - component: {fileID: 2318454595080774531} - - component: {fileID: 2971339723339766249} + - component: {fileID: 7644069561715729860} + - component: {fileID: 4501491015215836543} + - component: {fileID: 4205765680785243152} + - component: {fileID: 8766422769305713616} m_Layer: 0 - m_Name: DefaultConstruction_Phase_1 + m_Name: Fireball m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &5433206400477731590 +--- !u!4 &7644069561715729860 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 562891720401665892} + m_GameObject: {fileID: 158073311046191680} 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_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 &3041202948021905482 +--- !u!33 &4501491015215836543 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 + 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: 562891720401665892} + m_GameObject: {fileID: 158073311046191680} m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 @@ -67,7 +67,7 @@ MeshRenderer: m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: - - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + - {fileID: 2100000, guid: 94a6d1000bea4e36492489f6ab3d6349, type: 2} m_StaticBatchInfo: firstSubMesh: 0 subMeshCount: 0 @@ -91,24 +91,43 @@ MeshRenderer: m_SortingOrder: 0 m_MaskInteraction: 0 m_AdditionalVertexStreams: {fileID: 0} ---- !u!65 &2971339723339766249 -BoxCollider: +--- !u!114 &8766422769305713616 +MonoBehaviour: 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_GameObject: {fileID: 158073311046191680} m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: 0, z: 0} + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 883bd1d14f70a623ea1b252cf7015a92, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.VFX.FallFromSkyVisual + dropHeight: 20 + duration: 1.2 + 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: 25.6 + fallDirection: {x: 0.2, y: 0.2, z: 1} diff --git a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_2.prefab.meta b/Assets/_Project/Art/VFX/spells/Fireball.prefab.meta similarity index 74% rename from Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_2.prefab.meta rename to Assets/_Project/Art/VFX/spells/Fireball.prefab.meta index bb668c4..5557f85 100644 --- a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_2.prefab.meta +++ b/Assets/_Project/Art/VFX/spells/Fireball.prefab.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: c6dabc822d0afb746adc08fb8602c2b4 +guid: 80eaad6d0b024835482b64625b63053c PrefabImporter: externalObjects: {} userData: 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/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_2.prefab b/Assets/_Project/Art/VFX/spells/VFX_slowarea.prefab similarity index 55% rename from Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_2.prefab rename to Assets/_Project/Art/VFX/spells/VFX_slowarea.prefab index 43ed50f..b5d5e68 100644 --- a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstruction_Phase_2.prefab +++ b/Assets/_Project/Art/VFX/spells/VFX_slowarea.prefab @@ -1,6 +1,6 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: ---- !u!1 &3284400382278582069 +--- !u!1 &1462673130280185047 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -8,56 +8,86 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 3820746952356246079} - - component: {fileID: 3350984935134180217} - - component: {fileID: 6336690892943026752} - - component: {fileID: 2003287843732108245} + - component: {fileID: 30710218362299472} + - component: {fileID: 2262385832724230530} + - component: {fileID: 5239089805406934537} m_Layer: 0 - m_Name: DefaultConstruction_Phase_2 + m_Name: VFX_slowarea m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &3820746952356246079 +--- !u!4 &30710218362299472 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3284400382278582069} + m_GameObject: {fileID: 1462673130280185047} 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_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!33 &3350984935134180217 -MeshFilter: +--- !u!2083052967 &2262385832724230530 +VisualEffect: 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_GameObject: {fileID: 1462673130280185047} m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 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: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 + m_MotionVectors: 0 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 0 + m_RayTracingMode: 0 m_RayTraceProcedural: 0 m_RayTracingAccelStructBuildFlagsOverride: 0 m_RayTracingAccelStructBuildFlags: 1 @@ -66,8 +96,6 @@ MeshRenderer: m_MeshLodSelectionBias: 0 m_RenderingLayerMask: 1 m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} m_StaticBatchInfo: firstSubMesh: 0 subMeshCount: 0 @@ -90,25 +118,3 @@ MeshRenderer: 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/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/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..a327ea6 --- /dev/null +++ b/Assets/_Project/Art/VFX/towers/vfx_tower_impact_dust_burst.vfx @@ -0,0 +1,5650 @@ +%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: 474 + height: 2591 + 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: 1232 + height: 2643 +--- !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_tower_impact_dust_burst + m_EditorClassIdentifier: + m_UIIgnoredErrors: [] + m_Parent: {fileID: 0} + m_Children: + - {fileID: 8926484042661614700} + - {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 + 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_tower_impact_dust_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} + - {fileID: 8926484042661614975} + m_OutputSlots: [] + m_Label: Dust Cloud 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: 4000 + 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: 8926484042661614983} + 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: 4000 + 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: 3 + 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: 5 + 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: 1745} + 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: 2278} + 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":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 &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.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 &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: 0.15 + 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: 2 + 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":-1.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.4 + 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: + 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: 1 + 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: 0 + 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":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 + 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: 0 + 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: 0 + 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: 0 + 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 &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/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: 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/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/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/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/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/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/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/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/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/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/Buffs/OffensiveBuffs.asset b/Assets/_Project/Definitions/Buffs/OffensiveBuffs.asset deleted file mode 100644 index 737c5ab..0000000 --- a/Assets/_Project/Definitions/Buffs/OffensiveBuffs.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: 516e8faec948a4b3d977ec019376c438, type: 3} - m_Name: OffensiveBuffs - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.BuffCategory - DisplayName: Offensive Buffs - Cost: 5 - Pool: - - {fileID: 11400000, guid: 9ec170e540b1f91cca762dcebe81a856, type: 2} 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/Buffs/ExtraDamage25.asset.meta b/Assets/_Project/Definitions/BuilderEffects/GoldPerKillEffect.asset.meta similarity index 79% rename from Assets/_Project/Definitions/Buffs/ExtraDamage25.asset.meta rename to Assets/_Project/Definitions/BuilderEffects/GoldPerKillEffect.asset.meta index b240b6c..c0cfe61 100644 --- a/Assets/_Project/Definitions/Buffs/ExtraDamage25.asset.meta +++ b/Assets/_Project/Definitions/BuilderEffects/GoldPerKillEffect.asset.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 9ec170e540b1f91cca762dcebe81a856 +guid: 419fac0976a3e0a20827beff81826161 NativeFormatImporter: externalObjects: {} mainObjectFileID: 11400000 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..e713412 --- /dev/null +++ b/Assets/_Project/Definitions/BuilderSpells/FireballSpell.asset @@ -0,0 +1,32 @@ +%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: Fireball + Description: Shoot a fireball + Icon: {fileID: 21300000, guid: eff45e5e3dab24f438c054a095d34578, type: 3} + Cooldown: 15 + TargetType: 0 + 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: e54448243d0478045b6566412c54e4a7, type: 3} + volume: 0.603 + minPitch: 1.048 + maxPitch: 0.969 + Damage: 500 diff --git a/Assets/_Project/Definitions/Buffs/OffensiveBuffs.asset.meta b/Assets/_Project/Definitions/BuilderSpells/FireballSpell.asset.meta similarity index 79% rename from Assets/_Project/Definitions/Buffs/OffensiveBuffs.asset.meta rename to Assets/_Project/Definitions/BuilderSpells/FireballSpell.asset.meta index ced41c2..61581ca 100644 --- a/Assets/_Project/Definitions/Buffs/OffensiveBuffs.asset.meta +++ b/Assets/_Project/Definitions/BuilderSpells/FireballSpell.asset.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: d8ed3b9535538f7fc82be878cc307d26 +guid: 051c48f416e5366b59d49b0e062333ac NativeFormatImporter: externalObjects: {} mainObjectFileID: 11400000 diff --git a/Assets/_Project/Definitions/BuilderSpells/SlowAreaSpell.asset b/Assets/_Project/Definitions/BuilderSpells/SlowAreaSpell.asset new file mode 100644 index 0000000..cb2746a --- /dev/null +++ b/Assets/_Project/Definitions/BuilderSpells/SlowAreaSpell.asset @@ -0,0 +1,31 @@ +%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: Slow Area + Description: Slows enemies in an area + Icon: {fileID: 21300000, guid: 5f5072d8c9f626c4690a7b231c7488f9, type: 3} + Cooldown: 10 + TargetType: 1 + Radius: 5 + enemyLayerMask: + serializedVersion: 2 + m_Bits: 1152 + areaVfxPrefab: {fileID: 1462673130280185047, guid: bf2f1f2a9a54e9162b80673e3f7eeaf6, type: 3} + areaSound: + clip: {fileID: 8300000, guid: 038ff3eab9aa0034bac26ccb648ef2a1, type: 3} + volume: 0.632 + minPitch: 1.04 + maxPitch: 0.96 + SlowFactor: 0.5 + EffectDuration: 8 diff --git a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstructionSet.asset.meta b/Assets/_Project/Definitions/BuilderSpells/SlowAreaSpell.asset.meta similarity index 79% rename from Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstructionSet.asset.meta rename to Assets/_Project/Definitions/BuilderSpells/SlowAreaSpell.asset.meta index 3832c3f..1518d59 100644 --- a/Assets/_Project/Prefabs/Towers/Tower Construction Sets/DefaultConstructionSet/DefaultConstructionSet.asset.meta +++ b/Assets/_Project/Definitions/BuilderSpells/SlowAreaSpell.asset.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: ed951755c09d6d0479b4fd924b6915da +guid: d893f46b037536b4ba91307e184cecfe NativeFormatImporter: externalObjects: {} mainObjectFileID: 11400000 diff --git a/Assets/_Project/Definitions/BuilderSpells/SlowAreaUpgradedSpell.asset b/Assets/_Project/Definitions/BuilderSpells/SlowAreaUpgradedSpell.asset new file mode 100644 index 0000000..90d9579 --- /dev/null +++ b/Assets/_Project/Definitions/BuilderSpells/SlowAreaUpgradedSpell.asset @@ -0,0 +1,31 @@ +%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: 37cc60a4a6e53e24cb6d1c0be310868a, type: 3} + m_Name: SlowAreaUpgradedSpell + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.BuilderSpells.SlowAreaUpgradedSpellDefinition + DisplayName: Slow Area II + Description: Upgraded Slow Area. Slows for 50% longer. + Icon: {fileID: 21300000, guid: 5f5072d8c9f626c4690a7b231c7488f9, type: 3} + Cooldown: 10 + TargetType: 1 + Radius: 5 + enemyLayerMask: + serializedVersion: 2 + m_Bits: 1152 + areaVfxPrefab: {fileID: 1462673130280185047, guid: bf2f1f2a9a54e9162b80673e3f7eeaf6, type: 3} + areaSound: + clip: {fileID: 8300000, guid: 038ff3eab9aa0034bac26ccb648ef2a1, type: 3} + volume: 0.632 + minPitch: 1.04 + maxPitch: 0.96 + SlowFactor: 0.5 + EffectDuration: 12 diff --git a/Assets/_Project/Definitions/BuilderSpells/SlowAreaUpgradedSpell.asset.meta b/Assets/_Project/Definitions/BuilderSpells/SlowAreaUpgradedSpell.asset.meta new file mode 100644 index 0000000..16266b6 --- /dev/null +++ b/Assets/_Project/Definitions/BuilderSpells/SlowAreaUpgradedSpell.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 364edf6abc3c31e33b53d0a01142b8ab +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: 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/RunDefinitions/Draft/PlayerDraft/Draft_BuilderEffect_GoldPerKill.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderEffect_GoldPerKill.asset new file mode 100644 index 0000000..391470d --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/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/RunDefinitions/Draft/PlayerDraft/Draft_BuilderEffect_GoldPerKill.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderEffect_GoldPerKill.asset.meta new file mode 100644 index 0000000..3d7d0d2 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/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/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_Fireball.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_Fireball.asset new file mode 100644 index 0000000..5ec8c55 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/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/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_Fireball.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_Fireball.asset.meta new file mode 100644 index 0000000..f9e25b5 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/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/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_SlowArea.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_SlowArea.asset new file mode 100644 index 0000000..5dd615e --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/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/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_SlowArea.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_SlowArea.asset.meta new file mode 100644 index 0000000..40f9145 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/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/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_SlowAreaUpgrade.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_SlowAreaUpgrade.asset new file mode 100644 index 0000000..743c46d --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_SlowAreaUpgrade.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7b1c5b562f39c72eea3bafd0165af078, type: 3} + m_Name: Draft_BuilderSpellOption_SlowAreaUpgrade + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.Draft.BuilderSpellUpgradeDraftOption + DisplayName: Slow Area II + Description: Slows enemies in the area for 50% longer than the default slow area. + Icon: {fileID: 0} + Weight: 1 + BaseKind: 1 + UpgradedKind: 2 diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_SlowAreaUpgrade.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_SlowAreaUpgrade.asset.meta new file mode 100644 index 0000000..13ca9fd --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_SlowAreaUpgrade.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d180030b68a9a5e1da497bf6f83451d4 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: 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/RunDefinitions/EnemyAbilities.meta b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities.meta new file mode 100644 index 0000000..d927cf3 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 37cbc8b63ce7ae2e4b4abcfd7274bee7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/BlinkAbility.asset b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/BlinkAbility.asset new file mode 100644 index 0000000..ec1b7b5 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/BlinkAbility.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: 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: 8 + BlinkDistanceMeters: 4 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/RunDefinitions/EnemyAbilities/SplitOnDeathAbility.asset b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/SplitOnDeathAbility.asset new file mode 100644 index 0000000..6ca1f9e --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/SplitOnDeathAbility.asset @@ -0,0 +1,20 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 21543cb1b54f0b16e9c80584f68988b3, type: 3} + m_Name: SplitOnDeathAbility + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbilities.SplitOnDeathAbilityDefinition + DisplayName: Split on Death + Description: The enemy splits when it dies. + Weight: 100 + SplitInto: {fileID: 11400000, guid: a05af37e2256f164d80a66cc2a582466, type: 2} + SplitCount: 2 + ScatterRadius: 0.5 diff --git a/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/SplitOnDeathAbility.asset.meta b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/SplitOnDeathAbility.asset.meta new file mode 100644 index 0000000..fae7041 --- /dev/null +++ b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/SplitOnDeathAbility.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0305468bc8f912d429a8b20bf23f947c +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Definitions/Buffs/ExtraDamage25.asset b/Assets/_Project/Definitions/RunDefinitions/EnemyScalingConfig.asset similarity index 51% rename from Assets/_Project/Definitions/Buffs/ExtraDamage25.asset rename to Assets/_Project/Definitions/RunDefinitions/EnemyScalingConfig.asset index c707eae..509a039 100644 --- a/Assets/_Project/Definitions/Buffs/ExtraDamage25.asset +++ b/Assets/_Project/Definitions/RunDefinitions/EnemyScalingConfig.asset @@ -9,9 +9,9 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: b01f9aea62ee8a1c1991bb2a097de224, type: 3} - m_Name: ExtraDamage25 - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.BuffDefinition - DisplayName: 25% Increased Damage - Stat: 0 - Multiplier: 1.25 + 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 82% rename from Assets/_Project/Definitions/GoldConfig.asset rename to Assets/_Project/Definitions/RunDefinitions/GoldConfig.asset index 58f29f6..abf9261 100644 --- a/Assets/_Project/Definitions/GoldConfig.asset +++ b/Assets/_Project/Definitions/RunDefinitions/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/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 7709fe3..d39d8d9 100644 --- a/Assets/_Project/Definitions/Towers/BasicArrowTower.asset +++ b/Assets/_Project/Definitions/Towers/BasicArrowTower.asset @@ -17,15 +17,19 @@ 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 GroundedOnly: 0 Damage: 10 Range: 20 - FireRate: 5 + AttacksPerSecond: 5 SplashRadius: 0 ChainCount: 0 ChainRange: 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/Definitions/Towers/SiegeCannonTower.asset b/Assets/_Project/Definitions/Towers/SiegeCannonTower.asset index 54d91dd..7a6ead6 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.8 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 cfcc419..aa5b2b6 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} 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/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Blue.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Blue.prefab index 6bf2444..b4613dd 100644 --- a/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Blue.prefab +++ b/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Blue.prefab @@ -16,6 +16,8 @@ GameObject: - component: {fileID: 3283904430289710888} - component: {fileID: 3756613737869398948} - component: {fileID: 6036713598566100742} + - component: {fileID: -1575784752119152190} + - component: {fileID: 154042129325690845} m_Layer: 10 m_Name: Enemy_CrystalGolem_Blue m_TagString: Untagged @@ -124,7 +126,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyHealth ShowTopMostFoldoutHeaderGroup: 1 - definition: {fileID: 0} + definition: {fileID: 11400000, guid: a05af37e2256f164d80a66cc2a582466, type: 2} deathAnimator: {fileID: 1819643351848917197} deathAnimationDuration: 1.5 sinkDuration: 1.5 @@ -202,6 +204,40 @@ 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!114 &154042129325690845 +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_Red.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Red.prefab index f183f6e..4f54da4 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 @@ -124,7 +125,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyHealth ShowTopMostFoldoutHeaderGroup: 1 - definition: {fileID: 0} + definition: {fileID: 11400000, guid: edc686813aef43743bb15d356b511dff, type: 2} deathAnimator: {fileID: 8642767442976997525} deathAnimationDuration: 1.5 sinkDuration: 1.5 @@ -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..fb8210c 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 @@ -124,7 +125,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyHealth ShowTopMostFoldoutHeaderGroup: 1 - definition: {fileID: 0} + definition: {fileID: 11400000, guid: fe31ccfc7a429b24fb8f57279ba96c95, type: 2} deathAnimator: {fileID: 7317567842465160949} deathAnimationDuration: 1.5 sinkDuration: 1.5 @@ -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 fad5f6b..e11218f 100644 --- a/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Green.prefab +++ b/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Green.prefab @@ -16,6 +16,8 @@ GameObject: - component: {fileID: 3283904430289710888} - component: {fileID: 3756613737869398948} - component: {fileID: 6036713598566100742} + - component: {fileID: -4695266156693656620} + - component: {fileID: -7800194977638654489} m_Layer: 10 m_Name: Enemy_Cyclops_Green m_TagString: Untagged @@ -124,7 +126,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyHealth ShowTopMostFoldoutHeaderGroup: 1 - definition: {fileID: 0} + definition: {fileID: 11400000, guid: 21c69bd4b2c55cd4fa9cd9b551c6e3fe, type: 2} deathAnimator: {fileID: 6910253555362952583} deathAnimationDuration: 1.5 sinkDuration: 1.5 @@ -202,6 +204,32 @@ 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 + 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..d943a11 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 @@ -124,7 +125,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyHealth ShowTopMostFoldoutHeaderGroup: 1 - definition: {fileID: 0} + definition: {fileID: 11400000, guid: 52d9af0c680bca64a86d66fce2a73668, type: 2} deathAnimator: {fileID: 5079596453572633521} deathAnimationDuration: 1.5 sinkDuration: 1.5 @@ -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..06a8723 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 @@ -124,7 +125,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyHealth ShowTopMostFoldoutHeaderGroup: 1 - definition: {fileID: 0} + definition: {fileID: 11400000, guid: 4b981d8b44098894197507508f655072, type: 2} deathAnimator: {fileID: 162562342023078655} deathAnimationDuration: 1.5 sinkDuration: 1.5 @@ -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..829e743 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 @@ -124,7 +125,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyHealth ShowTopMostFoldoutHeaderGroup: 1 - definition: {fileID: 0} + definition: {fileID: 11400000, guid: bed87a08deeb7e048ba06c8268b0f959, type: 2} deathAnimator: {fileID: 6938810086909213800} deathAnimationDuration: 1.5 sinkDuration: 1.5 @@ -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..b37096d 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 @@ -124,7 +125,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyHealth ShowTopMostFoldoutHeaderGroup: 1 - definition: {fileID: 0} + definition: {fileID: 11400000, guid: 77f4545654c5b7b41b2760a580da6068, type: 2} deathAnimator: {fileID: 2830498994423139172} deathAnimationDuration: 1.5 sinkDuration: 1.5 @@ -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..063f5d2 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 @@ -124,7 +125,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyHealth ShowTopMostFoldoutHeaderGroup: 1 - definition: {fileID: 0} + definition: {fileID: 11400000, guid: 097d7ba78591cd443a06d637e0822a46, type: 2} deathAnimator: {fileID: 471366370285235598} deathAnimationDuration: 1.5 sinkDuration: 1.5 @@ -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..7994b3a 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 @@ -124,7 +125,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyHealth ShowTopMostFoldoutHeaderGroup: 1 - definition: {fileID: 0} + definition: {fileID: 11400000, guid: 1d9809612c00ed049848a955613a4619, type: 2} deathAnimator: {fileID: 3345626123719039665} deathAnimationDuration: 1.5 sinkDuration: 1.5 @@ -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 666ff7b..240ec88 100644 --- a/Assets/_Project/Prefabs/Player/Player.prefab +++ b/Assets/_Project/Prefabs/Player/Player.prefab @@ -13,9 +13,14 @@ GameObject: - component: {fileID: 2918837822014987993} - component: {fileID: 7845089877743661692} - component: {fileID: 4336209376377567030} - - component: {fileID: 2806524246861401760} - component: {fileID: 2806524246861401799} - component: {fileID: 2806524246861401801} + - 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 @@ -50,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 @@ -104,21 +109,6 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.PlayerMatchState ShowTopMostFoldoutHeaderGroup: 1 ---- !u!114 &2806524246861401760 -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: 7775ee3a2f441b52480aabf54be6c1b6, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.PlayerBuffManager - ShowTopMostFoldoutHeaderGroup: 1 - categories: - - {fileID: 11400000, guid: d8ed3b9535538f7fc82be878cc307d26, type: 2} --- !u!114 &2806524246861401799 MonoBehaviour: m_ObjectHideFlags: 0 @@ -129,7 +119,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 +132,84 @@ 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 +--- !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 +--- !u!114 &-4438158474568445526 +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: 65825b3189ae873948659b37b219f5e6, type: 3} + 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/Prefabs/Towers/Tower Construction Sets/BuildSiteVisual.prefab b/Assets/_Project/Prefabs/Towers/Tower Construction Sets/BuildSiteVisual.prefab index 6b3815f..771a16c 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 @@ -230,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 @@ -250,7 +139,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,13 +182,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} - stageCount: 4 - queuedYScale: 0.15 + dropReticlePrefab: {fileID: 4110617398237858862, guid: f2a37509f5f2e4d4e86cdaf12f99c6c4, type: 3} --- !u!65 &6259437393614329336 BoxCollider: m_ObjectHideFlags: 0 @@ -322,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 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/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/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_BasicArrow.prefab b/Assets/_Project/Prefabs/Towers/Tower_BasicArrow.prefab index 72ae323..dc2ce94 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: 8300000, guid: 4ee1b63f27ea04451802bafd35ecef89, type: 3} + volume: 0.667 + minPitch: 0.96 + maxPitch: 1.04 +--- !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: 6874992557687165507, guid: a9080df4046b863c8b07b3ad73d76bf4, type: 3} + 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..c6496e6 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: 8300000, guid: 4ee1b63f27ea04451802bafd35ecef89, type: 3} + volume: 0.667 + minPitch: 0.96 + maxPitch: 1.04 +--- !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: 6874992557687165507, guid: a9080df4046b863c8b07b3ad73d76bf4, type: 3} + 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 cff0c5b..23c11f4 100644 --- a/Assets/_Project/Prefabs/Towers/Tower_TeslaCoil.prefab +++ b/Assets/_Project/Prefabs/Towers/Tower_TeslaCoil.prefab @@ -100,6 +100,9 @@ GameObject: - component: {fileID: 8853488620519990682} - 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 @@ -146,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 @@ -174,6 +177,8 @@ MonoBehaviour: ShowTopMostFoldoutHeaderGroup: 1 tintedRenderers: - {fileID: 0} + dropHeight: 15 + landingDuration: 0.4 --- !u!114 &805962841523123163 MonoBehaviour: m_ObjectHideFlags: 0 @@ -219,10 +224,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 +250,84 @@ 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.3 + minPitch: 1 + maxPitch: 1 + delaySeconds: 0.3 +--- !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: 8300000, guid: 4ee1b63f27ea04451802bafd35ecef89, type: 3} + volume: 0.663 + minPitch: 0.96 + maxPitch: 1.04 +--- !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: 6874992557687165507, guid: a9080df4046b863c8b07b3ad73d76bf4, type: 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 6dff6f7..a08f1d5 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 @@ -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 @@ -2279,6 +2276,56 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &181002639 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 181002641} + - component: {fileID: 181002640} + m_Layer: 0 + m_Name: EnemyAbilityPool + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &181002640 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 181002639} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4409eb25a8be555de8dc3a73d4ed95db, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbilities.EnemyAbilityPool + abilities: + - {fileID: 11400000, guid: 0305468bc8f912d429a8b20bf23f947c, type: 2} + - {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 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 181002639} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 15.94346, y: 0, z: 194.22044} + 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 &203092944 Mesh: m_ObjectHideFlags: 0 @@ -7339,6 +7386,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 @@ -11393,6 +11584,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 @@ -12283,55 +12525,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 @@ -12826,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 @@ -13253,6 +13497,54 @@ 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} + - {fileID: 11400000, guid: 364edf6abc3c31e33b53d0a01142b8ab, 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 @@ -13567,6 +13859,75 @@ Mesh: - serializedVersion: 1 m_IndexStart: 0 m_IndexCount: 0 +--- !u!1 &954434158 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 954434161} + - component: {fileID: 954434160} + - component: {fileID: 954434159} + m_Layer: 0 + m_Name: DebugConsole + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &954434159 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 954434158} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7c6a808e8291552d0b64e36a210879c4, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TD.Dev.DebugConsole + toggleKey: 4 +--- !u!114 &954434160 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 954434158} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 19102, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: UnityEngine.dll::UnityEngine.UIElements.UIDocument + m_PanelSettings: {fileID: 11400000, guid: 6aa0af71585acea4db4995c3931dc946, type: 2} + m_ParentUI: {fileID: 0} + sourceAsset: {fileID: 0} + m_SortingOrder: 1 + m_Position: 0 + m_WorldSpaceSizeMode: 1 + m_WorldSpaceWidth: 1920 + m_WorldSpaceHeight: 1080 + m_PivotReferenceSize: 0 + m_Pivot: 0 + m_WorldSpaceCollider: {fileID: 0} +--- !u!4 &954434161 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 954434158} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -52.51635, y: 0, z: -27.6311} + 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 &955672358 GameObject: m_ObjectHideFlags: 0 @@ -13635,6 +13996,129 @@ 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 + 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 @@ -14164,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} @@ -15302,6 +15787,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 @@ -17948,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 @@ -19830,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: @@ -22538,6 +23017,7 @@ MonoBehaviour: m_EditorClassIdentifier: Assembly-CSharp::TD.Dev.DevWaveControls hotkey: 94 grantTowerHotkey: 101 + skipToBossHotkey: 100 --- !u!4 &1731269687 Transform: m_ObjectHideFlags: 0 @@ -27597,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 @@ -27845,6 +28397,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 @@ -28426,6 +29024,11 @@ 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} + - {fileID: 11400000, guid: d180030b68a9a5e1da497bf6f83451d4, type: 2} --- !u!4 &2139601601 Transform: m_ObjectHideFlags: 0 @@ -28802,7 +29405,6 @@ SceneRoots: m_ObjectHideFlags: 0 m_Roots: - {fileID: 410087041} - - {fileID: 832575519} - {fileID: 441239881} - {fileID: 167151709} - {fileID: 1507514109} @@ -28822,3 +29424,13 @@ SceneRoots: - {fileID: 1889390964} - {fileID: 2139601601} - {fileID: 176580462} + - {fileID: 516125087} + - {fileID: 2079088113} + - {fileID: 914832726} + - {fileID: 993870445} + - {fileID: 759470735} + - {fileID: 954434161} + - {fileID: 181002641} + - {fileID: 961493954} + - {fileID: 2021000669} + - {fileID: 875833599} diff --git a/Assets/_Project/Scripts/Audio/AudioCategory.cs b/Assets/_Project/Scripts/Audio/AudioCategory.cs index ef63198..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, Music } + public enum AudioCategory { Combat, EnemyHitDeath, UI } } diff --git a/Assets/_Project/Scripts/Audio/AudioManager.cs b/Assets/_Project/Scripts/Audio/AudioManager.cs index 961a820..5fbc61b 100644 --- a/Assets/_Project/Scripts/Audio/AudioManager.cs +++ b/Assets/_Project/Scripts/Audio/AudioManager.cs @@ -11,6 +11,12 @@ namespace TD.Audio { public AudioCategory category; public int maxVoices; + + // NOTE: currently inert. It seeds each pooled AudioSource at init, but every + // Play() call overwrites src.volume with (per-sound volume × SFX slider), so + // this value never reaches the mix. Left as-is rather than "fixed" because + // multiplying it in would halve every existing sound (authored scenes use 0.5). + // Wire it up only alongside a pass to re-level the per-sound volumes. [Range(0f, 1f)] public float volume; } @@ -58,7 +64,17 @@ namespace TD.Audio } } - public void Play(AudioClip clip, AudioCategory category, float pitch = 1f) + /// + /// Plays a one-shot on the given category's voice pool. is + /// the per-sound authored level; it's scaled by the player's SFX slider + /// () on the way in. + /// + /// + /// The scalar is sampled at play time, so a sound already in flight keeps the volume + /// it started with when the slider moves. Every SFX here is short, so that's + /// imperceptible and avoids having to track live voices. + /// + 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 +82,7 @@ namespace TD.Audio int idx = indices[category]; var src = pool[idx % pool.Length]; src.pitch = pitch; + src.volume = volume * AudioVolumeSettings.SfxScalar; src.clip = clip; src.Play(); indices[category] = idx + 1; diff --git a/Assets/_Project/Scripts/Audio/AudioVolumeSettings.cs b/Assets/_Project/Scripts/Audio/AudioVolumeSettings.cs new file mode 100644 index 0000000..5df40a6 --- /dev/null +++ b/Assets/_Project/Scripts/Audio/AudioVolumeSettings.cs @@ -0,0 +1,97 @@ +// Assets/_Project/Scripts/Audio/AudioVolumeSettings.cs +using UnityEngine; + +namespace TD.Audio +{ + /// + /// Player-facing volume mix, persisted in and shared by + /// every audio consumer in the game. Two buses: + /// + /// Music — the looping scene track played by . + /// SFX — everything routed through + /// (spells, tower fire, build/land, enemy death, sell, UI clicks). + /// + /// + /// + /// Why not named AudioSettings. UnityEngine.AudioSettings already + /// exists, so a TD.Audio.AudioSettings would be an ambiguous reference in any + /// file that has both using UnityEngine; and using TD.Audio;. + /// + /// Units. Public values are ints 0..100 — the numbers the settings slider + /// shows. Consumers multiply by / , + /// which apply a squared taper so the slider's lower half isn't perceptually dead + /// (linear amplitude drops off much faster than perceived loudness). At 100 the + /// scalar is exactly 1, so the default mix is byte-identical to the pre-settings + /// behaviour. + /// + /// Live updates. fires on every mutation. + /// Continuous sources (music) subscribe and re-apply; one-shots read the scalar at + /// play time, so a mid-flight SFX keeps the volume it started with. That's fine — + /// they're all short. + /// + public static class AudioVolumeSettings + { + public const int MinVolume = 0; + public const int MaxVolume = 100; + + private const int DefaultVolume = 100; + private const string MusicKey = "td.audio.music"; + private const string SfxKey = "td.audio.sfx"; + + /// Raised whenever music or SFX volume changes. + public static event System.Action OnChanged; + + // -1 = not yet read from PlayerPrefs. Statics are cleared on domain reload + // (entering play mode in the editor), so the lazy load re-runs each session. + private static int music = -1; + private static int sfx = -1; + + public static int MusicVolume + { + get + { + if (music < 0) music = PlayerPrefs.GetInt(MusicKey, DefaultVolume); + return music; + } + set => Set(ref music, MusicKey, value); + } + + public static int SfxVolume + { + get + { + if (sfx < 0) sfx = PlayerPrefs.GetInt(SfxKey, DefaultVolume); + return sfx; + } + set => Set(ref sfx, SfxKey, value); + } + + /// Amplitude multiplier (0..1) for the music bus. + public static float MusicScalar => ToScalar(MusicVolume); + + /// Amplitude multiplier (0..1) for the sound-effects bus. + public static float SfxScalar => ToScalar(SfxVolume); + + /// + /// Flushes PlayerPrefs to disk. Setters only write the in-memory pref (cheap + /// enough to call on every frame of a slider drag); call this once when the + /// settings UI closes so the choice survives a crash. + /// + public static void Flush() => PlayerPrefs.Save(); + + private static void Set(ref int field, string key, int value) + { + int clamped = Mathf.Clamp(value, MinVolume, MaxVolume); + if (field == clamped) return; + field = clamped; + PlayerPrefs.SetInt(key, clamped); + OnChanged?.Invoke(); + } + + private static float ToScalar(int volume) + { + float linear = Mathf.Clamp01(volume / (float)MaxVolume); + return linear * linear; + } + } +} diff --git a/Assets/_Project/Scripts/Audio/AudioVolumeSettings.cs.meta b/Assets/_Project/Scripts/Audio/AudioVolumeSettings.cs.meta new file mode 100644 index 0000000..2b1f334 --- /dev/null +++ b/Assets/_Project/Scripts/Audio/AudioVolumeSettings.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4d2f94f5f8df24e8aa1f47d9f0e3ecf4 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Audio/MusicPlayer.cs b/Assets/_Project/Scripts/Audio/MusicPlayer.cs new file mode 100644 index 0000000..781e36e --- /dev/null +++ b/Assets/_Project/Scripts/Audio/MusicPlayer.cs @@ -0,0 +1,55 @@ +// 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. + /// + /// + /// 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 + { + [SerializeField] private AudioClip clip; + [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() + { + 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/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/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/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/TeslaTowerFireSound.cs b/Assets/_Project/Scripts/Combat/TeslaTowerFireSound.cs index 9294b85..eddc323 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.Combat, 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..e76a289 --- /dev/null +++ b/Assets/_Project/Scripts/Combat/TowerBuiltSound.cs @@ -0,0 +1,47 @@ +// 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; + [SerializeField] private float delaySeconds = 0.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() + { + Invoke(nameof(PlayBuiltSound), delaySeconds); + } + + private void PlayBuiltSound() + { + 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/Combat/TowerCombat.cs b/Assets/_Project/Scripts/Combat/TowerCombat.cs index 657d5f8..3001be9 100644 --- a/Assets/_Project/Scripts/Combat/TowerCombat.cs +++ b/Assets/_Project/Scripts/Combat/TowerCombat.cs @@ -58,14 +58,15 @@ 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; - // Lazily resolved on first attack — the owner's slot isn't guaranteed to be - // set at spawn time, so we defer the lookup until combat actually begins. - private PlayerBuffManager ownerBuffManager; - private bool buffManagerResolved; - // Shared OverlapSphere result buffer. 32 covers any realistic enemy // density; size up if profiling reveals overflow. private static readonly Collider[] s_overlapBuffer = new Collider[32]; @@ -102,6 +103,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 +130,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; @@ -226,25 +234,6 @@ namespace TD.Combat ClearTarget(); } - // ----- Buff multiplier lookup ------------------------------------- - - // Resolved lazily on the first attack because the owner slot NetworkVariable - // may not yet have replicated by the time OnNetworkSpawn runs. - private PlayerBuffManager GetOwnerBuffManager() - { - if (buffManagerResolved) return ownerBuffManager; - - var slot = towerInstance.Owner; - if (slot == PlayerSlot.None) return null; - - var matchState = PlayerMatchState.GetForSlot(slot); - if (matchState == null) return null; - - ownerBuffManager = matchState.GetComponent(); - buffManagerResolved = true; - return ownerBuffManager; - } - // ----- Attack tick ------------------------------------------------- private void TickAttack(TowerDefinition def) @@ -252,9 +241,7 @@ namespace TD.Combat attackCooldown -= Time.deltaTime; if (attackCooldown > 0f) return; - float effectiveFireRate = def.AttacksPerSecond - * (GetOwnerBuffManager()?.GetMultiplier(BuffStat.AttackSpeed) ?? 1f); - attackCooldown = 1f / effectiveFireRate; + attackCooldown = 1f / def.AttacksPerSecond; Fire(def); } @@ -471,11 +458,7 @@ namespace TD.Combat private void HitEnemy(in CombatProfile p, EnemyHealth target, PlayerSlot owner) { - 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); + target.TakeDamage(p.Damage, p.DamageType, owner); ApplyStatusEffect(p, target, owner); } @@ -514,11 +497,9 @@ namespace TD.Combat return; } - float effectiveDamage = def.Damage - * (GetOwnerBuffManager()?.GetMultiplier(BuffStat.Damage) ?? 1f); proj.InitializeServer( target, - effectiveDamage, + def.Damage, p.DamageType, p.TargetType, p.SplashRadius, 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/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/Core/BuffStat.cs b/Assets/_Project/Scripts/Core/BuffStat.cs deleted file mode 100644 index 3e2132e..0000000 --- a/Assets/_Project/Scripts/Core/BuffStat.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Assets/_Project/Scripts/Core/BuffStat.cs -namespace TD.Core -{ - /// - /// Identifies which tower stat a modifies. - /// - public enum BuffStat : byte - { - Damage = 0, - AttackSpeed = 1, - } -} diff --git a/Assets/_Project/Scripts/Core/BuffStat.cs.meta b/Assets/_Project/Scripts/Core/BuffStat.cs.meta deleted file mode 100644 index b91fc16..0000000 --- a/Assets/_Project/Scripts/Core/BuffStat.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: fc84fec503f24bc7693ee29558f45d27 \ No newline at end of file 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/Core/BuilderSpellKind.cs b/Assets/_Project/Scripts/Core/BuilderSpellKind.cs new file mode 100644 index 0000000..91c56e9 --- /dev/null +++ b/Assets/_Project/Scripts/Core/BuilderSpellKind.cs @@ -0,0 +1,16 @@ +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, + SlowAreaUpgraded = 2, + } +} 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/EnemyAbilityKind.cs b/Assets/_Project/Scripts/Core/EnemyAbilityKind.cs new file mode 100644 index 0000000..3356956 --- /dev/null +++ b/Assets/_Project/Scripts/Core/EnemyAbilityKind.cs @@ -0,0 +1,29 @@ +namespace TD.Core +{ + /// + /// Identifies which enemy ability a + /// represents. Mirrors + /// — a stable, enum-indexed identifier used by + /// instead of an asset reference. + /// + public enum EnemyAbilityKind : byte + { + /// 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/EnemyAbilityKind.cs.meta b/Assets/_Project/Scripts/Core/EnemyAbilityKind.cs.meta new file mode 100644 index 0000000..18dd995 --- /dev/null +++ b/Assets/_Project/Scripts/Core/EnemyAbilityKind.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ec52a6b404fed65dfa48a63b5535373d \ No newline at end of file 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/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/Dev/DebugCommandRelay.cs b/Assets/_Project/Scripts/Dev/DebugCommandRelay.cs new file mode 100644 index 0000000..360b2a3 --- /dev/null +++ b/Assets/_Project/Scripts/Dev/DebugCommandRelay.cs @@ -0,0 +1,117 @@ +// Assets/_Project/Scripts/Dev/DebugCommandRelay.cs +using System.Collections.Generic; +using Unity.Netcode; +using UnityEngine; +using TD.Gameplay.Draft; +using TD.Gameplay.EnemyUpgrades; +using TD.Gameplay.Waves; + +namespace TD.Dev +{ + /// + /// Debug-only network relay: exposes one RPC that force-applies a + /// by its index, bypassing PlayerDraft's "must currently be + /// offered" check. + /// + /// + /// Lives entirely separate from PlayerDraft/DraftOption/DraftPool — none of those files + /// know this component exists. Removing this component (and TD.Dev.DebugConsole, which + /// calls it) leaves the shipping draft system completely untouched. + /// + /// Added to the Player prefab alongside PlayerDraft/PlayerGoldManager/etc. so it spawns + /// with a per-player OwnerClientId. Static per-client registry mirrors PlayerDraft's + /// GetForClient/Local pattern. + /// + public class DebugCommandRelay : NetworkBehaviour + { + private static readonly Dictionary s_byClientId + = new Dictionary(); + + public static DebugCommandRelay GetForClient(ulong clientId) + { + s_byClientId.TryGetValue(clientId, out var relay); + return relay; + } + + public static DebugCommandRelay Local + { + get + { + var nm = NetworkManager.Singleton; + if (nm == null || !nm.IsClient) return null; + return GetForClient(nm.LocalClientId); + } + } + + public override void OnNetworkSpawn() + { + s_byClientId[OwnerClientId] = this; + } + + public override void OnNetworkDespawn() + { + if (s_byClientId.TryGetValue(OwnerClientId, out var registered) && registered == this) + s_byClientId.Remove(OwnerClientId); + } + + /// + /// Owning client: force-apply the DraftOption at (its + /// DraftPool index) immediately, skipping the normal "must be currently offered" gate. + /// Debug/testing only — any connected client can grant themselves anything via this + /// RPC, same tradeoff DevWaveControls already accepts for its hotkeys. + /// + [Rpc(SendTo.Server, InvokePermission = RpcInvokePermission.Owner)] + public void DebugGrantDraftOptionRpc(int optionId) + { + var option = DraftPool.Instance != null ? DraftPool.Instance.Get(optionId) : null; + if (option == null) + { + Debug.LogWarning($"[DebugCommandRelay] Grant requested for unknown option id {optionId}."); + return; + } + + if (option.ServerApply(OwnerClientId)) + Debug.Log($"[DebugCommandRelay] Granted '{option.DisplayName}' to client {OwnerClientId}."); + else + Debug.LogWarning($"[DebugCommandRelay] '{option.DisplayName}' could not be applied " + + $"to client {OwnerClientId}."); + } + + /// + /// Force-apply the at (its + /// index) to the run's current wave slot — the same + /// recording WaveVote.ServerResolve does for a vote winner, skipping the vote + /// entirely. Not player-scoped: the effect lands on the run's current wave slot rather + /// than the caller, so any connected client's relay can trigger it. + /// + /// + /// Takes effect the next time this wave slot's enemies spawn, not retroactively on + /// enemies already alive — see 's remarks on why + /// applying is "record on the slot," not a direct mutation. + /// + [Rpc(SendTo.Server, InvokePermission = RpcInvokePermission.Owner)] + public void DebugGrantEnemyUpgradeRpc(int optionId) + { + var pool = EnemyUpgradePool.Instance; + var option = pool != null ? pool.Get(optionId) : null; + if (option == null) + { + Debug.LogWarning($"[DebugCommandRelay] Grant requested for unknown enemy upgrade id {optionId}."); + return; + } + + var run = RunState.Instance; + if (run == null) + { + Debug.LogWarning("[DebugCommandRelay] No RunState in this scene."); + return; + } + + int slot = run.CurrentUpgradeSlot; + run.ServerAddUpgrade(slot, optionId); + option.ServerOnApplied(run, slot); + + Debug.Log($"[DebugCommandRelay] Granted '{option.DisplayName}' to wave slot {slot}."); + } + } +} diff --git a/Assets/_Project/Scripts/Dev/DebugCommandRelay.cs.meta b/Assets/_Project/Scripts/Dev/DebugCommandRelay.cs.meta new file mode 100644 index 0000000..d7a2598 --- /dev/null +++ b/Assets/_Project/Scripts/Dev/DebugCommandRelay.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 65825b3189ae873948659b37b219f5e6 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Dev/DebugConsole.cs b/Assets/_Project/Scripts/Dev/DebugConsole.cs new file mode 100644 index 0000000..6ffbf2b --- /dev/null +++ b/Assets/_Project/Scripts/Dev/DebugConsole.cs @@ -0,0 +1,760 @@ +// Assets/_Project/Scripts/Dev/DebugConsole.cs +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using UnityEngine; +using UnityEngine.InputSystem; +using UnityEngine.UIElements; +using TD.UI; +using TD.Gameplay.Draft; +using TD.Gameplay.EnemyUpgrades; + +namespace TD.Dev +{ + /// + /// Standalone debug console overlay: press the toggle key to open a text + /// input, type a command, Enter to submit, Escape to cancel. + /// + /// + /// Deliberately decoupled from — own GameObject, + /// own UIDocument (it shares HUDPanelSettings, drawn above the HUD via a + /// higher sorting order) — so it can be dropped out of a build entirely by + /// not including that GameObject, the same way + /// is kept separate from shipping systems. + /// + /// The grammar lives in a tree (see + /// ) rather than in hardcoded string compares, + /// so the same definition drives both execution and the autocomplete list. + /// Supports one command so far: "get <type> <name>" grants a + /// to the local player via + /// . + /// + /// Keys while open: Up/Down move the suggestion highlight, Tab accepts it, + /// Enter accepts it while the command is still incomplete and submits once + /// it is complete, Escape closes without submitting. + /// + [RequireComponent(typeof(UIDocument))] + public class DebugConsole : MonoBehaviour + { + public static DebugConsole Instance { get; private set; } + + /// + /// True while the console overlay is showing. Legacy IMGUI (OnGUI) dev tools + /// draw after every runtime UI Toolkit panel regardless of sorting order, so they + /// have to check this and skip drawing rather than rely on layering. + /// + public static bool IsOpen => Instance != null && Instance.consoleOpen; + + [Tooltip("Keyboard shortcut that opens and closes the console. Uses the new Input " + + "System (UnityEngine.InputSystem.Key). Backquote is the physical ` / ~ key.")] + [SerializeField] private Key toggleKey = Key.Backquote; + + private DebugConsoleUI ui; + private bool consoleOpen; + + // Frame on which the console was opened or closed. The toggle key and Enter + // are ignored on that frame and the next so the keypress that opened/closed + // the console doesn't also get typed into the field or immediately submit it. + // Mirrors HUDController's chatToggleSuppressFrame. + private int toggleSuppressFrame = -1; + + // Current completion candidates for what's typed, the highlighted one, and the + // index in the input text where accepting a candidate starts overwriting. + private List suggestions = new List(); + private int selectedIndex; + private int fragmentStart; + + private void Awake() + { + if (Instance != null && Instance != this) + { + Debug.LogError("[DebugConsole] Duplicate instance detected. Destroying the new one."); + Destroy(gameObject); + return; + } + Instance = this; + } + + private void Start() + { + var doc = GetComponent(); + if (doc == null) + { + Debug.LogError("[DebugConsole] No UIDocument component found."); + return; + } + + var root = doc.rootVisualElement; + if (root == null) + { + Debug.LogError("[DebugConsole] rootVisualElement is null. " + + "Check that Panel Settings is assigned."); + return; + } + + ui = new DebugConsoleUI(root); + + // Focus tracking — contributes to the same flag HUDController's chat + // input sets, so camera/builder/spell input all stay gated correctly + // regardless of which text field currently has focus. + ui.CommandInput.RegisterCallback(_ => HUDController.IsTextInputActive = true); + ui.CommandInput.RegisterCallback(_ => HUDController.IsTextInputActive = false); + + ui.CommandInput.RegisterValueChangedCallback(_ => RefreshSuggestions()); + + // Tab and the arrows can't be polled from Keyboard.current the way Enter and + // Escape are (below): UI Toolkit would still insert a tab character and move + // the focus ring before Update runs. Intercept them on the field in the + // trickle-down phase, before the text engine and the focus ring see them. + ui.CommandInput.RegisterCallback(OnConsoleKeyDown, TrickleDown.TrickleDown); + ui.CommandInput.RegisterCallback(OnConsoleNavigationMove, + TrickleDown.TrickleDown); + } + + private void Update() + { + var kb = Keyboard.current; + if (kb == null) return; // no keyboard connected (e.g. headless server) + + if (Time.frameCount <= toggleSuppressFrame) return; + + if (toggleKey != Key.None && kb[toggleKey].wasPressedThisFrame) + { + if (consoleOpen) CloseConsole(); + else OpenConsole(); + return; + } + + if (!consoleOpen) return; + + bool enterDown = kb.enterKey.wasPressedThisFrame || kb.numpadEnterKey.wasPressedThisFrame; + bool escDown = kb.escapeKey.wasPressedThisFrame; + + if (enterDown) SubmitCommand(); + else if (escDown) CloseConsole(); + } + + private void OnConsoleKeyDown(KeyDownEvent evt) + { + if (!consoleOpen) return; + + switch (evt.keyCode) + { + case KeyCode.Tab: + AcceptSelectedSuggestion(); + Swallow(evt); + return; + case KeyCode.DownArrow: + MoveSelection(1); + Swallow(evt); + return; + case KeyCode.UpArrow: + MoveSelection(-1); + Swallow(evt); + return; + } + + // Tab reaches the field twice — once carrying keyCode, once carrying only the + // '\t' character. Swallow the second one too or a literal tab lands in the text. + if (evt.character == '\t') Swallow(evt); + } + + // UI Toolkit also translates Tab into a focus-ring navigation event, separately + // from the key event above. Block it so Tab can't move focus off the console. + private void OnConsoleNavigationMove(NavigationMoveEvent evt) + { + if (!consoleOpen) return; + Swallow(evt); + } + + // Consume an event so neither the text engine nor the focus ring acts on it. + // EventBase.PreventDefault is obsolete in Unity 6; FocusController.IgnoreEvent is + // its replacement for the focus-navigation half. + private void Swallow(EventBase evt) + { + evt.StopImmediatePropagation(); + ui.CommandInput?.panel?.focusController?.IgnoreEvent(evt); + } + + private void OpenConsole() + { + if (ui.CommandInput == null) return; + ui.Show(); + ui.CommandInput.SetValueWithoutNotify(string.Empty); + RefreshSuggestions(); + + // Suppress the toggle key and Enter for this frame and the next so the + // keypress that opened the console doesn't also get typed into the field. + // Focus is deferred a frame for the same reason — UI Toolkit would + // otherwise route the open keypress to the freshly-focused TextField. + toggleSuppressFrame = Time.frameCount + 1; + consoleOpen = true; + StartCoroutine(FocusNextFrame()); + } + + private IEnumerator FocusNextFrame() + { + yield return null; + if (consoleOpen && ui.CommandInput != null) + { + ui.CommandInput.Focus(); + ui.CommandInput.SelectAll(); + } + } + + private void CloseConsole() + { + if (ui.CommandInput != null) + { + ui.CommandInput.SetValueWithoutNotify(string.Empty); + ui.CommandInput.Blur(); + } + ui.Hide(); + + suggestions.Clear(); + selectedIndex = 0; + ui.ClearSuggestions(); + + consoleOpen = false; + toggleSuppressFrame = Time.frameCount + 1; + SuppressHudChatOpen(); + } + + // The Enter that submitted/accepted in this console also gets polled by + // HUDController's chat this same frame — suppress its "Enter opens chat" branch + // (HUDController.HandleChatInput, which gates only on this frame counter) so + // using the debug console never pops chat open too. + private static void SuppressHudChatOpen() + { + HUDController.SuppressChatOpenUntilFrame = Time.frameCount + 1; + } + + private void SubmitCommand() + { + string text = ui.CommandInput?.value ?? string.Empty; + + // Enter doubles as "accept the highlighted suggestion" while the typed + // command isn't runnable yet, so you can drive the whole thing with Enter + // and only ever hit Tab when you want to skip past the highlighted row. + if (!string.IsNullOrWhiteSpace(text) && suggestions.Count > 0 && !IsComplete(text)) + { + AcceptSelectedSuggestion(); + SuppressHudChatOpen(); + return; + } + + CloseConsole(); + + if (string.IsNullOrWhiteSpace(text)) return; + ExecuteCommand(text.Trim()); + } + + // ---------------------------------------------------------------- grammar + + /// + /// One token level of the command grammar. Literal levels list their + /// ; a level that takes a free-form final argument sets + /// to enumerate the valid values for completion. + /// + private sealed class CommandNode + { + public string Token; // literal token; null for the root + public string Hint; // dim one-liner shown beside the token + public Func> Values; // non-null => this level takes a final value + public bool Executable; // a complete command can end here + public Action Execute; // "Values" level: run the completed command + public readonly List Children = new List(); + } + + private const string UsageHint = "Try: get , grant enemy "; + + // Maps the type token in "get " to the DraftOption subclass it + // should match against. Add an entry here whenever a new DraftOption subclass + // should be gettable from the console — the command tree and its autocomplete + // list are both built from this. + private static readonly Dictionary DraftTypeAliases = + new Dictionary(StringComparer.OrdinalIgnoreCase) + { + { "spell", typeof(BuilderSpellDraftOption) }, + { "tower", typeof(NewTowerDraftOption) }, + { "buff", typeof(BuilderEffectDraftOption) }, + { "effect", typeof(BuilderEffectDraftOption) }, + }; + + private CommandNode commandTree; + private CommandNode CommandTree => commandTree ?? (commandTree = BuildCommandTree()); + + private static CommandNode BuildCommandTree() + { + var root = new CommandNode(); + + var get = new CommandNode + { + Token = "get", + Hint = "grant a draft option to the local player", + }; + root.Children.Add(get); + + foreach (var pair in DraftTypeAliases) + { + string typeToken = pair.Key; + var optionType = pair.Value; + get.Children.Add(new CommandNode + { + Token = typeToken, + Hint = "", + Executable = true, + Values = () => DraftOptionNames(optionType), + Execute = name => ExecuteGet(typeToken, optionType, name), + }); + } + + var grant = new CommandNode + { + Token = "grant", + Hint = "grant a buff to the enemies", + }; + root.Children.Add(grant); + + grant.Children.Add(new CommandNode + { + Token = "enemy", + Hint = "", + Executable = true, + Values = EnemyUpgradeNames, + Execute = ExecuteGrantEnemyAbility, + }); + + return root; + } + + // Display names of every pooled DraftOption of the given subclass, alphabetically. + // Recomputed per keystroke rather than cached: DraftPool is a scene singleton that + // may not exist yet when the console is built, and the pool is only a handful of + // entries. Uses DraftPool's existing Count/Get surface — the same one ExecuteGet + // walks — so completion can never offer something the command can't resolve. + private static List DraftOptionNames(Type optionType) + { + var names = new List(); + + var pool = DraftPool.Instance; + if (pool == null) return names; + + for (int i = 0; i < pool.Count; i++) + { + var option = pool.Get(i); + if (option == null || !optionType.IsInstanceOfType(option)) continue; + + string name = option.DisplayName; + if (string.IsNullOrWhiteSpace(name)) continue; + if (names.Contains(name)) continue; + + names.Add(name); + } + + names.Sort(StringComparer.OrdinalIgnoreCase); + return names; + } + + // Display names of every pooled EnemyUpgradeOption, alphabetically. Mirrors + // DraftOptionNames above — EnemyUpgradePool is the enemy-side equivalent of DraftPool, + // and this is the same Count/Get surface ExecuteGrantEnemyAbility walks. Includes + // non-ability cards too (e.g. the vote-meta "Double Dip") — DebugGrantEnemyUpgradeRpc + // resolves through EnemyUpgradeOption.ServerOnApplied regardless of subclass, so + // there's nothing this command can't actually grant. + private static List EnemyUpgradeNames() + { + var names = new List(); + + var pool = EnemyUpgradePool.Instance; + if (pool == null) return names; + + for (int i = 0; i < pool.Count; i++) + { + var option = pool.Get(i); + if (option == null) continue; + + string name = option.DisplayName; + if (string.IsNullOrWhiteSpace(name)) continue; + if (names.Contains(name)) continue; + + names.Add(name); + } + + names.Sort(StringComparer.OrdinalIgnoreCase); + return names; + } + + // Valid literal tokens at a level, for error messages ("Expected one of: ..."). + private static string ChildTokens(CommandNode node) + { + var tokens = new List(); + for (int i = 0; i < node.Children.Count; i++) tokens.Add(node.Children[i].Token); + tokens.Sort(StringComparer.OrdinalIgnoreCase); + return string.Join(", ", tokens); + } + + private static CommandNode FindChild(CommandNode node, string token) + { + for (int i = 0; i < node.Children.Count; i++) + if (string.Equals(node.Children[i].Token, token, StringComparison.OrdinalIgnoreCase)) + return node.Children[i]; + return null; + } + + // Whitespace tokenizer that also reports where each token starts, so completion + // knows which span of the raw input a candidate would replace. + private static void Tokenize(string text, List tokens, List starts) + { + tokens.Clear(); + starts.Clear(); + + int i = 0; + while (i < text.Length) + { + while (i < text.Length && char.IsWhiteSpace(text[i])) i++; + if (i >= text.Length) break; + + int start = i; + while (i < text.Length && !char.IsWhiteSpace(text[i])) i++; + tokens.Add(text.Substring(start, i - start)); + starts.Add(start); + } + } + + // ------------------------------------------------------------- completion + + private struct Suggestion + { + public string Text; // what replaces the current fragment + public string Hint; // dim trailing text, display only + public bool AppendSpace; // true when more tokens follow this one + } + + private readonly List walkTokens = new List(); + private readonly List walkStarts = new List(); + + /// + /// Candidates for the token currently being typed, plus (via + /// ) the index in where + /// accepting one starts overwriting. + /// + private List ComputeSuggestions(string text, out int fragStart) + { + text = text ?? string.Empty; + Tokenize(text, walkTokens, walkStarts); + + bool endsWithSpace = text.Length > 0 && char.IsWhiteSpace(text[text.Length - 1]); + + var node = CommandTree; + int i = 0; + + while (true) + { + // Free-form final argument: everything from here to the end of the line is + // one value, so multi-word names ("Slow Area") complete as a single unit — + // matching how ExecuteCommand rejoins the trailing tokens. + if (node.Values != null) + { + fragStart = i < walkTokens.Count ? walkStarts[i] : text.Length; + string valueFragment = i < walkTokens.Count + ? text.Substring(fragStart).Trim() + : string.Empty; + return FilterValues(node.Values(), valueFragment); + } + + // Nothing typed at this level yet — offer everything it accepts. + if (i >= walkTokens.Count) + { + fragStart = text.Length; + return FilterChildren(node, string.Empty); + } + + // Last token with no trailing space is still being typed: complete it + // rather than trying to descend through it. + if (i == walkTokens.Count - 1 && !endsWithSpace) + { + fragStart = walkStarts[i]; + return FilterChildren(node, walkTokens[i]); + } + + var child = FindChild(node, walkTokens[i]); + if (child == null) + { + // A finished token that matches nothing — the rest of the line is + // unreachable, so there's nothing useful to suggest. + fragStart = walkStarts[i]; + return new List(); + } + + node = child; + i++; + } + } + + private static List FilterChildren(CommandNode node, string fragment) + { + var result = new List(); + for (int i = 0; i < node.Children.Count; i++) + { + var child = node.Children[i]; + if (fragment.Length > 0 && + !child.Token.StartsWith(fragment, StringComparison.OrdinalIgnoreCase)) + continue; + + result.Add(new Suggestion + { + Text = child.Token, + Hint = child.Hint, + AppendSpace = child.Children.Count > 0 || child.Values != null, + }); + } + result.Sort((a, b) => string.Compare(a.Text, b.Text, StringComparison.OrdinalIgnoreCase)); + return result; + } + + // Values are matched on the same normalized form execution uses, so anything the + // list offers for "slow_ar" is something ExecuteGet would also accept. + private static List FilterValues(List values, string fragment) + { + var result = new List(); + string normalizedFragment = Normalize(fragment); + + for (int i = 0; i < values.Count; i++) + { + if (normalizedFragment.Length > 0 && + !Normalize(values[i]).StartsWith(normalizedFragment, StringComparison.Ordinal)) + continue; + + result.Add(new Suggestion { Text = values[i], AppendSpace = false }); + } + return result; + } + + /// True when is a runnable command as typed. + private bool IsComplete(string text) + { + Tokenize(text ?? string.Empty, walkTokens, walkStarts); + + var node = CommandTree; + int i = 0; + + while (i < walkTokens.Count) + { + if (node.Values != null) break; + + var child = FindChild(node, walkTokens[i]); + if (child == null) return false; + + node = child; + i++; + } + + if (!node.Executable) return false; + + if (node.Values != null) + { + if (i >= walkTokens.Count) return false; // value level, nothing typed for it + + string normalized = Normalize(string.Join(" ", walkTokens.GetRange(i, walkTokens.Count - i))); + var values = node.Values(); + for (int v = 0; v < values.Count; v++) + if (Normalize(values[v]) == normalized) return true; + + return false; + } + + return true; + } + + // --------------------------------------------------------- suggestion UI + + private void RefreshSuggestions() + { + if (ui.CommandInput == null) return; + + // Keep the highlight on the same candidate when it survives the new filter, + // so typing another character doesn't silently move what Enter would accept. + string previouslySelected = selectedIndex >= 0 && selectedIndex < suggestions.Count + ? suggestions[selectedIndex].Text + : null; + + suggestions = ComputeSuggestions(ui.CommandInput.value, out fragmentStart); + + selectedIndex = 0; + if (previouslySelected != null) + { + for (int i = 0; i < suggestions.Count; i++) + { + if (!string.Equals(suggestions[i].Text, previouslySelected, StringComparison.Ordinal)) + continue; + selectedIndex = i; + break; + } + } + + ui.RenderSuggestions(ToSuggestionRows(suggestions), selectedIndex); + } + + private static List ToSuggestionRows(List suggestions) + { + var rows = new List(suggestions.Count); + for (int i = 0; i < suggestions.Count; i++) + rows.Add(new DebugConsoleUI.SuggestionRow(suggestions[i].Text, suggestions[i].Hint)); + return rows; + } + + private void MoveSelection(int delta) + { + if (suggestions.Count == 0) return; + + selectedIndex = (selectedIndex + delta) % suggestions.Count; + if (selectedIndex < 0) selectedIndex += suggestions.Count; + + ui.RenderSuggestions(ToSuggestionRows(suggestions), selectedIndex); + } + + private bool AcceptSelectedSuggestion() + { + if (ui.CommandInput == null) return false; + if (selectedIndex < 0 || selectedIndex >= suggestions.Count) return false; + + var suggestion = suggestions[selectedIndex]; + string text = ui.CommandInput.value ?? string.Empty; + int start = Mathf.Clamp(fragmentStart, 0, text.Length); + + string completed = text.Substring(0, start) + suggestion.Text + + (suggestion.AppendSpace ? " " : string.Empty); + + // SetValueWithoutNotify + an explicit refresh instead of assigning value: + // one deterministic recompute, and the caret placement below can't race the + // change callback. + ui.CommandInput.SetValueWithoutNotify(completed); + ui.CommandInput.SelectRange(completed.Length, completed.Length); + RefreshSuggestions(); + return true; + } + + // ------------------------------------------------------------- execution + + private void ExecuteCommand(string text) + { + Tokenize(text, walkTokens, walkStarts); + + var node = CommandTree; + int i = 0; + + while (i < walkTokens.Count && node.Values == null) + { + var child = FindChild(node, walkTokens[i]); + if (child == null) + { + Debug.Log($"[DebugConsole] Unrecognized token \"{walkTokens[i]}\" in " + + $"\"{text}\". Expected one of: {ChildTokens(node)}. {UsageHint}"); + return; + } + + node = child; + i++; + } + + if (node.Values == null || !node.Executable || i >= walkTokens.Count) + { + Debug.Log($"[DebugConsole] Incomplete command: \"{text}\". {UsageHint}"); + return; + } + + string nameToken = string.Join(" ", walkTokens.GetRange(i, walkTokens.Count - i)); + node.Execute(nameToken); + } + + // "get ": grants any DraftOption of the given type whose DisplayName + // matches , via the local player's DebugCommandRelay. Reuses DraftOption's + // existing type-agnostic ServerApply dispatch instead of hardcoding a grant path + // per option type. + private static void ExecuteGet(string typeToken, Type optionType, string nameToken) + { + var pool = DraftPool.Instance; + if (pool == null) + { + Debug.LogWarning("[DebugConsole] No DraftPool in this scene."); + return; + } + + string normalizedTarget = Normalize(nameToken); + for (int i = 0; i < pool.Count; i++) + { + var option = pool.Get(i); + if (option == null || !optionType.IsInstanceOfType(option)) continue; + if (Normalize(option.DisplayName) != normalizedTarget) continue; + + var relay = DebugCommandRelay.Local; + if (relay == null) + { + Debug.LogWarning("[DebugConsole] No local DebugCommandRelay found — " + + "is it on the Player prefab?"); + return; + } + + relay.DebugGrantDraftOptionRpc(i); + return; + } + + Debug.LogWarning($"[DebugConsole] No {typeToken} option named \"{nameToken}\" found."); + } + + // "grant enemy ": the same effect as the post-wave vote picking that ability + // card for the current wave slot — records it via RunState.ServerAddUpgrade and runs + // its ServerOnApplied, mirroring WaveVote.ServerResolve exactly (see DebugCommandRelay. + // DebugGrantEnemyUpgradeRpc). Takes effect the next time this wave slot's enemies + // spawn, not retroactively on enemies already alive. + private static void ExecuteGrantEnemyAbility(string nameToken) + { + var pool = EnemyUpgradePool.Instance; + if (pool == null) + { + Debug.LogWarning("[DebugConsole] No EnemyUpgradePool in this scene."); + return; + } + + string normalizedTarget = Normalize(nameToken); + for (int i = 0; i < pool.Count; i++) + { + var option = pool.Get(i); + if (option == null || Normalize(option.DisplayName) != normalizedTarget) continue; + + var relay = DebugCommandRelay.Local; + if (relay == null) + { + Debug.LogWarning("[DebugConsole] No local DebugCommandRelay found — " + + "is it on the Player prefab?"); + return; + } + + relay.DebugGrantEnemyUpgradeRpc(i); + return; + } + + Debug.LogWarning($"[DebugConsole] No enemy ability named \"{nameToken}\" found."); + } + + // DisplayName is player-facing draft card text (its spacing/casing is chosen for + // presentation, not for typing), so command matching strips everything but letters + // and digits before comparing — "Slow Area", "slow_area", and "SlowArea" all match + // the same option. + private static string Normalize(string s) + { + if (string.IsNullOrEmpty(s)) return string.Empty; + var sb = new StringBuilder(s.Length); + foreach (char c in s) + if (char.IsLetterOrDigit(c)) sb.Append(char.ToLowerInvariant(c)); + return sb.ToString(); + } + + private void OnDestroy() + { + if (Instance == this) Instance = null; + } + } +} diff --git a/Assets/_Project/Scripts/Dev/DebugConsole.cs.meta b/Assets/_Project/Scripts/Dev/DebugConsole.cs.meta new file mode 100644 index 0000000..c9a3292 --- /dev/null +++ b/Assets/_Project/Scripts/Dev/DebugConsole.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7c6a808e8291552d0b64e36a210879c4 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Dev/DebugConsoleUI.cs b/Assets/_Project/Scripts/Dev/DebugConsoleUI.cs new file mode 100644 index 0000000..808dd29 --- /dev/null +++ b/Assets/_Project/Scripts/Dev/DebugConsoleUI.cs @@ -0,0 +1,185 @@ +// Assets/_Project/Scripts/Dev/DebugConsoleUI.cs +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.UIElements; + +namespace TD.Dev +{ + /// + /// Builds and draws 's VisualElement tree: the input bar and + /// its autocomplete list. Owns presentation only — element construction, styling, and + /// row rendering — no command grammar, keybinding, or suggestion-selection logic; that + /// stays in , which drives this class through its public + /// members and reads/writes directly for focus and value. + /// + internal sealed class DebugConsoleUI + { + // Beyond this many candidates the list is truncated with a "+N more" row so a + // large DraftPool can't grow the console bar off the top of the screen. + private const int MaxVisibleSuggestions = 12; + + /// One row of the autocomplete list: a candidate token plus an optional dim hint. + public readonly struct SuggestionRow + { + public readonly string Text; + public readonly string Hint; + + public SuggestionRow(string text, string hint) + { + Text = text; + Hint = hint; + } + } + + public TextField CommandInput { get; } + + private readonly VisualElement consoleContainer; + private readonly VisualElement suggestionList; + + public DebugConsoleUI(VisualElement uiRoot) + { + // Top-anchored bar, closed by default. Distinct position from the HUD's + // bottom-left chat panel so the two never overlap. + consoleContainer = new VisualElement(); + consoleContainer.pickingMode = PickingMode.Ignore; + consoleContainer.style.position = Position.Absolute; + consoleContainer.style.left = 0; + consoleContainer.style.right = 0; + consoleContainer.style.top = 0; + consoleContainer.style.paddingTop = 8; + consoleContainer.style.paddingBottom = 8; + consoleContainer.style.paddingLeft = 12; + consoleContainer.style.paddingRight = 12; + // Fully opaque: the console is a text-entry overlay that has to stay readable + // over the level, the HUD, and whatever else is on screen. + consoleContainer.style.backgroundColor = new Color(0f, 0f, 0f, 1f); + consoleContainer.style.display = DisplayStyle.None; + + CommandInput = new TextField(); + CommandInput.style.minHeight = 28; + CommandInput.style.width = Length.Percent(100); + CommandInput.maxLength = 200; + CommandInput.isDelayed = false; + StyleConsoleInput(CommandInput); + + suggestionList = new VisualElement(); + suggestionList.pickingMode = PickingMode.Ignore; + suggestionList.style.flexDirection = FlexDirection.Column; + suggestionList.style.marginTop = 4; + suggestionList.style.display = DisplayStyle.None; + + consoleContainer.Add(CommandInput); + consoleContainer.Add(suggestionList); + uiRoot.Add(consoleContainer); + } + + // Mirrors HUDController.StyleChatInputDark — dark background, white text, + // a thin border, and inner padding so ascenders/descenders don't clip. + // Green border (vs. chat's neutral gray) as a quick visual "this is the + // debug console, not chat" cue. + private static void StyleConsoleInput(TextField field) + { + var darkBg = new Color(0.05f, 0.05f, 0.05f, 1f); + var borderClr = new Color(0.35f, 0.75f, 0.35f); + + field.style.backgroundColor = darkBg; + field.style.color = Color.white; + field.style.borderTopWidth = field.style.borderBottomWidth = + field.style.borderLeftWidth = field.style.borderRightWidth = 1; + field.style.borderTopColor = field.style.borderBottomColor = + field.style.borderLeftColor = field.style.borderRightColor = borderClr; + + var inner = field.Q("unity-text-input"); + if (inner != null) + { + inner.style.backgroundColor = darkBg; + inner.style.color = Color.white; + inner.style.paddingTop = 4; + inner.style.paddingBottom = 4; + inner.style.paddingLeft = 6; + inner.style.paddingRight = 6; + } + } + + // One autocomplete row: the candidate token plus an optional dim hint. Rows are + // pickingMode Ignore and keyboard-driven only — nothing here is clickable, which + // avoids the recursive picking-mode problem documented in HUDController's chat + // panel (clicks falling through to the game world via a ScrollView's internal + // wrapper element). + private static VisualElement BuildSuggestionRow(string text, string hint, bool selected) + { + var row = new VisualElement(); + row.pickingMode = PickingMode.Ignore; + row.style.flexDirection = FlexDirection.Row; + row.style.minHeight = 20; + row.style.paddingLeft = 6; + row.style.paddingRight = 6; + row.style.backgroundColor = selected + ? new Color(0.16f, 0.38f, 0.16f, 1f) // matches the green console cue + : new Color(0.05f, 0.05f, 0.05f, 1f); + + var label = new Label(text); + label.pickingMode = PickingMode.Ignore; + label.style.color = Color.white; + label.style.unityFontStyleAndWeight = selected ? FontStyle.Bold : FontStyle.Normal; + row.Add(label); + + if (!string.IsNullOrEmpty(hint)) + { + var hintLabel = new Label(hint); + hintLabel.pickingMode = PickingMode.Ignore; + hintLabel.style.color = new Color(0.6f, 0.6f, 0.6f); + hintLabel.style.marginLeft = 12; + row.Add(hintLabel); + } + + return row; + } + + public void Show() + { + consoleContainer.style.display = DisplayStyle.Flex; + consoleContainer.pickingMode = PickingMode.Position; + } + + public void Hide() + { + consoleContainer.style.display = DisplayStyle.None; + consoleContainer.pickingMode = PickingMode.Ignore; + } + + // Windows the list around selectedIndex so arrowing past MaxVisibleSuggestions + // keeps the selected row on screen instead of scrolling it out of the truncated view. + public void RenderSuggestions(List rows, int selectedIndex) + { + suggestionList.Clear(); + + if (rows == null || rows.Count == 0) + { + suggestionList.style.display = DisplayStyle.None; + return; + } + + suggestionList.style.display = DisplayStyle.Flex; + + int start = rows.Count > MaxVisibleSuggestions + ? Mathf.Clamp(selectedIndex - MaxVisibleSuggestions / 2, 0, + rows.Count - MaxVisibleSuggestions) + : 0; + int end = Mathf.Min(start + MaxVisibleSuggestions, rows.Count); + + for (int i = start; i < end; i++) + suggestionList.Add(BuildSuggestionRow(rows[i].Text, rows[i].Hint, i == selectedIndex)); + + int hidden = rows.Count - (end - start); + if (hidden > 0) + suggestionList.Add(BuildSuggestionRow($"+{hidden} more", null, false)); + } + + public void ClearSuggestions() + { + suggestionList.Clear(); + suggestionList.style.display = DisplayStyle.None; + } + } +} diff --git a/Assets/_Project/Scripts/Dev/DebugConsoleUI.cs.meta b/Assets/_Project/Scripts/Dev/DebugConsoleUI.cs.meta new file mode 100644 index 0000000..66e439e --- /dev/null +++ b/Assets/_Project/Scripts/Dev/DebugConsoleUI.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: fce39b2f68ef0f3f9bec299aa46d353a \ No newline at end of file diff --git a/Assets/_Project/Scripts/Dev/DevWaveControls.cs b/Assets/_Project/Scripts/Dev/DevWaveControls.cs index 2dfd6ff..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() @@ -52,13 +59,20 @@ namespace TD.Dev if (NetworkManager.Singleton == null || !NetworkManager.Singleton.IsServer) return; + // IMGUI draws after every runtime UI Toolkit panel, so this box would cover the + // debug console's autocomplete list no matter what sorting order the console's + // PanelSettings uses. Yield to the console while it's open. + if (DebugConsole.IsOpen) return; + // 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 @@ -113,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/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/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/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/ActiveBuff.cs b/Assets/_Project/Scripts/Gameplay/ActiveBuff.cs deleted file mode 100644 index 3a54012..0000000 --- a/Assets/_Project/Scripts/Gameplay/ActiveBuff.cs +++ /dev/null @@ -1,61 +0,0 @@ -// Assets/_Project/Scripts/Gameplay/ActiveBuff.cs -using System; -using Unity.Collections; -using Unity.Netcode; -using TD.Core; - -namespace TD.Gameplay -{ - /// - /// One buff currently held by a player. Stored in - /// 's NetworkList so all peers see the same set. - /// - /// - /// IEquatable. NGO's NetworkList indexer setter short-circuits when - /// Equals returns true, silently dropping the write. Every mutable field - /// (only ) is included in the comparison so toggling a - /// buff correctly propagates to clients. - /// - public struct ActiveBuff : INetworkSerializable, IEquatable - { - /// Which tower stat this buff multiplies. - public BuffStat Stat; - - /// Multiplicative factor, e.g. 1.25 for +25%. - public float Multiplier; - - /// - /// False when disabled (e.g. by an enemy ability). Excluded from - /// while false. - /// - public bool IsActive; - - /// Human-readable name for the HUD buff list. - public FixedString64Bytes DisplayName; - - // ----- INetworkSerializable --------------------------------------- - - public void NetworkSerialize(BufferSerializer serializer) where T : IReaderWriter - { - byte statByte = (byte)Stat; - serializer.SerializeValue(ref statByte); - Stat = (BuffStat)statByte; - - serializer.SerializeValue(ref Multiplier); - serializer.SerializeValue(ref IsActive); - serializer.SerializeValue(ref DisplayName); - } - - // ----- IEquatable ------------------------------------------------- - - public bool Equals(ActiveBuff other) - => Stat == other.Stat - && Multiplier == other.Multiplier - && IsActive == other.IsActive - && DisplayName == other.DisplayName; - - public override bool Equals(object obj) => obj is ActiveBuff other && Equals(other); - - public override int GetHashCode() => HashCode.Combine((int)Stat, Multiplier, IsActive); - } -} diff --git a/Assets/_Project/Scripts/Gameplay/ActiveBuff.cs.meta b/Assets/_Project/Scripts/Gameplay/ActiveBuff.cs.meta deleted file mode 100644 index d6868bd..0000000 --- a/Assets/_Project/Scripts/Gameplay/ActiveBuff.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: b09203f8acc450bf3b3c4bd8ef3fe84e \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/BuffCategory.cs b/Assets/_Project/Scripts/Gameplay/BuffCategory.cs deleted file mode 100644 index bad6ee3..0000000 --- a/Assets/_Project/Scripts/Gameplay/BuffCategory.cs +++ /dev/null @@ -1,23 +0,0 @@ -// Assets/_Project/Scripts/Gameplay/BuffCategory.cs -using UnityEngine; - -namespace TD.Gameplay -{ - /// - /// A purchasable category of buffs. The player pays gold - /// and receives a randomly chosen from . - /// - [CreateAssetMenu(fileName = "BuffCategory", menuName = "TD/Buffs/Buff Category")] - public class BuffCategory : ScriptableObject - { - [Tooltip("Name shown on the buff menu purchase button.")] - public string DisplayName; - - [Tooltip("Gold cost to purchase one random buff from this category.")] - [Min(0)] - public int Cost; - - [Tooltip("Set of buffs the player can receive. One is chosen uniformly at random.")] - public BuffDefinition[] Pool; - } -} diff --git a/Assets/_Project/Scripts/Gameplay/BuffCategory.cs.meta b/Assets/_Project/Scripts/Gameplay/BuffCategory.cs.meta deleted file mode 100644 index c2d766d..0000000 --- a/Assets/_Project/Scripts/Gameplay/BuffCategory.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 516e8faec948a4b3d977ec019376c438 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/BuffDefinition.cs b/Assets/_Project/Scripts/Gameplay/BuffDefinition.cs deleted file mode 100644 index 951972e..0000000 --- a/Assets/_Project/Scripts/Gameplay/BuffDefinition.cs +++ /dev/null @@ -1,24 +0,0 @@ -// Assets/_Project/Scripts/Gameplay/BuffDefinition.cs -using UnityEngine; -using TD.Core; - -namespace TD.Gameplay -{ - /// - /// One possible buff that can be awarded to a player. Lives in a - /// 's pool and is drawn randomly on purchase. - /// - [CreateAssetMenu(fileName = "BuffDefinition", menuName = "TD/Buffs/Buff Definition")] - public class BuffDefinition : ScriptableObject - { - [Tooltip("Name shown in the buff menu and tooltip.")] - public string DisplayName; - - [Tooltip("Which tower stat this buff multiplies.")] - public BuffStat Stat; - - [Tooltip("Multiplicative factor applied to the stat. 1.25 = +25%.")] - [Min(1f)] - public float Multiplier = 1.25f; - } -} diff --git a/Assets/_Project/Scripts/Gameplay/BuffDefinition.cs.meta b/Assets/_Project/Scripts/Gameplay/BuffDefinition.cs.meta deleted file mode 100644 index 12b38db..0000000 --- a/Assets/_Project/Scripts/Gameplay/BuffDefinition.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: b01f9aea62ee8a1c1991bb2a097de224 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/BuildSiteVisual.cs b/Assets/_Project/Scripts/Gameplay/BuildSiteVisual.cs index 3ba4d76..7e85cc4 100644 --- a/Assets/_Project/Scripts/Gameplay/BuildSiteVisual.cs +++ b/Assets/_Project/Scripts/Gameplay/BuildSiteVisual.cs @@ -3,19 +3,21 @@ using Unity.Netcode; using UnityEngine; using TD.Core; using TD.Towers; +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 @@ -26,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, @@ -47,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; @@ -62,22 +59,12 @@ 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("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; + [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; // ----- Networked state -------------------------------------------- @@ -125,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, @@ -197,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 @@ -236,16 +237,9 @@ 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; // ----- Lifecycle -------------------------------------------------- @@ -295,15 +289,20 @@ 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) + { + 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; // Apply initial visual state based on the (now-replicated) values. - ApplyStageVisual(currentStage.Value); + ApplyStageMaterialAndTint(currentStage.Value); } public override void OnNetworkDespawn() @@ -353,25 +352,12 @@ namespace TD.Gameplay private void Update() { - // 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()); + // Drive the targeting reticle on every peer, every stage: 0 while Queued + // (full-size reticle, awaiting a builder), shrinking while Constructing, frozen + // 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()); } // ----- Server API ------------------------------------------------- @@ -494,9 +480,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) { @@ -514,37 +500,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) @@ -563,115 +523,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/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/BuilderInputController.cs b/Assets/_Project/Scripts/Gameplay/BuilderInputController.cs index ce1e258..955f301 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 @@ -138,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(); } @@ -150,13 +152,21 @@ namespace TD.Gameplay // controllers handle right-click as cancel there) and when over HUD. if (isModal) return; - // B: toggle buff menu. - if (keyboard != null && keyboard.bKey.wasPressedThisFrame - && !HUDController.IsTextInputActive) + // Tab: select the builder, or (if already selected) recenter the camera on it. + if (keyboard != null && keyboard.tabKey.wasPressedThisFrame + && !HUDController.IsUiCapturingInput) { - HUDController.Instance?.ToggleBuffMenu(); + 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; @@ -277,5 +287,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 new file mode 100644 index 0000000..557fe3d --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpellCastController.cs @@ -0,0 +1,265 @@ +// 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; + + // 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; + 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.IsUiCapturingInput) + ScanHotkeys(); + + 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) + { + 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) + { + // 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; + + 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..2bf7c9e --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpells/BuilderSpellDefinition.cs @@ -0,0 +1,110 @@ +// 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. + /// 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 + { + /// 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); + + /// + /// 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 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/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..1327be9 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpells/BuilderSpellPool.cs @@ -0,0 +1,69 @@ +// 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..b4917ca --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpells/FireballSpellDefinition.cs @@ -0,0 +1,85 @@ +// Assets/_Project/Scripts/Gameplay/BuilderSpells/FireballSpellDefinition.cs +using UnityEngine; +using TD.Audio; +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 reticule, 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("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; + + [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 " + + "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)] + 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; + } + + 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/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..4885848 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaSpellDefinition.cs @@ -0,0 +1,78 @@ +// Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaSpellDefinition.cs +using UnityEngine; +using TD.Audio; +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. + /// + /// The cast spawns a that lingers for + /// and keeps re-applying the slow to anything standing in + /// the radius, so enemies walking through the area get slowed rather than only whatever + /// happened to be standing there at the exact instant of cast. + /// + /// + [CreateAssetMenu(fileName = "SlowAreaSpell", menuName = "TD/Builder Spells/Slow Area")] + public class SlowAreaSpellDefinition : BuilderSpellDefinition + { + 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).")] + [Range(0f, 1f)] + public float SlowFactor = 0.5f; + + [Tooltip("Seconds the slow lasts on an affected enemy, and how long the area itself " + + "lingers, re-slowing anything that walks through it. 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); + + SlowAreaZone.Spawn(targetPoint, Mathf.Max(Radius, 0.01f), SlowFactor, + EffectDuration, enemyLayerMask, owner); + + return true; + } + + public override void ClientSpawnVfx(Vector3 targetPoint) + { + if (areaVfxPrefab != null) + { + var instance = Instantiate(areaVfxPrefab, targetPoint, Quaternion.identity); + 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/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/BuilderSpells/SlowAreaUpgradedSpellDefinition.cs b/Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaUpgradedSpellDefinition.cs new file mode 100644 index 0000000..dd339f7 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaUpgradedSpellDefinition.cs @@ -0,0 +1,21 @@ +// Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaUpgradedSpellDefinition.cs + +using TD.Core; +using UnityEngine; + +namespace TD.Gameplay.BuilderSpells +{ + /// + /// Draft upgrade for — identical behavior, just a + /// distinct so can replace the base spell + /// with this one in the player's loadout. All fields (SlowFactor, EffectDuration, etc.) + /// are inherited; author this asset with a longer EffectDuration than the base spell. + /// + [CreateAssetMenu(fileName = "SlowAreaUpgradedSpell", + menuName = "TD/Builder Spells/Slow Area (Upgraded)")] + public class SlowAreaUpgradedSpellDefinition : SlowAreaSpellDefinition + { + public override BuilderSpellKind Kind => BuilderSpellKind.SlowAreaUpgraded; + } +} diff --git a/Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaUpgradedSpellDefinition.cs.meta b/Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaUpgradedSpellDefinition.cs.meta new file mode 100644 index 0000000..af8991f --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaUpgradedSpellDefinition.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 37cc60a4a6e53e24cb6d1c0be310868a \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaZone.cs b/Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaZone.cs new file mode 100644 index 0000000..de1c76a --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaZone.cs @@ -0,0 +1,77 @@ +// Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaZone.cs +using UnityEngine; +using TD.Core; + +namespace TD.Gameplay.BuilderSpells +{ + /// + /// Server-only, non-networked lingering area spawned by + /// . Re-scans its radius on an + /// interval for its lifetime and keeps refreshing the slow on anything standing + /// inside, so enemies get slowed as they walk through rather than only at the + /// instant of cast. + /// + /// + /// Never spawned as a — it runs + /// server-side only, and the slow it applies already reaches clients through + /// 's own NetworkVariable, the same as an instant hit. + /// + public class SlowAreaZone : MonoBehaviour + { + private const float TickInterval = 0.2f; + + private float radius; + private float slowFactor; + private float effectDuration; + private LayerMask enemyLayerMask; + private PlayerSlot owner; + + private readonly Collider[] overlapBuffer = new Collider[64]; + private float tickTimer; + + public static SlowAreaZone Spawn(Vector3 position, float radius, float slowFactor, + float effectDuration, LayerMask enemyLayerMask, PlayerSlot owner) + { + var zoneObject = new GameObject("SlowAreaZone (Server)"); + zoneObject.transform.position = position; + + var zone = zoneObject.AddComponent(); + zone.radius = radius; + zone.slowFactor = slowFactor; + zone.effectDuration = effectDuration; + zone.enemyLayerMask = enemyLayerMask; + zone.owner = owner; + zone.ApplyToOverlapping(); + + Destroy(zoneObject, effectDuration); + return zone; + } + + private void Update() + { + tickTimer -= Time.deltaTime; + if (tickTimer > 0f) return; + + ApplyToOverlapping(); + } + + private void ApplyToOverlapping() + { + tickTimer = TickInterval; + + int count = Physics.OverlapSphereNonAlloc( + transform.position, radius, overlapBuffer, enemyLayerMask); + + for (int i = 0; i < count; i++) + { + var enemyHealth = overlapBuffer[i].GetComponent(); + if (enemyHealth == null || enemyHealth.IsDead) continue; + + var enemyStatus = overlapBuffer[i].GetComponent(); + if (enemyStatus == null) continue; + + enemyStatus.ApplyEffect(DamageType.Cold, slowFactor, effectDuration, owner); + } + } + } +} diff --git a/Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaZone.cs.meta b/Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaZone.cs.meta new file mode 100644 index 0000000..7c880a9 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderSpells/SlowAreaZone.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7b00a1f57e8be13cd91c0ed5f515bfc8 \ 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..6b81aea --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/BuilderUpgradeManager.cs @@ -0,0 +1,141 @@ +// 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 . + /// + /// + /// 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 otherwise + /// permanent for the match — the only way one leaves the granted set is + /// swapping it for its upgraded replacement. + /// + /// 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 -------------------------------------------- + + // 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; + + // ----- NGO lifecycle ------------------------------------------------ + + public override void OnNetworkSpawn() + { + s_byClientId[OwnerClientId] = this; + grantedKinds.OnListChanged += HandleGrantedKindsChanged; + } + + public override void OnNetworkDespawn() + { + grantedKinds.OnListChanged -= HandleGrantedKindsChanged; + + if (s_byClientId.TryGetValue(OwnerClientId, out var registered) && registered == this) + s_byClientId.Remove(OwnerClientId); + } + + private void HandleGrantedKindsChanged(NetworkListEvent change) => OnUpgradesChanged?.Invoke(); + + // ----- Read API ----------------------------------------------------- + + /// True if this player has been granted the given effect. + public bool PlayerHasEffect(BuilderEffectKind kind) => grantedKinds.Contains((byte)kind); + + /// + /// 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; + + byte value = (byte)kind; + if (grantedKinds.Contains(value)) return false; + + grantedKinds.Add(value); + return true; + } + + /// + /// Server-only: replaces a previously granted effect with a different one (an upgrade + /// pick). No-op if the old effect isn't currently granted or the new one already is. + /// Returns true if the swap happened. + /// + public bool ServerUpgradeEffect(BuilderEffectKind oldKind, BuilderEffectKind newKind) + { + if (!IsServer) return false; + + byte newValue = (byte)newKind; + if (grantedKinds.Contains(newValue)) return false; + + byte oldValue = (byte)oldKind; + if (!grantedKinds.Remove(oldValue)) return false; + + grantedKinds.Add(newValue); + return true; + } + } +} 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/CameraController.cs b/Assets/_Project/Scripts/Gameplay/CameraController.cs index b80f33e..4a2009a 100644 --- a/Assets/_Project/Scripts/Gameplay/CameraController.cs +++ b/Assets/_Project/Scripts/Gameplay/CameraController.cs @@ -227,16 +227,18 @@ 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.) - var kb = HUDController.IsTextInputActive ? null : Keyboard.current; + // 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) 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.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/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/Draft/BuilderEffectUpgradeDraftOption.cs b/Assets/_Project/Scripts/Gameplay/Draft/BuilderEffectUpgradeDraftOption.cs new file mode 100644 index 0000000..46022b5 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/Draft/BuilderEffectUpgradeDraftOption.cs @@ -0,0 +1,42 @@ +// Assets/_Project/Scripts/Gameplay/Draft/BuilderEffectUpgradeDraftOption.cs +using UnityEngine; +using TD.Core; +using TD.Gameplay.BuilderEffects; + +namespace TD.Gameplay.Draft +{ + /// + /// Draft choice — "upgrade a builder effect you already have". Replaces + /// with in the player's + /// . + /// + /// + /// Mirrors , but swaps rather than adds. Only offered + /// while the player currently has granted — once taken, + /// is removed, which automatically makes this option (and any sibling + /// upgrade branching off the same base) invalid for future drafts. + /// + [CreateAssetMenu(fileName = "BuilderEffectUpgradeOption", + menuName = "TD/Draft/Builder Effect Upgrade Option")] + public class BuilderEffectUpgradeDraftOption : DraftOption + { + [Header("Payload")] + [Tooltip("The builder effect this option upgrades from.")] + public BuilderEffectKind BaseKind; + + [Tooltip("The builder effect this option upgrades to.")] + public BuilderEffectKind UpgradedKind; + + public override bool IsValidFor(ulong clientId) + { + var upgrades = BuilderUpgradeManager.GetForClient(clientId); + return upgrades != null && upgrades.PlayerHasEffect(BaseKind); + } + + public override bool ServerApply(ulong clientId) + { + var upgrades = BuilderUpgradeManager.GetForClient(clientId); + return upgrades != null && upgrades.ServerUpgradeEffect(BaseKind, UpgradedKind); + } + } +} diff --git a/Assets/_Project/Scripts/Gameplay/Draft/BuilderEffectUpgradeDraftOption.cs.meta b/Assets/_Project/Scripts/Gameplay/Draft/BuilderEffectUpgradeDraftOption.cs.meta new file mode 100644 index 0000000..393a4c1 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/Draft/BuilderEffectUpgradeDraftOption.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 717648113e8090fc6856744d898ab375 \ 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..360a566 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/Draft/BuilderSpellDraftOption.cs @@ -0,0 +1,52 @@ +// 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. Gates on rather than + /// current possession, so a base spell already upgraded past (see + /// ) is never re-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.PlayerHasEverGranted(Kind); + } + + public override bool ServerApply(ulong clientId) + { + 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/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/Draft/BuilderSpellUpgradeDraftOption.cs b/Assets/_Project/Scripts/Gameplay/Draft/BuilderSpellUpgradeDraftOption.cs new file mode 100644 index 0000000..a9d56bd --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/Draft/BuilderSpellUpgradeDraftOption.cs @@ -0,0 +1,52 @@ +// Assets/_Project/Scripts/Gameplay/Draft/BuilderSpellUpgradeDraftOption.cs +using UnityEngine; +using TD.Core; +using TD.Gameplay.BuilderSpells; + +namespace TD.Gameplay.Draft +{ + /// + /// Draft choice — "upgrade a builder spell you already have". Replaces + /// with in the player's + /// , in place — the upgraded spell keeps the same hotkey + /// slot the base spell occupied. + /// + /// + /// Mirrors , but swaps rather than adds (so it doesn't + /// consume a slot). Only offered while the player currently has + /// granted — once taken, is removed, which automatically makes this + /// option (and any sibling upgrade branching off the same base) invalid for future drafts. + /// + [CreateAssetMenu(fileName = "BuilderSpellUpgradeOption", + menuName = "TD/Draft/Builder Spell Upgrade Option")] + public class BuilderSpellUpgradeDraftOption : DraftOption + { + [Header("Payload")] + [Tooltip("The builder spell this option upgrades from.")] + public BuilderSpellKind BaseKind; + + [Tooltip("The builder spell this option upgrades to.")] + public BuilderSpellKind UpgradedKind; + + public override bool IsValidFor(ulong clientId) + { + var loadout = PlayerSpellLoadout.GetForClient(clientId); + return loadout != null && loadout.PlayerHasSpell(BaseKind); + } + + public override bool ServerApply(ulong clientId) + { + var loadout = PlayerSpellLoadout.GetForClient(clientId); + return loadout != null && loadout.ServerUpgradeSpell(BaseKind, UpgradedKind); + } + + /// Inherits the upgraded 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(UpgradedKind) : null; + return def != null ? def.Icon : null; + } + } +} diff --git a/Assets/_Project/Scripts/Gameplay/Draft/BuilderSpellUpgradeDraftOption.cs.meta b/Assets/_Project/Scripts/Gameplay/Draft/BuilderSpellUpgradeDraftOption.cs.meta new file mode 100644 index 0000000..2d6304f --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/Draft/BuilderSpellUpgradeDraftOption.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7b1c5b562f39c72eea3bafd0165af078 \ No newline at end of file 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/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/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/Draft/PlayerDraft.cs b/Assets/_Project/Scripts/Gameplay/Draft/PlayerDraft.cs index 3fd7350..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. @@ -137,31 +140,44 @@ 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); } - /// - /// 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, RequireOwnership = true)] - 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 new file mode 100644 index 0000000..841d627 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/Draft/TowerUpgradeDraftOption.cs @@ -0,0 +1,80 @@ +// Assets/_Project/Scripts/Gameplay/Draft/TowerUpgradeDraftOption.cs +using UnityEngine; +using TD.Towers; + +namespace TD.Gameplay.Draft +{ + /// + /// 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. + /// + /// + /// 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 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 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 upgrades = PlayerTowerUpgrades.GetForClient(clientId); + var pm = TowerPlacementManager.Instance; + + if (deck == null || upgrades == null || pm == null) return false; + if (BaseTower == null || UpgradedTower == null) return false; + + 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 upgrades = PlayerTowerUpgrades.GetForClient(clientId); + var pm = TowerPlacementManager.Instance; + if (upgrades == null || pm == null || UpgradedTower == null) return false; + + if (!pm.TryGetTypeId(UpgradedTower, out int upgradedTypeId)) + { + Debug.LogError($"[TowerUpgradeDraftOption] '{UpgradedTower.name}' is not in the " + + $"tower catalog; cannot apply. Add it to " + + $"TowerPlacementManager.towerDefinitions."); + return false; + } + + return upgrades.ServerUnlock(upgradedTypeId); + } + + /// Inherits the upgraded tower's icon unless this option assigns an override. + public override Sprite ResolveIcon() + => Icon != null ? Icon : (UpgradedTower != null ? UpgradedTower.Icon : null); + } +} diff --git a/Assets/_Project/Scripts/Gameplay/Draft/TowerUpgradeDraftOption.cs.meta b/Assets/_Project/Scripts/Gameplay/Draft/TowerUpgradeDraftOption.cs.meta new file mode 100644 index 0000000..a35a5d2 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/Draft/TowerUpgradeDraftOption.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: aeec22f152a57ef5798eae035c091543 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/EnemyAbilities.meta b/Assets/_Project/Scripts/Gameplay/EnemyAbilities.meta new file mode 100644 index 0000000..099a1ab --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyAbilities.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1c918164b61faf1d5af9f782c5237a60 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Scripts/Gameplay/EnemyAbilities/BlinkAbilityDefinition.cs b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/BlinkAbilityDefinition.cs new file mode 100644 index 0000000..c00904c --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/BlinkAbilityDefinition.cs @@ -0,0 +1,56 @@ +// 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 = 8f; + + [Tooltip("World units to advance along the path per blink.")] + [Min(0.1f)] + public float BlinkDistanceMeters = 4f; + + public override void ServerOnSpawn(EnemyAbility instance, int abilityIndex) + { + // Seed each enemy's cooldown with a random point within the full interval, as if it + // spawned already partway through a cooldown. A small jitter window near zero would + // still let a burst of enemies spawned together sync up and blink as a visible cluster + // every cycle; spreading across the whole interval avoids that regardless of how + // IntervalSeconds is tuned. 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. + instance.TimerFor(abilityIndex) = -Random.Range(0f, IntervalSeconds); + } + + 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(BlinkDistanceMeters); + } + } +} 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 new file mode 100644 index 0000000..d80b430 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemyAbilityDefinition.cs @@ -0,0 +1,107 @@ +// Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemyAbilityDefinition.cs +using UnityEngine; +using TD.Core; + +namespace TD.Gameplay.EnemyAbilities +{ + /// + /// 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. + /// + /// + /// 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. + /// + /// 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 + { + /// Which enemy ability this asset's data belongs to. + public abstract EnemyAbilityKind Kind { get; } + + [Header("Presentation")] + [Tooltip("Name shown in debug logs and the enemy-info panel.")] + public string DisplayName; + + [Tooltip("Short description shown in the enemy-info panel.")] + [TextArea(2, 4)] + public string Description; + + // ----- Spawn-time stat modification -------------------------------- + + /// + /// 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. + /// 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. + /// + /// 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/EnemyAbilityDefinition.cs.meta b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemyAbilityDefinition.cs.meta new file mode 100644 index 0000000..b94f8dd --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemyAbilityDefinition.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 855f7f0848d3086868816d25295fcdd6 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemyAbilityPool.cs b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemyAbilityPool.cs new file mode 100644 index 0000000..09a0880 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemyAbilityPool.cs @@ -0,0 +1,71 @@ +// Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemyAbilityPool.cs +using System; +using UnityEngine; +using TD.Core; + +namespace TD.Gameplay.EnemyAbilities +{ + /// + /// 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. Mirrors exactly. + /// + /// + /// Plain MonoBehaviour: identical on every peer (same assets), so there is nothing to sync. + /// + /// 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 + { + public static EnemyAbilityPool Instance { get; private set; } + + [Tooltip("Every EnemyAbilityDefinition asset available this match. One entry per " + + "EnemyAbilityKind — order doesn't matter, Kind on the asset itself decides " + + "its slot.")] + [SerializeField] private EnemyAbilityDefinition[] abilities; + + // 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 EnemyAbilityDefinition[] byKind; + + private void Awake() + { + if (Instance != null && Instance != this) + { + Debug.LogError("[EnemyAbilityPool] Multiple instances detected. Only one per scene."); + return; + } + Instance = this; + + int kindCount = Enum.GetValues(typeof(EnemyAbilityKind)).Length; + byKind = new EnemyAbilityDefinition[kindCount]; + if (abilities == null) return; + + for (int i = 0; i < abilities.Length; i++) + { + var def = abilities[i]; + if (def == null) continue; + byKind[(int)def.Kind] = def; + } + } + + private void OnDestroy() + { + if (Instance == this) Instance = null; + } + + /// Returns the ability asset for , or null if none is + /// authored in this pool. + public EnemyAbilityDefinition Get(EnemyAbilityKind kind) + { + int i = (int)kind; + return (byKind != null && i >= 0 && i < byKind.Length) ? byKind[i] : null; + } + } +} diff --git a/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemyAbilityPool.cs.meta b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemyAbilityPool.cs.meta new file mode 100644 index 0000000..a951ada --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemyAbilityPool.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4409eb25a8be555de8dc3a73d4ed95db \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemySpawnContext.cs b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemySpawnContext.cs new file mode 100644 index 0000000..67fda7b --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemySpawnContext.cs @@ -0,0 +1,52 @@ +// 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, 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/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 new file mode 100644 index 0000000..1d96391 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/SplitOnDeathAbilityDefinition.cs @@ -0,0 +1,92 @@ +// Assets/_Project/Scripts/Gameplay/EnemyAbilities/SplitOnDeathAbilityDefinition.cs +using UnityEngine; +using TD.Core; + +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. + /// + /// + /// 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 copies spawn when the parent dies.")] + [Min(1)] + public int SplitCount = 2; + + [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("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("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; + + public override void ServerOnDeath(EnemyAbility instance, EnemyHealth health) + { + var def = health.Definition; + if (def == null) return; + + 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, minion); + } + } +} diff --git a/Assets/_Project/Scripts/Gameplay/EnemyAbilities/SplitOnDeathAbilityDefinition.cs.meta b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/SplitOnDeathAbilityDefinition.cs.meta new file mode 100644 index 0000000..8c2a4f3 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/SplitOnDeathAbilityDefinition.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 21543cb1b54f0b16e9c80584f68988b3 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/EnemyAbility.cs b/Assets/_Project/Scripts/Gameplay/EnemyAbility.cs new file mode 100644 index 0000000..8913543 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyAbility.cs @@ -0,0 +1,199 @@ +// Assets/_Project/Scripts/Gameplay/EnemyAbility.cs +using System.Collections.Generic; +using Unity.Netcode; +using UnityEngine; +using TD.Core; +using TD.Gameplay.EnemyAbilities; + +namespace TD.Gameplay +{ + /// + /// 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 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 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 + { + // 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 readonly List pendingDefinitions = new List(); + private bool hasPendingInit; + + // ----- Public state ----------------------------------------------------- + + private readonly List definitions = new List(); + + /// 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 or empty, + /// meaning this enemy carries no wave buffs. + /// + /// + /// 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) + { + 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 -------------------------------------------------- + + public override void OnNetworkSpawn() + { + if (!IsServer || !hasPendingInit) return; + + definitions.Clear(); + definitions.AddRange(pendingDefinitions); + hasPendingInit = false; + + timers = definitions.Count > 0 + ? new float[definitions.Count] + : System.Array.Empty(); + + 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 || 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/EnemyAbility.cs.meta b/Assets/_Project/Scripts/Gameplay/EnemyAbility.cs.meta new file mode 100644 index 0000000..3562455 --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/EnemyAbility.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9d1a26a32e8969cd29bce6010126a5f6 \ No newline at end of file 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 4d0e7ea..28f6ab9 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,13 +68,14 @@ namespace TD.Gameplay private int pendingLivesCost = 1; private bool pendingIsFlying; private bool pendingIsHeld; + private bool pendingIsBoss; private bool hasPendingInit; // ----- 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; @@ -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 --------------------------------------------------------- /// @@ -126,6 +148,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 ------------------------------------- /// @@ -133,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. @@ -155,6 +182,7 @@ namespace TD.Gameplay hp.Value = pendingMaxHp; isFlying.Value = pendingIsFlying; isHeld.Value = pendingIsHeld; + isBoss.Value = pendingIsBoss; hasPendingInit = false; } @@ -162,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. @@ -171,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. @@ -240,6 +273,7 @@ namespace TD.Gameplay if (deathAnimator != null) deathAnimator.SetTrigger(DieHash); + DiedClientRpc(); StartCoroutine(DeathSequence()); } @@ -263,6 +297,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/EnemyMovement.cs b/Assets/_Project/Scripts/Gameplay/EnemyMovement.cs index 86195c6..6815ff2 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. /// @@ -71,6 +73,11 @@ namespace TD.Gameplay // the goal). Without this, every zone crossing was counted as a leak; only // the originating player should be credited a leak per the design. private PlayerSlot originZone = PlayerSlot.None; + + /// The zone (player) this enemy was originally spawned for — see + /// . Used by on-death abilities (e.g. Split on Death) so + /// spawned children preserve the same leak attribution as their parent. + public PlayerSlot OriginZone => originZone; // Latches once the enemy has crossed its origin zone's leak volume, so we // never double-count a leak if the enemy re-enters its origin (rare but // possible if pathing is dynamic). @@ -168,15 +175,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 -------------------------------------------------- @@ -272,10 +282,81 @@ namespace TD.Gameplay NetworkObject.Despawn(); } + // ----- Ability-driven movement ---------------------------------------- + + /// + /// Server-only: teleport this enemy forward along its existing path by up to + /// world units. 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. Walking the path keeps the enemy inside the maze — + /// it cuts corners, it doesn't ignore them. + /// + /// Distance is measured along the path (waypoint to waypoint), consuming the + /// budget one segment at a time, so the landing spot can fall mid-segment rather than + /// snapping to a waypoint. This keeps the blink distance predictable regardless of how + /// far apart the path's waypoints happen to be — unlike skipping a fixed waypoint count, + /// where one blink could span a few tiles or the length of the whole map depending on + /// path smoothing. + /// + /// Zone tracking runs once, on the final landing 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 (or past) the final waypoint resolves as a normal goal arrival, + /// despawn and life cost included. + /// + public void ServerBlinkForward(float meters) + { + if (!IsServer || meters <= 0f) return; + if (hasReachedGoal || remainingPath.Count == 0) return; + if (health != null && health.IsHeld) return; + + float remaining = meters; + Vector3 position = transform.position; + + while (remaining > 0f && remainingPath.Count > 0) + { + Vector3 targetWorld = GridCoordinates.GridToWorld(remainingPath[0]); + Vector3 toTarget = targetWorld - position; + toTarget.y = 0f; + float distance = toTarget.magnitude; + + if (distance <= remaining) + { + // Reach this waypoint fully and keep walking the leftover budget + // into the next segment. + remaining -= distance; + position = new Vector3(targetWorld.x, position.y, targetWorld.z); + remainingPath.RemoveAt(0); + } + else + { + // Budget runs out partway along this segment. + position += toTarget.normalized * remaining; + remaining = 0f; + } + } + + // Preserve Y so flyers stay at altitude and grounded pivots don't sink. + transform.position = position; + + if (remainingPath.Count == 0) + { + HandleGoalReached(); + return; + } + + CheckZoneTransition(GridCoordinates.WorldToGrid(position)); + } + // ----- 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/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/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..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,20 +70,58 @@ 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.")] - 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 wave number, or null if out of range. + /// Returns the gold rules for the given 1-based encounter number + /// (RunState.GlobalEncounterNumber), or null if out of range. /// - public WaveGoldEntry GetWaveEntry(int waveNumber) + /// + /// 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 EncounterGoldEntry GetEncounterEntry(int encounterNumber) { - if (Waves == null) return null; - int index = waveNumber - 1; - if (index < 0 || index >= Waves.Length) return null; - return Waves[index]; + if (Encounters == null) return null; + int index = encounterNumber - 1; + 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/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/Gameplay/PlayerBuffManager.cs b/Assets/_Project/Scripts/Gameplay/PlayerBuffManager.cs deleted file mode 100644 index 506791e..0000000 --- a/Assets/_Project/Scripts/Gameplay/PlayerBuffManager.cs +++ /dev/null @@ -1,195 +0,0 @@ -// Assets/_Project/Scripts/Gameplay/PlayerBuffManager.cs -using System.Collections.Generic; -using Unity.Collections; -using Unity.Netcode; -using UnityEngine; -using TD.Core; - -namespace TD.Gameplay -{ - /// - /// Holds all buffs currently owned by one player. Lives on the Player prefab - /// alongside and . - /// - /// - /// Purchase flow. The owning client calls - /// with a category index. The server - /// validates gold, deducts the cost, picks a random - /// from the category's pool, and appends an - /// to the replicated list. - /// - /// Multiplier query. is called by - /// on the server each time a tower fires. - /// It multiplies all active buffs for the requested stat together. - /// - /// Enable / disable. Enemies can call - /// and by index to temporarily suppress buffs - /// without removing them from the list. - /// - public class PlayerBuffManager : NetworkBehaviour - { - // ----- Static registry (mirrors PlayerGoldManager pattern) ----------- - - private static readonly Dictionary s_byClientId - = new Dictionary(); - - /// Returns the PlayerBuffManager owned by the given client, or null. - public static PlayerBuffManager GetForClient(ulong clientId) - { - s_byClientId.TryGetValue(clientId, out var mgr); - return mgr; - } - - /// Convenience: the local client's own buff manager. - public static PlayerBuffManager Local - { - get - { - var nm = NetworkManager.Singleton; - if (nm == null) return null; - return GetForClient(nm.LocalClientId); - } - } - - // ----- Inspector ------------------------------------------------------ - - [Tooltip("Purchasable buff categories shown in the buff menu. Index in this " + - "array is the categoryIndex passed to RequestPurchaseBuffRpc.")] - [SerializeField] private BuffCategory[] categories; - - private NetworkList buffs; - - private void Awake() - { - buffs = new NetworkList(); - } - - // ----- NGO lifecycle ---------------------------------------------- - - public override void OnNetworkSpawn() - { - s_byClientId[OwnerClientId] = this; - } - - public override void OnNetworkDespawn() - { - if (s_byClientId.TryGetValue(OwnerClientId, out var registered) && registered == this) - s_byClientId.Remove(OwnerClientId); - } - - // ----- Public API ------------------------------------------------- - - /// - /// Returns the combined multiplier for across all - /// active buffs owned by this player. Returns 1.0 if no matching buffs - /// are active. Safe to call from any peer. - /// - public float GetMultiplier(BuffStat stat) - { - float result = 1f; - for (int i = 0; i < buffs.Count; i++) - { - var buff = buffs[i]; - if (buff.Stat == stat && buff.IsActive) - result *= buff.Multiplier; - } - return result; - } - - /// - /// Returns the number of buff categories available, for building the UI. - /// - public int CategoryCount => categories?.Length ?? 0; - - /// Returns the category at the given index, or null. - public BuffCategory GetCategory(int index) - => (categories != null && index >= 0 && index < categories.Length) - ? categories[index] - : null; - - /// Read-only access to the buff list for UI rendering. - public NetworkList Buffs => buffs; - - // ----- Server helpers --------------------------------------------- - - /// - /// Server-only: disables the buff at . - /// The buff remains in the list and can be re-enabled. - /// - public void ServerDisableBuff(int index) - { - if (!IsServer) return; - if (index < 0 || index >= buffs.Count) return; - - var b = buffs[index]; - if (!b.IsActive) return; - b.IsActive = false; - buffs[index] = b; - } - - /// Server-only: re-enables the buff at . - public void ServerEnableBuff(int index) - { - if (!IsServer) return; - if (index < 0 || index >= buffs.Count) return; - - var b = buffs[index]; - if (b.IsActive) return; - b.IsActive = true; - buffs[index] = b; - } - - // ----- Purchase RPC ----------------------------------------------- - - /// - /// Owning-client entry point. Sends a request to the server to purchase - /// a random buff from the category at . - /// The server validates gold and adds the buff if the purchase succeeds. - /// - [Rpc(SendTo.Server, RequireOwnership = true)] - public void RequestPurchaseBuffRpc(int categoryIndex) - { - if (categories == null || categoryIndex < 0 || categoryIndex >= categories.Length) - { - Debug.LogWarning("[PlayerBuffManager] RequestPurchaseBuff: invalid category index."); - return; - } - - var category = categories[categoryIndex]; - if (category == null || category.Pool == null || category.Pool.Length == 0) - { - Debug.LogWarning("[PlayerBuffManager] RequestPurchaseBuff: category has no buffs."); - return; - } - - var goldManager = PlayerGoldManager.GetForClient(OwnerClientId); - if (goldManager == null) - { - Debug.LogError("[PlayerBuffManager] RequestPurchaseBuff: no PlayerGoldManager found."); - return; - } - - if (goldManager.CurrentGold < category.Cost) - { - Debug.Log($"[PlayerBuffManager] Client {OwnerClientId} cannot afford " + - $"'{category.DisplayName}' (cost {category.Cost}, " + - $"gold {goldManager.CurrentGold})."); - return; - } - - goldManager.DeductGold(category.Cost); - - var def = category.Pool[Random.Range(0, category.Pool.Length)]; - buffs.Add(new ActiveBuff - { - Stat = def.Stat, - Multiplier = def.Multiplier, - IsActive = true, - DisplayName = new FixedString64Bytes(def.DisplayName ?? string.Empty), - }); - - Debug.Log($"[PlayerBuffManager] Client {OwnerClientId} purchased buff " + - $"'{def.DisplayName}' ({def.Stat} ×{def.Multiplier})."); - } - } -} diff --git a/Assets/_Project/Scripts/Gameplay/PlayerBuffManager.cs.meta b/Assets/_Project/Scripts/Gameplay/PlayerBuffManager.cs.meta deleted file mode 100644 index b1951a5..0000000 --- a/Assets/_Project/Scripts/Gameplay/PlayerBuffManager.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 7775ee3a2f441b52480aabf54be6c1b6 \ No newline at end of file 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/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/PlayerSpellLoadout.cs b/Assets/_Project/Scripts/Gameplay/PlayerSpellLoadout.cs new file mode 100644 index 0000000..4782e9f --- /dev/null +++ b/Assets/_Project/Scripts/Gameplay/PlayerSpellLoadout.cs @@ -0,0 +1,268 @@ +// Assets/_Project/Scripts/Gameplay/PlayerSpellLoadout.cs +using System.Collections; +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 . 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 + { + /// 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(); + + // Every kind ever granted this match, including ones since upgraded away. Unlike + // `spells`, entries here are never removed — see PlayerHasEverGranted. + private readonly NetworkList everGrantedKinds = 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 this player has ever been granted the given spell this match, whether or + /// not it's still occupying a slot (e.g. it may have since been upgraded away). Used + /// by so a base spell already + /// upgraded past is never re-offered. + /// + public bool PlayerHasEverGranted(BuilderSpellKind kind) => everGrantedKinds.Contains((byte)kind); + + /// 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)); + if (!everGrantedKinds.Contains((byte)kind)) everGrantedKinds.Add((byte)kind); + return true; + } + + /// + /// Server-only: replaces a previously granted spell with a different one (an upgrade + /// pick), in place — the upgraded spell keeps the base spell's hotkey slot and starts + /// off cooldown. No-op if the old spell isn't currently granted or the new one already + /// is. Returns true if the swap happened. + /// + public bool ServerUpgradeSpell(BuilderSpellKind oldKind, BuilderSpellKind newKind) + { + if (!IsServer) return false; + if (PlayerHasSpell(newKind)) return false; + + for (int i = 0; i < spells.Count; i++) + { + if (spells[i].Kind == oldKind) + { + spells[i] = SpellSlot.CreateReady(newKind); + if (!everGrantedKinds.Contains((byte)newKind)) everGrantedKinds.Add((byte)newKind); + return true; + } + } + return false; + } + + // ----- 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, InvokePermission = RpcInvokePermission.Owner)] + 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.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; + } + + // 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) + { + 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/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/PlayerTowerDeck.cs b/Assets/_Project/Scripts/Gameplay/PlayerTowerDeck.cs index eb5687c..9d7b54d 100644 --- a/Assets/_Project/Scripts/Gameplay/PlayerTowerDeck.cs +++ b/Assets/_Project/Scripts/Gameplay/PlayerTowerDeck.cs @@ -7,8 +7,8 @@ namespace TD.Gameplay { /// /// Per-player set of unlocked tower types — the player's "deck". Lives on the - /// Player prefab alongside , - /// , and . + /// Player prefab alongside and + /// . /// /// /// Roguelike keystone. Players no longer see every tower in the match @@ -146,5 +146,30 @@ namespace TD.Gameplay unlockedTypeIds.Add(towerTypeId); return true; } + + /// + /// Server-only: replaces a previously unlocked tower type with a different one (an + /// upgrade pick) — every tower of that type placed from now on uses the new definition. + /// Already-placed towers keep whatever type they were placed with; this only changes + /// what's placeable going forward. No-op if the old type isn't currently unlocked or + /// the new one already is. Returns true if the swap happened. + /// + public bool ServerUpgradeTower(int oldTypeId, int newTypeId) + { + if (!IsServer) return false; + if (newTypeId <= 0) return false; + if (Contains(newTypeId)) return false; + + for (int i = 0; i < unlockedTypeIds.Count; i++) + { + if (unlockedTypeIds[i] == oldTypeId) + { + unlockedTypeIds.RemoveAt(i); + unlockedTypeIds.Add(newTypeId); + return true; + } + } + return false; + } } } 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/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/Gameplay/TowerInstance.cs b/Assets/_Project/Scripts/Gameplay/TowerInstance.cs index 724776e..6128ab4 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; @@ -55,6 +56,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. @@ -93,6 +106,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. @@ -132,6 +163,19 @@ 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; + + /// 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 @@ -166,6 +210,21 @@ namespace TD.Gameplay } } + // ----- Events --------------------------------------------------------- + + /// 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 ------------------------------------- /// @@ -220,6 +279,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; } @@ -239,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); @@ -262,11 +330,14 @@ namespace TD.Gameplay $"for {ownerSlot.Value} at anchor {anchorTile.Value}. " + $"IsServer={IsServer}"); } + + OnBuiltClient?.Invoke(); } 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. @@ -309,6 +380,230 @@ 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; + } + + // ----- 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 + /// 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 @@ -368,11 +663,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/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/Gameplay/TowerPlacementManager.cs b/Assets/_Project/Scripts/Gameplay/TowerPlacementManager.cs index 7c4662d..3706dfb 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,113 @@ 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); + } + + // 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) + { + 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); + } + + // ----- 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 7398dd0..5eeb6e5 100644 --- a/Assets/_Project/Scripts/Gameplay/WaveDefinition.cs +++ b/Assets/_Project/Scripts/Gameplay/WaveDefinition.cs @@ -41,5 +41,70 @@ 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. + /// + /// 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 + { + 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 5c8f7dd..a40ed28 100644 --- a/Assets/_Project/Scripts/Gameplay/WaveManager.cs +++ b/Assets/_Project/Scripts/Gameplay/WaveManager.cs @@ -3,45 +3,57 @@ using System.Collections; using Unity.Netcode; using UnityEngine; 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. /// /// @@ -53,18 +65,29 @@ 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 " + "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; @@ -93,14 +116,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(); @@ -176,6 +212,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 @@ -185,7 +226,7 @@ namespace TD.Gameplay } if (ms.Phase == MatchPhase.Playing) - StartNextWave(); + StartRun(); } public override void OnNetworkDespawn() @@ -198,13 +239,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. @@ -228,34 +262,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. @@ -270,23 +352,100 @@ 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: + { + // 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; {destroyed} tower(s) destroyed."); + 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); @@ -314,59 +473,41 @@ 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(); + ResolveCurrentEncounterHealth(def); + // Spawn all enemies at once in a held (untargetable, immobile) state. if (def.Entries != null) { @@ -403,6 +544,197 @@ 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)."); + } + + // ----- 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) @@ -428,7 +760,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); } } @@ -453,7 +787,16 @@ 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) { @@ -463,6 +806,17 @@ 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, currentEncounterHpShare * def.HpMultiplier); + 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); @@ -472,8 +826,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 { @@ -489,6 +843,12 @@ namespace TD.Gameplay spawnPos, Quaternion.Euler(0f, yaw, 0f)); + // 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 (!Mathf.Approximately(context.VisualScale, 1f)) + go.transform.localScale *= context.VisualScale; + var health = go.GetComponent(); var movement = go.GetComponent(); @@ -500,8 +860,25 @@ namespace TD.Gameplay return; } - health.InitializeServer(def.MaxHp, 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); + + 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. + var ability = go.GetComponent(); + if (ability != 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); health.OnDied += HandleEnemyKilled; @@ -513,33 +890,86 @@ namespace TD.Gameplay go.GetComponent().Spawn(); } + /// + /// Server-only: spawns copies of at + /// , continuing that tile's A* path onward rather than + /// restarting from a wave spawner. Used by on-death abilities (e.g. + /// SplitOnDeathAbilityDefinition) to spawn smaller enemies from a corpse's + /// position. Reuses so split children get the same + /// activeEnemyCount/event-wiring bookkeeping as any other spawn. + /// + /// + /// 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, + EnemySpawnContext context) + { + if (!IsServer) return; + for (int i = 0; i < count; i++) + SpawnEnemy(def, atTile, ownerSlot, + abilities: null, + contextOverride: context, + xHalfExtent: scatterRadius, zHalfExtent: scatterRadius); + } + // ----- Enemy event handlers (server-only) ------------------------- 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(currentWaveIndex + 1); + var goldEntry = goldConfig?.GetEncounterEntry(CurrentEncounterNumber); if (goldEntry != null) killReward = goldEntry.GoldPerEnemy; - // Award kill gold to the tower owner that landed the killing blow. + // 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. 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); + + // 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. + enemyAbility?.ServerInvokeOnDeath(health); UnsubscribeEnemy(health); DecrementAndCheckComplete(); @@ -567,6 +997,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); @@ -599,8 +1034,41 @@ 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); + } + + // 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 @@ -647,17 +1115,24 @@ 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 // 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(currentWaveIndex + 1); + var entry = goldConfig?.GetEncounterEntry(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..b31b585 --- /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.Encounters is indexed by, so payouts 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..9d1c129 --- /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/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/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/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 96f50ec..7b51380 100644 --- a/Assets/_Project/Scripts/UI/HUDController.cs +++ b/Assets/_Project/Scripts/UI/HUDController.cs @@ -8,7 +8,10 @@ using UnityEngine.SceneManagement; using UnityEngine.UIElements; 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; @@ -42,6 +45,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).")] @@ -70,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; @@ -100,10 +120,6 @@ namespace TD.UI // Match-end overlay — built once on Start and toggled on Phase changes. private VisualElement matchEndOverlay; - - // Buff menu overlay — toggled by the B key via ToggleBuffMenu(). - private VisualElement buffMenuOverlay; - private VisualElement buffMenuContent; private Label matchEndTitle; // Draft overlay (roguelike between-waves draft). Non-modal: the card row floats at @@ -111,10 +127,59 @@ 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 + // 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 + { + 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. @@ -131,8 +196,34 @@ namespace TD.UI // Set true whenever the chat input or any other text field on the HUD has // keyboard focus. Camera, builder input, and hotkey handlers all gate on - // this to keep typing from driving gameplay. - public static bool IsTextInputActive { get; private set; } + // this to keep typing from driving gameplay. Setter is internal (not + // private) so other standalone text-input surfaces — e.g. TD.Dev.DebugConsole, + // which is not part of HUDController — can contribute to the same flag + // 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 + // Enter press doesn't also get interpreted as "open chat" this frame. Without + // this, submitting a debug console command with Enter would immediately pop + // chat open too, since both systems poll the raw key independently. + internal static int SuppressChatOpenUntilFrame = -1; // ----- State ------------------------------------------------------ @@ -149,7 +240,10 @@ 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 // ----- Hotkeys ---------------------------------------------------- @@ -277,6 +371,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() @@ -294,11 +401,28 @@ 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 - // 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(); @@ -320,12 +444,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); @@ -380,9 +500,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; @@ -403,35 +524,444 @@ 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 ------------------------------------------------- + + // 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 = GetSelectedBuilderLoadout(); + displayedSpellLoadout = loadout; + + if (spellHotbarFrame != null) + { + 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++) + { + 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)); + } + } + + // 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). + private void UpdateSpellCooldowns() + { + if (spellSlotUis.Count == 0) return; + + var loadout = displayedSpellLoadout; + 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() @@ -460,6 +990,7 @@ namespace TD.UI nextWaveLabel = Require