diff --git a/Assets/Materials/GhostProjectile.mat b/Assets/Materials/GhostProjectile.mat new file mode 100644 index 0000000..9a4e303 --- /dev/null +++ b/Assets/Materials/GhostProjectile.mat @@ -0,0 +1,137 @@ +%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: GhostProjectile + m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: + - _ALPHAPREMULTIPLY_ON + - _SURFACE_TYPE_TRANSPARENT + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 3000 + stringTagMap: + RenderType: Transparent + disabledShaderPasses: + - DepthOnly + - SHADOWCASTER + 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: + - _AlphaClip: 0 + - _AlphaToMask: 0 + - _Blend: 0 + - _BlendModePreserveSpecular: 1 + - _BumpScale: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DstBlend: 10 + - _DstBlendAlpha: 10 + - _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: 1 + - _WorkflowMode: 1 + - _ZWrite: 0 + m_Colors: + - _BaseColor: {r: 0.38039213, g: 0.38431373, b: 0.39215687, a: 0.78431374} + - _Color: {r: 0.3803921, g: 0.3843137, b: 0.39215684, a: 0.78431374} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} + m_BuildTextureStacks: [] +--- !u!114 &8625757837965251938 +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: + version: 7 diff --git a/Assets/Materials/GhostProjectile.mat.meta b/Assets/Materials/GhostProjectile.mat.meta new file mode 100644 index 0000000..35f33a1 --- /dev/null +++ b/Assets/Materials/GhostProjectile.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 66b56adfef1823449b3992c35d0f489c +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/TrajectoryLine.mat b/Assets/Materials/TrajectoryLine.mat new file mode 100644 index 0000000..fc7cdf6 --- /dev/null +++ b/Assets/Materials/TrajectoryLine.mat @@ -0,0 +1,140 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-6532468477391232685 +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: + version: 7 +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: TrajectoryLine + m_Shader: {fileID: 4800000, guid: 650dd9526735d5b46b79224bc6e94025, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: + - _SURFACE_TYPE_TRANSPARENT + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 1 + m_CustomRenderQueue: 3000 + stringTagMap: + RenderType: Transparent + disabledShaderPasses: + - DepthOnly + - SHADOWCASTER + 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: + - _AlphaClip: 0 + - _AlphaToMask: 0 + - _Blend: 0 + - _BlendModePreserveSpecular: 1 + - _BlendOp: 0 + - _BumpScale: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _Cull: 0 + - _Cutoff: 0.834 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DstBlend: 10 + - _DstBlendAlpha: 10 + - _EnvironmentReflections: 1 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.005 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _SampleGI: 0 + - _Smoothness: 0.5 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 5 + - _SrcBlendAlpha: 1 + - _Surface: 1 + - _UVSec: 0 + - _WorkflowMode: 1 + - _ZWrite: 0 + m_Colors: + - _BaseColor: {r: 1, g: 1, b: 1, a: 0.015686275} + - _Color: {r: 1, g: 1, b: 1, a: 0.015686275} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Materials/TrajectoryLine.mat.meta b/Assets/Materials/TrajectoryLine.mat.meta new file mode 100644 index 0000000..35f1288 --- /dev/null +++ b/Assets/Materials/TrajectoryLine.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2332a9014d9db304793b505bab51a107 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/WallMat.physicMaterial b/Assets/Materials/WallMat.physicMaterial new file mode 100644 index 0000000..786994d --- /dev/null +++ b/Assets/Materials/WallMat.physicMaterial @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!134 &13400000 +PhysicMaterial: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: WallMat + dynamicFriction: 0 + staticFriction: 0 + bounciness: 1 + frictionCombine: 1 + bounceCombine: 1 diff --git a/Assets/Materials/WallMat.physicMaterial.meta b/Assets/Materials/WallMat.physicMaterial.meta new file mode 100644 index 0000000..2c2e5b4 --- /dev/null +++ b/Assets/Materials/WallMat.physicMaterial.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: db65845c02126636d9fae11e1ea2f004 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 13400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Models/GreenBoy.fbx b/Assets/Models/GreenBoy.fbx new file mode 100644 index 0000000..679e174 Binary files /dev/null and b/Assets/Models/GreenBoy.fbx differ diff --git a/Assets/Models/GreenBoy.fbx.meta b/Assets/Models/GreenBoy.fbx.meta new file mode 100644 index 0000000..e08f8f5 --- /dev/null +++ b/Assets/Models/GreenBoy.fbx.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: 18a302e9a279644c19653ac58e191809 +ModelImporter: + serializedVersion: 22200 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + removeConstantScaleCurves: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + 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: 0.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 + 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: 0.001 + 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/Prefabs/Projectiles/Bullet.prefab b/Assets/Prefabs/Projectiles/Bullet.prefab index 36a7388..80df278 100644 --- a/Assets/Prefabs/Projectiles/Bullet.prefab +++ b/Assets/Prefabs/Projectiles/Bullet.prefab @@ -13,6 +13,7 @@ GameObject: - component: {fileID: 5408793041970514069} - component: {fileID: 58437666630366278} - component: {fileID: 4851113807957284959} + - component: {fileID: 8700343489547611766} m_Layer: 6 m_Name: Bullet m_TagString: Untagged @@ -133,3 +134,19 @@ Rigidbody: m_Interpolate: 0 m_Constraints: 0 m_CollisionDetection: 0 +--- !u!114 &8700343489547611766 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2962360034595352958} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a98521a4b559621438fc196adc605f3b, type: 3} + m_Name: + m_EditorClassIdentifier: + bounciness: 1 + damage: 10 + wallRebounces: 4 + comingFrom: {fileID: 0} diff --git a/Assets/Prefabs/Projectiles/ProjectileGhost.prefab b/Assets/Prefabs/Projectiles/ProjectileGhost.prefab new file mode 100644 index 0000000..06ed954 --- /dev/null +++ b/Assets/Prefabs/Projectiles/ProjectileGhost.prefab @@ -0,0 +1,85 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &2962360034595352958 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 888336455889056387} + - component: {fileID: 345585203663460175} + - component: {fileID: 5408793041970514069} + m_Layer: 6 + m_Name: ProjectileGhost + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &888336455889056387 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2962360034595352958} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 7.372555, y: -18.054228, z: 22.62589} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &345585203663460175 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2962360034595352958} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &5408793041970514069 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2962360034595352958} + 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_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 66b56adfef1823449b3992c35d0f489c, 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_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} diff --git a/Assets/Prefabs/Projectiles/ProjectileGhost.prefab.meta b/Assets/Prefabs/Projectiles/ProjectileGhost.prefab.meta new file mode 100644 index 0000000..21e9423 --- /dev/null +++ b/Assets/Prefabs/Projectiles/ProjectileGhost.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f657bc53e175aad72a117bf3ef556359 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/Towers/BaseTower.prefab b/Assets/Prefabs/Towers/BaseTower.prefab index 724ce7b..f614500 100644 --- a/Assets/Prefabs/Towers/BaseTower.prefab +++ b/Assets/Prefabs/Towers/BaseTower.prefab @@ -73,6 +73,10 @@ PrefabInstance: type: 3} insertIndex: -1 addedObject: {fileID: 7883233016828513649} + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: eb5e13df78999ef878da1db5c63224e2, + type: 3} + insertIndex: -1 + addedObject: {fileID: 5565472806559733162} m_SourcePrefab: {fileID: 100100000, guid: eb5e13df78999ef878da1db5c63224e2, type: 3} --- !u!1 &872127579833310669 stripped GameObject: @@ -95,7 +99,40 @@ MonoBehaviour: startHealth: 100 OnHealthZero: m_PersistentCalls: - m_Calls: [] + m_Calls: + - m_Target: {fileID: 7883233016828513649} + m_TargetAssemblyTypeName: HealthComponent, Assembly-CSharp + m_MethodName: SimpleKill + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 OnHealthChange: m_PersistentCalls: m_Calls: [] +--- !u!65 &5565472806559733162 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 872127579833310669} + 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/Prefabs/Towers/BlackHole.prefab b/Assets/Prefabs/Towers/BlackHole.prefab index 8974ea4..1485b82 100644 --- a/Assets/Prefabs/Towers/BlackHole.prefab +++ b/Assets/Prefabs/Towers/BlackHole.prefab @@ -231,6 +231,36 @@ PrefabInstance: propertyPath: m_Name value: BlackHole objectReference: {fileID: 0} + - target: {fileID: 5565472806559733162, guid: f54a14318952c90c5b47a300aedb0d15, + type: 3} + propertyPath: m_Size.x + value: 0.5101528 + objectReference: {fileID: 0} + - target: {fileID: 5565472806559733162, guid: f54a14318952c90c5b47a300aedb0d15, + type: 3} + propertyPath: m_Size.y + value: 1.8364654 + objectReference: {fileID: 0} + - target: {fileID: 5565472806559733162, guid: f54a14318952c90c5b47a300aedb0d15, + type: 3} + propertyPath: m_Size.z + value: 0.5177386 + objectReference: {fileID: 0} + - target: {fileID: 5565472806559733162, guid: f54a14318952c90c5b47a300aedb0d15, + type: 3} + propertyPath: m_Center.x + value: -0.022192955 + objectReference: {fileID: 0} + - target: {fileID: 5565472806559733162, guid: f54a14318952c90c5b47a300aedb0d15, + type: 3} + propertyPath: m_Center.y + value: -0.0720216 + objectReference: {fileID: 0} + - target: {fileID: 5565472806559733162, guid: f54a14318952c90c5b47a300aedb0d15, + type: 3} + propertyPath: m_Center.z + value: -0.008693576 + objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: diff --git a/Assets/Prefabs/Towers/Turret.prefab b/Assets/Prefabs/Towers/Turret.prefab index 293205d..d2c26b9 100644 --- a/Assets/Prefabs/Towers/Turret.prefab +++ b/Assets/Prefabs/Towers/Turret.prefab @@ -383,7 +383,7 @@ Transform: m_GameObject: {fileID: 2676689439087408815} serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0.00723} + m_LocalPosition: {x: 0, y: 0, z: 0.00846} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -845,7 +845,7 @@ LineRenderer: m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: - - {fileID: 10306, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 2100000, guid: 2332a9014d9db304793b505bab51a107, type: 2} m_StaticBatchInfo: firstSubMesh: 0 subMeshCount: 0 @@ -912,7 +912,7 @@ LineRenderer: atime6: 0 atime7: 0 m_Mode: 0 - m_ColorSpace: -1 + m_ColorSpace: 0 m_NumColorKeys: 2 m_NumAlphaKeys: 2 numCornerVertices: 0 @@ -994,6 +994,36 @@ PrefabInstance: propertyPath: m_Name value: Turret objectReference: {fileID: 0} + - target: {fileID: 5565472806559733162, guid: f54a14318952c90c5b47a300aedb0d15, + type: 3} + propertyPath: m_Size.x + value: 0.5204178 + objectReference: {fileID: 0} + - target: {fileID: 5565472806559733162, guid: f54a14318952c90c5b47a300aedb0d15, + type: 3} + propertyPath: m_Size.y + value: 1.2033536 + objectReference: {fileID: 0} + - target: {fileID: 5565472806559733162, guid: f54a14318952c90c5b47a300aedb0d15, + type: 3} + propertyPath: m_Size.z + value: 0.6565219 + objectReference: {fileID: 0} + - target: {fileID: 5565472806559733162, guid: f54a14318952c90c5b47a300aedb0d15, + type: 3} + propertyPath: m_Center.x + value: -0.02208674 + objectReference: {fileID: 0} + - target: {fileID: 5565472806559733162, guid: f54a14318952c90c5b47a300aedb0d15, + type: 3} + propertyPath: m_Center.y + value: -0.07302019 + objectReference: {fileID: 0} + - target: {fileID: 5565472806559733162, guid: f54a14318952c90c5b47a300aedb0d15, + type: 3} + propertyPath: m_Center.z + value: -0.05310279 + objectReference: {fileID: 0} - target: {fileID: 8365322460670124409, guid: f54a14318952c90c5b47a300aedb0d15, type: 3} propertyPath: m_Name @@ -1072,8 +1102,15 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 3c6fb039e74d12a7bbfde22591bc7eee, type: 3} m_Name: m_EditorClassIdentifier: + barrel: {fileID: 2740722787380423134} horizontalArc: {fileID: 8981486734084153558} verticalArc: {fileID: 5247639431516572416} + spaceBetweenGhosts: 0.5 + trajectoryBounces: 4 + ghostPrefab: {fileID: 2962360034595352958, guid: f657bc53e175aad72a117bf3ef556359, + type: 3} + trajectoryLine: {fileID: 3987931586699850031} + trajectoryObjectPoolSize: 25 attackSecondsDelay: 1 projectileSequence: - Arc: 0 @@ -1083,9 +1120,6 @@ MonoBehaviour: type: 3} Burst: 0 BurstDelay: 0 - barrel: {fileID: 2740722787380423134} - trajectory: {fileID: 3987931586699850031} - trajectoryBounces: 4 --- !u!4 &9116936080776508834 stripped Transform: m_CorrespondingSourceObject: {fileID: 527409087646353271, guid: f54a14318952c90c5b47a300aedb0d15, diff --git a/Assets/Scenes/CameraTestScene.unity b/Assets/Scenes/CameraTestScene.unity index f23bd0a..528ab90 100644 --- a/Assets/Scenes/CameraTestScene.unity +++ b/Assets/Scenes/CameraTestScene.unity @@ -135,6 +135,7 @@ GameObject: - component: {fileID: 163929262} - component: {fileID: 163929261} - component: {fileID: 163929260} + - component: {fileID: 163929264} m_Layer: 0 m_Name: Cube (3) m_TagString: Wall @@ -228,6 +229,18 @@ Transform: m_Children: [] m_Father: {fileID: 1696531492} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &163929264 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 163929259} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c2cdf8a35ccaacc4695675d2ada4aecf, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &310810784 GameObject: m_ObjectHideFlags: 0 @@ -240,6 +253,7 @@ GameObject: - component: {fileID: 310810787} - component: {fileID: 310810786} - component: {fileID: 310810785} + - component: {fileID: 310810789} m_Layer: 0 m_Name: Cube (1) m_TagString: Wall @@ -333,6 +347,18 @@ Transform: m_Children: [] m_Father: {fileID: 1696531492} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &310810789 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 310810784} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c2cdf8a35ccaacc4695675d2ada4aecf, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &1257773688 GameObject: m_ObjectHideFlags: 0 @@ -451,6 +477,12 @@ MonoBehaviour: m_LightCookieSize: {x: 1, y: 1} m_LightCookieOffset: {x: 0, y: 0} m_SoftShadowQuality: 0 +--- !u!1 &1267316003 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 7435709693246867821, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + m_PrefabInstance: {fileID: 1774990605473331699} + m_PrefabAsset: {fileID: 0} --- !u!1 &1425080745 GameObject: m_ObjectHideFlags: 0 @@ -463,6 +495,7 @@ GameObject: - component: {fileID: 1425080748} - component: {fileID: 1425080747} - component: {fileID: 1425080746} + - component: {fileID: 1425080750} m_Layer: 0 m_Name: Cube (4) m_TagString: Wall @@ -556,6 +589,18 @@ Transform: m_Children: [] m_Father: {fileID: 1696531492} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1425080750 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1425080745} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c2cdf8a35ccaacc4695675d2ada4aecf, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &1696531491 GameObject: m_ObjectHideFlags: 0 @@ -605,6 +650,7 @@ GameObject: - component: {fileID: 1786067372} - component: {fileID: 1786067371} - component: {fileID: 1786067370} + - component: {fileID: 1786067374} m_Layer: 0 m_Name: Cube (2) m_TagString: Wall @@ -698,6 +744,18 @@ Transform: m_Children: [] m_Father: {fileID: 1696531492} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1786067374 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1786067369} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c2cdf8a35ccaacc4695675d2ada4aecf, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &1820565102 GameObject: m_ObjectHideFlags: 0 @@ -710,6 +768,7 @@ GameObject: - component: {fileID: 1820565106} - component: {fileID: 1820565105} - component: {fileID: 1820565104} + - component: {fileID: 1820565107} m_Layer: 0 m_Name: Cube (5) m_TagString: Wall @@ -803,6 +862,18 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1820565102} m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!114 &1820565107 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1820565102} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c2cdf8a35ccaacc4695675d2ada4aecf, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1 &1915595172 GameObject: m_ObjectHideFlags: 0 @@ -815,6 +886,7 @@ GameObject: - component: {fileID: 1915595175} - component: {fileID: 1915595174} - component: {fileID: 1915595173} + - component: {fileID: 1915595177} m_Layer: 0 m_Name: Cube m_TagString: Wall @@ -908,6 +980,18 @@ Transform: m_Children: [] m_Father: {fileID: 1696531492} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1915595177 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1915595172} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c2cdf8a35ccaacc4695675d2ada4aecf, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1001 &1774990605473331699 PrefabInstance: m_ObjectHideFlags: 0 @@ -921,6 +1005,191 @@ PrefabInstance: propertyPath: m_Name value: Cinemachine objectReference: {fileID: 0} + - target: {fileID: 3313768392743891090, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: fadeSpeed + value: 5.05 + objectReference: {fileID: 0} + - target: {fileID: 3313768392743891090, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: hideFadeSpeed + value: 7 + objectReference: {fileID: 0} + - target: {fileID: 3313768392743891090, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: showFadeSpeed + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: cam + value: + objectReference: {fileID: 1267316003} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: sens.x + value: 300 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: sens.y + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: scrollSpeed + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: stopAfterTime + value: 15 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: stopStiffness + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: decelerationMultiplier + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: curve.m_Curve.Array.size + value: 4 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: curve.m_Curve.Array.data[1].time + value: 0.2991759 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: curve.m_Curve.Array.data[2].time + value: 0.6705839 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: curve.m_Curve.Array.data[3].time + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: curve.m_Curve.Array.data[1].value + value: 0.51186574 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: curve.m_Curve.Array.data[2].value + value: 0.6387135 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: curve.m_Curve.Array.data[3].value + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: curve.m_Curve.Array.data[0].inSlope + value: 1.710919 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: curve.m_Curve.Array.data[1].inSlope + value: 0.50856996 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: curve.m_Curve.Array.data[2].inSlope + value: 0.078333884 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: curve.m_Curve.Array.data[3].inSlope + value: 1.0967482 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: curve.m_Curve.Array.data[0].outSlope + value: 1.710919 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: curve.m_Curve.Array.data[1].inWeight + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: curve.m_Curve.Array.data[1].outSlope + value: 0.50856996 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: curve.m_Curve.Array.data[2].inWeight + value: 0.37746048 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: curve.m_Curve.Array.data[2].outSlope + value: 0.078333884 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: curve.m_Curve.Array.data[3].inWeight + value: 0.33333334 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: curve.m_Curve.Array.data[3].outSlope + value: 1.0967482 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: curve.m_Curve.Array.data[0].outWeight + value: 0.33333334 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: curve.m_Curve.Array.data[1].outWeight + value: 0.30844653 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: curve.m_Curve.Array.data[2].outWeight + value: 0.33333334 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: curve.m_Curve.Array.data[0].tangentMode + value: 34 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: curve.m_Curve.Array.data[1].tangentMode + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: curve.m_Curve.Array.data[2].tangentMode + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3837216061230793568, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: curve.m_Curve.Array.data[3].tangentMode + value: 34 + objectReference: {fileID: 0} + - target: {fileID: 5664717836218291588, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: m_XAxis.m_DecelTime + value: 0.25 + objectReference: {fileID: 0} + - target: {fileID: 5664717836218291588, guid: fd9f9b61c0ebb324ebc9f929e26706bc, + type: 3} + propertyPath: m_YAxis.m_DecelTime + value: 0.25 + objectReference: {fileID: 0} - target: {fileID: 8882344377078016156, guid: fd9f9b61c0ebb324ebc9f929e26706bc, type: 3} propertyPath: m_LocalPosition.x diff --git a/Assets/Scenes/TowerTest.unity b/Assets/Scenes/TowerTest.unity index 2e466c7..6db570d 100644 --- a/Assets/Scenes/TowerTest.unity +++ b/Assets/Scenes/TowerTest.unity @@ -241,6 +241,74 @@ MonoBehaviour: m_LightCookieSize: {x: 1, y: 1} m_LightCookieOffset: {x: 0, y: 0} m_SoftShadowQuality: 1 +--- !u!1001 &504816165 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: 18a302e9a279644c19653ac58e191809, + type: 3} + propertyPath: m_LocalPosition.x + value: 0.8027312 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 18a302e9a279644c19653ac58e191809, + type: 3} + propertyPath: m_LocalPosition.y + value: 0.20438403 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 18a302e9a279644c19653ac58e191809, + type: 3} + propertyPath: m_LocalPosition.z + value: -3.614678 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 18a302e9a279644c19653ac58e191809, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 18a302e9a279644c19653ac58e191809, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 18a302e9a279644c19653ac58e191809, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 18a302e9a279644c19653ac58e191809, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 18a302e9a279644c19653ac58e191809, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 18a302e9a279644c19653ac58e191809, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 18a302e9a279644c19653ac58e191809, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 919132149155446097, guid: 18a302e9a279644c19653ac58e191809, + type: 3} + propertyPath: m_Name + value: GreenBoy + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 18a302e9a279644c19653ac58e191809, type: 3} --- !u!1 &643774939 GameObject: m_ObjectHideFlags: 0 @@ -267,7 +335,7 @@ BoxCollider: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 643774939} - m_Material: {fileID: 0} + m_Material: {fileID: 13400000, guid: db65845c02126636d9fae11e1ea2f004, type: 2} m_IncludeLayers: serializedVersion: 2 m_Bits: 0 @@ -372,7 +440,7 @@ BoxCollider: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 769011490} - m_Material: {fileID: 0} + m_Material: {fileID: 13400000, guid: db65845c02126636d9fae11e1ea2f004, type: 2} m_IncludeLayers: serializedVersion: 2 m_Bits: 0 @@ -576,6 +644,16 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: + - target: {fileID: 7437064479105606814, guid: 9415cb10a1bd579269301ca4f61a1554, + type: 3} + propertyPath: trajectoryBounces + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 7437064479105606814, guid: 9415cb10a1bd579269301ca4f61a1554, + type: 3} + propertyPath: trajectoryObjectPoolSize + value: 100 + objectReference: {fileID: 0} - target: {fileID: 7437064479105606814, guid: 9415cb10a1bd579269301ca4f61a1554, type: 3} propertyPath: projectileSequence.Array.data[0].Speed @@ -667,7 +745,7 @@ BoxCollider: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1085503232} - m_Material: {fileID: 0} + m_Material: {fileID: 13400000, guid: db65845c02126636d9fae11e1ea2f004, type: 2} m_IncludeLayers: serializedVersion: 2 m_Bits: 0 @@ -772,7 +850,7 @@ BoxCollider: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1197417724} - m_Material: {fileID: 0} + m_Material: {fileID: 13400000, guid: db65845c02126636d9fae11e1ea2f004, type: 2} m_IncludeLayers: serializedVersion: 2 m_Bits: 0 @@ -877,7 +955,7 @@ BoxCollider: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1621186629} - m_Material: {fileID: 0} + m_Material: {fileID: 13400000, guid: db65845c02126636d9fae11e1ea2f004, type: 2} m_IncludeLayers: serializedVersion: 2 m_Bits: 0 @@ -1165,7 +1243,7 @@ PrefabInstance: - target: {fileID: 7348612162646443967, guid: fd9f9b61c0ebb324ebc9f929e26706bc, type: 3} propertyPath: m_LocalRotation.w - value: -0.13805284 + value: -0.1380528 objectReference: {fileID: 0} - target: {fileID: 7348612162646443967, guid: fd9f9b61c0ebb324ebc9f929e26706bc, type: 3} @@ -1180,7 +1258,7 @@ PrefabInstance: - target: {fileID: 7348612162646443967, guid: fd9f9b61c0ebb324ebc9f929e26706bc, type: 3} propertyPath: m_LocalRotation.z - value: -0.13815573 + value: -0.13815574 objectReference: {fileID: 0} - target: {fileID: 8882344377078016156, guid: fd9f9b61c0ebb324ebc9f929e26706bc, type: 3} @@ -1263,7 +1341,7 @@ BoxCollider: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1797347348} - m_Material: {fileID: 0} + m_Material: {fileID: 13400000, guid: db65845c02126636d9fae11e1ea2f004, type: 2} m_IncludeLayers: serializedVersion: 2 m_Bits: 0 @@ -1496,3 +1574,4 @@ SceneRoots: - {fileID: 1932692269} - {fileID: 1671091699} - {fileID: 770231297} + - {fileID: 504816165} diff --git a/Assets/Scripts/Camera/CameraController.cs b/Assets/Scripts/Camera/CameraController.cs index c017224..9ee2b2b 100644 --- a/Assets/Scripts/Camera/CameraController.cs +++ b/Assets/Scripts/Camera/CameraController.cs @@ -1,15 +1,21 @@ using UnityEngine; using Cinemachine; +using System.Collections; public class CameraController : MonoBehaviour { [SerializeField] private GameObject cam; public float scrollSpeed; + public float stopAfterTime = 0.25f; + public AnimationCurve curve = new AnimationCurve(new Keyframe(0f, 0f, 1f, 1f), new Keyframe(1f, 1f, 1f, 1f)); + [Range(1f, 0f)] public float decelerationMultiplier; public Vector2 sens; private Vector2 defaultMaxSpeed; + private float timer; + private void Start() { defaultMaxSpeed *= 0; @@ -17,16 +23,24 @@ public class CameraController : MonoBehaviour private void Update() { - defaultMaxSpeed = new Vector2(cam.GetComponent().m_XAxis.m_MaxSpeed, cam.GetComponent().m_YAxis.m_MaxSpeed); + //defaultMaxSpeed = new Vector2(cam.GetComponent().m_XAxis.m_MaxSpeed, cam.GetComponent().m_YAxis.m_MaxSpeed); if (Input.GetMouseButtonDown(1)) { defaultMaxSpeed = sens; + + // Enable mouse input + cam.GetComponent().m_XAxis.m_InputAxisName = "Mouse X"; + cam.GetComponent().m_YAxis.m_InputAxisName = "Mouse Y"; } if (Input.GetMouseButtonUp(1)) { - defaultMaxSpeed *= 0; + timer = 0; + + // Disable mouse input + cam.GetComponent().m_XAxis.m_InputAxisName = ""; + cam.GetComponent().m_YAxis.m_InputAxisName = ""; } cam.GetComponent().m_XAxis.m_MaxSpeed = defaultMaxSpeed.x; @@ -35,5 +49,11 @@ public class CameraController : MonoBehaviour float scroll = Input.GetAxis("Mouse ScrollWheel"); cam.GetComponent().m_Offset.z += scroll * scrollSpeed; + + + timer += Time.deltaTime; + float evalTime = timer / stopAfterTime; + if (!Input.GetMouseButton(1)) + defaultMaxSpeed = Vector2.LerpUnclamped(defaultMaxSpeed, Vector2.zero, curve.Evaluate(evalTime)); } } diff --git a/Assets/Scripts/Camera/HideWall.cs b/Assets/Scripts/Camera/HideWall.cs index 8e9bc68..65a27ab 100644 --- a/Assets/Scripts/Camera/HideWall.cs +++ b/Assets/Scripts/Camera/HideWall.cs @@ -3,18 +3,16 @@ using UnityEngine; public class HideWall : MonoBehaviour { - [SerializeField] private GameObject target; [SerializeField] private GameObject origin; - public GameObject prevObject; - public Material defaultMaterial; // Material when not hitting "Wall" - public Material hitMaterial; // Material when hitting "Wall" + [Range(1f, 10f)] public float hideFadeSpeed; + [Range(1f, 10f)] public float showFadeSpeed; public float sphereRadius; - float maxSphereRayDistance; public Vector3 maxSphereRayDistanceOffset; + float maxSphereRayDistance; private List prevHitObjects = new List(); private void Start() @@ -29,44 +27,36 @@ public class HideWall : MonoBehaviour List hitObjectsThisFrame = new List(); - // Change material of currently hit objects for (int i = 0; i < hits.Length; i++) { - if (hits[i].collider.CompareTag("Wall")) + if (hits[i].collider != null && hits[i].collider.CompareTag("Wall")) { var hitGameObject = hits[i].collider.gameObject; hitObjectsThisFrame.Add(hitGameObject); - // Change material only if this object wasn't hit last frame - if (!prevHitObjects.Contains(hitGameObject)) + var wallOpacity = hitGameObject.GetComponent(); + if (wallOpacity != null && !prevHitObjects.Contains(hitGameObject)) { - Renderer renderer = hits[i].collider.GetComponent(); - if (renderer != null) - { - renderer.material = hitMaterial; - } + wallOpacity.HideWall(hideFadeSpeed); } } } - // Restore the material of objects that are not hit this frame but were hit in the previous frame - for (int i = 0; i < prevHitObjects.Count; i++) + foreach (var prevHitObject in prevHitObjects) { - if (!hitObjectsThisFrame.Contains(prevHitObjects[i])) + if (!hitObjectsThisFrame.Contains(prevHitObject)) { - Renderer renderer = prevHitObjects[i].GetComponent(); - if (renderer != null) + var wallOpacity = prevHitObject.GetComponent(); + if (wallOpacity != null) { - renderer.material = defaultMaterial; + wallOpacity.ShowWall(showFadeSpeed); } } } - // Update the list of previously hit objects prevHitObjects = hitObjectsThisFrame; } - private void OnDrawGizmos() { Gizmos.color = Color.red; diff --git a/Assets/Scripts/Camera/WallOpacity.cs b/Assets/Scripts/Camera/WallOpacity.cs new file mode 100644 index 0000000..136d5ef --- /dev/null +++ b/Assets/Scripts/Camera/WallOpacity.cs @@ -0,0 +1,51 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class WallOpacity : MonoBehaviour +{ + private float t; + private bool isShowing = true; + + private float showFadeSpeed; + private float hideFadeSpeed; + + private void Start() + { + t = 1; + } + + void Update() + { + if (isShowing) + { + t += Time.deltaTime * showFadeSpeed; + } + else + { + t -= Time.deltaTime * hideFadeSpeed; + } + t = Mathf.Clamp(t, 0, 1); + + Renderer renderer = GetComponent(); + if (renderer != null) + { + var originalMat = renderer.material; + var originalColor = originalMat.color; + originalMat.color = new Color(originalColor.r, originalColor.g, originalColor.b, t); + renderer.material = originalMat; + } + } + + public void ShowWall(float speed) + { + isShowing = true; + showFadeSpeed = speed; + } + + public void HideWall(float speed) + { + isShowing = false; + hideFadeSpeed = speed; + } +} diff --git a/Assets/Scripts/Camera/WallOpacity.cs.meta b/Assets/Scripts/Camera/WallOpacity.cs.meta new file mode 100644 index 0000000..5a28fc0 --- /dev/null +++ b/Assets/Scripts/Camera/WallOpacity.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c2cdf8a35ccaacc4695675d2ada4aecf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Extensions/FloatExtensions.cs b/Assets/Scripts/Extensions/FloatExtensions.cs new file mode 100644 index 0000000..83d86f4 --- /dev/null +++ b/Assets/Scripts/Extensions/FloatExtensions.cs @@ -0,0 +1,10 @@ +using System.Collections; +using UnityEngine; + +namespace Assets +{ + public static class FloatExtensions + { + public static float Clamp(this float x, float min, float max) => Mathf.Clamp(x, min, max); + } +} \ No newline at end of file diff --git a/Assets/Scripts/Extensions/FloatExtensions.cs.meta b/Assets/Scripts/Extensions/FloatExtensions.cs.meta new file mode 100644 index 0000000..c7f7a01 --- /dev/null +++ b/Assets/Scripts/Extensions/FloatExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 92c9a051ffde8174690f03cc2c3d547b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Tower/AimTower.cs b/Assets/Scripts/Tower/AimTower.cs new file mode 100644 index 0000000..dac4169 --- /dev/null +++ b/Assets/Scripts/Tower/AimTower.cs @@ -0,0 +1,120 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class AimTower : Tower +{ + [SerializeField] protected Barrel barrel; + [SerializeField] protected EditableArc horizontalArc; + [SerializeField] protected EditableArc verticalArc; + + [Header("Trajectory")] + [SerializeField] private float spaceBetweenGhosts = 0.5f; + [SerializeField] private int trajectoryBounces = 3; + private const float k_trajectory_maxdist = 100f; + private List ghosts = new(); + [SerializeField] private GameObject ghostPrefab; + [SerializeField] private LineRenderer trajectoryLine; + [SerializeField] private int trajectoryObjectPoolSize = 25; + private int poolIdx = 0; + + public Vector3 AimDirection => barrel.transform.forward; + public Vector2 HorizontalRotationMinMax => horizontalArc.RotationMinMax; + public Vector2 VerticalRotationMinMax => verticalArc.RotationMinMax; + public float HorizontalRotation => horizontalArc.Value; + public float VerticalRotation => verticalArc.Value; + + + protected override void Awake() + { + horizontalArc.Value.AddListener(UpdateBarrelRotation); + verticalArc.Value.AddListener(UpdateBarrelRotation); + + horizontalArc.Value.AddListener(UpdateTrajectory); + verticalArc.Value.AddListener(UpdateTrajectory); + + horizontalArc.Value.AddListener(SnapVerticalToHorizontal); + + UpdateBarrelRotation(); + UpdateTrajectory(); + } + + protected override void OnDestroy() + { + horizontalArc.Value.RemoveListener(UpdateBarrelRotation); + verticalArc.Value.RemoveListener(UpdateBarrelRotation); + horizontalArc.Value.RemoveListener(SnapVerticalToHorizontal); + } + + private void UpdateBarrelRotation(float unused) => UpdateBarrelRotation(); + + // Rotate barrel to match rotation + private void UpdateBarrelRotation() + { + barrel.transform.localRotation = Quaternion.Euler(-verticalArc.Value, horizontalArc.Value, 0f); + } + + private void SnapVerticalToHorizontal(float horizontalAngle) + { + verticalArc.transform.rotation = Quaternion.Euler(verticalArc.transform.rotation.eulerAngles.x, horizontalAngle, verticalArc.transform.rotation.eulerAngles.z); + } + + private void UpdateTrajectory(float unused) => UpdateTrajectory(); + + private void UpdateTrajectory() + { + foreach (var ghost in ghosts) + { + ghost.SetActive(false); + } + + Vector3 origin = barrel.Tip.position; + Vector3 dir = barrel.transform.forward; + List pointsInTrajectory = new(); + pointsInTrajectory.Add(origin); + for (int i = 0; i < trajectoryBounces; i++) + { + Debug.DrawRay(origin, dir.normalized * k_trajectory_maxdist, Color.red, 5f); + RaycastHit hit; + if (!Physics.Raycast(origin, dir, out hit, k_trajectory_maxdist)) + break; + + pointsInTrajectory.Add(hit.point); + dir = Vector3.Reflect(dir, hit.normal); + origin = hit.point; + } + + + trajectoryLine.positionCount = pointsInTrajectory.Count; + trajectoryLine.SetPositions(pointsInTrajectory.ToArray()); + + // Build trajectory + for (int i = 0; i < pointsInTrajectory.Count - 1; i++) + { + Vector3 point1 = pointsInTrajectory[i]; + Vector3 point2 = pointsInTrajectory[i + 1]; + + Vector3 trajDir = (point2 - point1).normalized; + float dist = Vector3.Distance(point1, point2); + for (float j = 0; j < dist; j += spaceBetweenGhosts) + { + Vector3 ghostPos = point1 + trajDir * j; + + // Use object pool or spawn new + if (ghosts.Count >= trajectoryObjectPoolSize) + { + ghosts[poolIdx].transform.position = ghostPos; + ghosts[poolIdx].SetActive(true); + poolIdx = (poolIdx + 1) % trajectoryObjectPoolSize; + } + else + { + var ghost = Instantiate(ghostPrefab); + ghost.transform.position = ghostPos; + ghost.transform.parent = transform; + ghosts.Add(ghost); + } + } + } + } +} diff --git a/Assets/Scripts/Tower/AimTower.cs.meta b/Assets/Scripts/Tower/AimTower.cs.meta new file mode 100644 index 0000000..3c682c5 --- /dev/null +++ b/Assets/Scripts/Tower/AimTower.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 07497cc2771c1090bb0a07e731976e15 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Tower/Projectile.cs b/Assets/Scripts/Tower/Projectile.cs index a82b6f8..a947a32 100644 --- a/Assets/Scripts/Tower/Projectile.cs +++ b/Assets/Scripts/Tower/Projectile.cs @@ -8,15 +8,57 @@ public class Projectile : MonoBehaviour private float bounciness = 0.5f; private Collider projCol; + private Rigidbody body; + + [SerializeField, Range(0, 50)] + private int damage = 10; + + [SerializeField] + private int wallRebounces = 4; + private int hitWalls = 0; + + public HealthComponent comingFrom; + + private Vector3 prevVel; private void Awake() { projCol = GetComponent(); + body = GetComponent(); Assert.IsNotNull(projCol); PhysicMaterial pMat = new(); pMat.bounciness = this.bounciness; + pMat.staticFriction = 0f; + pMat.dynamicFriction = 0f; + pMat.frictionCombine = PhysicMaterialCombine.Minimum; + pMat.bounceCombine = PhysicMaterialCombine.Minimum; projCol.material = pMat; } + + private void LateUpdate() + { + prevVel = body.velocity; + } + + private void OnCollisionEnter(Collision collision) + { + HealthComponent hitHealthComp = collision.gameObject.GetComponent(); + if (hitHealthComp == comingFrom) return; + if (hitHealthComp) + { + hitHealthComp.TakeDamage(damage); + Destroy(gameObject); + } + else + { + if (++hitWalls == wallRebounces) + { + Destroy(gameObject); + } + Vector3 newVel = Vector3.Reflect(prevVel.normalized, collision.contacts[0].normal.normalized); + body.velocity = newVel.normalized * prevVel.magnitude * bounciness; + } + } } diff --git a/Assets/Scripts/Tower/ProjectileTower.cs b/Assets/Scripts/Tower/ProjectileTower.cs index 3a1d227..9cdb5ea 100644 --- a/Assets/Scripts/Tower/ProjectileTower.cs +++ b/Assets/Scripts/Tower/ProjectileTower.cs @@ -4,26 +4,13 @@ using System.Collections.Generic; using UnityEngine; using UnityEngine.Assertions; -public class ProjectileTower : Tower +public class ProjectileTower : AimTower { - [SerializeField] protected EditableArc horizontalArc; - [SerializeField] protected EditableArc verticalArc; - [SerializeField, Range(0.01f, 20f)] private float attackSecondsDelay = 1f; [SerializeField] private ProjectilePattern[] projectileSequence; - [SerializeField] private Barrel barrel; - [SerializeField] private LineRenderer trajectory; - [SerializeField] private int trajectoryBounces = 2; - private const float k_trajectory_maxdist = 100f; private ProjectileSpawner projectileSpawner; - public Vector3 AimDirection => barrel.transform.forward; - public Vector2 HorizontalRotationMinMax => horizontalArc.RotationMinMax; - public Vector2 VerticalRotationMinMax => verticalArc.RotationMinMax; - public float HorizontalRotation => horizontalArc.Value; - public float VerticalRotation => verticalArc.Value; - protected override void Awake() { base.Awake(); @@ -31,74 +18,18 @@ public class ProjectileTower : Tower projectileSpawner = GetComponent(); Assert.IsNotNull(projectileSpawner); - horizontalArc.Value.AddListener(UpdateBarrelRotation); - verticalArc.Value.AddListener(UpdateBarrelRotation); - - horizontalArc.Value.AddListener(UpdateTrajectory); - verticalArc.Value.AddListener(UpdateTrajectory); - - horizontalArc.Value.AddListener(SnapVerticalToHorizontal); - - UpdateBarrelRotation(); - UpdateTrajectory(); StartCoroutine(AttackLoop()); } - private void SnapVerticalToHorizontal(float horizontalAngle) - { - verticalArc.transform.rotation = Quaternion.Euler(verticalArc.transform.rotation.eulerAngles.x, horizontalAngle, verticalArc.transform.rotation.eulerAngles.z); - } - - private void UpdateTrajectory(float unused) => UpdateTrajectory(); - - private void UpdateTrajectory() - { - if (trajectory == null) return; - - Vector3 origin = barrel.Tip.position; - Vector3 dir = barrel.transform.forward; - List pointsInTrajectory = new(); - pointsInTrajectory.Add(origin); - for (int i = 0; i < trajectoryBounces; i++) - { - Debug.DrawRay(origin, dir.normalized * k_trajectory_maxdist, Color.red, 5f); - RaycastHit hit; - if (!Physics.Raycast(origin, dir, out hit, k_trajectory_maxdist)) - break; - - pointsInTrajectory.Add(hit.point); - dir = Vector3.Reflect(dir, hit.normal); - origin = hit.point; - } - - trajectory.positionCount = pointsInTrajectory.Count; - trajectory.SetPositions(pointsInTrajectory.ToArray()); - } - - protected override void OnDestroy() - { - horizontalArc.Value.RemoveListener(UpdateBarrelRotation); - verticalArc.Value.RemoveListener(UpdateBarrelRotation); - horizontalArc.Value.RemoveListener(SnapVerticalToHorizontal); - } private IEnumerator AttackLoop() { do { yield return new WaitForSeconds(attackSecondsDelay); - UpdateBarrelRotation(); Debug.DrawRay(transform.position, horizontalArc.ToKnobVector, Color.red, attackSecondsDelay); Debug.DrawRay(transform.position, verticalArc.ToKnobVector, Color.green, attackSecondsDelay); Debug.DrawRay(transform.position, AimDirection, Color.yellow, attackSecondsDelay); - projectileSpawner.RunBulletSequence(barrel.transform.position, transform.up, AimDirection, projectileSequence); + projectileSpawner.RunBulletSequence(barrel.Tip.position, transform.up, AimDirection, projectileSequence); } while (true); } - - private void UpdateBarrelRotation(float unused) => UpdateBarrelRotation(); - - // Rotate barrel to match rotation - private void UpdateBarrelRotation() - { - barrel.transform.localRotation = Quaternion.Euler(-verticalArc.Value, horizontalArc.Value, 0f); - } } diff --git a/Assets/Scripts/Utilities/HealthComponent.cs b/Assets/Scripts/Utilities/HealthComponent.cs index ce52ae9..74cefa2 100644 --- a/Assets/Scripts/Utilities/HealthComponent.cs +++ b/Assets/Scripts/Utilities/HealthComponent.cs @@ -28,5 +28,10 @@ public class HealthComponent : MonoBehaviour if (currentHealth == 0) OnHealthZero?.Invoke(); } + + public void SimpleKill() + { + Destroy(gameObject); + } } diff --git a/Assets/Scripts/Utilities/ProjectileSpawner.cs b/Assets/Scripts/Utilities/ProjectileSpawner.cs index 59b0381..6926abf 100644 --- a/Assets/Scripts/Utilities/ProjectileSpawner.cs +++ b/Assets/Scripts/Utilities/ProjectileSpawner.cs @@ -45,6 +45,7 @@ public class ProjectileSpawner : MonoBehaviour projectile.transform.up = bulletDir; projectile.GetComponent().AddForce(bulletDir * bulletPattern.Speed); + projectile.GetComponent().comingFrom = GetComponent(); if (bulletPattern.Burst) yield return new WaitForSeconds(bulletPattern.BurstDelay);