From 01ce057601aeab7d31aea80d0c752ebe5970fce0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C5=A1a=20Ceviel?= Date: Tue, 27 Jan 2026 13:33:33 +0300 Subject: [PATCH] added start and finish flags --- Assets/Code/Track/TrackData.cs | 22 +- Assets/Code/UI/GameplayController.cs | 3 +- Assets/Resources/Meshes/RaceFlag.obj | 3 + Assets/Resources/Meshes/RaceFlag.obj.meta | 110 ++++++++++ Assets/Resources/Scenes/Gameplay.unity | 251 +++++++++++++++++++++- 5 files changed, 385 insertions(+), 4 deletions(-) create mode 100644 Assets/Resources/Meshes/RaceFlag.obj create mode 100644 Assets/Resources/Meshes/RaceFlag.obj.meta diff --git a/Assets/Code/Track/TrackData.cs b/Assets/Code/Track/TrackData.cs index f0af14e..2c1f035 100644 --- a/Assets/Code/Track/TrackData.cs +++ b/Assets/Code/Track/TrackData.cs @@ -9,13 +9,33 @@ namespace Code.Track public Vector3 StartPosition { get; } public Quaternion StartRotation { get; } public Vector3 FinishPosition { get; } + public Quaternion FinishRotation { get; } public TrackData(List waypoints) { Waypoints = new List(waypoints); StartPosition = waypoints[0]; - StartRotation = Quaternion.LookRotation(waypoints[1] - waypoints[0]); FinishPosition = waypoints[^1]; + + if (waypoints.Count > 1) + { + var startDir = (waypoints[1] - waypoints[0]).normalized; + StartRotation = Quaternion.LookRotation(startDir, Vector3.up); + } + else + { + StartRotation = Quaternion.identity; + } + + if (waypoints.Count > 1) + { + var finishDir = (waypoints[^1] - waypoints[^2]).normalized; + FinishRotation = Quaternion.LookRotation(finishDir, Vector3.up); + } + else + { + FinishRotation = Quaternion.identity; + } } } } \ No newline at end of file diff --git a/Assets/Code/UI/GameplayController.cs b/Assets/Code/UI/GameplayController.cs index d0a66cb..f622840 100644 --- a/Assets/Code/UI/GameplayController.cs +++ b/Assets/Code/UI/GameplayController.cs @@ -14,7 +14,7 @@ namespace Code.UI private void Start() { var seed = Random.Range(0, 10000); - _currentTrack = TrackGenerator.Generate(seed, 1000, segmentCount: 30); + _currentTrack = TrackGenerator.Generate(seed, 2000, segmentCount: 30); trackBuilder.Build(_currentTrack); @@ -22,6 +22,7 @@ namespace Code.UI playerSpawn.rotation = _currentTrack.StartRotation; finishTrigger.position = _currentTrack.FinishPosition; + finishTrigger.rotation = _currentTrack.FinishRotation; } } } \ No newline at end of file diff --git a/Assets/Resources/Meshes/RaceFlag.obj b/Assets/Resources/Meshes/RaceFlag.obj new file mode 100644 index 0000000..72eb8fb --- /dev/null +++ b/Assets/Resources/Meshes/RaceFlag.obj @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:674cfe3c41be6591a02b5ffedf3e22a1bb967d58b4b7913858820014d3ba2147 +size 16035 diff --git a/Assets/Resources/Meshes/RaceFlag.obj.meta b/Assets/Resources/Meshes/RaceFlag.obj.meta new file mode 100644 index 0000000..d205e84 --- /dev/null +++ b/Assets/Resources/Meshes/RaceFlag.obj.meta @@ -0,0 +1,110 @@ +fileFormatVersion: 2 +guid: 4a09aca9160fc63dc88949e10a3649e6 +ModelImporter: + serializedVersion: 24200 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + removeConstantScaleCurves: 0 + motionNodeName: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importPhysicalCameras: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + nodeNameCollisionStrategy: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + optimizeBones: 1 + generateMeshLods: 0 + meshLodGenerationFlags: 0 + maximumMeshLod: -1 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVMarginMethod: 1 + secondaryUVMinLightmapResolution: 40 + secondaryUVMinObjectScale: 1 + secondaryUVPackMargin: 4 + useFileScale: 1 + strictVertexDataChecks: 0 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 0 + addHumanoidExtraRootOnlyWhenUsingAvatar: 1 + importBlendShapeDeformPercent: 1 + remapMaterialsIfMaterialImportModeIsNone: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Scenes/Gameplay.unity b/Assets/Resources/Scenes/Gameplay.unity index 1675b79..06dc131 100644 --- a/Assets/Resources/Scenes/Gameplay.unity +++ b/Assets/Resources/Scenes/Gameplay.unity @@ -119,6 +119,128 @@ NavMeshSettings: debug: m_Flags: 0 m_NavMeshData: {fileID: 0} +--- !u!1 &400466401 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 400466402} + m_Layer: 0 + m_Name: RaceFlag + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &400466402 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 400466401} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: 0.7071068, z: -0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 16, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1.5} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 534894436} + m_Father: {fileID: 1196404185} + m_LocalEulerAnglesHint: {x: 0, y: 90, z: 0} +--- !u!1 &534894435 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 534894436} + - component: {fileID: 534894438} + - component: {fileID: 534894437} + m_Layer: 0 + m_Name: default + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &534894436 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 534894435} + 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: 400466402} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &534894437 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 534894435} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: -3033667219593020291, guid: 4a09aca9160fc63dc88949e10a3649e6, type: 3} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &534894438 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 534894435} + m_Mesh: {fileID: -2432090755550338912, guid: 4a09aca9160fc63dc88949e10a3649e6, type: 3} --- !u!1 &1119188903 GameObject: m_ObjectHideFlags: 0 @@ -186,6 +308,7 @@ MonoBehaviour: barrierSpacing: 2 mountainPrefab: {fileID: 1902205009112633233, guid: d32428de441d9112d8520ce559427762, type: 3} mountainSpacing: 10 + mountainOffsetFromRoad: 10 mountainMinDistance: 20 mountainScaleMin: 1 mountainScaleMax: 3 @@ -217,7 +340,8 @@ Transform: m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: [] + m_Children: + - {fileID: 400466402} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1779809731 @@ -248,9 +372,132 @@ Transform: m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: [] + m_Children: + - {fileID: 3529375834048046907} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &1179318518813241129 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5061139794337924440} + m_Mesh: {fileID: -2432090755550338912, guid: 4a09aca9160fc63dc88949e10a3649e6, type: 3} +--- !u!23 &2411815936391908285 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5061139794337924440} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: -3033667219593020291, guid: 4a09aca9160fc63dc88949e10a3649e6, type: 3} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!4 &3529375834048046907 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4301232535418469761} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0.7071068, z: 0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 16, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1.5} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4074324645149742691} + m_Father: {fileID: 1779809732} + m_LocalEulerAnglesHint: {x: 0, y: 90, z: 0} +--- !u!4 &4074324645149742691 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5061139794337924440} + 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: 3529375834048046907} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &4301232535418469761 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3529375834048046907} + m_Layer: 0 + m_Name: RaceFlag + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &5061139794337924440 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4074324645149742691} + - component: {fileID: 1179318518813241129} + - component: {fileID: 2411815936391908285} + m_Layer: 0 + m_Name: default + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 --- !u!1660057539 &9223372036854775807 SceneRoots: m_ObjectHideFlags: 0