diff --git a/.gitignore b/.gitignore deleted file mode 100644 index d6b3a0b..0000000 --- a/.gitignore +++ /dev/null @@ -1,74 +0,0 @@ -# This .gitignore file should be placed at the root of your Unity project directory -# -# Get latest from https://github.com/github/gitignore/blob/main/Unity.gitignore -# -/[Ll]ibrary/ -/[Tt]emp/ -/[Oo]bj/ -/[Bb]uild/ -/[Bb]uilds/ -/[Ll]ogs/ -/[Uu]ser[Ss]ettings/ - -# MemoryCaptures can get excessive -/[Mm]emoryCaptures/ - -# Asset meta data should only be ignored when the corresponding asset is also ignored -!/[Aa]ssets/**/*.meta - -# Uncomment this line if you wish to ignore the asset store tools plugin -# /[Aa]ssets/AssetStoreTools* - -# Autogenerated Jetbrains Rider plugin -/[Aa]ssets/Plugins/Editor/JetBrains* - -# Visual Studio cache directory -.vs/ -.gradle/ - -# Gradle build aux -/Assets/Plugins/Android/mainTemplate.gradle -/Assets/Plugins/Android/launcherTemplate.gradle - -# Autogenerated VS/MD/Consulo solution and project files -ExportedObj/ -.consulo/ -*.csproj -*.unityproj -*.sln -*.suo -*.tmp -*.user -*.userprefs -*.pidb -*.booproj -*.svd -*.pdb -*.opendb -*.VC.db - -# Unity3D generated meta files -*.pidb.meta -*.pdb.meta -*.mdb.meta - -# Unity3D generated file on crash reports -sysinfo.txt - -# Builds -*.apk -*.aab -*.unitypackage -*.app - -# Crashlytics generated file -crashlytics-build.properties - -# Packed Addressables -/[Aa]ssets/[Aa]ddressable[Aa]ssets[Dd]ata/*/*.bin* - -# Temporary auto-generated Android Assets -/[Aa]ssets/[Ss]treaming[Aa]ssets/aa/* - - -.idea/ diff --git a/Assets/Scenes.meta b/Assets/Scenes.meta deleted file mode 100644 index d717c4a..0000000 --- a/Assets/Scenes.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 5eba01364f86498419063e7f96a3ccce -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scenes/SampleScene.unity b/Assets/Scenes/SampleScene.unity deleted file mode 100644 index 1c63aa8..0000000 --- a/Assets/Scenes/SampleScene.unity +++ /dev/null @@ -1,432 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!29 &1 -OcclusionCullingSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_OcclusionBakeSettings: - smallestOccluder: 5 - smallestHole: 0.25 - backfaceThreshold: 100 - m_SceneGUID: 00000000000000000000000000000000 - m_OcclusionCullingData: {fileID: 0} ---- !u!104 &2 -RenderSettings: - m_ObjectHideFlags: 0 - serializedVersion: 10 - m_Fog: 0 - m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} - m_FogMode: 3 - m_FogDensity: 0.01 - m_LinearFogStart: 0 - m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} - m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} - m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} - m_AmbientIntensity: 1 - m_AmbientMode: 0 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} - m_HaloStrength: 0.5 - m_FlareStrength: 1 - m_FlareFadeSpeed: 3 - m_HaloTexture: {fileID: 0} - m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} - m_DefaultReflectionMode: 0 - m_DefaultReflectionResolution: 128 - m_ReflectionBounces: 1 - m_ReflectionIntensity: 1 - m_CustomReflection: {fileID: 0} - m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.18028378, g: 0.22571412, b: 0.30692285, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 12 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 1 - m_EnableRealtimeLightmaps: 0 - m_LightmapEditorSettings: - serializedVersion: 12 - m_Resolution: 2 - m_BakeResolution: 40 - m_AtlasSize: 1024 - m_AO: 0 - m_AOMaxDistance: 1 - m_CompAOExponent: 1 - m_CompAOExponentDirect: 0 - m_ExtractAmbientOcclusion: 0 - m_Padding: 2 - m_LightmapParameters: {fileID: 0} - m_LightmapsBakeMode: 1 - m_TextureCompression: 1 - m_ReflectionCompression: 2 - m_MixedBakeMode: 2 - m_BakeBackend: 1 - m_PVRSampling: 1 - m_PVRDirectSampleCount: 32 - m_PVRSampleCount: 512 - m_PVRBounces: 2 - m_PVREnvironmentSampleCount: 256 - m_PVREnvironmentReferencePointCount: 2048 - m_PVRFilteringMode: 1 - m_PVRDenoiserTypeDirect: 1 - m_PVRDenoiserTypeIndirect: 1 - m_PVRDenoiserTypeAO: 1 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVREnvironmentMIS: 1 - m_PVRCulling: 1 - m_PVRFilteringGaussRadiusDirect: 1 - m_PVRFilteringGaussRadiusIndirect: 5 - m_PVRFilteringGaussRadiusAO: 2 - m_PVRFilteringAtrousPositionSigmaDirect: 0.5 - m_PVRFilteringAtrousPositionSigmaIndirect: 2 - m_PVRFilteringAtrousPositionSigmaAO: 1 - m_ExportTrainingData: 0 - m_TrainingDataDestination: TrainingData - m_LightProbeSampleCountMultiplier: 4 - m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} - m_LightingSettings: {fileID: 0} ---- !u!196 &4 -NavMeshSettings: - serializedVersion: 2 - m_ObjectHideFlags: 0 - m_BuildSettings: - serializedVersion: 3 - agentTypeID: 0 - agentRadius: 0.5 - agentHeight: 2 - agentSlope: 45 - agentClimb: 0.4 - ledgeDropHeight: 0 - maxJumpAcrossDistance: 0 - minRegionArea: 2 - manualCellSize: 0 - cellSize: 0.16666667 - manualTileSize: 0 - tileSize: 256 - buildHeightMesh: 0 - maxJobWorkers: 0 - preserveTilesOutsideBounds: 0 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &330585543 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 330585546} - - component: {fileID: 330585545} - - component: {fileID: 330585544} - - component: {fileID: 330585547} - m_Layer: 0 - m_Name: Main Camera - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!81 &330585544 -AudioListener: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 330585543} - m_Enabled: 1 ---- !u!20 &330585545 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 330585543} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} - m_projectionMatrixMode: 1 - m_GateFitMode: 2 - m_FOVAxisMode: 0 - m_Iso: 200 - m_ShutterSpeed: 0.005 - m_Aperture: 16 - m_FocusDistance: 10 - m_FocalLength: 50 - m_BladeCount: 5 - m_Curvature: {x: 2, y: 11} - m_BarrelClipping: 0.25 - m_Anamorphism: 0 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 60 - orthographic: 0 - orthographic size: 5 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 0} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 1 - m_AllowMSAA: 1 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &330585546 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 330585543} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1, z: -10} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &330585547 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 330585543} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} - m_Name: - m_EditorClassIdentifier: - m_RenderShadows: 1 - m_RequiresDepthTextureOption: 2 - m_RequiresOpaqueTextureOption: 2 - m_CameraType: 0 - m_Cameras: [] - m_RendererIndex: -1 - m_VolumeLayerMask: - serializedVersion: 2 - m_Bits: 1 - m_VolumeTrigger: {fileID: 0} - m_VolumeFrameworkUpdateModeOption: 2 - m_RenderPostProcessing: 1 - m_Antialiasing: 0 - m_AntialiasingQuality: 2 - m_StopNaN: 0 - m_Dithering: 0 - m_ClearDepth: 1 - m_AllowXRRendering: 1 - m_AllowHDROutput: 1 - m_UseScreenCoordOverride: 0 - m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0} - m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0} - m_RequiresDepthTexture: 0 - m_RequiresColorTexture: 0 - m_Version: 2 - m_TaaSettings: - quality: 3 - frameInfluence: 0.1 - jitterScale: 1 - mipBias: 0 - varianceClampScale: 0.9 - contrastAdaptiveSharpening: 0 ---- !u!1 &410087039 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 410087041} - - component: {fileID: 410087040} - - component: {fileID: 410087042} - m_Layer: 0 - m_Name: Directional Light - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!108 &410087040 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 410087039} - m_Enabled: 1 - serializedVersion: 11 - m_Type: 1 - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_Intensity: 2 - m_Range: 10 - m_SpotAngle: 30 - m_InnerSpotAngle: 21.80208 - m_CookieSize: 10 - m_Shadows: - m_Type: 2 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 1 - m_Bias: 0.05 - m_NormalBias: 0.4 - m_NearPlane: 0.2 - m_CullingMatrixOverride: - e00: 1 - e01: 0 - e02: 0 - e03: 0 - e10: 0 - e11: 1 - e12: 0 - e13: 0 - e20: 0 - e21: 0 - e22: 1 - e23: 0 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - m_UseCullingMatrixOverride: 0 - m_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} - m_RenderMode: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingLayerMask: 1 - m_Lightmapping: 4 - m_LightShadowCasterMode: 0 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 5000 - m_UseColorTemperature: 1 - m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} - m_UseBoundingSphereOverride: 0 - m_UseViewFrustumForShadowCasterCull: 1 - m_ForceVisible: 0 - m_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!4 &410087041 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 410087039} - serializedVersion: 2 - m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} - m_LocalPosition: {x: 0, y: 3, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} ---- !u!114 &410087042 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 410087039} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 474bcb49853aa07438625e644c072ee6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Version: 3 - m_UsePipelineSettings: 1 - m_AdditionalLightsShadowResolutionTier: 2 - m_LightLayerMask: 1 - m_RenderingLayers: 1 - m_CustomShadowLayers: 0 - m_ShadowLayerMask: 1 - m_ShadowRenderingLayers: 1 - m_LightCookieSize: {x: 1, y: 1} - m_LightCookieOffset: {x: 0, y: 0} - m_SoftShadowQuality: 1 ---- !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!1660057539 &9223372036854775807 -SceneRoots: - m_ObjectHideFlags: 0 - m_Roots: - - {fileID: 330585546} - - {fileID: 410087041} - - {fileID: 832575519} diff --git a/Assets/Scenes/SampleScene.unity.meta b/Assets/Scenes/SampleScene.unity.meta deleted file mode 100644 index 9531828..0000000 --- a/Assets/Scenes/SampleScene.unity.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 99c9720ab356a0642a771bea13969a05 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Settings/DefaultVolumeProfile.asset b/Assets/Settings/DefaultVolumeProfile.asset index 6fb1822..66d98de 100644 --- a/Assets/Settings/DefaultVolumeProfile.asset +++ b/Assets/Settings/DefaultVolumeProfile.asset @@ -342,6 +342,9 @@ MonoBehaviour: skyOcclusionIntensityMultiplier: m_OverrideState: 1 m_Value: 1 + worldOffset: + m_OverrideState: 1 + m_Value: {x: 0, y: 0, z: 0} --- !u!114 &-1216621516061285780 MonoBehaviour: m_ObjectHideFlags: 3 @@ -376,6 +379,9 @@ MonoBehaviour: highQualityFiltering: m_OverrideState: 1 m_Value: 0 + filter: + m_OverrideState: 1 + m_Value: 0 downscale: m_OverrideState: 1 m_Value: 0 @@ -462,8 +468,6 @@ MonoBehaviour: - {fileID: -6288072647309666549} - {fileID: 7518938298396184218} - {fileID: -1410297666881709256} - - {fileID: -7750755424749557576} - - {fileID: -5139089513906902183} --- !u!114 &853819529557874667 MonoBehaviour: m_ObjectHideFlags: 3 diff --git a/Assets/_Project/Art/Terrain/TerrainData/New Terrain.asset b/Assets/_Project/Art/Terrain/TerrainData/New Terrain.asset index 9c49241..06ed519 100644 Binary files a/Assets/_Project/Art/Terrain/TerrainData/New Terrain.asset and b/Assets/_Project/Art/Terrain/TerrainData/New Terrain.asset differ diff --git a/Assets/_Project/Prefabs/Vehicles/Player/Buggy_Player.prefab b/Assets/_Project/Prefabs/Vehicles/Player/Buggy_Player.prefab index dcd4bed..34e4145 100644 --- a/Assets/_Project/Prefabs/Vehicles/Player/Buggy_Player.prefab +++ b/Assets/_Project/Prefabs/Vehicles/Player/Buggy_Player.prefab @@ -71,6 +71,39 @@ WheelCollider: m_LayerOverridePriority: 0 m_Enabled: 1 m_ProvidesContacts: 0 +--- !u!1 &750113556555537078 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9114007139308049182} + m_Layer: 0 + m_Name: Audio + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &9114007139308049182 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 750113556555537078} + 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: 5897662229585756618} + - {fileID: 1619493721624094195} + m_Father: {fileID: 4772777578382570152} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1220105584347587854 GameObject: m_ObjectHideFlags: 0 @@ -142,6 +175,299 @@ WheelCollider: m_LayerOverridePriority: 0 m_Enabled: 1 m_ProvidesContacts: 0 +--- !u!1 &2599938933167188421 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7863987729731623420} + m_Layer: 0 + m_Name: Effects + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7863987729731623420 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2599938933167188421} + 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: 8749525721669873730} + - {fileID: 6943352201908577945} + - {fileID: 4860281492798288263} + - {fileID: 3017463661873623124} + m_Father: {fileID: 4772777578382570152} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &4250428261150226367 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1619493721624094195} + - component: {fileID: 5164767240841886004} + m_Layer: 0 + m_Name: TireScreechSound + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1619493721624094195 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4250428261150226367} + 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: 9114007139308049182} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!82 &5164767240841886004 +AudioSource: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4250428261150226367} + m_Enabled: 1 + serializedVersion: 4 + OutputAudioMixerGroup: {fileID: 0} + m_audioClip: {fileID: 0} + m_Resource: {fileID: 8300000, guid: f632e2ace80a32e47a2c531f64901a50, type: 3} + m_PlayOnAwake: 0 + m_Volume: 0.4 + m_Pitch: 1 + Loop: 1 + Mute: 0 + Spatialize: 0 + SpatializePostEffects: 0 + Priority: 128 + DopplerLevel: 0.3 + MinDistance: 12 + MaxDistance: 70 + Pan2D: 0 + rolloffMode: 1 + 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: 1 + 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!1 &5725176332190465528 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5897662229585756618} + - component: {fileID: 2872479692476395633} + m_Layer: 0 + m_Name: EngineSound + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5897662229585756618 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5725176332190465528} + 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: 9114007139308049182} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!82 &2872479692476395633 +AudioSource: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5725176332190465528} + m_Enabled: 1 + serializedVersion: 4 + OutputAudioMixerGroup: {fileID: 0} + m_audioClip: {fileID: 0} + m_Resource: {fileID: 8300000, guid: 771ce407ce807b74885ec23ebd1e6647, type: 3} + m_PlayOnAwake: 0 + m_Volume: 0.65 + m_Pitch: 1 + Loop: 1 + Mute: 0 + Spatialize: 0 + SpatializePostEffects: 0 + Priority: 128 + DopplerLevel: 0.3 + MinDistance: 24 + MaxDistance: 90 + Pan2D: 0 + rolloffMode: 1 + 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: 1 + 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!1 &6741570655071805230 GameObject: m_ObjectHideFlags: 0 @@ -251,6 +577,8 @@ Transform: - {fileID: 4673438351332549834} - {fileID: 3534324926145310694} - {fileID: 279644236469480577} + - {fileID: 7863987729731623420} + - {fileID: 9114007139308049182} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!54 &5167617291018270 @@ -321,13 +649,24 @@ MonoBehaviour: frontRightVisual: {fileID: 0} rearLeftVisual: {fileID: 0} rearRightVisual: {fileID: 0} - motorTorque: 950 - brakeTorque: 1700 - maxSteerAngle: 32 - reverseTorqueScale: 0.45 - downforce: 35 - centerOfMassOffset: {x: 0, y: -0.45, z: 0.15} maxSpeedKmh: 120 + maxReverseSpeedKmh: 45 + accelerationMultiplier: 6 + maxSteerAngle: 35 + steeringSpeed: 0.5 + brakeForce: 450 + decelerationMultiplier: 2 + handbrakeDriftMultiplier: 5 + downforce: 35 + centerOfMass: {x: 0, y: -0.45, z: 0.15} + useEffects: 1 + rearLeftSmoke: {fileID: 8749525721655742662} + rearRightSmoke: {fileID: 6943352201889072669} + rearLeftSkid: {fileID: 4860281492798288262} + rearRightSkid: {fileID: 3017463661873623125} + useSounds: 1 + engineSound: {fileID: 2872479692476395633} + tireScreechSound: {fileID: 5164767240841886004} --- !u!114 &8664118715040108722 MonoBehaviour: m_ObjectHideFlags: 0 @@ -423,6 +762,282 @@ WheelCollider: m_LayerOverridePriority: 0 m_Enabled: 1 m_ProvidesContacts: 0 +--- !u!1001 &2782393766222725750 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 7863987729731623420} + m_Modifications: + - target: {fileID: 7344874181333496816, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} + propertyPath: m_Emitting + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7344874181333496817, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} + propertyPath: m_LocalPosition.x + value: -0.8716712 + objectReference: {fileID: 0} + - target: {fileID: 7344874181333496817, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} + propertyPath: m_LocalPosition.y + value: 0.27369422 + objectReference: {fileID: 0} + - target: {fileID: 7344874181333496817, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} + propertyPath: m_LocalPosition.z + value: -0.42227113 + objectReference: {fileID: 0} + - target: {fileID: 7344874181333496817, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7344874181333496817, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7344874181333496817, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7344874181333496817, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7344874181333496817, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7344874181333496817, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7344874181333496817, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7344874181333496819, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} + propertyPath: m_Name + value: LeftTireSkid + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} +--- !u!96 &4860281492798288262 stripped +TrailRenderer: + m_CorrespondingSourceObject: {fileID: 7344874181333496816, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} + m_PrefabInstance: {fileID: 2782393766222725750} + m_PrefabAsset: {fileID: 0} +--- !u!4 &4860281492798288263 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7344874181333496817, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} + m_PrefabInstance: {fileID: 2782393766222725750} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &4638004351678942375 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 7863987729731623420} + m_Modifications: + - target: {fileID: 4121091811543088291, guid: ddf4ea2625767fd4bb4153e7e4009ad5, type: 3} + propertyPath: m_Name + value: LeftTireSmoke_PS + objectReference: {fileID: 0} + - target: {fileID: 4121091811543137509, guid: ddf4ea2625767fd4bb4153e7e4009ad5, type: 3} + propertyPath: m_LocalPosition.x + value: -1.0716712 + objectReference: {fileID: 0} + - target: {fileID: 4121091811543137509, guid: ddf4ea2625767fd4bb4153e7e4009ad5, type: 3} + propertyPath: m_LocalPosition.y + value: 0.023694217 + objectReference: {fileID: 0} + - target: {fileID: 4121091811543137509, guid: ddf4ea2625767fd4bb4153e7e4009ad5, type: 3} + propertyPath: m_LocalPosition.z + value: -0.42227113 + objectReference: {fileID: 0} + - target: {fileID: 4121091811543137509, guid: ddf4ea2625767fd4bb4153e7e4009ad5, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4121091811543137509, guid: ddf4ea2625767fd4bb4153e7e4009ad5, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4121091811543137509, guid: ddf4ea2625767fd4bb4153e7e4009ad5, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4121091811543137509, guid: ddf4ea2625767fd4bb4153e7e4009ad5, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4121091811543137509, guid: ddf4ea2625767fd4bb4153e7e4009ad5, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4121091811543137509, guid: ddf4ea2625767fd4bb4153e7e4009ad5, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4121091811543137509, guid: ddf4ea2625767fd4bb4153e7e4009ad5, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: ddf4ea2625767fd4bb4153e7e4009ad5, type: 3} +--- !u!198 &8749525721655742662 stripped +ParticleSystem: + m_CorrespondingSourceObject: {fileID: 4121091811527957601, guid: ddf4ea2625767fd4bb4153e7e4009ad5, type: 3} + m_PrefabInstance: {fileID: 4638004351678942375} + m_PrefabAsset: {fileID: 0} +--- !u!4 &8749525721669873730 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4121091811543137509, guid: ddf4ea2625767fd4bb4153e7e4009ad5, type: 3} + m_PrefabInstance: {fileID: 4638004351678942375} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &5480338763159847845 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 7863987729731623420} + m_Modifications: + - target: {fileID: 7344874181333496816, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} + propertyPath: m_Emitting + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7344874181333496817, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} + propertyPath: m_LocalPosition.x + value: 0.87719953 + objectReference: {fileID: 0} + - target: {fileID: 7344874181333496817, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} + propertyPath: m_LocalPosition.y + value: 0.2736943 + objectReference: {fileID: 0} + - target: {fileID: 7344874181333496817, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} + propertyPath: m_LocalPosition.z + value: -0.42227113 + objectReference: {fileID: 0} + - target: {fileID: 7344874181333496817, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7344874181333496817, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7344874181333496817, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7344874181333496817, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 7344874181333496817, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7344874181333496817, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7344874181333496817, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7344874181333496819, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} + propertyPath: m_Name + value: RightTireSkid + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} +--- !u!4 &3017463661873623124 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7344874181333496817, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} + m_PrefabInstance: {fileID: 5480338763159847845} + m_PrefabAsset: {fileID: 0} +--- !u!96 &3017463661873623125 stripped +TrailRenderer: + m_CorrespondingSourceObject: {fileID: 7344874181333496816, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3} + m_PrefabInstance: {fileID: 5480338763159847845} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &6443156973287594620 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 7863987729731623420} + m_Modifications: + - target: {fileID: 4121091811543088291, guid: ddf4ea2625767fd4bb4153e7e4009ad5, type: 3} + propertyPath: m_Name + value: RightTireSmoke_PS + objectReference: {fileID: 0} + - target: {fileID: 4121091811543137509, guid: ddf4ea2625767fd4bb4153e7e4009ad5, type: 3} + propertyPath: m_LocalPosition.x + value: 1.0771996 + objectReference: {fileID: 0} + - target: {fileID: 4121091811543137509, guid: ddf4ea2625767fd4bb4153e7e4009ad5, type: 3} + propertyPath: m_LocalPosition.y + value: 0.023694307 + objectReference: {fileID: 0} + - target: {fileID: 4121091811543137509, guid: ddf4ea2625767fd4bb4153e7e4009ad5, type: 3} + propertyPath: m_LocalPosition.z + value: -0.42227113 + objectReference: {fileID: 0} + - target: {fileID: 4121091811543137509, guid: ddf4ea2625767fd4bb4153e7e4009ad5, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4121091811543137509, guid: ddf4ea2625767fd4bb4153e7e4009ad5, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4121091811543137509, guid: ddf4ea2625767fd4bb4153e7e4009ad5, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4121091811543137509, guid: ddf4ea2625767fd4bb4153e7e4009ad5, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 4121091811543137509, guid: ddf4ea2625767fd4bb4153e7e4009ad5, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4121091811543137509, guid: ddf4ea2625767fd4bb4153e7e4009ad5, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4121091811543137509, guid: ddf4ea2625767fd4bb4153e7e4009ad5, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: ddf4ea2625767fd4bb4153e7e4009ad5, type: 3} +--- !u!198 &6943352201889072669 stripped +ParticleSystem: + m_CorrespondingSourceObject: {fileID: 4121091811527957601, guid: ddf4ea2625767fd4bb4153e7e4009ad5, type: 3} + m_PrefabInstance: {fileID: 6443156973287594620} + m_PrefabAsset: {fileID: 0} +--- !u!4 &6943352201908577945 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4121091811543137509, guid: ddf4ea2625767fd4bb4153e7e4009ad5, type: 3} + m_PrefabInstance: {fileID: 6443156973287594620} + m_PrefabAsset: {fileID: 0} --- !u!1001 &6787725748994149289 PrefabInstance: m_ObjectHideFlags: 0 diff --git a/Assets/_Project/Scenes/Demo Scene.unity b/Assets/_Project/Scenes/Demo Scene.unity index 21538c7..88baa96 100644 --- a/Assets/_Project/Scenes/Demo Scene.unity +++ b/Assets/_Project/Scenes/Demo Scene.unity @@ -247,15 +247,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5333045600610406045, guid: 5be9815168b750e43a3cafd4741a38ec, type: 3} propertyPath: m_LocalPosition.x - value: 151.49287 + value: 125.79 objectReference: {fileID: 0} - target: {fileID: 5333045600610406045, guid: 5be9815168b750e43a3cafd4741a38ec, type: 3} propertyPath: m_LocalPosition.y - value: -0.00000177061 + value: 18.48 objectReference: {fileID: 0} - target: {fileID: 5333045600610406045, guid: 5be9815168b750e43a3cafd4741a38ec, type: 3} propertyPath: m_LocalPosition.z - value: 96.31607 + value: 102.32 objectReference: {fileID: 0} - target: {fileID: 5333045600610406045, guid: 5be9815168b750e43a3cafd4741a38ec, type: 3} propertyPath: m_LocalRotation.w @@ -626,7 +626,7 @@ Transform: m_GameObject: {fileID: 1735981100} serializedVersion: 2 m_LocalRotation: {x: 0.4066569, y: 0, z: 0, w: 0.913581} - m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalPosition: {x: 0, y: 6.02, z: 6.68} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] diff --git a/Assets/_Project/Scripts/Editor/BuggyPrefabBuilder.cs b/Assets/_Project/Scripts/Editor/BuggyPrefabBuilder.cs index f0ebc73..1535dca 100644 --- a/Assets/_Project/Scripts/Editor/BuggyPrefabBuilder.cs +++ b/Assets/_Project/Scripts/Editor/BuggyPrefabBuilder.cs @@ -9,6 +9,10 @@ namespace RaceFields.EditorTools { private const string BuggyPrefabPath = "Assets/_Project/Prefabs/Vehicles/Player/Buggy_Player.prefab"; private const string CameraPrefabPath = "Assets/_Project/Prefabs/Cameras/Buggy_ThirdPersonCamera.prefab"; + private const string TireSmokePrefabPath = "Assets/PROMETEO - Car Controller/Effects/Particle Systems/Prefabs/TireSmoke_PS.prefab"; + private const string TireSkidPrefabPath = "Assets/PROMETEO - Car Controller/Effects/Trails/Prefabs/TireSkid.prefab"; + private const string EngineSoundPath = "Assets/PROMETEO - Car Controller/Sounds/CarEngine.wav"; + private const string TireScreechSoundPath = "Assets/PROMETEO - Car Controller/Sounds/TireScreech.wav"; [MenuItem("Race Fields/Setup/Rebuild Buggy Prefab")] public static void RebuildBuggyPrefab() @@ -18,13 +22,15 @@ namespace RaceFields.EditorTools { EnsureComponent(root, ConfigureBody); EnsureComponent(root, ConfigureBodyCollider); - EnsureComponent(root, null); + ArcadeBuggyController controller = EnsureComponent(root, null); EnsureComponent(root, setup => setup.AlignAllWheels()); SetupWheel(root.transform, "F_L", "WheelCollider_FL"); SetupWheel(root.transform, "F_R", "WheelCollider_FR"); SetupWheel(root.transform, "B_L", "WheelCollider_RL"); SetupWheel(root.transform, "B_R", "WheelCollider_RR"); + SetupEffects(root.transform, controller); + SetupSounds(root.transform, controller); BuggyWheelSetup wheelSetup = root.GetComponent(); wheelSetup.AlignAllWheels(); @@ -121,6 +127,117 @@ namespace RaceFields.EditorTools wheelCollider.suspensionSpring = spring; } + private static void SetupEffects(Transform root, ArcadeBuggyController controller) + { + GameObject effectsRoot = GetOrCreateChild(root, "Effects"); + Transform rearLeftWheel = FindDescendant(root, "WheelCollider_RL"); + Transform rearRightWheel = FindDescendant(root, "WheelCollider_RR"); + + ParticleSystem rearLeftSmoke = SetupEffectPrefab(effectsRoot.transform, rearLeftWheel, "LeftTireSmoke_PS", TireSmokePrefabPath, new Vector3(-0.2f, -0.25f, 0f)); + ParticleSystem rearRightSmoke = SetupEffectPrefab(effectsRoot.transform, rearRightWheel, "RightTireSmoke_PS", TireSmokePrefabPath, new Vector3(0.2f, -0.25f, 0f)); + TrailRenderer rearLeftSkid = SetupEffectPrefab(effectsRoot.transform, rearLeftWheel, "LeftTireSkid", TireSkidPrefabPath, Vector3.zero); + TrailRenderer rearRightSkid = SetupEffectPrefab(effectsRoot.transform, rearRightWheel, "RightTireSkid", TireSkidPrefabPath, Vector3.zero); + + SerializedObject serializedController = new SerializedObject(controller); + serializedController.FindProperty("maxSpeedKmh").floatValue = 120f; + serializedController.FindProperty("maxReverseSpeedKmh").floatValue = 45f; + serializedController.FindProperty("accelerationMultiplier").floatValue = 6f; + serializedController.FindProperty("maxSteerAngle").floatValue = 35f; + serializedController.FindProperty("steeringSpeed").floatValue = 0.5f; + serializedController.FindProperty("brakeForce").floatValue = 450f; + serializedController.FindProperty("decelerationMultiplier").floatValue = 2f; + serializedController.FindProperty("handbrakeDriftMultiplier").floatValue = 5f; + serializedController.FindProperty("useEffects").boolValue = true; + serializedController.FindProperty("rearLeftSmoke").objectReferenceValue = rearLeftSmoke; + serializedController.FindProperty("rearRightSmoke").objectReferenceValue = rearRightSmoke; + serializedController.FindProperty("rearLeftSkid").objectReferenceValue = rearLeftSkid; + serializedController.FindProperty("rearRightSkid").objectReferenceValue = rearRightSkid; + serializedController.ApplyModifiedPropertiesWithoutUndo(); + } + + private static void SetupSounds(Transform root, ArcadeBuggyController controller) + { + GameObject audioRoot = GetOrCreateChild(root, "Audio"); + AudioSource engineSource = SetupAudioSource(audioRoot.transform, "EngineSound", EngineSoundPath, true, 0.65f, 1f, 24f, 90f); + AudioSource tireScreechSource = SetupAudioSource(audioRoot.transform, "TireScreechSound", TireScreechSoundPath, true, 0.4f, 1f, 12f, 70f); + + SerializedObject serializedController = new SerializedObject(controller); + serializedController.FindProperty("useSounds").boolValue = true; + serializedController.FindProperty("engineSound").objectReferenceValue = engineSource; + serializedController.FindProperty("tireScreechSound").objectReferenceValue = tireScreechSource; + serializedController.ApplyModifiedPropertiesWithoutUndo(); + } + + private static AudioSource SetupAudioSource(Transform parent, string sourceName, string clipPath, bool loop, float volume, float pitch, float minDistance, float maxDistance) + { + GameObject sourceObject = GetOrCreateChild(parent, sourceName); + AudioSource source = sourceObject.GetComponent(); + if (source == null) + source = sourceObject.AddComponent(); + + source.clip = AssetDatabase.LoadAssetAtPath(clipPath); + source.playOnAwake = false; + source.loop = loop; + source.volume = volume; + source.pitch = pitch; + source.spatialBlend = 1f; + source.rolloffMode = AudioRolloffMode.Linear; + source.minDistance = minDistance; + source.maxDistance = maxDistance; + source.dopplerLevel = 0.3f; + return source; + } + + private static T SetupEffectPrefab(Transform parent, Transform wheel, string effectName, string prefabPath, Vector3 localOffset) where T : Component + { + if (wheel == null) + return null; + + Transform existing = FindDescendant(parent, effectName); + GameObject effectObject; + if (existing != null) + { + effectObject = existing.gameObject; + } + else + { + GameObject prefab = AssetDatabase.LoadAssetAtPath(prefabPath); + effectObject = prefab != null + ? (GameObject)PrefabUtility.InstantiatePrefab(prefab) + : new GameObject(effectName); + } + + effectObject.name = effectName; + effectObject.transform.SetParent(parent, false); + effectObject.transform.position = wheel.position + TransformDirection(wheel, localOffset); + effectObject.transform.rotation = wheel.rotation; + effectObject.transform.localScale = Vector3.one; + + T component = effectObject.GetComponentInChildren(true); + if (component is TrailRenderer trail) + trail.emitting = false; + else if (component is ParticleSystem particles) + particles.Stop(true, ParticleSystemStopBehavior.StopEmittingAndClear); + + return component; + } + + private static Vector3 TransformDirection(Transform wheel, Vector3 localOffset) + { + return wheel.TransformDirection(localOffset); + } + + private static GameObject GetOrCreateChild(Transform root, string childName) + { + Transform existing = FindDescendant(root, childName); + if (existing != null) + return existing.gameObject; + + GameObject child = new GameObject(childName); + child.transform.SetParent(root, false); + return child; + } + private static float EstimateRadius(Transform visual) { Renderer renderer = visual.GetComponentInChildren(); diff --git a/Assets/_Project/Scripts/Vehicles/Controller/ArcadeBuggyController.cs b/Assets/_Project/Scripts/Vehicles/Controller/ArcadeBuggyController.cs index f20eefc..4c2c9ec 100644 --- a/Assets/_Project/Scripts/Vehicles/Controller/ArcadeBuggyController.cs +++ b/Assets/_Project/Scripts/Vehicles/Controller/ArcadeBuggyController.cs @@ -21,20 +21,60 @@ namespace RaceFields.Vehicles [SerializeField] private Transform rearRightVisual; [Header("Driving")] - [SerializeField] private float motorTorque = 950f; - [SerializeField] private float brakeTorque = 1700f; - [SerializeField] private float maxSteerAngle = 32f; - [SerializeField] private float reverseTorqueScale = 0.45f; + [SerializeField, Range(20f, 190f)] private float maxSpeedKmh = 120f; + [SerializeField, Range(10f, 120f)] private float maxReverseSpeedKmh = 45f; + [SerializeField, Range(1f, 10f)] private float accelerationMultiplier = 6f; + [SerializeField, Range(10f, 45f)] private float maxSteerAngle = 35f; + [SerializeField, Range(0.1f, 1f)] private float steeringSpeed = 0.5f; + [SerializeField, Range(100f, 600f)] private float brakeForce = 450f; + [SerializeField, Range(1f, 10f)] private float decelerationMultiplier = 2f; + [SerializeField, Range(1f, 10f)] private float handbrakeDriftMultiplier = 5f; [SerializeField] private float downforce = 35f; [Header("Stability")] - [SerializeField] private Vector3 centerOfMassOffset = new Vector3(0f, -0.45f, 0.15f); - [SerializeField] private float maxSpeedKmh = 120f; + [SerializeField] private Vector3 centerOfMass = new Vector3(0f, -0.45f, 0.15f); + + [Header("Effects")] + [SerializeField] private bool useEffects = true; + [SerializeField] private ParticleSystem rearLeftSmoke; + [SerializeField] private ParticleSystem rearRightSmoke; + [SerializeField] private TrailRenderer rearLeftSkid; + [SerializeField] private TrailRenderer rearRightSkid; + + [Header("Sounds")] + [SerializeField] private bool useSounds; + [SerializeField] private AudioSource engineSound; + [SerializeField] private AudioSource tireScreechSound; + + public float SpeedKmh { get; private set; } + public bool IsDrifting { get; private set; } + public bool IsTractionLocked { get; private set; } + + private const float TorquePerAccelerationStep = 50f; + private const float DriftVelocityThreshold = 2.5f; + private const float SkidVelocityThreshold = 5f; + private const float EffectsMinSpeedKmh = 12f; private Rigidbody body; - private float throttle; - private float steering; - private bool brake; + private float throttleInput; + private float steeringInput; + private bool handbrakeInput; + private float steeringAxis; + private float throttleAxis; + private float driftingAxis; + private float localVelocityX; + private float localVelocityZ; + private float initialEnginePitch; + + private WheelFrictionCurve frontLeftSidewaysFriction; + private WheelFrictionCurve frontRightSidewaysFriction; + private WheelFrictionCurve rearLeftSidewaysFriction; + private WheelFrictionCurve rearRightSidewaysFriction; + private float frontLeftExtremumSlip; + private float frontRightExtremumSlip; + private float rearLeftExtremumSlip; + private float rearRightExtremumSlip; + private Quaternion frontLeftVisualRotationOffset = Quaternion.identity; private Quaternion frontRightVisualRotationOffset = Quaternion.identity; private Quaternion rearLeftVisualRotationOffset = Quaternion.identity; @@ -43,25 +83,30 @@ namespace RaceFields.Vehicles private void Awake() { body = GetComponent(); - body.centerOfMass += centerOfMassOffset; AutoFindReferences(); CacheVisualRotationOffsets(); + CacheWheelFriction(); + + body.centerOfMass = centerOfMass; + initialEnginePitch = engineSound != null ? engineSound.pitch : 1f; + SetEffectsActive(false); } private void Update() { ReadInput(); - SyncWheelVisual(frontLeftCollider, frontLeftVisual, frontLeftVisualRotationOffset); - SyncWheelVisual(frontRightCollider, frontRightVisual, frontRightVisualRotationOffset); - SyncWheelVisual(rearLeftCollider, rearLeftVisual, rearLeftVisualRotationOffset); - SyncWheelVisual(rearRightCollider, rearRightVisual, rearRightVisualRotationOffset); + UpdateTelemetry(); + UpdateWheelVisuals(); + UpdateSounds(); } private void FixedUpdate() { ApplySteering(); - ApplyMotorAndBrakes(); - body.AddForce(-transform.up * downforce * body.linearVelocity.magnitude, ForceMode.Force); + ApplyDrive(); + ApplyHandbrake(); + ApplyDownforce(); + UpdateEffects(); } private void ReadInput() @@ -74,57 +119,278 @@ namespace RaceFields.Vehicles float left = Keyboard.current.aKey.isPressed || Keyboard.current.leftArrowKey.isPressed ? 1f : 0f; float right = Keyboard.current.dKey.isPressed || Keyboard.current.rightArrowKey.isPressed ? 1f : 0f; - throttle = forward - reverse; - steering = right - left; - brake = Keyboard.current.spaceKey.isPressed; + throttleInput = forward - reverse; + steeringInput = right - left; + handbrakeInput = Keyboard.current.spaceKey.isPressed; return; } #endif - throttle = Input.GetAxisRaw("Vertical"); - steering = Input.GetAxisRaw("Horizontal"); - brake = Input.GetKey(KeyCode.Space); + throttleInput = Input.GetAxisRaw("Vertical"); + steeringInput = Input.GetAxisRaw("Horizontal"); + handbrakeInput = Input.GetKey(KeyCode.Space); + } + + private void UpdateTelemetry() + { + SpeedKmh = body.linearVelocity.magnitude * 3.6f; + Vector3 localVelocity = transform.InverseTransformDirection(body.linearVelocity); + localVelocityX = localVelocity.x; + localVelocityZ = localVelocity.z; + IsDrifting = Mathf.Abs(localVelocityX) > DriftVelocityThreshold; } private void ApplySteering() { - float angle = steering * maxSteerAngle; - if (frontLeftCollider != null) frontLeftCollider.steerAngle = angle; - if (frontRightCollider != null) frontRightCollider.steerAngle = angle; + if (steeringInput < -0.01f) + steeringAxis -= Time.fixedDeltaTime * 10f * steeringSpeed; + else if (steeringInput > 0.01f) + steeringAxis += Time.fixedDeltaTime * 10f * steeringSpeed; + else + steeringAxis = Mathf.MoveTowards(steeringAxis, 0f, Time.fixedDeltaTime * 10f * steeringSpeed); + + steeringAxis = Mathf.Clamp(steeringAxis, -1f, 1f); + float steeringAngle = steeringAxis * maxSteerAngle; + SetSteerAngle(frontLeftCollider, steeringAngle, steeringSpeed); + SetSteerAngle(frontRightCollider, steeringAngle, steeringSpeed); } - private void ApplyMotorAndBrakes() + private void ApplyDrive() { - float speedKmh = body.linearVelocity.magnitude * 3.6f; - float torque = speedKmh < maxSpeedKmh ? throttle * motorTorque : 0f; - if (throttle < 0f) torque *= reverseTorqueScale; + if (throttleInput > 0.01f) + { + throttleAxis = Mathf.MoveTowards(throttleAxis, 1f, Time.fixedDeltaTime * 3f); + if (localVelocityZ < -1f) + { + ApplyBrakeTorque(brakeForce); + ApplyMotorTorque(0f); + return; + } + + ApplyBrakeTorque(0f); + ApplyMotorTorque(SpeedKmh < maxSpeedKmh ? accelerationMultiplier * TorquePerAccelerationStep * throttleAxis : 0f); + return; + } + + if (throttleInput < -0.01f) + { + throttleAxis = Mathf.MoveTowards(throttleAxis, -1f, Time.fixedDeltaTime * 3f); + + if (localVelocityZ > 1f) + { + ApplyBrakeTorque(brakeForce); + ApplyMotorTorque(0f); + return; + } + + ApplyBrakeTorque(0f); + ApplyMotorTorque(SpeedKmh < maxReverseSpeedKmh ? accelerationMultiplier * TorquePerAccelerationStep * throttleAxis : 0f); + return; + } + + throttleAxis = Mathf.MoveTowards(throttleAxis, 0f, Time.fixedDeltaTime * 10f); + ApplyMotorTorque(0f); + + if (!handbrakeInput) + { + ApplyBrakeTorque(0f); + body.linearVelocity *= 1f / (1f + 0.025f * decelerationMultiplier); + + if (body.linearVelocity.magnitude < 0.25f) + body.linearVelocity = Vector3.zero; + } + } + + private void ApplyHandbrake() + { + if (handbrakeInput) + { + driftingAxis = Mathf.Clamp01(driftingAxis + Time.fixedDeltaTime); + float startingPoint = driftingAxis * frontLeftExtremumSlip * handbrakeDriftMultiplier; + if (startingPoint < frontLeftExtremumSlip) + driftingAxis = frontLeftExtremumSlip / (frontLeftExtremumSlip * handbrakeDriftMultiplier); + + SetDriftFriction(driftingAxis); + IsTractionLocked = true; + ApplyBrakeTorque(brakeForce); + return; + } + + IsTractionLocked = false; + driftingAxis = Mathf.MoveTowards(driftingAxis, 0f, Time.fixedDeltaTime / 1.5f); + SetDriftFriction(driftingAxis); + } + + private void ApplyDownforce() + { + body.AddForce(-transform.up * downforce * body.linearVelocity.magnitude, ForceMode.Force); + } + + private void UpdateSounds() + { + if (!useSounds) + { + StopAudio(engineSound); + StopAudio(tireScreechSound); + return; + } + + if (engineSound != null) + { + if (!engineSound.isPlaying) + engineSound.Play(); + + engineSound.pitch = initialEnginePitch + body.linearVelocity.magnitude / 25f; + } + + bool rearWheelsGrounded = IsWheelGrounded(rearLeftCollider) || IsWheelGrounded(rearRightCollider); + bool shouldScreech = rearWheelsGrounded && (IsDrifting || (IsTractionLocked && SpeedKmh > EffectsMinSpeedKmh)); + if (tireScreechSound != null) + { + if (shouldScreech && !tireScreechSound.isPlaying) + tireScreechSound.Play(); + else if (!shouldScreech && tireScreechSound.isPlaying) + tireScreechSound.Stop(); + } + } + + private void UpdateEffects() + { + if (!useEffects) + { + SetEffectsActive(false); + return; + } + + bool rearLeftGrounded = IsWheelGrounded(rearLeftCollider); + bool rearRightGrounded = IsWheelGrounded(rearRightCollider); + bool emitSmoke = IsDrifting && SpeedKmh > EffectsMinSpeedKmh; + bool emitSkids = (IsTractionLocked || Mathf.Abs(localVelocityX) > SkidVelocityThreshold) && SpeedKmh > EffectsMinSpeedKmh; + + SetParticlePlaying(rearLeftSmoke, emitSmoke && rearLeftGrounded); + SetParticlePlaying(rearRightSmoke, emitSmoke && rearRightGrounded); + SetTrailEmitting(rearLeftSkid, emitSkids && rearLeftGrounded); + SetTrailEmitting(rearRightSkid, emitSkids && rearRightGrounded); + } + + private void UpdateWheelVisuals() + { + SyncWheelVisual(frontLeftCollider, frontLeftVisual, frontLeftVisualRotationOffset); + SyncWheelVisual(frontRightCollider, frontRightVisual, frontRightVisualRotationOffset); + SyncWheelVisual(rearLeftCollider, rearLeftVisual, rearLeftVisualRotationOffset); + SyncWheelVisual(rearRightCollider, rearRightVisual, rearRightVisualRotationOffset); + } + + private void CacheWheelFriction() + { + frontLeftSidewaysFriction = frontLeftCollider != null ? frontLeftCollider.sidewaysFriction : default; + frontRightSidewaysFriction = frontRightCollider != null ? frontRightCollider.sidewaysFriction : default; + rearLeftSidewaysFriction = rearLeftCollider != null ? rearLeftCollider.sidewaysFriction : default; + rearRightSidewaysFriction = rearRightCollider != null ? rearRightCollider.sidewaysFriction : default; + + frontLeftExtremumSlip = frontLeftSidewaysFriction.extremumSlip; + frontRightExtremumSlip = frontRightSidewaysFriction.extremumSlip; + rearLeftExtremumSlip = rearLeftSidewaysFriction.extremumSlip; + rearRightExtremumSlip = rearRightSidewaysFriction.extremumSlip; + } + + private void SetDriftFriction(float drift) + { + ApplySidewaysFriction(frontLeftCollider, ref frontLeftSidewaysFriction, frontLeftExtremumSlip, drift); + ApplySidewaysFriction(frontRightCollider, ref frontRightSidewaysFriction, frontRightExtremumSlip, drift); + ApplySidewaysFriction(rearLeftCollider, ref rearLeftSidewaysFriction, rearLeftExtremumSlip, drift); + ApplySidewaysFriction(rearRightCollider, ref rearRightSidewaysFriction, rearRightExtremumSlip, drift); + } + + private void ApplySidewaysFriction(WheelCollider wheel, ref WheelFrictionCurve friction, float defaultExtremumSlip, float drift) + { + if (wheel == null) + return; + + float driftExtremumSlip = defaultExtremumSlip * handbrakeDriftMultiplier; + friction.extremumSlip = Mathf.Lerp(defaultExtremumSlip, driftExtremumSlip, drift); + wheel.sidewaysFriction = friction; + } + + private void ApplyMotorTorque(float torque) + { + SetDriveTorque(frontLeftCollider, torque); + SetDriveTorque(frontRightCollider, torque); SetDriveTorque(rearLeftCollider, torque); SetDriveTorque(rearRightCollider, torque); + } - float currentBrakeTorque = brake ? brakeTorque : 0f; - SetBrakeTorque(frontLeftCollider, currentBrakeTorque); - SetBrakeTorque(frontRightCollider, currentBrakeTorque); - SetBrakeTorque(rearLeftCollider, currentBrakeTorque); - SetBrakeTorque(rearRightCollider, currentBrakeTorque); + private void ApplyBrakeTorque(float torque) + { + SetBrakeTorque(frontLeftCollider, torque); + SetBrakeTorque(frontRightCollider, torque); + SetBrakeTorque(rearLeftCollider, torque); + SetBrakeTorque(rearRightCollider, torque); + } + + private static void SetSteerAngle(WheelCollider wheel, float angle, float lerp) + { + if (wheel != null) + wheel.steerAngle = Mathf.Lerp(wheel.steerAngle, angle, lerp); } private static void SetDriveTorque(WheelCollider wheel, float torque) { - if (wheel != null) wheel.motorTorque = torque; + if (wheel != null) + wheel.motorTorque = torque; } private static void SetBrakeTorque(WheelCollider wheel, float torque) { - if (wheel != null) wheel.brakeTorque = torque; + if (wheel != null) + wheel.brakeTorque = torque; } private static void SyncWheelVisual(WheelCollider collider, Transform visual, Quaternion visualRotationOffset) { - if (collider == null || visual == null) return; + if (collider == null || visual == null) + return; + collider.GetWorldPose(out Vector3 position, out Quaternion rotation); visual.SetPositionAndRotation(position, rotation * visualRotationOffset); } + private void SetEffectsActive(bool active) + { + SetParticlePlaying(rearLeftSmoke, active); + SetParticlePlaying(rearRightSmoke, active); + SetTrailEmitting(rearLeftSkid, active); + SetTrailEmitting(rearRightSkid, active); + } + + private static void SetParticlePlaying(ParticleSystem particles, bool playing) + { + if (particles == null) + return; + + if (playing && !particles.isPlaying) + particles.Play(); + else if (!playing && particles.isPlaying) + particles.Stop(); + } + + private static void SetTrailEmitting(TrailRenderer trail, bool emitting) + { + if (trail != null) + trail.emitting = emitting; + } + + private static bool IsWheelGrounded(WheelCollider wheel) + { + return wheel != null && wheel.isGrounded; + } + + private static void StopAudio(AudioSource source) + { + if (source != null && source.isPlaying) + source.Stop(); + } + private void AutoFindReferences() { frontLeftCollider ??= FindChildComponent("WheelCollider_FL"); @@ -136,6 +402,11 @@ namespace RaceFields.Vehicles frontRightVisual ??= FindFirstChildTransform("F_R", "WheelVisual_FR"); rearLeftVisual ??= FindFirstChildTransform("B_L", "WheelVisual_RL"); rearRightVisual ??= FindFirstChildTransform("B_R", "WheelVisual_RR"); + + rearLeftSmoke ??= FindChildComponent("LeftTireSmoke_PS"); + rearRightSmoke ??= FindChildComponent("RightTireSmoke_PS"); + rearLeftSkid ??= FindChildComponent("LeftTireSkid"); + rearRightSkid ??= FindChildComponent("RightTireSkid"); } private void CacheVisualRotationOffsets()