Compare commits

..

1 Commits
cviat ... main

Author SHA1 Message Date
Cviat
91eb39ea70 Press F 2026-08-12 12:11:13 +03:00
61 changed files with 8939 additions and 225 deletions

0
.ai/mcp/mcp.json Normal file
View File

View File

@ -1,4 +0,0 @@
<changelist name="Несохранённые_изменения_перед_Обновить_от_17_07_2026,_12_36_[Изменения]" date="1784280990511" recycled="true" deleted="true">
<option name="PATH" value="$PROJECT_DIR$/.idea/.idea.Race_fields/.idea/shelf/Несохранённые_изменения_перед_Обновить_от_17_07_2026,_12_36_[Изменения]/shelved.patch" />
<option name="DESCRIPTION" value="Несохранённые изменения перед Обновить от 17.07.2026, 12:36 [Изменения]" />
</changelist>

View File

@ -0,0 +1,266 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="BackgroundAgentGlobalSettings">
<option name="selectedModelId" value="auto" />
</component>
<component name="ChangeListManager">
<list default="true" id="08e3a700-2b23-4d3a-a6cd-45bec0bfa361" name="Изменения" comment="add : Add vehicle selection flow and harvester enemy AI">
<change beforePath="$PROJECT_DIR$/.idea/.idea.Race_fields/.idea/shelf/_____17_07_2026__12_36___.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Assets/_Project/Prefabs/Harvesters/HarvesterEnemy.prefab" beforeDir="false" afterPath="$PROJECT_DIR$/Assets/_Project/Prefabs/Harvesters/HarvesterEnemy.prefab" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Assets/_Project/Prefabs/Vehicles/Player/Buggy.prefab" beforeDir="false" afterPath="$PROJECT_DIR$/Assets/_Project/Prefabs/Vehicles/Player/Buggy.prefab" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Assets/_Project/Prefabs/Vehicles/Player/Buggy_1.prefab" beforeDir="false" afterPath="$PROJECT_DIR$/Assets/_Project/Prefabs/Vehicles/Player/Buggy_1.prefab" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Assets/_Project/Prefabs/Vehicles/Player/Buggy_Player.prefab" beforeDir="false" afterPath="$PROJECT_DIR$/Assets/_Project/Prefabs/Vehicles/Player/Buggy_Player.prefab" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Assets/_Project/Scenes/Demo Scene.unity" beforeDir="false" afterPath="$PROJECT_DIR$/Assets/_Project/Scenes/Demo Scene.unity" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Assets/_Project/Scripts/Editor/BuggyPrefabBuilder.cs" beforeDir="false" afterPath="$PROJECT_DIR$/Assets/_Project/Scripts/Editor/BuggyPrefabBuilder.cs" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Assets/_Project/Scripts/GameFlow/SelectedVehicleSpawner.cs" beforeDir="false" afterPath="$PROJECT_DIR$/Assets/_Project/Scripts/GameFlow/SelectedVehicleSpawner.cs" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Assets/_Project/Scripts/Vehicles/Controller/ArcadeBuggyController.cs" beforeDir="false" afterPath="$PROJECT_DIR$/Assets/_Project/Scripts/Vehicles/Controller/ArcadeBuggyController.cs" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Assets/_Project/Scripts/Vehicles/Wheels/BuggyWheelSetup.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Assets/_Project/Scripts/Vehicles/Wheels/BuggyWheelSetup.cs.meta" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/Packages/manifest.json" beforeDir="false" afterPath="$PROJECT_DIR$/Packages/manifest.json" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Packages/packages-lock.json" beforeDir="false" afterPath="$PROJECT_DIR$/Packages/packages-lock.json" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="CopilotPersistence">
<persistenceIdMap>
<entry key="_C:/development/resource/unity_projects/Race_fields" value="3Gd5QUXON5f4HtIkRnTsMfnv21w" />
</persistenceIdMap>
</component>
<component name="EmbeddingIndexingInfo">
<option name="cachedIndexableFilesCount" value="4" />
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="HighlightingSettingsPerFile">
<setting file="file://$PROJECT_DIR$/Assets/_Project/Art/Models/Harvesters.meta" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Assets/_Project/Art/VFX/Effects/Trails.meta" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Assets/_Project/Audio/SFX/Vehicles/11a70f994753862.mp3.meta" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Assets/_Project/Audio/SFX/Vehicles/braking-tire-screeching.mp3.meta" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Assets/_Project/Audio/SFX/Vehicles/cbb115cd9d4f69a.mp3.meta" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Assets/_Project/Prefabs/Harvesters/HarvesterEnemy.prefab" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Assets/_Project/Prefabs/Harvesters/HarvesterEnemy.prefab.meta" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Assets/_Project/Prefabs/Vehicles/Player/Buggy.prefab" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Assets/_Project/Prefabs/Vehicles/Player/Buggy_1.prefab" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Assets/_Project/Prefabs/Vehicles/Player/Buggy_1.prefab.meta" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Assets/_Project/Prefabs/Vehicles/Player/Buggy_Player.prefab" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Assets/_Project/Scenes/Demo Scene.unity" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Assets/_Project/Scenes/Harvesters.meta" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Assets/_Project/Scenes/Selection Scene.unity" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Assets/_Project/Scenes/Selection Scene.unity.meta" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Assets/_Project/Screenshots.meta" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Assets/_Project/Scripts/GameFlow/GameSelectionState.cs.meta" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Assets/_Project/Scripts/GameFlow/SelectedVehicleSpawner.cs.meta" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Assets/_Project/Scripts/GameFlow/SelectionMenuController.cs.meta" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Assets/_Project/Scripts/Harvesters/AI/HarvesterChaseController.cs.meta" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Assets/_Project/Scripts/Harvesters/Visuals/HarvesterBladeSpinner.cs.meta" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Assets/_Project/Scripts/Weapons/Core/VehicleWeaponInventory.cs" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Assets/_Recovery/0 (3).unity.meta" root0="FORCE_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Library/PackageCache/com.unity.inputsystem@21a28c3a6c83/InputSystem/Plugins/XR/TrackedPoseDriver.cs" root0="SKIP_HIGHLIGHTING" />
<setting file="file://$PROJECT_DIR$/Library/PackageCache/com.unity.render-pipelines.universal@be00b5bbd9a1/Runtime/UniversalRenderPipeline.cs" root0="SKIP_HIGHLIGHTING" />
</component>
<component name="McpProjectServerCommands">
<commands />
<urls />
</component>
<component name="MetaFilesCheckinStateConfiguration" checkMetaFiles="false" />
<component name="ProjectColorInfo">{
&quot;customColor&quot;: &quot;&quot;,
&quot;associatedIndex&quot;: 4
}</component>
<component name="ProjectId" id="3Gd5QUXON5f4HtIkRnTsMfnv21w" />
<component name="ProjectSessionTemplates">
<option name="panelTemplate">
<template>
<option name="modeId" value="file:///c%3A/snapshot/copilot-language-server-internal/dist/assets/agents/Plan.agent.md" />
<option name="model">
<model>
<option name="modelType" value="builtin_id" />
<option name="modelValue" value="auto" />
</model>
</option>
<option name="targetType" value="LOCAL" />
</template>
</option>
</component>
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"RunOnceActivity.MCP Project settings loaded": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true",
"RunOnceActivity.git.unshallow": "true",
"RunOnceActivity.typescript.service.memoryLimit.init": "true",
"copilot.chat.legacySessionMetadata.migrated": "true",
"git-widget-placeholder": "main",
"node.js.detected.package.eslint": "true",
"node.js.selected.package.eslint": "(autodetect)",
"node.js.selected.package.tslint": "(autodetect)",
"nodejs_package_manager_path": "npm",
"settings.editor.selected.configurable": "ml.llm.LLMThirdPartyAiProvidersConfigurable",
"vue.rearranger.settings.migration": "true"
}
}]]></component>
<component name="RunManager" selected="Подключиться к редактору Unity.Подключиться к редактору Unity">
<configuration name="Модульные тесты (пакетный режим)" type="RunUnityExe" factoryName="Unity Executable">
<option name="EXE_PATH" value="C:\Program Files\Unity\Hub\Editor\6000.5.1f1\Editor\Unity.exe" />
<option name="PROGRAM_PARAMETERS" value="-runTests -batchmode -projectPath C:\development\resource\unity_projects\Race_fields -testResults Logs/results.xml -logFile Logs/Editor.log -testPlatform EditMode -debugCodeOptimization" />
<option name="WORKING_DIRECTORY" value="C:\development\resource\unity_projects\Race_fields" />
<option name="PASS_PARENT_ENVS" value="1" />
<option name="ENV_FILE_PATHS" value="" />
<option name="REDIRECT_INPUT_PATH" value="" />
<option name="MIXED_MODE_DEBUG" value="0" />
<method v="2" />
</configuration>
<configuration name="Запустить Unity" type="RunUnityExe" factoryName="Unity Executable">
<option name="EXE_PATH" value="C:\Program Files\Unity\Hub\Editor\6000.5.1f1\Editor\Unity.exe" />
<option name="PROGRAM_PARAMETERS" value="-projectPath C:\development\resource\unity_projects\Race_fields -debugCodeOptimization" />
<option name="WORKING_DIRECTORY" value="C:\development\resource\unity_projects\Race_fields" />
<option name="PASS_PARENT_ENVS" value="1" />
<option name="ENV_FILE_PATHS" value="" />
<option name="REDIRECT_INPUT_PATH" value="" />
<option name="MIXED_MODE_DEBUG" value="0" />
<method v="2" />
</configuration>
<configuration name="Подключиться к редактору Unity" type="UNITY_DEBUG_RUN_CONFIGURATION" factoryName="Unity Debug" show_console_on_std_err="false" show_console_on_std_out="false" port="50000" address="localhost" useMixedMode="false">
<option name="allowRunningInParallel" value="false" />
<option name="listenPortForConnections" value="false" />
<option name="pid" />
<option name="projectPathOnTarget" />
<option name="runtimes">
<list />
</option>
<option name="selectedOptions">
<list />
</option>
<method v="2" />
</configuration>
<configuration name="Attach to" type="UnityDevicePlayer" factoryName="UnityAttachToDevicePlayer">
<method v="2" />
</configuration>
</component>
<component name="TaskManager">
<task id="LOCAL-00001" summary="add: README.md">
<option name="closed" value="true" />
<created>1784280596021</created>
<option name="number" value="00001" />
<option name="presentableId" value="LOCAL-00001" />
<option name="project" value="LOCAL" />
<updated>1784280596021</updated>
</task>
<task active="true" id="Default" summary="Задача по умолчанию">
<changelist id="08e3a700-2b23-4d3a-a6cd-45bec0bfa361" name="Изменения" comment="add: README.md" />
<created>1784288591435</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1784288591435</updated>
<workItem from="1784288596356" duration="25132000" />
<workItem from="1784555385306" duration="519000" />
<workItem from="1784696802414" duration="8245000" />
<workItem from="1784711743710" duration="34585000" />
<workItem from="1784891813884" duration="848000" />
<workItem from="1784896188926" duration="7409000" />
<workItem from="1785928737366" duration="400000" />
<workItem from="1785998210045" duration="19283000" />
</task>
<task id="LOCAL-00002" summary="update : rewrite car controller, add terrain">
<option name="closed" value="true" />
<created>1784528529649</created>
<option name="number" value="00002" />
<option name="presentableId" value="LOCAL-00002" />
<option name="project" value="LOCAL" />
<updated>1784528529649</updated>
</task>
<task id="LOCAL-00003" summary="add : particle system">
<option name="closed" value="true" />
<created>1784530020605</created>
<option name="number" value="00003" />
<option name="presentableId" value="LOCAL-00003" />
<option name="project" value="LOCAL" />
<updated>1784530020605</updated>
</task>
<task id="LOCAL-00004" summary="add : .gitignore">
<option name="closed" value="true" />
<created>1784534243727</created>
<option name="number" value="00004" />
<option name="presentableId" value="LOCAL-00004" />
<option name="project" value="LOCAL" />
<updated>1784534243727</updated>
</task>
<task id="LOCAL-00005" summary="add : Selectio scene">
<option name="closed" value="true" />
<created>1784701858222</created>
<option name="number" value="00005" />
<option name="presentableId" value="LOCAL-00005" />
<option name="project" value="LOCAL" />
<updated>1784701858222</updated>
</task>
<task id="LOCAL-00006" summary="add : Add vehicle selection flow and harvester enemy AI">
<option name="closed" value="true" />
<created>1784794230299</created>
<option name="number" value="00006" />
<option name="presentableId" value="LOCAL-00006" />
<option name="project" value="LOCAL" />
<updated>1784794230299</updated>
</task>
<option name="localTasksCounter" value="7" />
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
<component name="UnityCheckinConfiguration" checkUnsavedScenes="false" />
<component name="UnityProjectConfiguration" hasMinimizedUI="true" />
<component name="UnityProjectDiscoverer">
<option name="hasUnityReference" value="true" />
<option name="unityProject" value="true" />
<option name="unityProjectFolder" value="true" />
</component>
<component name="UnityUnitTestConfiguration" currentTestLauncher="Both" />
<component name="Vcs.Log.Tabs.Properties">
<option name="TAB_STATES">
<map>
<entry key="MAIN">
<value>
<State>
<option name="FILTERS">
<map>
<entry key="branch">
<value>
<list>
<option value="main" />
</list>
</value>
</entry>
</map>
</option>
</State>
</value>
</entry>
</map>
</option>
</component>
<component name="VcsManagerConfiguration">
<MESSAGE value="Merge cviat into main and resolve Unity conflicts" />
<MESSAGE value="add: README.md" />
<MESSAGE value="update : rewrite car controller, add terrain" />
<MESSAGE value="add : particle system" />
<MESSAGE value="add : .gitignore" />
<MESSAGE value="add : Selectio scene" />
<MESSAGE value="add : Add vehicle selection flow and harvester enemy AI" />
<option name="LAST_COMMIT_MESSAGE" value="add : Add vehicle selection flow and harvester enemy AI" />
</component>
<component name="XSLT-Support.FileAssociations.UIState">
<expand />
<select />
</component>
</project>

View File

@ -0,0 +1,137 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &-4075328406638620692
MonoBehaviour:
m_ObjectHideFlags: 11
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Editor::UnityEditor.Rendering.Universal.AssetVersion
version: 10
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: BulletProjectile
m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap:
RenderType: Opaque
disabledShaderPasses:
- MOTIONVECTORS
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BaseMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_Lightmaps:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_LightmapsInd:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_ShadowMasks:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _AddPrecomputedVelocity: 0
- _AlphaClip: 0
- _AlphaToMask: 0
- _Blend: 0
- _BlendModePreserveSpecular: 1
- _BumpScale: 1
- _ClearCoatMask: 0
- _ClearCoatSmoothness: 0
- _Cull: 2
- _Cutoff: 0.5
- _DetailAlbedoMapScale: 1
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _DstBlendAlpha: 0
- _EnvironmentReflections: 1
- _GlossMapScale: 0
- _Glossiness: 0
- _GlossyReflections: 0
- _Metallic: 0
- _OcclusionStrength: 1
- _Parallax: 0.005
- _QueueOffset: 0
- _ReceiveShadows: 1
- _Smoothness: 0.5
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Surface: 0
- _WorkflowMode: 1
- _XRMotionVectorsPass: 1
- _ZWrite: 1
m_Colors:
- _BaseColor: {r: 0.009433985, g: 0.007559973, b: 0.0007564989, a: 1}
- _Color: {r: 0.009433985, g: 0.007559973, b: 0.0007564989, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
m_BuildTextureStacks: []
m_AllowLocking: 1

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: e4f0cefa7e5ef2640b0cf25b80ee3520
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@ -0,0 +1,114 @@
fileFormatVersion: 2
guid: e10ef6ed1df1f9445b52c82622b4ad31
ModelImporter:
serializedVersion: 24501
internalIDToNameTable: []
externalObjects: {}
materials:
materialImportMode: 2
materialName: 0
materialSearch: 1
materialLocation: 1
searchTexturesGlobally: 0
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
importUVs: -1
importVertexColors: 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
calculateBlendshapeNormalsDeltaFromImportedNormals: 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:

Binary file not shown.

View File

@ -0,0 +1,524 @@
fileFormatVersion: 2
guid: a4df6771917b23c4f9be6ea9e36c1bd9
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 11500000, guid: b2a9591990af98743ba3ff7cf1000886, type: 3}
textureImporterSettings:
alphaSource: 1
mipMapMode: 0
enableMipMap: 1
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
convertToNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
swizzle: 50462976
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
nPOTScale: 1
sRGBTexture: 1
spriteMode: 2
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 0
flipbookColumns: 0
ignorePngGamma: 0
cookieMode: 0
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 0
wrapV: 0
wrapW: 0
normalMap: 0
textureFormat: 0
maxTextureSize: 0
lightmap: 0
compressionQuality: 0
linearTexture: 0
grayScaleToAlpha: 0
rGBM: 0
cubemapConvolutionSteps: 0
cubemapConvolutionExponent: 0
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
applyGammaDecoding: 0
singleSpriteImportData:
- name:
originalName:
pivot: {x: 0, y: 0}
alignment: 0
border: {x: 0, y: 0, z: 0, w: 0}
customData:
rect:
serializedVersion: 2
x: 0
y: 0
width: 0
height: 0
spriteID: c167efbf8e46f0042b5dee4c94cc9cc1
spriteBone: []
spriteOutline: []
vertices: []
spritePhysicsOutline: []
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 0, y: 0}
spritePosition: {x: 0, y: 0}
multiSpriteImportData: []
layeredSpriteImportData:
- name: Wheel_FR
originalName:
pivot: {x: 0.5, y: 0.5}
alignment: 0
border: {x: 0, y: 0, z: 0, w: 0}
customData:
rect:
serializedVersion: 2
x: 1266
y: 605
width: 209
height: 256
spriteID: 49b4e606fa4744040b03727e67a07a28
spriteBone: []
spriteOutline: []
vertices: []
spritePhysicsOutline: []
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 1266, y: 605}
spritePosition: {x: 803, y: 826}
- name: Wheel_RL
originalName:
pivot: {x: 0.5, y: 0.5}
alignment: 0
border: {x: 0, y: 0, z: 0, w: 0}
customData:
rect:
serializedVersion: 2
x: 1266
y: 340
width: 211
height: 257
spriteID: 02d5672b6e59d0d45b8b2479a3ab0bda
spriteBone: []
spriteOutline: []
vertices: []
spritePhysicsOutline: []
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 1266, y: 340}
spritePosition: {x: 242, y: 825}
- name: Wheel_RR
originalName:
pivot: {x: 0.5, y: 0.5}
alignment: 0
border: {x: 0, y: 0, z: 0, w: 0}
customData:
rect:
serializedVersion: 2
x: 1266
y: 869
width: 202
height: 260
spriteID: 1ea701bd01d75f84982e26d49e8a49cf
spriteBone: []
spriteOutline: []
vertices: []
spritePhysicsOutline: []
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 1266, y: 869}
spritePosition: {x: 810, y: 225}
- name: Wheel_RL
originalName:
pivot: {x: 0.5, y: 0.5}
alignment: 0
border: {x: 0, y: 0, z: 0, w: 0}
customData:
rect:
serializedVersion: 2
x: 1491
y: 4
width: 201
height: 261
spriteID: 92d779dabe4abc1449070e159e16f374
spriteBone: []
spriteOutline: []
vertices: []
spritePhysicsOutline: []
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 1491, y: 4}
spritePosition: {x: 242, y: 225}
- name: FuelTank_R
originalName:
pivot: {x: 0.5, y: 0.5}
alignment: 0
border: {x: 0, y: 0, z: 0, w: 0}
customData:
rect:
serializedVersion: 2
x: 1700
y: 4
width: 104
height: 225
spriteID: d73ec417b1fbb7740a07656cad779ef2
spriteBone: []
spriteOutline: []
vertices: []
spritePhysicsOutline: []
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 1700, y: 4}
spritePosition: {x: 827, y: 503}
- name: FuelTank_L
originalName:
pivot: {x: 0.5, y: 0.5}
alignment: 0
border: {x: 0, y: 0, z: 0, w: 0}
customData:
rect:
serializedVersion: 2
x: 1812
y: 4
width: 102
height: 225
spriteID: a93cb5906f19e4f4984ab1cc6f8605d4
spriteBone: []
spriteOutline: []
vertices: []
spritePhysicsOutline: []
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 1812, y: 4}
spritePosition: {x: 323, y: 503}
- name: Bumper
originalName:
pivot: {x: 0.5, y: 0.5}
alignment: 0
border: {x: 0, y: 0, z: 0, w: 0}
customData:
rect:
serializedVersion: 2
x: 1491
y: 273
width: 390
height: 120
spriteID: 7e67b0d3c5dfa1e4bb0078317e63ad12
spriteBone: []
spriteOutline: []
vertices: []
spritePhysicsOutline: []
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 1491, y: 273}
spritePosition: {x: 432, y: 1086}
- name: Cooler
originalName:
pivot: {x: 0.5, y: 0.5}
alignment: 0
border: {x: 0, y: 0, z: 0, w: 0}
customData:
rect:
serializedVersion: 2
x: 1922
y: 4
width: 109
height: 200
spriteID: f64d6eb9a2d7bc8499da8df9432b7f3b
spriteBone: []
spriteOutline: []
vertices: []
spritePhysicsOutline: []
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 1922, y: 4}
spritePosition: {x: 572, y: 868}
- name: Layer 3
originalName:
pivot: {x: 0.5, y: 0.5}
alignment: 0
border: {x: 0, y: 0, z: 0, w: 0}
customData:
rect:
serializedVersion: 2
x: 1491
y: 401
width: 13
height: 277
spriteID: 6ccfde867c43bbf46a18f423979bd489
spriteBone: []
spriteOutline: []
vertices: []
spritePhysicsOutline: []
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 1491, y: 401}
spritePosition: {x: 660, y: 833}
- name: Engine
originalName:
pivot: {x: 0.5, y: 0.5}
alignment: 0
border: {x: 0, y: 0, z: 0, w: 0}
customData:
rect:
serializedVersion: 2
x: 1266
y: 4
width: 217
height: 328
spriteID: 14369f1f908ddd44c954eee16a044c41
spriteBone: []
spriteOutline: []
vertices: []
spritePhysicsOutline: []
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 1266, y: 4}
spritePosition: {x: 518, y: 792}
- name: Body
originalName:
pivot: {x: 0.5, y: 0.5}
alignment: 0
border: {x: 0, y: 0, z: 0, w: 0}
customData:
rect:
serializedVersion: 2
x: 4
y: 1266
width: 993
height: 1190
spriteID: 900c3908f26b44046841cb05283ab51c
spriteBone: []
spriteOutline: []
vertices: []
spritePhysicsOutline: []
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 4, y: 1266}
spritePosition: {x: 0, y: 64}
- name: Layer 2
originalName:
pivot: {x: 0.5, y: 0.5}
alignment: 0
border: {x: 0, y: 0, z: 0, w: 0}
customData:
rect:
serializedVersion: 2
x: 4
y: 4
width: 1254
height: 1254
spriteID: 100b593d2b80c2e459502c020f443c60
spriteBone: []
spriteOutline: []
vertices: []
spritePhysicsOutline: []
indices:
edges: []
tessellationDetail: 0
uvTransform: {x: 4, y: 4}
spritePosition: {x: 0, y: 0}
spriteImportData: []
rigSpriteImportData: []
sharedRigSpriteImportData: []
mosaicSpriteImportData: []
platformSettings: []
mosaicLayers: 1
characterMode: 1
documentPivot: {x: 0, y: 0}
documentAlignment: 7
importHiddenLayers: 0
layerMappingOption: 2
generatePhysicsShape: 0
paperDollMode: 0
keepDupilcateSpriteName: 1
generateTileAssets: 0
tilePaletteCellLayout: 0
tilePaletteHexagonLayout: 0
tilePaletteCellSize: {x: 1, y: 1, z: 0}
tilePaletteCellSizing: 0
transparencySortMode: 0
transparencySortAxis: {x: 0, y: 0, z: 1}
tileTemplate: {instanceID: 0}
padding: 4
spriteSizeExpand: 0
skeletonAssetReferenceID:
pipeline: {instanceID: 0}
pipelineVersion:
spritePackingTag:
resliceFromLayer: 0
pSDLayerImportSetting: []
psdLayers:
- name: Wheel_FR
spriteName: Wheel_FR
isGroup: 0
parentIndex: -1
spriteID: 49b4e606fa4744040b03727e67a07a28
layerID: 7
mosaicPosition: {x: 1266, y: 605}
flatten: 0
isImported: 1
isVisible: 1
- name: Wheel_RL
spriteName: Wheel_RL
isGroup: 0
parentIndex: -1
spriteID: 02d5672b6e59d0d45b8b2479a3ab0bda
layerID: 9
mosaicPosition: {x: 1266, y: 340}
flatten: 0
isImported: 1
isVisible: 1
- name: Wheel_RR
spriteName: Wheel_RR
isGroup: 0
parentIndex: -1
spriteID: 1ea701bd01d75f84982e26d49e8a49cf
layerID: 12
mosaicPosition: {x: 1266, y: 869}
flatten: 0
isImported: 1
isVisible: 1
- name: Wheel_RL
spriteName: Wheel_RL
isGroup: 0
parentIndex: -1
spriteID: 92d779dabe4abc1449070e159e16f374
layerID: 14
mosaicPosition: {x: 1491, y: 4}
flatten: 0
isImported: 1
isVisible: 1
- name: FuelTank_R
spriteName: FuelTank_R
isGroup: 0
parentIndex: -1
spriteID: d73ec417b1fbb7740a07656cad779ef2
layerID: 16
mosaicPosition: {x: 1700, y: 4}
flatten: 0
isImported: 1
isVisible: 1
- name: FuelTank_L
spriteName: FuelTank_L
isGroup: 0
parentIndex: -1
spriteID: a93cb5906f19e4f4984ab1cc6f8605d4
layerID: 18
mosaicPosition: {x: 1812, y: 4}
flatten: 0
isImported: 1
isVisible: 1
- name: Bumper
spriteName: Bumper
isGroup: 0
parentIndex: -1
spriteID: 7e67b0d3c5dfa1e4bb0078317e63ad12
layerID: 20
mosaicPosition: {x: 1491, y: 273}
flatten: 0
isImported: 1
isVisible: 1
- name: Cooler
spriteName: Cooler
isGroup: 0
parentIndex: -1
spriteID: f64d6eb9a2d7bc8499da8df9432b7f3b
layerID: 24
mosaicPosition: {x: 1922, y: 4}
flatten: 0
isImported: 1
isVisible: 1
- name: Layer 3
spriteName: Layer 3
isGroup: 0
parentIndex: -1
spriteID: 6ccfde867c43bbf46a18f423979bd489
layerID: 28
mosaicPosition: {x: 1491, y: 401}
flatten: 0
isImported: 1
isVisible: 1
- name: Engine
spriteName: Engine
isGroup: 0
parentIndex: -1
spriteID: 14369f1f908ddd44c954eee16a044c41
layerID: 22
mosaicPosition: {x: 1266, y: 4}
flatten: 0
isImported: 1
isVisible: 1
- name: Body
spriteName: Body
isGroup: 0
parentIndex: -1
spriteID: 900c3908f26b44046841cb05283ab51c
layerID: 10
mosaicPosition: {x: 4, y: 1266}
flatten: 0
isImported: 1
isVisible: 1
- name: Layer 2
spriteName: Layer 2
isGroup: 0
parentIndex: -1
spriteID: 100b593d2b80c2e459502c020f443c60
layerID: 5
mosaicPosition: {x: 4, y: 4}
flatten: 0
isImported: 1
isVisible: 1
mosaicPSDLayers: []
rigPSDLayers: []
sharedRigPSDLayers: []
importFileNodeState: 1
platformSettingsDirtyTick: 0
spriteSizeExpandChanged: 0
generateGOHierarchy: 0
textureAssetName:
prefabAssetName:
spriteLibAssetName:
skeletonAssetName:
secondarySpriteTextures: []

Binary file not shown.

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: d6bcac2507ddd5e448851a12c20f7eaa
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,769 @@
# Race Fields Architecture
Этот документ фиксирует текущую архитектуру проекта по фактическим сценам, prefab'ам и скриптам.
Главная цель: видеть не просто граф зависимостей, а слои проекта, ответственность каждого блока и места, где архитектура сейчас хрупкая.
## Как Читать Диаграммы
Главная диаграмма читается сверху вниз:
1. `Entry / Scene Layer` - откуда стартует игра.
2. `Scene Bootstrap Layer` - кто собирает игровую сцену.
3. `Runtime Entity Layer` - реальные игровые объекты.
4. `Subsystem Layer` - системы, которые обслуживают player/enemies.
5. `Asset / Data Layer` - prefab'ы, sprites, render textures, static state.
Связи на главной диаграмме показывают только важные runtime-зависимости. Детальные связи вынесены ниже в отдельные диаграммы.
## Current Architecture Overview
```mermaid
flowchart TB
subgraph L1["ENTRY / SCENE LAYER"]
SelectionScene["Selection Scene"]
DemoScene["Demo Scene"]
end
subgraph L2["SCENE BOOTSTRAP LAYER"]
SelectionMenu["SelectionMenuController\nвыбор машины / режима / карты"]
SelectedVehicleSpawner["SelectedVehicleSpawner\nсоздает player и биндует сцену"]
end
subgraph L3["RUNTIME ENTITY LAYER"]
Player["Player Vehicle Instance\nBuggy prefab clone"]
Harvester["Harvester Enemy\nHarvester prefab instance"]
Terrain["Terrain\nTerrainCollider"]
end
subgraph L4["PLAYER SUBSYSTEMS"]
VehicleControl["ArcadeBuggyController\ninput + physics + wheels + sound + effects"]
WheelRig["WheelColliders / WheelVisuals"]
DamageCore["VehicleDamageController\nмодули здоровья"]
ImpactDamage["VehicleImpactDamageReceiver\nterrain / landing / collision damage"]
DamageHitboxes["DamageHitbox\nзоны урона"]
end
subgraph L5["SCENE SUBSYSTEMS"]
FollowCamera["BuggyFollowCamera"]
RearViewCamera["RearViewMirrorCamera"]
DamageHUD["VehicleDamageHud"]
HarvesterAI["HarvesterChaseController"]
BladeDamage["BladeDamageSource"]
BladeVisual["HarvesterBladeSpinner"]
end
subgraph L6["ASSET / DATA LAYER"]
GameSelectionState["GameSelectionState static\nвыбор между сценами"]
VehiclePrefabs["Player Vehicle Prefabs\nBuggy / Buggy_1 / Buggy_Player"]
HarvesterPrefab["HarvesterEnemy Prefab"]
DamageUISprites["MDP_Buggy_1.psb\nHUD base + overlay sprites"]
RearViewRT["RearViewMirror RenderTexture"]
end
SelectionScene --> SelectionMenu
SelectionMenu --> GameSelectionState
SelectionMenu --> DemoScene
DemoScene --> SelectedVehicleSpawner
DemoScene --> Terrain
DemoScene --> Harvester
SelectedVehicleSpawner --> GameSelectionState
SelectedVehicleSpawner --> VehiclePrefabs
SelectedVehicleSpawner --> Player
SelectedVehicleSpawner --> FollowCamera
SelectedVehicleSpawner --> RearViewCamera
SelectedVehicleSpawner --> DamageHUD
VehiclePrefabs --> Player
Player --> VehicleControl
Player --> WheelRig
Player --> DamageCore
Player --> ImpactDamage
Player --> DamageHitboxes
VehicleControl --> WheelRig
ImpactDamage --> DamageCore
ImpactDamage --> WheelRig
DamageHitboxes --> DamageCore
DamageCore --> DamageHUD
DamageUISprites --> DamageHUD
HarvesterPrefab --> Harvester
Harvester --> HarvesterAI
Harvester --> BladeVisual
Harvester --> BladeDamage
HarvesterAI --> Player
BladeDamage --> DamageHitboxes
FollowCamera --> Player
RearViewCamera --> Player
RearViewCamera --> RearViewRT
```
## Main Runtime Flow
Это основной путь от выбора машины до gameplay.
```mermaid
sequenceDiagram
participant PlayerInput as Player Input
participant SelectionMenu as SelectionMenuController
participant SelectionState as GameSelectionState
participant UnityScene as Unity SceneManager
participant DemoScene as Demo Scene
participant Spawner as SelectedVehicleSpawner
participant Vehicle as Player Vehicle
participant Camera as Cameras
participant HUD as VehicleDamageHud
participant Enemy as Harvester
PlayerInput->>SelectionMenu: left/right/space
SelectionMenu->>SelectionMenu: choose vehicle, mode, map
SelectionMenu->>SelectionState: SetSelection(vehiclePrefab, mode, sceneName)
SelectionMenu->>UnityScene: LoadScene(sceneName)
UnityScene->>DemoScene: load gameplay scene
DemoScene->>Spawner: Start()
Spawner->>SelectionState: read selected prefab
Spawner->>Vehicle: Instantiate(prefab at spawn point)
Spawner->>Camera: SetTarget(vehicle)
Spawner->>HUD: Bind(vehicle.VehicleDamageController)
Enemy->>Vehicle: auto find / chase target
```
Проблема этого flow:
- `GameSelectionState` - static.
- `SelectedVehicleSpawner` уже не просто spawner, а bootstrap сцены.
- Камеры, HUD и враг частично умеют искать player сами, частично получают его от spawner.
## Scene Composition
### Selection Scene
```mermaid
flowchart LR
subgraph SelectionScene["Selection Scene"]
MainCamera["Main Camera"]
Light["Directional Light"]
PreviewRoot["VehiclePreviewRoot"]
PreviewFloor["Preview Floor"]
Canvas["Selection Canvas"]
EventSystem["EventSystem\nInputSystemUIInputModule"]
Menu["SelectionMenuController"]
end
Menu --> PreviewRoot
Menu --> Canvas
Menu -->|"spawns preview prefab"| PreviewVehicle["Runtime Preview Vehicle"]
Menu -->|"writes selected data"| GameSelectionState["GameSelectionState"]
Menu -->|"loads selected map"| SceneManager["SceneManager.LoadScene"]
```
Что важно:
- Preview использует настоящий gameplay prefab.
- После spawn preview отключаются gameplay-компоненты.
- Это быстро, но preview и gameplay связаны слишком плотно.
### Demo Scene
```mermaid
flowchart LR
subgraph DemoScene["Demo Scene"]
Terrain["Terrain + TerrainCollider"]
ExistingBuggy["Buggy_1 scene instance\nтестовый объект"]
SpawnPoint["Selected Vehicle Spawn Point"]
Spawner["SelectedVehicleSpawner"]
FollowCamera["Buggy_ThirdPersonCamera"]
RearCamera["RearViewMirrorCamera"]
HudCanvas["Gameplay HUD Canvas"]
Harvester["Harvester"]
MachineGun["MachineGun"]
end
Spawner --> SpawnPoint
Spawner -->|"destroys existing ArcadeBuggyController if enabled"| ExistingBuggy
Spawner -->|"spawns selected prefab"| SpawnedPlayer["Buggy(Clone)"]
Spawner --> FollowCamera
Spawner --> RearCamera
Spawner --> HudCanvas
Harvester -->|"chases"| SpawnedPlayer
```
Что важно:
- В сцене есть и тестовая машина `Buggy_1`, и spawner.
- Spawner может удалить старую машину и создать выбранную.
- Для финальной архитектуры лучше оставить один путь создания player.
## Vehicle Prefab Composition
Все три player-prefab'а сейчас должны иметь одну и ту же структуру:
- `Buggy.prefab`
- `Buggy_1.prefab`
- `Buggy_Player.prefab`
```mermaid
flowchart TB
subgraph VehicleRoot["PLAYER VEHICLE PREFAB ROOT"]
Transform["Transform"]
Rigidbody["Rigidbody"]
BoxCollider["BoxCollider"]
end
subgraph Control["CONTROL / PHYSICS"]
ArcadeBuggyController["ArcadeBuggyController"]
BuggyWheelSetup["BuggyWheelSetup"]
WheelColliders["WheelCollider_FL / FR / RL / RR"]
WheelVisuals["Wheel visuals"]
VehicleAudio["EngineSound / TireScreechSound"]
VehicleVFX["Smoke / Skid Trails"]
end
subgraph Damage["DAMAGE"]
VehicleDamageController["VehicleDamageController"]
VehicleImpactDamageReceiver["VehicleImpactDamageReceiver"]
DamageModules["DamageModules"]
DamageHitboxes["DamageHitboxes"]
end
subgraph Modules["MODULES"]
Body["Body Module"]
Engine["Engine Module"]
FL["FrontLeftWheel Module"]
FR["FrontRightWheel Module"]
RL["RearLeftWheel Module"]
RR["RearRightWheel Module"]
end
subgraph Hitboxes["HITBOXES"]
BodyBox["Body Hitbox"]
EngineBox["Engine Hitbox"]
FLBox["FrontLeftWheel Hitbox"]
FRBox["FrontRightWheel Hitbox"]
RLBox["RearLeftWheel Hitbox"]
RRBox["RearRightWheel Hitbox"]
end
VehicleRoot --> Control
VehicleRoot --> Damage
ArcadeBuggyController --> WheelColliders
ArcadeBuggyController --> WheelVisuals
ArcadeBuggyController --> VehicleAudio
ArcadeBuggyController --> VehicleVFX
BuggyWheelSetup --> WheelColliders
VehicleDamageController --> DamageModules
DamageModules --> Modules
DamageHitboxes --> Hitboxes
DamageHitboxes --> VehicleDamageController
VehicleImpactDamageReceiver --> VehicleDamageController
VehicleImpactDamageReceiver --> ArcadeBuggyController
FL -->|"destroyed"| ArcadeBuggyController
FR -->|"destroyed"| ArcadeBuggyController
RL -->|"destroyed"| ArcadeBuggyController
RR -->|"destroyed"| ArcadeBuggyController
```
Ключевая проблема:
`Damage` зависит от `ArcadeBuggyController`. Это работает только пока все машины устроены как багги. Для нормальной архитектуры нужен wheel adapter/interface.
## Damage Architecture
```mermaid
flowchart TB
subgraph DamageInput["DAMAGE INPUT SOURCES"]
BladeDamageSource["BladeDamageSource\ntrigger damage"]
ImpactReceiver["VehicleImpactDamageReceiver\nterrain / landing / collision"]
FutureWeapons["Future Weapons\nbullets / mines / rockets"]
end
subgraph Routing["DAMAGE ROUTING"]
DamageHitbox["DamageHitbox\nexternal hit -> module type"]
DamageHit["DamageHit\namount / type / point / direction / source"]
end
subgraph State["DAMAGE STATE"]
DamageController["VehicleDamageController"]
ModuleBase["DamageableVehicleModule"]
WheelModule["VehicleWheelDamageModule"]
end
subgraph Output["DAMAGE OUTPUT"]
Hud["VehicleDamageHud"]
WheelDetach["Wheel detach\nvisual + collider + rigidbody"]
ControllerEffect["ArcadeBuggyController.SetWheelEnabled(false)"]
end
BladeDamageSource --> DamageHitbox
FutureWeapons --> DamageHitbox
DamageHitbox --> DamageHit
ImpactReceiver --> DamageHit
DamageHit --> DamageController
DamageController --> ModuleBase
ModuleBase --> WheelModule
DamageController --> Hud
WheelModule --> WheelDetach
WheelModule --> ControllerEffect
```
### Damage Rules Сейчас
External damage:
- `BladeDamageSource` ищет `DamageHitbox`.
- `DamageHitbox` знает `VehicleModuleType`.
- `VehicleDamageController` передает damage в конкретный module.
Terrain / impact damage:
- `VehicleImpactDamageReceiver` висит на root машины.
- Считает collision damage через `OnCollisionEnter`.
- Считает landing damage по каждому `WheelCollider`.
- Отправляет damage напрямую в `VehicleDamageController`.
HUD:
- `VehicleDamageHud` слушает `VehicleDamageController.ModuleStateChanged`.
- Красит overlay:
- healthy - transparent;
- damaged - red;
- destroyed/detached - black.
## Enemy Architecture
```mermaid
flowchart TB
subgraph HarvesterPrefab["HARVESTER PREFAB"]
HarvesterRoot["Root\nRigidbody + BoxCollider"]
Chase["HarvesterChaseController"]
HarvesterWheels["WheelColliders + WheelVisuals"]
Blades["Blades"]
Spinner["HarvesterBladeSpinner"]
BladeDamage["BladeDamageSource"]
end
subgraph Target["TARGET"]
PlayerVehicle["ArcadeBuggyController player"]
PlayerHitboxes["Player DamageHitboxes"]
end
Chase --> HarvesterWheels
Chase -->|"FindFirstObjectByType / target"| PlayerVehicle
Blades --> Spinner
Blades --> BladeDamage
BladeDamage --> PlayerHitboxes
```
Проблема:
- Harvester сам ищет player.
- Нет `EnemyDirector`.
- Нет единого `TargetProvider`.
- При нескольких машинах враг может выбрать не ту.
## Camera And HUD Binding
```mermaid
flowchart TB
Spawner["SelectedVehicleSpawner"]
Player["Spawned Player Vehicle"]
subgraph CameraSystem["CAMERA SYSTEM"]
FollowCamera["BuggyFollowCamera"]
RearViewCamera["RearViewMirrorCamera"]
RearViewRT["RearViewMirror RenderTexture"]
RearViewImage["Rear View UI Image"]
end
subgraph HUDSystem["HUD SYSTEM"]
DamageHud["VehicleDamageHud"]
HudBase["DamageHUD_BaseLayers"]
HudOverlays["DamageHUD_DamageOverlays"]
end
Spawner --> Player
Spawner -->|"SetTarget"| FollowCamera
Spawner -->|"SetTarget"| RearViewCamera
RearViewCamera --> RearViewRT
RearViewRT --> RearViewImage
Player -->|"VehicleDamageController"| DamageHud
DamageHud --> HudBase
DamageHud --> HudOverlays
```
Проблема:
- Камеры и HUD умеют искать player сами.
- Spawner тоже задает им player.
- Нужно выбрать один путь. Лучше: bind только через bootstrap.
## Current Dependency Table
| System | Owns | Depends On | Problem |
|---|---|---|---|
| `SelectionMenuController` | UI выбора, preview, load scene | `GameSelectionState`, real vehicle prefab | Preview завязан на gameplay prefab |
| `GameSelectionState` | выбранная машина/режим/карта | static global state | нет lifecycle, нет reset/session |
| `SelectedVehicleSpawner` | spawn player, bind camera/HUD | `GameSelectionState`, cameras, HUD, damage | делает больше, чем spawner |
| `ArcadeBuggyController` | input, drive, wheels, audio, VFX | wheel objects, audio, particles | слишком широкий класс |
| `VehicleDamageController` | health modules | modules array | ок, но нужен profile/config |
| `VehicleImpactDamageReceiver` | terrain/collision damage | `ArcadeBuggyController`, `VehicleDamageController` | damage зависит от конкретной машины |
| `VehicleWheelDamageModule` | wheel destruction | `ArcadeBuggyController` | damage знает controller |
| `VehicleDamageHud` | module damage UI | `VehicleDamageController`, scene UI sprites | mapping зашит в scene |
| `HarvesterChaseController` | enemy movement | player search, wheel colliders | нет EnemyDirector |
| `BladeDamageSource` | blade damage | `DamageHitbox` | нормальная связь для source damage |
| `BuggyFollowCamera` | follow camera | player search or external target | два способа binding |
| `RearViewMirrorCamera` | rear view | player search or external target | два способа binding |
## Architecture Problems To Fix Before Scaling
### 1. Нужен GameBootstrap
Сейчас gameplay-сцена собирается через `SelectedVehicleSpawner`, но по факту он уже делает bootstrap.
Нужно:
```text
GameBootstrap
-> read session request
-> create player
-> bind cameras
-> bind HUD
-> start enemies
-> start game mode
```
### 2. Нужен GameSession
Сейчас состояние между сценами хранится в static `GameSelectionState`.
Нужно:
```text
GameSession
selected vehicle
selected map
selected game mode
player instance
active enemies
session state
```
### 3. Нужен VehicleDefinition
Сейчас selection хранит `GameObject prefab`.
Лучше:
```text
VehicleDefinition
display name
gameplay prefab
preview settings
damage profile
HUD damage layout
audio profile
```
### 4. Нужен Wheel Rig Adapter
Damage не должен знать `ArcadeBuggyController`.
Нужно:
```csharp
public interface IVehicleWheelRig
{
WheelCollider GetWheelCollider(WheelSlot slot);
Transform GetWheelVisual(WheelSlot slot);
void SetWheelEnabled(WheelSlot slot, bool enabled);
bool IsWheelGrounded(WheelSlot slot);
}
```
Тогда:
- `VehicleImpactDamageReceiver` зависит от `IVehicleWheelRig`;
- `VehicleWheelDamageModule` зависит от `IVehicleWheelRig`;
- конкретная багги просто предоставляет реализацию.
### 5. Нужен Input Layer
Сейчас `ArcadeBuggyController` сам читает keyboard.
Нужно:
```text
IPlayerInputSource
Throttle
Steering
Handbrake
KeyboardInputSource
GamepadInputSource
ArcadeCabinetInputSource
AIInputSource
```
### 6. Нужны Game Modes
Сейчас есть enum:
- `Arena`
- `SurvivalRace`
Но нет runtime-режимов.
Нужно:
```text
IGameMode
ArenaMode
SurvivalRaceMode
```
Game mode должен отвечать за:
- правила старта;
- enemy spawn rules;
- win/lose;
- scoring;
- timer;
- map-specific logic.
## Target Architecture
```mermaid
flowchart TB
subgraph Entry["ENTRY"]
Selection["Selection Scene"]
SessionRequest["GameSessionRequest"]
end
subgraph Data["DATA / DEFINITIONS"]
VehicleDefinition["VehicleDefinition"]
MapDefinition["MapDefinition"]
GameModeDefinition["GameModeDefinition"]
DamageProfile["VehicleDamageProfile"]
HudDefinition["VehicleHudDefinition"]
end
subgraph Bootstrap["GAMEPLAY BOOTSTRAP"]
GameBootstrap["GameBootstrap"]
GameSession["GameSession"]
VehicleFactory["VehicleFactory"]
CameraBinder["CameraRigBinder"]
HudBinder["HudBinder"]
EnemyDirector["EnemyDirector"]
GameModeRunner["GameModeRunner"]
end
subgraph Runtime["RUNTIME OBJECTS"]
Player["Player Vehicle"]
Enemies["Enemies"]
World["Map / Terrain / Hazards"]
end
subgraph VehicleSystems["VEHICLE SYSTEMS"]
InputSource["IPlayerInputSource"]
VehicleController["IVehicleController"]
WheelRig["IVehicleWheelRig"]
DamageController["VehicleDamageController"]
ImpactReceiver["VehicleImpactDamageReceiver"]
VehicleAudio["VehicleAudioController"]
VehicleVFX["VehicleEffectsController"]
end
Selection --> SessionRequest
SessionRequest --> GameBootstrap
GameBootstrap --> GameSession
GameBootstrap --> VehicleFactory
GameBootstrap --> CameraBinder
GameBootstrap --> HudBinder
GameBootstrap --> EnemyDirector
GameBootstrap --> GameModeRunner
GameSession --> VehicleDefinition
GameSession --> MapDefinition
GameSession --> GameModeDefinition
VehicleDefinition --> DamageProfile
VehicleDefinition --> HudDefinition
VehicleFactory --> Player
Player --> InputSource
Player --> VehicleController
Player --> WheelRig
Player --> DamageController
Player --> ImpactReceiver
Player --> VehicleAudio
Player --> VehicleVFX
EnemyDirector --> Enemies
GameModeRunner --> Enemies
GameModeRunner --> World
CameraBinder --> Player
HudBinder --> Player
HudBinder --> HudDefinition
```
## Recommended Refactor Plan
### Step 1 - Rename / Split Spawner
Current:
```text
SelectedVehicleSpawner
```
Target:
```text
GameBootstrap
VehicleFactory
CameraRigBinder
HudBinder
```
Minimum first change:
- оставить spawn в `SelectedVehicleSpawner`;
- вынести camera/HUD binding в отдельные компоненты;
- или переименовать `SelectedVehicleSpawner` в `GameBootstrap` и явно признать его ответственность.
### Step 2 - Replace Static Selection With Session Request
Current:
```text
GameSelectionState static
```
Target:
```text
GameSessionRequest
GameSession
```
### Step 3 - Introduce VehicleDefinition
Current:
```text
SelectionMenuController.VehicleOption -> GameObject prefab
```
Target:
```text
SelectionMenuController.VehicleOption -> VehicleDefinition
VehicleDefinition -> gameplay prefab / preview / damage / HUD / audio
```
### Step 4 - Decouple Damage From ArcadeBuggyController
Current:
```text
VehicleImpactDamageReceiver -> ArcadeBuggyController
VehicleWheelDamageModule -> ArcadeBuggyController
```
Target:
```text
VehicleImpactDamageReceiver -> IVehicleWheelRig
VehicleWheelDamageModule -> IVehicleWheelRig
ArcadeBuggyController or BuggyWheelRig -> IVehicleWheelRig
```
### Step 5 - Split ArcadeBuggyController
Current:
```text
ArcadeBuggyController
input
physics
wheel visuals
audio
VFX
wheel API for damage
```
Target:
```text
ArcadeBuggyController / VehicleMotor
VehicleInputSource
VehicleWheelVisuals
VehicleAudioController
VehicleEffectsController
BuggyWheelRig
```
## What Is Safe To Add Now
Можно добавлять без сильного риска:
- tuning параметров машины;
- tuning damage thresholds;
- улучшение HUD;
- настройка harvester movement;
- новые визуальные эффекты;
- простые hazards, если они наносят урон через `DamageHitbox`.
## What Should Wait
Лучше не добавлять до bootstrap/session/refactor:
- оружие;
- несколько видов enemies;
- power-ups;
- полноценные game modes;
- scoring/results;
- несколько player vehicles;
- сохранение прогресса;
- arcade cabinet input;
- VR-specific gameplay.
Причина: все это сейчас будет цепляться к static state, scene object search и прямым ссылкам.
## Summary
Текущая архитектура рабочая для prototype, но главный риск уже виден:
```text
Нет единого runtime-контекста.
```
Сейчас обязанности размазаны между:
- `GameSelectionState`;
- `SelectedVehicleSpawner`;
- камерами, которые сами ищут player;
- harvester, который сам ищет player;
- HUD, который сам ищет damage controller.
Нормальная точка сборки должна выглядеть так:
```text
Selection Scene
-> GameSessionRequest
-> Demo Scene
-> GameBootstrap
-> GameSession
-> Player / Cameras / HUD / Enemies / GameMode
```
После этого новые системы будут подключаться через session/bootstrap, а не случайно искать друг друга по сцене.

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: de5a8a5be1a98c64f8ae57f7dbad8078
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -455,9 +455,18 @@ PrefabInstance:
- targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: b1dfea447adb74843b8085dbe3a6bd24, type: 3} - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: b1dfea447adb74843b8085dbe3a6bd24, type: 3}
insertIndex: -1 insertIndex: -1
addedObject: {fileID: 4587263311667884763} addedObject: {fileID: 4587263311667884763}
- targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: b1dfea447adb74843b8085dbe3a6bd24, type: 3}
insertIndex: -1
addedObject: {fileID: 6917201045494101815}
- targetCorrespondingSourceObject: {fileID: 4177302620104308133, guid: b1dfea447adb74843b8085dbe3a6bd24, type: 3} - targetCorrespondingSourceObject: {fileID: 4177302620104308133, guid: b1dfea447adb74843b8085dbe3a6bd24, type: 3}
insertIndex: -1 insertIndex: -1
addedObject: {fileID: 3524664443606531945} addedObject: {fileID: 3524664443606531945}
- targetCorrespondingSourceObject: {fileID: 4177302620104308133, guid: b1dfea447adb74843b8085dbe3a6bd24, type: 3}
insertIndex: -1
addedObject: {fileID: 5132510599987276558}
- targetCorrespondingSourceObject: {fileID: 4177302620104308133, guid: b1dfea447adb74843b8085dbe3a6bd24, type: 3}
insertIndex: -1
addedObject: {fileID: 8479407567185228081}
m_SourcePrefab: {fileID: 100100000, guid: b1dfea447adb74843b8085dbe3a6bd24, type: 3} m_SourcePrefab: {fileID: 100100000, guid: b1dfea447adb74843b8085dbe3a6bd24, type: 3}
--- !u!4 &3259800674814833756 stripped --- !u!4 &3259800674814833756 stripped
Transform: Transform:
@ -488,6 +497,42 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::RaceFields.Harvesters.Visuals.HarvesterBladeSpinner m_EditorClassIdentifier: Assembly-CSharp::RaceFields.Harvesters.Visuals.HarvesterBladeSpinner
rotationSpeed: 720 rotationSpeed: 720
rotationSpace: 1 rotationSpace: 1
--- !u!114 &5132510599987276558
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6216918693069553911}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5483916f7ebff2c448991626172509ea, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::RaceFields.Damage.BladeDamageSource
damagePerSecond: 45
tickInterval: 0.25
activationDelay: 1.25
--- !u!65 &8479407567185228081
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6216918693069553911}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Size: {x: 0.065, y: 0.014, z: 0.014}
m_Center: {x: 0, y: 0, z: 0}
--- !u!1 &7169525912848336899 stripped --- !u!1 &7169525912848336899 stripped
GameObject: GameObject:
m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: b1dfea447adb74843b8085dbe3a6bd24, type: 3} m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: b1dfea447adb74843b8085dbe3a6bd24, type: 3}
@ -573,6 +618,21 @@ BoxCollider:
serializedVersion: 3 serializedVersion: 3
m_Size: {x: 2.6, y: 2.3, z: 4.8} m_Size: {x: 2.6, y: 2.3, z: 4.8}
m_Center: {x: 0.08, y: 1.65, z: -0.05} m_Center: {x: 0.08, y: 1.65, z: -0.05}
--- !u!114 &6917201045494101815
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7169525912848336899}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b84a36537942ca148a8bc4a133d96e93, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::RaceFields.Damage.SimpleDamageReceiver
maxHealth: 100
destroyOnDeath: 1
destroyDelay: 0
--- !u!4 &7508790823005770425 stripped --- !u!4 &7508790823005770425 stripped
Transform: Transform:
m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: b1dfea447adb74843b8085dbe3a6bd24, type: 3} m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: b1dfea447adb74843b8085dbe3a6bd24, type: 3}

View File

@ -0,0 +1,287 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &5060312022363176025
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4449135132298046214}
- component: {fileID: 455824722436531212}
- component: {fileID: 5609845134334554891}
- component: {fileID: 8172290100206215017}
- component: {fileID: 3755552695787435108}
- component: {fileID: 5767152562348033804}
- component: {fileID: 4256604062628749703}
m_Layer: 0
m_Name: BulletProjectile
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &4449135132298046214
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5060312022363176025}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.07, y: 0.07, z: 0.07}
m_ConstrainProportionsScale: 1
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!33 &455824722436531212
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5060312022363176025}
m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
--- !u!135 &5609845134334554891
SphereCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5060312022363176025}
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_Radius: 0.5
m_Center: {x: 0, y: 0, z: 0}
--- !u!23 &8172290100206215017
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5060312022363176025}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: e4f0cefa7e5ef2640b0cf25b80ee3520, 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: 1
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!54 &3755552695787435108
Rigidbody:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5060312022363176025}
serializedVersion: 5
m_Mass: 0.03
m_LinearDamping: 0
m_AngularDamping: 0
m_CenterOfMass: {x: 0, y: 0, z: 0}
m_InertiaTensor: {x: 1, y: 1, z: 1}
m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_ImplicitCom: 1
m_ImplicitTensor: 1
m_UseGravity: 0
m_IsKinematic: 0
m_Interpolate: 1
m_Constraints: 0
m_CollisionDetection: 2
--- !u!114 &5767152562348033804
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5060312022363176025}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 9a787488e597d6a4ca2a4d452e6ee62a, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::BulletProjectile
damage: 8
impactForce: 25
lifeTime: 2.5
--- !u!96 &4256604062628749703
TrailRenderer:
serializedVersion: 4
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5060312022363176025}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 0
m_LightProbeUsage: 0
m_ReflectionProbeUsage: 0
m_RayTracingMode: 0
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_Time: 3
m_PreviewTimeScale: 1
m_Parameters:
serializedVersion: 3
widthMultiplier: 1
widthCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0.21352497
inSlope: -0.070786595
outSlope: -0.070786595
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.942857
- serializedVersion: 3
time: 0.29931217
value: 0.12369752
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
- serializedVersion: 3
time: 0.65615445
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
colorGradient:
serializedVersion: 2
key0: {r: 1, g: 0.94832873, b: 0, a: 1}
key1: {r: 1, g: 1, b: 1, a: 1}
key2: {r: 0, g: 0, b: 0, a: 0}
key3: {r: 0, g: 0, b: 0, a: 0}
key4: {r: 0, g: 0, b: 0, a: 0}
key5: {r: 0, g: 0, b: 0, a: 0}
key6: {r: 0, g: 0, b: 0, a: 0}
key7: {r: 0, g: 0, b: 0, a: 0}
ctime0: 0
ctime1: 65535
ctime2: 0
ctime3: 0
ctime4: 0
ctime5: 0
ctime6: 0
ctime7: 0
atime0: 24865
atime1: 65535
atime2: 0
atime3: 0
atime4: 0
atime5: 0
atime6: 0
atime7: 0
m_Mode: 0
m_ColorSpace: 0
m_NumColorKeys: 2
m_NumAlphaKeys: 2
numCornerVertices: 0
numCapVertices: 0
alignment: 0
textureMode: 0
textureScale: {x: 1, y: 1}
shadowBias: 0.5
generateLightingData: 0
m_MinVertexDistance: 0.1
m_Autodestruct: 0
m_Emitting: 1
m_ApplyActiveColorSpace: 1

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: b53989f2534110c459cbd05c3562861f
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,5 +1,42 @@
%YAML 1.1 %YAML 1.1
%TAG !u! tag:unity3d.com,2011: %TAG !u! tag:unity3d.com,2011:
--- !u!1 &678851920617152828
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4308219931449687786}
m_Layer: 0
m_Name: DamageModules
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &4308219931449687786
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 678851920617152828}
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: 5203170617531134041}
- {fileID: 4039219305083098774}
- {fileID: 917869650534139438}
- {fileID: 513069921206777595}
- {fileID: 5030994328003929438}
- {fileID: 1490784618976174324}
m_Father: {fileID: 6187829236652007928}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &904516071749555836 --- !u!1 &904516071749555836
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -129,6 +166,374 @@ AudioSource:
m_PreInfinity: 2 m_PreInfinity: 2
m_PostInfinity: 2 m_PostInfinity: 2
m_RotationOrder: 4 m_RotationOrder: 4
--- !u!1 &980107703586752827
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1490784618976174324}
m_Layer: 0
m_Name: DamageModule_RearRightWheel
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1490784618976174324
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 980107703586752827}
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: 4308219931449687786}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &985278927905599597
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 509780127314561339}
- component: {fileID: 4949023128094988400}
- component: {fileID: 4617614898393773024}
m_Layer: 0
m_Name: DamageHitbox_RearRightWheel
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &509780127314561339
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 985278927905599597}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 1.0023823, y: 0.42134243, z: -0.4222711}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 5756100871681110291}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!135 &4949023128094988400
SphereCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 985278927905599597}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Radius: 0.60740626
m_Center: {x: 0, y: 0, z: 0}
--- !u!114 &4617614898393773024
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 985278927905599597}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 18014f9b0dee6a9498473614a3e522d8, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::RaceFields.Damage.VehicleDamage.DamageHitbox
damageController: {fileID: 4162358059794313232}
moduleType: 5
damageMultiplier: 1.1
--- !u!1 &1522199945063803671
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 165765137459173630}
- component: {fileID: 5518850499844772572}
- component: {fileID: 9097829637973307076}
m_Layer: 0
m_Name: DamageHitbox_RearLeftWheel
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &165765137459173630
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1522199945063803671}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -1.0329266, y: 0.42649394, z: -0.42227113}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 5756100871681110291}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!135 &5518850499844772572
SphereCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1522199945063803671}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Radius: 0.60405797
m_Center: {x: 0, y: 0, z: 0}
--- !u!114 &9097829637973307076
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1522199945063803671}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 18014f9b0dee6a9498473614a3e522d8, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::RaceFields.Damage.VehicleDamage.DamageHitbox
damageController: {fileID: 4162358059794313232}
moduleType: 4
damageMultiplier: 1.1
--- !u!1 &2033152002869285067
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5756100871681110291}
m_Layer: 0
m_Name: DamageHitboxes
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &5756100871681110291
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2033152002869285067}
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: 5784468902436153891}
- {fileID: 4254540126733534658}
- {fileID: 6456890869576959319}
- {fileID: 4314062963670830293}
- {fileID: 165765137459173630}
- {fileID: 509780127314561339}
m_Father: {fileID: 6187829236652007928}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &2087479700153931477
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 917869650534139438}
m_Layer: 0
m_Name: DamageModule_FrontLeftWheel
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &917869650534139438
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2087479700153931477}
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: 4308219931449687786}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &2134887713512700918
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6456890869576959319}
- component: {fileID: 3641632203635272221}
- component: {fileID: 7977274247077034901}
m_Layer: 0
m_Name: DamageHitbox_FrontLeftWheel
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &6456890869576959319
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2134887713512700918}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -0.98700947, y: 0.42516497, z: 1.7977297}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 5756100871681110291}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!135 &3641632203635272221
SphereCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2134887713512700918}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Radius: 0.60405797
m_Center: {x: 0, y: 0, z: 0}
--- !u!114 &7977274247077034901
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2134887713512700918}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 18014f9b0dee6a9498473614a3e522d8, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::RaceFields.Damage.VehicleDamage.DamageHitbox
damageController: {fileID: 4162358059794313232}
moduleType: 2
damageMultiplier: 1.1
--- !u!1 &2236652310159055060
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 513069921206777595}
m_Layer: 0
m_Name: DamageModule_FrontRightWheel
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &513069921206777595
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2236652310159055060}
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: 4308219931449687786}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &3142864022589553855
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4039219305083098774}
m_Layer: 0
m_Name: DamageModule_Engine
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &4039219305083098774
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3142864022589553855}
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: 4308219931449687786}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &3869626763326721352 --- !u!1 &3869626763326721352
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -271,6 +676,75 @@ WheelCollider:
m_LayerOverridePriority: 0 m_LayerOverridePriority: 0
m_Enabled: 1 m_Enabled: 1
m_ProvidesContacts: 0 m_ProvidesContacts: 0
--- !u!1 &4474454028331496979
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4254540126733534658}
- component: {fileID: 6151096057021924048}
- component: {fileID: 4665106538739430254}
m_Layer: 0
m_Name: DamageHitbox_Engine
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &4254540126733534658
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4474454028331496979}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0.01256505, y: 0.50707626, z: 2.269475}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 5756100871681110291}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!65 &6151096057021924048
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4474454028331496979}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Size: {x: 1.2245655, y: 0.75567365, z: 1.1007986}
m_Center: {x: 0, y: 0, z: 0}
--- !u!114 &4665106538739430254
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4474454028331496979}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 18014f9b0dee6a9498473614a3e522d8, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::RaceFields.Damage.VehicleDamage.DamageHitbox
damageController: {fileID: 4162358059794313232}
moduleType: 1
damageMultiplier: 1.2
--- !u!1 &4777080315795762327 --- !u!1 &4777080315795762327
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -306,6 +780,75 @@ Transform:
- {fileID: 7660429726624174055} - {fileID: 7660429726624174055}
m_Father: {fileID: 6187829236652007928} m_Father: {fileID: 6187829236652007928}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &5074150975273399011
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5784468902436153891}
- component: {fileID: 6844973523226333809}
- component: {fileID: 5764655060026937901}
m_Layer: 0
m_Name: DamageHitbox_Body
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &5784468902436153891
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5074150975273399011}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0.015743494, y: 0.76463735, z: 0.6496234}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 5756100871681110291}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!65 &6844973523226333809
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5074150975273399011}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Size: {x: 2.0409427, y: 1.0075649, z: 2.5554254}
m_Center: {x: 0, y: 0, z: 0}
--- !u!114 &5764655060026937901
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5074150975273399011}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 18014f9b0dee6a9498473614a3e522d8, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::RaceFields.Damage.VehicleDamage.DamageHitbox
damageController: {fileID: 4162358059794313232}
moduleType: 0
damageMultiplier: 1
--- !u!1 &5884228197934813945 --- !u!1 &5884228197934813945
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -481,6 +1024,137 @@ Transform:
- {fileID: 7146618632555308886} - {fileID: 7146618632555308886}
m_Father: {fileID: 6187829236652007928} m_Father: {fileID: 6187829236652007928}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &8221003576484659173
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5030994328003929438}
m_Layer: 0
m_Name: DamageModule_RearLeftWheel
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &5030994328003929438
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8221003576484659173}
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: 4308219931449687786}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &8344515166698737873
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5203170617531134041}
m_Layer: 0
m_Name: DamageModule_Body
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &5203170617531134041
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8344515166698737873}
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: 4308219931449687786}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &8357043864206736957
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4314062963670830293}
- component: {fileID: 4207657310940732640}
- component: {fileID: 3830794235451668251}
m_Layer: 0
m_Name: DamageHitbox_FrontRightWheel
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &4314062963670830293
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8357043864206736957}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 1.0023823, y: 0.42134243, z: 1.7977293}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 5756100871681110291}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!135 &4207657310940732640
SphereCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8357043864206736957}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Radius: 0.60740626
m_Center: {x: 0, y: 0, z: 0}
--- !u!114 &3830794235451668251
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8357043864206736957}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 18014f9b0dee6a9498473614a3e522d8, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::RaceFields.Damage.VehicleDamage.DamageHitbox
damageController: {fileID: 4162358059794313232}
moduleType: 3
damageMultiplier: 1.1
--- !u!1 &8546225698448467078 --- !u!1 &8546225698448467078
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -853,6 +1527,12 @@ PrefabInstance:
- targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: 1d88c2d74df3d234b885ec2e1187f328, type: 3} - targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: 1d88c2d74df3d234b885ec2e1187f328, type: 3}
insertIndex: -1 insertIndex: -1
addedObject: {fileID: 9122830728132778127} addedObject: {fileID: 9122830728132778127}
- targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: 1d88c2d74df3d234b885ec2e1187f328, type: 3}
insertIndex: -1
addedObject: {fileID: 4308219931449687786}
- targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: 1d88c2d74df3d234b885ec2e1187f328, type: 3}
insertIndex: -1
addedObject: {fileID: 5756100871681110291}
m_AddedComponents: m_AddedComponents:
- targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: 1d88c2d74df3d234b885ec2e1187f328, type: 3} - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: 1d88c2d74df3d234b885ec2e1187f328, type: 3}
insertIndex: -1 insertIndex: -1
@ -865,7 +1545,7 @@ PrefabInstance:
addedObject: {fileID: 6756632559856253266} addedObject: {fileID: 6756632559856253266}
- targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: 1d88c2d74df3d234b885ec2e1187f328, type: 3} - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: 1d88c2d74df3d234b885ec2e1187f328, type: 3}
insertIndex: -1 insertIndex: -1
addedObject: {fileID: 4292201610895144585} addedObject: {fileID: 4162358059794313232}
m_SourcePrefab: {fileID: 100100000, guid: 1d88c2d74df3d234b885ec2e1187f328, type: 3} m_SourcePrefab: {fileID: 100100000, guid: 1d88c2d74df3d234b885ec2e1187f328, type: 3}
--- !u!4 &18073668855899836 stripped --- !u!4 &18073668855899836 stripped
Transform: Transform:
@ -983,7 +1663,7 @@ MonoBehaviour:
useSounds: 1 useSounds: 1
engineSound: {fileID: 4106908681420802530} engineSound: {fileID: 4106908681420802530}
tireScreechSound: {fileID: 5596619143633281226} tireScreechSound: {fileID: 5596619143633281226}
--- !u!114 &4292201610895144585 --- !u!114 &4162358059794313232
MonoBehaviour: MonoBehaviour:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0} m_CorrespondingSourceObject: {fileID: 0}
@ -992,21 +1672,23 @@ MonoBehaviour:
m_GameObject: {fileID: 6815148326285687618} m_GameObject: {fileID: 6815148326285687618}
m_Enabled: 1 m_Enabled: 1
m_EditorHideFlags: 0 m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5f00271deee9d014d92d5672e1fe2baa, type: 3} m_Script: {fileID: 11500000, guid: 23a901881a64d704fbdbdf8716ec0229, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: Assembly-CSharp::RaceFields.Vehicles.BuggyWheelSetup m_EditorClassIdentifier: Assembly-CSharp::RaceFields.Damage.VehicleDamage.VehicleDamageController
frontLeftWheelName: Wheel_FL moduleHealth: []
frontRightWheelName: Wheel_FR spawnGraceTime: 1
rearLeftWheelName: Wheel_RL minCollisionSpeed: 11
rearRightWheelName: Wheel_RR collisionDamagePerSpeed: 4.5
frontLeftColliderName: WheelCollider_FL maxCollisionDamage: 95
frontRightColliderName: WheelCollider_FR collisionCooldown: 0.25
rearLeftColliderName: WheelCollider_RL minAirTimeForLandingDamage: 0.45
rearRightColliderName: WheelCollider_RR minLandingDownSpeed: 9
radiusMultiplier: 0.5 landingDamagePerSpeed: 4
minimumRadius: 0.12 maxLandingDamage: 75
suspensionDistance: 0.28 landingWheelDamageShare: 0.65
wheelMass: 20 landingBodyDamageShare: 0.35
logDamage: 0
lastDamageDebug:
--- !u!1001 &6985207696866215891 --- !u!1001 &6985207696866215891
PrefabInstance: PrefabInstance:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0

View File

@ -68,6 +68,106 @@ Transform:
- {fileID: 771748206721198171} - {fileID: 771748206721198171}
m_Father: {fileID: 7537428961558247435} m_Father: {fileID: 7537428961558247435}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &2444968483898049878
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3367861422134867292}
m_Layer: 0
m_Name: spawnPoint
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &3367861422134867292
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2444968483898049878}
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: 7537428961558247435}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &2732471142558111248
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8324421492438060744}
- component: {fileID: 6482405419762299482}
- component: {fileID: 1148924790592848314}
m_Layer: 0
m_Name: DamageHitbox_Body
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &8324421492438060744
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2732471142558111248}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0.034928203, y: 0.952, z: 0.6496234}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 2261364672918771758}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!65 &6482405419762299482
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2732471142558111248}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Size: {x: 2.0928407, y: 1.0075648, z: 2.5554254}
m_Center: {x: 0, y: 0, z: 0}
--- !u!114 &1148924790592848314
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2732471142558111248}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 18014f9b0dee6a9498473614a3e522d8, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::RaceFields.Damage.VehicleDamage.DamageHitbox
damageController: {fileID: 2812740341713274400}
moduleType: 0
damageMultiplier: 1
--- !u!1 &2968795502916450284 --- !u!1 &2968795502916450284
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -94,7 +194,7 @@ Transform:
m_GameObject: {fileID: 2968795502916450284} m_GameObject: {fileID: 2968795502916450284}
serializedVersion: 2 serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 1.0023823, y: 0.42134243, z: 1.7977293} m_LocalPosition: {x: 1.0023823, y: 0.485, z: 1.7977293}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
@ -109,7 +209,7 @@ WheelCollider:
m_GameObject: {fileID: 2968795502916450284} m_GameObject: {fileID: 2968795502916450284}
serializedVersion: 2 serializedVersion: 2
m_Center: {x: 0, y: 0, z: 0} m_Center: {x: 0, y: 0, z: 0}
m_Radius: 0.47826356 m_Radius: 0.48
m_SuspensionSpring: m_SuspensionSpring:
spring: 35000 spring: 35000
damper: 4500 damper: 4500
@ -139,6 +239,112 @@ WheelCollider:
m_LayerOverridePriority: 0 m_LayerOverridePriority: 0
m_Enabled: 1 m_Enabled: 1
m_ProvidesContacts: 0 m_ProvidesContacts: 0
--- !u!1 &3038654581770510618
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2261364672918771758}
m_Layer: 0
m_Name: DamageHitboxes
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &2261364672918771758
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3038654581770510618}
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: 8324421492438060744}
- {fileID: 6502846467834952196}
- {fileID: 1128488548074832024}
- {fileID: 2014965150128567933}
- {fileID: 1268015067078022563}
- {fileID: 7967830878504766180}
m_Father: {fileID: 7537428961558247435}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &3316164678788101584
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1128488548074832024}
- component: {fileID: 326816972199248185}
- component: {fileID: 4070285775645152463}
m_Layer: 0
m_Name: DamageHitbox_FrontLeftWheel
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1128488548074832024
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3316164678788101584}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -0.98700947, y: 0.42516497, z: 1.7977297}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 2261364672918771758}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!135 &326816972199248185
SphereCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3316164678788101584}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Radius: 0.5900389
m_Center: {x: 0, y: 0, z: 0}
--- !u!114 &4070285775645152463
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3316164678788101584}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 18014f9b0dee6a9498473614a3e522d8, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::RaceFields.Damage.VehicleDamage.DamageHitbox
damageController: {fileID: 2812740341713274400}
moduleType: 2
damageMultiplier: 1.1
--- !u!1 &3401613838793633353 --- !u!1 &3401613838793633353
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -268,6 +474,75 @@ AudioSource:
m_PreInfinity: 2 m_PreInfinity: 2
m_PostInfinity: 2 m_PostInfinity: 2
m_RotationOrder: 4 m_RotationOrder: 4
--- !u!1 &3697681831167838674
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2014965150128567933}
- component: {fileID: 7899810716207740354}
- component: {fileID: 7204145278176613994}
m_Layer: 0
m_Name: DamageHitbox_FrontRightWheel
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &2014965150128567933
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3697681831167838674}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 1.0023823, y: 0.42134243, z: 1.7977293}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 2261364672918771758}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!135 &7899810716207740354
SphereCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3697681831167838674}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Radius: 0.6217426
m_Center: {x: 0, y: 0, z: 0}
--- !u!114 &7204145278176613994
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3697681831167838674}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 18014f9b0dee6a9498473614a3e522d8, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::RaceFields.Damage.VehicleDamage.DamageHitbox
damageController: {fileID: 2812740341713274400}
moduleType: 3
damageMultiplier: 1.1
--- !u!1 &6394886081676257114 --- !u!1 &6394886081676257114
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -294,7 +569,7 @@ Transform:
m_GameObject: {fileID: 6394886081676257114} m_GameObject: {fileID: 6394886081676257114}
serializedVersion: 2 serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 1.041, y: 0.42134243, z: -0.4222711} m_LocalPosition: {x: 1.041, y: 0.485, z: -0.4222711}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
@ -309,7 +584,7 @@ WheelCollider:
m_GameObject: {fileID: 6394886081676257114} m_GameObject: {fileID: 6394886081676257114}
serializedVersion: 2 serializedVersion: 2
m_Center: {x: 0, y: 0, z: 0} m_Center: {x: 0, y: 0, z: 0}
m_Radius: 0.47826356 m_Radius: 0.48
m_SuspensionSpring: m_SuspensionSpring:
spring: 35000 spring: 35000
damper: 4500 damper: 4500
@ -365,7 +640,7 @@ Transform:
m_GameObject: {fileID: 7009283000020388423} m_GameObject: {fileID: 7009283000020388423}
serializedVersion: 2 serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: -0.98700947, y: 0.42516497, z: 1.7977297} m_LocalPosition: {x: -0.98700947, y: 0.485, z: 1.7977297}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
@ -380,7 +655,7 @@ WheelCollider:
m_GameObject: {fileID: 7009283000020388423} m_GameObject: {fileID: 7009283000020388423}
serializedVersion: 2 serializedVersion: 2
m_Center: {x: 0, y: 0, z: 0} m_Center: {x: 0, y: 0, z: 0}
m_Radius: 0.45387608 m_Radius: 0.48
m_SuspensionSpring: m_SuspensionSpring:
spring: 35000 spring: 35000
damper: 4500 damper: 4500
@ -436,7 +711,7 @@ Transform:
m_GameObject: {fileID: 7485059301515088591} m_GameObject: {fileID: 7485059301515088591}
serializedVersion: 2 serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: -1.064, y: 0.42649394, z: -0.42227113} m_LocalPosition: {x: -1.064, y: 0.485, z: -0.42227113}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
@ -451,7 +726,7 @@ WheelCollider:
m_GameObject: {fileID: 7485059301515088591} m_GameObject: {fileID: 7485059301515088591}
serializedVersion: 2 serializedVersion: 2
m_Center: {x: 0, y: 0, z: 0} m_Center: {x: 0, y: 0, z: 0}
m_Radius: 0.45387608 m_Radius: 0.48
m_SuspensionSpring: m_SuspensionSpring:
spring: 35000 spring: 35000
damper: 4500 damper: 4500
@ -481,6 +756,75 @@ WheelCollider:
m_LayerOverridePriority: 0 m_LayerOverridePriority: 0
m_Enabled: 1 m_Enabled: 1
m_ProvidesContacts: 0 m_ProvidesContacts: 0
--- !u!1 &7527940449985007555
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6502846467834952196}
- component: {fileID: 2057871027760290318}
- component: {fileID: 6893315038360669418}
m_Layer: 0
m_Name: DamageHitbox_Engine
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &6502846467834952196
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7527940449985007555}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0.011763545, y: 0.911, z: 2.117}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 2261364672918771758}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!65 &2057871027760290318
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7527940449985007555}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Size: {x: 1.2557043, y: 0.7556735, z: 1.1007986}
m_Center: {x: 0, y: 0, z: 0}
--- !u!114 &6893315038360669418
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7527940449985007555}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 18014f9b0dee6a9498473614a3e522d8, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::RaceFields.Damage.VehicleDamage.DamageHitbox
damageController: {fileID: 2812740341713274400}
moduleType: 1
damageMultiplier: 1.2
--- !u!1 &8094638899907770378 --- !u!1 &8094638899907770378
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -610,6 +954,144 @@ AudioSource:
m_PreInfinity: 2 m_PreInfinity: 2
m_PostInfinity: 2 m_PostInfinity: 2
m_RotationOrder: 4 m_RotationOrder: 4
--- !u!1 &8495969875874801582
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7967830878504766180}
- component: {fileID: 4573757853348463198}
- component: {fileID: 2036753299656184915}
m_Layer: 0
m_Name: DamageHitbox_RearRightWheel
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &7967830878504766180
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8495969875874801582}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 1.041, y: 0.42134243, z: -0.4222711}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 2261364672918771758}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!135 &4573757853348463198
SphereCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8495969875874801582}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Radius: 0.6217426
m_Center: {x: 0, y: 0, z: 0}
--- !u!114 &2036753299656184915
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8495969875874801582}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 18014f9b0dee6a9498473614a3e522d8, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::RaceFields.Damage.VehicleDamage.DamageHitbox
damageController: {fileID: 2812740341713274400}
moduleType: 5
damageMultiplier: 1.1
--- !u!1 &8924939002948937440
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1268015067078022563}
- component: {fileID: 2196820243769238166}
- component: {fileID: 1092424478862009421}
m_Layer: 0
m_Name: DamageHitbox_RearLeftWheel
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1268015067078022563
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8924939002948937440}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -1.064, y: 0.42649394, z: -0.42227113}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 2261364672918771758}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!135 &2196820243769238166
SphereCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8924939002948937440}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Radius: 0.5900389
m_Center: {x: 0, y: 0, z: 0}
--- !u!114 &1092424478862009421
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8924939002948937440}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 18014f9b0dee6a9498473614a3e522d8, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::RaceFields.Damage.VehicleDamage.DamageHitbox
damageController: {fileID: 2812740341713274400}
moduleType: 4
damageMultiplier: 1.1
--- !u!1001 &3066333805257791790 --- !u!1001 &3066333805257791790
PrefabInstance: PrefabInstance:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -1089,6 +1571,12 @@ PrefabInstance:
- targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: 1d88c2d74df3d234b885ec2e1187f328, type: 3} - targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: 1d88c2d74df3d234b885ec2e1187f328, type: 3}
insertIndex: -1 insertIndex: -1
addedObject: {fileID: 8407050728171327581} addedObject: {fileID: 8407050728171327581}
- targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: 1d88c2d74df3d234b885ec2e1187f328, type: 3}
insertIndex: -1
addedObject: {fileID: 2261364672918771758}
- targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: 1d88c2d74df3d234b885ec2e1187f328, type: 3}
insertIndex: -1
addedObject: {fileID: 3367861422134867292}
m_AddedComponents: m_AddedComponents:
- targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: 1d88c2d74df3d234b885ec2e1187f328, type: 3} - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: 1d88c2d74df3d234b885ec2e1187f328, type: 3}
insertIndex: -1 insertIndex: -1
@ -1101,7 +1589,10 @@ PrefabInstance:
addedObject: {fileID: 8884678622101061738} addedObject: {fileID: 8884678622101061738}
- targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: 1d88c2d74df3d234b885ec2e1187f328, type: 3} - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: 1d88c2d74df3d234b885ec2e1187f328, type: 3}
insertIndex: -1 insertIndex: -1
addedObject: {fileID: 1259061515745219696} addedObject: {fileID: 2812740341713274400}
- targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: 1d88c2d74df3d234b885ec2e1187f328, type: 3}
insertIndex: -1
addedObject: {fileID: 9004504747958224257}
m_SourcePrefab: {fileID: 100100000, guid: 1d88c2d74df3d234b885ec2e1187f328, type: 3} m_SourcePrefab: {fileID: 100100000, guid: 1d88c2d74df3d234b885ec2e1187f328, type: 3}
--- !u!4 &1252779653934068934 stripped --- !u!4 &1252779653934068934 stripped
Transform: Transform:
@ -1214,7 +1705,7 @@ MonoBehaviour:
useSounds: 1 useSounds: 1
engineSound: {fileID: 5846105440596795175} engineSound: {fileID: 5846105440596795175}
tireScreechSound: {fileID: 3381358742307659235} tireScreechSound: {fileID: 3381358742307659235}
--- !u!114 &1259061515745219696 --- !u!114 &2812740341713274400
MonoBehaviour: MonoBehaviour:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0} m_CorrespondingSourceObject: {fileID: 0}
@ -1223,21 +1714,37 @@ MonoBehaviour:
m_GameObject: {fileID: 7192674219121697457} m_GameObject: {fileID: 7192674219121697457}
m_Enabled: 1 m_Enabled: 1
m_EditorHideFlags: 0 m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5f00271deee9d014d92d5672e1fe2baa, type: 3} m_Script: {fileID: 11500000, guid: 23a901881a64d704fbdbdf8716ec0229, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: Assembly-CSharp::RaceFields.Vehicles.BuggyWheelSetup m_EditorClassIdentifier: Assembly-CSharp::RaceFields.Damage.VehicleDamage.VehicleDamageController
frontLeftWheelName: Wheel_FL moduleHealth: []
frontRightWheelName: Wheel_FR spawnGraceTime: 1
rearLeftWheelName: Wheel_RL minCollisionSpeed: 11
rearRightWheelName: Wheel_RR collisionDamagePerSpeed: 4.5
frontLeftColliderName: WheelCollider_FL maxCollisionDamage: 95
frontRightColliderName: WheelCollider_FR collisionCooldown: 0.25
rearLeftColliderName: WheelCollider_RL minAirTimeForLandingDamage: 0.45
rearRightColliderName: WheelCollider_RR minLandingDownSpeed: 9
radiusMultiplier: 0.5 landingDamagePerSpeed: 4
minimumRadius: 0.12 maxLandingDamage: 75
suspensionDistance: 0.28 landingWheelDamageShare: 0.65
wheelMass: 20 landingBodyDamageShare: 0.35
logDamage: 0
lastDamageDebug:
--- !u!114 &9004504747958224257
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7192674219121697457}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 89aedc67121ea4f4c98085bc8c9ad0d4, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::VehicleWeaponInventory
currentWeapon: {fileID: 0}
spawnPoint: {fileID: 3367861422134867292}
--- !u!4 &7537428961558247435 stripped --- !u!4 &7537428961558247435 stripped
Transform: Transform:
m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: 1d88c2d74df3d234b885ec2e1187f328, type: 3} m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: 1d88c2d74df3d234b885ec2e1187f328, type: 3}
@ -1295,6 +1802,10 @@ PrefabInstance:
propertyPath: m_Name propertyPath: m_Name
value: RightTireSkid value: RightTireSkid
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 7344874181333496819, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3}
propertyPath: m_IsActive
value: 0
objectReference: {fileID: 0}
m_RemovedComponents: [] m_RemovedComponents: []
m_RemovedGameObjects: [] m_RemovedGameObjects: []
m_AddedGameObjects: [] m_AddedGameObjects: []
@ -1362,6 +1873,10 @@ PrefabInstance:
propertyPath: m_Name propertyPath: m_Name
value: LeftTireSkid value: LeftTireSkid
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 7344874181333496819, guid: ab4ea67cd9337c341af0bd7182c60f92, type: 3}
propertyPath: m_IsActive
value: 0
objectReference: {fileID: 0}
m_RemovedComponents: [] m_RemovedComponents: []
m_RemovedGameObjects: [] m_RemovedGameObjects: []
m_AddedGameObjects: [] m_AddedGameObjects: []

View File

@ -175,6 +175,75 @@ WheelCollider:
m_LayerOverridePriority: 0 m_LayerOverridePriority: 0
m_Enabled: 1 m_Enabled: 1
m_ProvidesContacts: 0 m_ProvidesContacts: 0
--- !u!1 &1666953206663730719
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4479990610205060349}
- component: {fileID: 5825399517747744468}
- component: {fileID: 2024650573028944834}
m_Layer: 0
m_Name: DamageHitbox_RearLeftWheel
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &4479990610205060349
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1666953206663730719}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -0.8716712, y: 0.27369422, z: -0.42227113}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 9194943108169963881}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!135 &5825399517747744468
SphereCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1666953206663730719}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Radius: 0.51565677
m_Center: {x: 0, y: 0, z: 0}
--- !u!114 &2024650573028944834
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1666953206663730719}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 18014f9b0dee6a9498473614a3e522d8, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::RaceFields.Damage.VehicleDamage.DamageHitbox
damageController: {fileID: 1251155925191827369}
moduleType: 4
damageMultiplier: 1.1
--- !u!1 &2599938933167188421 --- !u!1 &2599938933167188421
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -339,6 +408,75 @@ AudioSource:
m_PreInfinity: 2 m_PreInfinity: 2
m_PostInfinity: 2 m_PostInfinity: 2
m_RotationOrder: 4 m_RotationOrder: 4
--- !u!1 &4256784020541811601
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8855745749561159609}
- component: {fileID: 5035463054206016886}
- component: {fileID: 6076283664317587352}
m_Layer: 0
m_Name: DamageHitbox_FrontLeftWheel
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &8855745749561159609
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4256784020541811601}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -0.8716712, y: 0.27369422, z: 1.8148861}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 9194943108169963881}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!135 &5035463054206016886
SphereCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4256784020541811601}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Radius: 0.5156568
m_Center: {x: 0, y: 0, z: 0}
--- !u!114 &6076283664317587352
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4256784020541811601}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 18014f9b0dee6a9498473614a3e522d8, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::RaceFields.Damage.VehicleDamage.DamageHitbox
damageController: {fileID: 1251155925191827369}
moduleType: 2
damageMultiplier: 1.1
--- !u!1 &5725176332190465528 --- !u!1 &5725176332190465528
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -468,6 +606,43 @@ AudioSource:
m_PreInfinity: 2 m_PreInfinity: 2
m_PostInfinity: 2 m_PostInfinity: 2
m_RotationOrder: 4 m_RotationOrder: 4
--- !u!1 &5972247958471006541
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 9194943108169963881}
m_Layer: 0
m_Name: DamageHitboxes
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &9194943108169963881
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5972247958471006541}
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: 5036353294958251943}
- {fileID: 383979774159315010}
- {fileID: 8855745749561159609}
- {fileID: 8988962712716943782}
- {fileID: 4479990610205060349}
- {fileID: 6809863583008423600}
m_Father: {fileID: 4772777578382570152}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &6741570655071805230 --- !u!1 &6741570655071805230
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -539,6 +714,75 @@ WheelCollider:
m_LayerOverridePriority: 0 m_LayerOverridePriority: 0
m_Enabled: 1 m_Enabled: 1
m_ProvidesContacts: 0 m_ProvidesContacts: 0
--- !u!1 &6879061424484390238
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8988962712716943782}
- component: {fileID: 5441599143552244572}
- component: {fileID: 2059777941910514618}
m_Layer: 0
m_Name: DamageHitbox_FrontRightWheel
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &8988962712716943782
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6879061424484390238}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0.87719953, y: 0.2736943, z: 1.8148861}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 9194943108169963881}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!135 &5441599143552244572
SphereCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6879061424484390238}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Radius: 0.5156568
m_Center: {x: 0, y: 0, z: 0}
--- !u!114 &2059777941910514618
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6879061424484390238}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 18014f9b0dee6a9498473614a3e522d8, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::RaceFields.Damage.VehicleDamage.DamageHitbox
damageController: {fileID: 1251155925191827369}
moduleType: 3
damageMultiplier: 1.1
--- !u!1 &6884068289341648401 --- !u!1 &6884068289341648401
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -551,7 +795,7 @@ GameObject:
- component: {fileID: 5167617291018270} - component: {fileID: 5167617291018270}
- component: {fileID: 582127618437854756} - component: {fileID: 582127618437854756}
- component: {fileID: 302156863843409177} - component: {fileID: 302156863843409177}
- component: {fileID: 8664118715040108722} - component: {fileID: 1251155925191827369}
m_Layer: 0 m_Layer: 0
m_Name: Buggy_Player m_Name: Buggy_Player
m_TagString: Untagged m_TagString: Untagged
@ -579,6 +823,7 @@ Transform:
- {fileID: 279644236469480577} - {fileID: 279644236469480577}
- {fileID: 7863987729731623420} - {fileID: 7863987729731623420}
- {fileID: 9114007139308049182} - {fileID: 9114007139308049182}
- {fileID: 9194943108169963881}
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!54 &5167617291018270 --- !u!54 &5167617291018270
@ -667,7 +912,7 @@ MonoBehaviour:
useSounds: 1 useSounds: 1
engineSound: {fileID: 2872479692476395633} engineSound: {fileID: 2872479692476395633}
tireScreechSound: {fileID: 5164767240841886004} tireScreechSound: {fileID: 5164767240841886004}
--- !u!114 &8664118715040108722 --- !u!114 &1251155925191827369
MonoBehaviour: MonoBehaviour:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0} m_CorrespondingSourceObject: {fileID: 0}
@ -676,21 +921,161 @@ MonoBehaviour:
m_GameObject: {fileID: 6884068289341648401} m_GameObject: {fileID: 6884068289341648401}
m_Enabled: 1 m_Enabled: 1
m_EditorHideFlags: 0 m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5f00271deee9d014d92d5672e1fe2baa, type: 3} m_Script: {fileID: 11500000, guid: 23a901881a64d704fbdbdf8716ec0229, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: Assembly-CSharp::RaceFields.Vehicles.BuggyWheelSetup m_EditorClassIdentifier: Assembly-CSharp::RaceFields.Damage.VehicleDamage.VehicleDamageController
frontLeftWheelName: F_L moduleHealth: []
frontRightWheelName: F_R spawnGraceTime: 1
rearLeftWheelName: B_L minCollisionSpeed: 11
rearRightWheelName: B_R collisionDamagePerSpeed: 4.5
frontLeftColliderName: WheelCollider_FL maxCollisionDamage: 95
frontRightColliderName: WheelCollider_FR collisionCooldown: 0.25
rearLeftColliderName: WheelCollider_RL minAirTimeForLandingDamage: 0.45
rearRightColliderName: WheelCollider_RR minLandingDownSpeed: 9
radiusMultiplier: 0.5 landingDamagePerSpeed: 4
minimumRadius: 0.12 maxLandingDamage: 75
suspensionDistance: 0.28 landingWheelDamageShare: 0.65
wheelMass: 20 landingBodyDamageShare: 0.35
logDamage: 0
lastDamageDebug:
--- !u!1 &7144028055245717426
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5036353294958251943}
- component: {fileID: 1424654091887393660}
- component: {fileID: 5944958387327624743}
m_Layer: 0
m_Name: DamageHitbox_Body
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &5036353294958251943
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7144028055245717426}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -0.03496194, y: 0.68061024, z: 0.6465633}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 9194943108169963881}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!65 &1424654091887393660
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7144028055245717426}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Size: {x: 1.6176045, y: 1.1486375, z: 2.1729183}
m_Center: {x: 0, y: 0, z: 0}
--- !u!114 &5944958387327624743
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7144028055245717426}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 18014f9b0dee6a9498473614a3e522d8, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::RaceFields.Damage.VehicleDamage.DamageHitbox
damageController: {fileID: 1251155925191827369}
moduleType: 0
damageMultiplier: 1
--- !u!1 &7584916029984392318
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 383979774159315010}
- component: {fileID: 488353336899379031}
- component: {fileID: 7381166954967654850}
m_Layer: 0
m_Name: DamageHitbox_Engine
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &383979774159315010
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7584916029984392318}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0.0027641654, y: 0.36941406, z: 2.2160401}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 9194943108169963881}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!65 &488353336899379031
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7584916029984392318}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Size: {x: 0.9705627, y: 0.8614781, z: 0.9360264}
m_Center: {x: 0, y: 0, z: 0}
--- !u!114 &7381166954967654850
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7584916029984392318}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 18014f9b0dee6a9498473614a3e522d8, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::RaceFields.Damage.VehicleDamage.DamageHitbox
damageController: {fileID: 1251155925191827369}
moduleType: 1
damageMultiplier: 1.2
--- !u!1 &7631946534788984040 --- !u!1 &7631946534788984040
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -762,6 +1147,75 @@ WheelCollider:
m_LayerOverridePriority: 0 m_LayerOverridePriority: 0
m_Enabled: 1 m_Enabled: 1
m_ProvidesContacts: 0 m_ProvidesContacts: 0
--- !u!1 &8672086566250455480
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6809863583008423600}
- component: {fileID: 718638615359961317}
- component: {fileID: 813588334617030112}
m_Layer: 0
m_Name: DamageHitbox_RearRightWheel
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &6809863583008423600
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8672086566250455480}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0.87719953, y: 0.2736943, z: -0.42227113}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 9194943108169963881}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!135 &718638615359961317
SphereCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8672086566250455480}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 1
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Radius: 0.51565677
m_Center: {x: 0, y: 0, z: 0}
--- !u!114 &813588334617030112
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8672086566250455480}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 18014f9b0dee6a9498473614a3e522d8, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::RaceFields.Damage.VehicleDamage.DamageHitbox
damageController: {fileID: 1251155925191827369}
moduleType: 5
damageMultiplier: 1.1
--- !u!1001 &2782393766222725750 --- !u!1001 &2782393766222725750
PrefabInstance: PrefabInstance:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0

View File

@ -0,0 +1,242 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &2619232887283984616
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1973944076214827591}
m_Layer: 0
m_Name: Muzzle
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1973944076214827591
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2619232887283984616}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0.13739058, y: 1.8283, z: 0.4653}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 7534708747585793477}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &4284098897898543534
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7934938654016177134}
m_Layer: 0
m_Name: pivot
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &7934938654016177134
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4284098897898543534}
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: 7534708747585793477}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &6304765452993946667
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4132040617390652714}
m_Layer: 0
m_Name: GameObject
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &4132040617390652714
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6304765452993946667}
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: 7789081065401008525}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &7403242231905148394
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3107816258632120782}
m_Layer: 0
m_Name: GameObject
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &3107816258632120782
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7403242231905148394}
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: 623600404198432679}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1001 &8005729781991361070
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: -8679921383154817045, guid: e10ef6ed1df1f9445b52c82622b4ad31, type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: e10ef6ed1df1f9445b52c82622b4ad31, type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: e10ef6ed1df1f9445b52c82622b4ad31, type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: e10ef6ed1df1f9445b52c82622b4ad31, type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: e10ef6ed1df1f9445b52c82622b4ad31, type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: e10ef6ed1df1f9445b52c82622b4ad31, type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: e10ef6ed1df1f9445b52c82622b4ad31, type: 3}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: e10ef6ed1df1f9445b52c82622b4ad31, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: e10ef6ed1df1f9445b52c82622b4ad31, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: e10ef6ed1df1f9445b52c82622b4ad31, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 919132149155446097, guid: e10ef6ed1df1f9445b52c82622b4ad31, type: 3}
propertyPath: m_Name
value: MachineGun_prefab
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects:
- targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: e10ef6ed1df1f9445b52c82622b4ad31, type: 3}
insertIndex: 4
addedObject: {fileID: 7934938654016177134}
- targetCorrespondingSourceObject: {fileID: -8679921383154817045, guid: e10ef6ed1df1f9445b52c82622b4ad31, type: 3}
insertIndex: -1
addedObject: {fileID: 1973944076214827591}
- targetCorrespondingSourceObject: {fileID: -9006549272062162013, guid: e10ef6ed1df1f9445b52c82622b4ad31, type: 3}
insertIndex: -1
addedObject: {fileID: 4132040617390652714}
- targetCorrespondingSourceObject: {fileID: -1748125006957259383, guid: e10ef6ed1df1f9445b52c82622b4ad31, type: 3}
insertIndex: -1
addedObject: {fileID: 3107816258632120782}
m_AddedComponents:
- targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: e10ef6ed1df1f9445b52c82622b4ad31, type: 3}
insertIndex: -1
addedObject: {fileID: 4293301573341011267}
m_SourcePrefab: {fileID: 100100000, guid: e10ef6ed1df1f9445b52c82622b4ad31, type: 3}
--- !u!4 &623600404198432679 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -1748125006957259383, guid: e10ef6ed1df1f9445b52c82622b4ad31, type: 3}
m_PrefabInstance: {fileID: 8005729781991361070}
m_PrefabAsset: {fileID: 0}
--- !u!1 &7195477887394346879 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: e10ef6ed1df1f9445b52c82622b4ad31, type: 3}
m_PrefabInstance: {fileID: 8005729781991361070}
m_PrefabAsset: {fileID: 0}
--- !u!114 &4293301573341011267
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7195477887394346879}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d3422cd562818d448a78afdc747d8166, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::MachineGunWeapon
aimPivot: {fileID: 7534708747585793477}
muzzle: {fileID: 1973944076214827591}
projectilePrefab: {fileID: 5767152562348033804, guid: b53989f2534110c459cbd05c3562861f, type: 3}
muzzleFlash: {fileID: 0}
targetSearchRadius: 80
targetHeightOffset: 1.1
aimTurnSpeed: 18
fireRate: 12
damagePerShot: 8
projectileSpeed: 70
projectileLifeTime: 2.5
spreadAngle: 1.2
--- !u!4 &7534708747585793477 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: e10ef6ed1df1f9445b52c82622b4ad31, type: 3}
m_PrefabInstance: {fileID: 8005729781991361070}
m_PrefabAsset: {fileID: 0}
--- !u!4 &7789081065401008525 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -9006549272062162013, guid: e10ef6ed1df1f9445b52c82622b4ad31, type: 3}
m_PrefabInstance: {fileID: 8005729781991361070}
m_PrefabAsset: {fileID: 0}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 0b387817969384b45bb9bc5ceb9fb9e8
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 3e661d7a89960a149a0041a0a0ccc044
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,39 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!84 &8400000
RenderTexture:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: RearViewMirror
m_ImageContentsHash:
serializedVersion: 2
Hash: 00000000000000000000000000000000
m_IsAlphaChannelOptional: 0
serializedVersion: 6
m_Width: 512
m_Height: 192
m_AntiAliasing: 2
m_MipCount: -1
m_DepthStencilFormat: 90
m_ColorFormat: 4
m_MipMap: 0
m_GenerateMips: 1
m_SRGB: 1
m_UseDynamicScale: 0
m_UseDynamicScaleExplicit: 0
m_BindMS: 0
m_EnableCompatibleFormat: 1
m_EnableRandomWrite: 0
m_TextureSettings:
serializedVersion: 2
m_FilterMode: 1
m_Aniso: 0
m_MipBias: 0
m_WrapU: 1
m_WrapV: 1
m_WrapW: 1
m_Dimension: 2
m_VolumeDepth: 1
m_ShadowSamplingMode: 2

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 50bdd4d765aea2146ad9c6ecff404b7e
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 8400000
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: f71317cc2bc384141adf6b3ba7b14528
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,70 @@
using RaceFields.Vehicles;
using UnityEngine;
namespace RaceFields.CameraSystem
{
[RequireComponent(typeof(Camera))]
public sealed class RearViewMirrorCamera : MonoBehaviour
{
[SerializeField] private Transform target;
[SerializeField] private bool autoFindTarget = true;
[SerializeField] private float targetSearchInterval = 0.35f;
[SerializeField] private Vector3 localOffset = new Vector3(0f, 2.1f, 0.6f);
[SerializeField] private float lookUpBias = 0.08f;
[SerializeField] private float positionLerp = 18f;
[SerializeField] private float rotationLerp = 18f;
private Camera mirrorCamera;
private float nextTargetSearchTime;
private void Awake()
{
mirrorCamera = GetComponent<Camera>();
mirrorCamera.enabled = true;
}
private void LateUpdate()
{
ResolveTarget();
if (target == null)
return;
Vector3 desiredPosition = target.TransformPoint(localOffset);
Vector3 lookDirection = -target.forward + Vector3.up * lookUpBias;
Quaternion desiredRotation = Quaternion.LookRotation(lookDirection.normalized, Vector3.up);
float positionStep = 1f - Mathf.Exp(-positionLerp * Time.deltaTime);
float rotationStep = 1f - Mathf.Exp(-rotationLerp * Time.deltaTime);
transform.position = Vector3.Lerp(transform.position, desiredPosition, positionStep);
transform.rotation = Quaternion.Slerp(transform.rotation, desiredRotation, rotationStep);
}
public void SetTarget(Transform newTarget, bool snap)
{
target = newTarget;
if (snap && target != null)
SnapToTarget();
}
private void SnapToTarget()
{
transform.position = target.TransformPoint(localOffset);
Vector3 lookDirection = -target.forward + Vector3.up * lookUpBias;
transform.rotation = Quaternion.LookRotation(lookDirection.normalized, Vector3.up);
}
private void ResolveTarget()
{
if (target != null || !autoFindTarget)
return;
if (Time.unscaledTime < nextTargetSearchTime)
return;
nextTargetSearchTime = Time.unscaledTime + targetSearchInterval;
ArcadeBuggyController controller = Object.FindFirstObjectByType<ArcadeBuggyController>();
if (controller != null)
SetTarget(controller.transform, true);
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: b009635d9fed79946bb577254278da61

View File

@ -0,0 +1,41 @@
using System.Collections.Generic;
using RaceFields.Damage.VehicleDamage;
using UnityEngine;
namespace RaceFields.Damage
{
public sealed class BladeDamageSource : MonoBehaviour
{
[SerializeField] private float damagePerSecond = 80f;
[SerializeField] private float tickInterval = 0.2f;
[SerializeField] private float activationDelay = 0.75f;
private readonly Dictionary<DamageHitbox, float> nextDamageTimes = new Dictionary<DamageHitbox, float>();
private float activeAtTime;
private void OnEnable()
{
activeAtTime = Time.time + activationDelay;
nextDamageTimes.Clear();
}
private void OnTriggerStay(Collider other)
{
if (Time.time < activeAtTime)
return;
DamageHitbox hitbox = other.GetComponentInParent<DamageHitbox>();
if (hitbox == null)
return;
float time = Time.time;
if (nextDamageTimes.TryGetValue(hitbox, out float nextTime) && time < nextTime)
return;
nextDamageTimes[hitbox] = time + tickInterval;
Vector3 direction = (other.transform.position - transform.position).normalized;
float damage = damagePerSecond * tickInterval;
hitbox.ApplyDamage(new DamageHit(damage, DamageType.Blade, other.ClosestPoint(transform.position), direction, gameObject));
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 5483916f7ebff2c448991626172509ea

View File

@ -0,0 +1,29 @@
using RaceFields.Damage.VehicleDamage;
using UnityEngine;
namespace RaceFields.Damage
{
[RequireComponent(typeof(Rigidbody))]
public sealed class CollisionDamageSource : MonoBehaviour
{
[SerializeField] private float minRelativeSpeed = 7f;
[SerializeField] private float damagePerSpeed = 4f;
[SerializeField] private float maxDamage = 85f;
[SerializeField] private DamageType damageType = DamageType.Collision;
private void OnCollisionEnter(Collision collision)
{
float relativeSpeed = collision.relativeVelocity.magnitude;
if (relativeSpeed < minRelativeSpeed)
return;
DamageHitbox hitbox = collision.collider.GetComponentInParent<DamageHitbox>();
if (hitbox == null)
return;
ContactPoint contact = collision.GetContact(0);
float amount = Mathf.Min(maxDamage, (relativeSpeed - minRelativeSpeed) * damagePerSpeed);
hitbox.ApplyDamage(new DamageHit(amount, damageType, contact.point, collision.relativeVelocity.normalized, gameObject));
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 27d1127628814c242afa8c0cafd1d278

View File

@ -0,0 +1,46 @@
namespace RaceFields.Damage
{
public enum DamageType
{
Collision,
Blade,
Projectile,
Debug
}
public enum VehicleModuleType
{
Body,
Engine,
FrontLeftWheel,
FrontRightWheel,
RearLeftWheel,
RearRightWheel
}
public enum VehicleModuleState
{
Healthy,
Damaged,
Destroyed,
Detached
}
public readonly struct DamageHit
{
public readonly float Amount;
public readonly DamageType Type;
public readonly UnityEngine.Vector3 Point;
public readonly UnityEngine.Vector3 Direction;
public readonly UnityEngine.GameObject Source;
public DamageHit(float amount, DamageType type, UnityEngine.Vector3 point, UnityEngine.Vector3 direction, UnityEngine.GameObject source)
{
Amount = amount;
Type = type;
Point = point;
Direction = direction;
Source = source;
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: afdd389aa3e96af428bc9a2dc1a28b50

View File

@ -0,0 +1,33 @@
using UnityEngine;
namespace RaceFields.Damage
{
public sealed class SimpleDamageReceiver : MonoBehaviour
{
[SerializeField] private float maxHealth = 100f;
[SerializeField] private bool destroyOnDeath = true;
[SerializeField] private float destroyDelay;
public float CurrentHealth { get; private set; }
public bool IsDead { get; private set; }
private void Awake()
{
CurrentHealth = Mathf.Max(1f, maxHealth);
}
public void ApplyDamage(float amount, Vector3 point, Vector3 direction, GameObject source)
{
if (IsDead)
return;
CurrentHealth = Mathf.Max(0f, CurrentHealth - Mathf.Max(0f, amount));
if (CurrentHealth > 0f)
return;
IsDead = true;
if (destroyOnDeath)
Destroy(gameObject, destroyDelay);
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: b84a36537942ca148a8bc4a133d96e93

View File

@ -0,0 +1,28 @@
using UnityEngine;
namespace RaceFields.Damage.VehicleDamage
{
public sealed class DamageHitbox : MonoBehaviour
{
[SerializeField] private VehicleDamageController damageController;
[SerializeField] private VehicleModuleType moduleType = VehicleModuleType.Body;
[SerializeField] private float damageMultiplier = 1f;
public VehicleModuleType ModuleType => moduleType;
private void Awake()
{
if (damageController == null)
damageController = GetComponentInParent<VehicleDamageController>();
}
public void ApplyDamage(DamageHit hit)
{
if (damageController == null)
return;
DamageHit scaledHit = new DamageHit(hit.Amount * damageMultiplier, hit.Type, hit.Point, hit.Direction, hit.Source);
damageController.ApplyDamage(moduleType, scaledHit);
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 18014f9b0dee6a9498473614a3e522d8

View File

@ -0,0 +1,384 @@
using System;
using RaceFields.Vehicles;
using UnityEngine;
namespace RaceFields.Damage.VehicleDamage
{
[RequireComponent(typeof(Rigidbody))]
[RequireComponent(typeof(ArcadeBuggyController))]
public sealed class VehicleDamageController : MonoBehaviour
{
[Serializable]
public sealed class VehicleModule
{
[SerializeField] private VehicleModuleType moduleType = VehicleModuleType.Body;
[SerializeField] private string displayName = "Module";
[SerializeField] private float maxHealth = 100f;
[SerializeField, Range(0f, 1f)] private float damagedHealthRatio = 0.5f;
[SerializeField] private WheelSlot wheelSlot;
[SerializeField] private bool detachWheelVisualOnDestroyed;
[SerializeField] private float detachImpulse = 2f;
[SerializeField] private float currentHealth;
[SerializeField] private VehicleModuleState state = VehicleModuleState.Healthy;
public VehicleModuleType ModuleType => moduleType;
public string DisplayName => displayName;
public float MaxHealth => maxHealth;
public float CurrentHealth => currentHealth;
public VehicleModuleState State => state;
public WheelSlot WheelSlot => wheelSlot;
public bool DetachWheelVisualOnDestroyed => detachWheelVisualOnDestroyed;
public float DetachImpulse => detachImpulse;
public float NormalizedHealth => maxHealth <= 0f ? 0f : Mathf.Clamp01(currentHealth / maxHealth);
public VehicleModule(VehicleModuleType moduleType, string displayName, float maxHealth)
{
this.moduleType = moduleType;
this.displayName = displayName;
this.maxHealth = maxHealth;
}
public VehicleModule WithWheel(WheelSlot slot, bool detachVisual)
{
wheelSlot = slot;
detachWheelVisualOnDestroyed = detachVisual;
return this;
}
public void ResetHealth()
{
currentHealth = Mathf.Max(1f, maxHealth);
state = VehicleModuleState.Healthy;
}
public bool ApplyDamage(float amount)
{
if (state == VehicleModuleState.Destroyed || state == VehicleModuleState.Detached)
return false;
VehicleModuleState previous = state;
currentHealth = Mathf.Max(0f, currentHealth - Mathf.Max(0f, amount));
state = ResolveState();
return previous != state;
}
public void MarkDetached()
{
currentHealth = 0f;
state = VehicleModuleState.Detached;
}
private VehicleModuleState ResolveState()
{
if (currentHealth <= 0f)
return VehicleModuleState.Destroyed;
return NormalizedHealth <= damagedHealthRatio
? VehicleModuleState.Damaged
: VehicleModuleState.Healthy;
}
}
[Header("Modules")]
[SerializeField] private VehicleModule[] moduleHealth;
[Header("Startup")]
[SerializeField] private float spawnGraceTime = 1f;
[Header("Collision Damage")]
[SerializeField] private float minCollisionSpeed = 11f;
[SerializeField] private float collisionDamagePerSpeed = 4.5f;
[SerializeField] private float maxCollisionDamage = 95f;
[SerializeField] private float collisionCooldown = 0.25f;
[Header("Landing Damage")]
[SerializeField] private float minAirTimeForLandingDamage = 0.45f;
[SerializeField] private float minLandingDownSpeed = 9f;
[SerializeField] private float landingDamagePerSpeed = 4f;
[SerializeField] private float maxLandingDamage = 75f;
[SerializeField, Range(0f, 1f)] private float landingWheelDamageShare = 0.65f;
[SerializeField, Range(0f, 1f)] private float landingBodyDamageShare = 0.35f;
[Header("Debug")]
[SerializeField] private bool logDamage;
[SerializeField] private string lastDamageDebug;
public event Action<VehicleModule> ModuleStateChanged;
public VehicleModule[] Modules => moduleHealth;
public string LastDamageDebug => lastDamageDebug;
private ArcadeBuggyController buggyController;
private Rigidbody body;
private float ignoreDamageUntil;
private float nextCollisionDamageTime;
private WheelImpactState frontLeftState;
private WheelImpactState frontRightState;
private WheelImpactState rearLeftState;
private WheelImpactState rearRightState;
private struct WheelImpactState
{
public bool WasGrounded;
public float AirborneStartTime;
public float MaxDownSpeed;
}
private void Reset()
{
moduleHealth = CreateDefaultModules();
}
private void Awake()
{
buggyController = GetComponent<ArcadeBuggyController>();
body = GetComponent<Rigidbody>();
EnsureModules();
ResetModuleHealth();
ignoreDamageUntil = Time.time + spawnGraceTime;
frontLeftState.WasGrounded = true;
frontRightState.WasGrounded = true;
rearLeftState.WasGrounded = true;
rearRightState.WasGrounded = true;
}
private void FixedUpdate()
{
if (Time.time < ignoreDamageUntil)
return;
UpdateWheelLanding(WheelSlot.FrontLeft, VehicleModuleType.FrontLeftWheel, ref frontLeftState);
UpdateWheelLanding(WheelSlot.FrontRight, VehicleModuleType.FrontRightWheel, ref frontRightState);
UpdateWheelLanding(WheelSlot.RearLeft, VehicleModuleType.RearLeftWheel, ref rearLeftState);
UpdateWheelLanding(WheelSlot.RearRight, VehicleModuleType.RearRightWheel, ref rearRightState);
}
private void OnCollisionEnter(Collision collision)
{
if (Time.time < ignoreDamageUntil || Time.time < nextCollisionDamageTime)
return;
if (collision.contactCount == 0)
return;
ContactPoint contact = collision.GetContact(0);
float impactSpeed = Mathf.Abs(Vector3.Dot(collision.relativeVelocity, contact.normal));
if (impactSpeed < minCollisionSpeed)
return;
VehicleModuleType moduleType = ResolveImpactModule(contact.point);
float damage = Mathf.Min(maxCollisionDamage, (impactSpeed - minCollisionSpeed) * collisionDamagePerSpeed);
ApplyDamage(moduleType, new DamageHit(damage, DamageType.Collision, contact.point, collision.relativeVelocity.normalized, gameObject));
nextCollisionDamageTime = Time.time + collisionCooldown;
}
public void ApplyDamage(VehicleModuleType moduleType, DamageHit hit)
{
VehicleModule module = GetModule(moduleType);
if (module == null)
return;
bool changed = module.ApplyDamage(hit.Amount);
lastDamageDebug = $"{hit.Type}: {hit.Amount:F1} -> {moduleType}";
if (module.State == VehicleModuleState.Destroyed && IsWheelModule(module.ModuleType))
DisableDestroyedWheel(module);
if (logDamage)
Debug.Log($"{name} {lastDamageDebug}", this);
if (changed)
ModuleStateChanged?.Invoke(module);
}
public VehicleModule GetModule(VehicleModuleType moduleType)
{
EnsureModules();
for (int i = 0; i < moduleHealth.Length; i++)
{
if (moduleHealth[i] != null && moduleHealth[i].ModuleType == moduleType)
return moduleHealth[i];
}
return null;
}
public VehicleModuleState GetModuleState(VehicleModuleType moduleType)
{
VehicleModule module = GetModule(moduleType);
return module != null ? module.State : VehicleModuleState.Healthy;
}
public void RepairAll()
{
EnsureModules();
for (int i = 0; i < moduleHealth.Length; i++)
{
if (moduleHealth[i] == null)
continue;
moduleHealth[i].ResetHealth();
ModuleStateChanged?.Invoke(moduleHealth[i]);
}
}
private void UpdateWheelLanding(WheelSlot slot, VehicleModuleType moduleType, ref WheelImpactState state)
{
WheelCollider wheel = buggyController.GetWheelCollider(slot);
if (wheel == null || !wheel.enabled)
return;
bool grounded = wheel.isGrounded;
if (!grounded)
{
if (state.WasGrounded)
{
state.AirborneStartTime = Time.time;
state.MaxDownSpeed = 0f;
}
state.WasGrounded = false;
Vector3 gravityDirection = Physics.gravity.sqrMagnitude > 0f ? -Physics.gravity.normalized : Vector3.down;
float downSpeed = Vector3.Dot(body.GetPointVelocity(wheel.transform.position), gravityDirection);
state.MaxDownSpeed = Mathf.Max(state.MaxDownSpeed, Mathf.Max(0f, downSpeed));
return;
}
if (state.WasGrounded)
return;
float airTime = Time.time - state.AirborneStartTime;
float maxDownSpeed = state.MaxDownSpeed;
state.WasGrounded = true;
state.AirborneStartTime = 0f;
state.MaxDownSpeed = 0f;
if (airTime < minAirTimeForLandingDamage || maxDownSpeed < minLandingDownSpeed)
return;
float totalDamage = Mathf.Min(maxLandingDamage, (maxDownSpeed - minLandingDownSpeed) * landingDamagePerSpeed);
ApplyDamage(moduleType, new DamageHit(totalDamage * landingWheelDamageShare, DamageType.Collision, wheel.transform.position, Vector3.down, gameObject));
float bodyDamage = totalDamage * landingBodyDamageShare * 0.25f;
if (bodyDamage > 0f)
ApplyDamage(VehicleModuleType.Body, new DamageHit(bodyDamage, DamageType.Collision, wheel.transform.position, Vector3.down, gameObject));
}
private VehicleModuleType ResolveImpactModule(Vector3 worldPoint)
{
if (TryResolveWheelImpact(worldPoint, out WheelSlot closestWheel))
return WheelSlotToModule(closestWheel);
Vector3 localPoint = transform.InverseTransformPoint(worldPoint);
return localPoint.z > 0.65f ? VehicleModuleType.Engine : VehicleModuleType.Body;
}
private bool TryResolveWheelImpact(Vector3 worldPoint, out WheelSlot closestWheel)
{
closestWheel = WheelSlot.FrontLeft;
float bestDistance = float.MaxValue;
bool found = false;
CheckWheelDistance(WheelSlot.FrontLeft, worldPoint, ref closestWheel, ref bestDistance, ref found);
CheckWheelDistance(WheelSlot.FrontRight, worldPoint, ref closestWheel, ref bestDistance, ref found);
CheckWheelDistance(WheelSlot.RearLeft, worldPoint, ref closestWheel, ref bestDistance, ref found);
CheckWheelDistance(WheelSlot.RearRight, worldPoint, ref closestWheel, ref bestDistance, ref found);
return found;
}
private void CheckWheelDistance(WheelSlot slot, Vector3 worldPoint, ref WheelSlot closestWheel, ref float bestDistance, ref bool found)
{
WheelCollider wheel = buggyController.GetWheelCollider(slot);
if (wheel == null || !wheel.enabled)
return;
float limit = Mathf.Max(0.45f, wheel.radius * 1.8f);
float distance = Vector3.Distance(worldPoint, wheel.transform.position);
if (distance > limit || distance >= bestDistance)
return;
closestWheel = slot;
bestDistance = distance;
found = true;
}
private void DisableDestroyedWheel(VehicleModule module)
{
buggyController.SetWheelEnabled(module.WheelSlot, false);
if (!module.DetachWheelVisualOnDestroyed)
return;
Transform visual = buggyController.GetWheelVisual(module.WheelSlot);
if (visual == null)
return;
visual.SetParent(null, true);
Collider wheelCollider = visual.GetComponent<Collider>();
if (wheelCollider == null)
wheelCollider = visual.gameObject.AddComponent<SphereCollider>();
Rigidbody wheelBody = visual.GetComponent<Rigidbody>();
if (wheelBody == null)
wheelBody = visual.gameObject.AddComponent<Rigidbody>();
wheelBody.mass = 18f;
wheelBody.interpolation = RigidbodyInterpolation.Interpolate;
wheelBody.collisionDetectionMode = CollisionDetectionMode.ContinuousDynamic;
wheelBody.AddForce((visual.right + Vector3.up * 0.35f) * module.DetachImpulse, ForceMode.Impulse);
module.MarkDetached();
}
private void EnsureModules()
{
if (moduleHealth == null || moduleHealth.Length == 0)
moduleHealth = CreateDefaultModules();
}
private void ResetModuleHealth()
{
for (int i = 0; i < moduleHealth.Length; i++)
{
if (moduleHealth[i] != null)
moduleHealth[i].ResetHealth();
}
}
private static VehicleModule[] CreateDefaultModules()
{
return new[]
{
new VehicleModule(VehicleModuleType.Body, "Body", 180f),
new VehicleModule(VehicleModuleType.Engine, "Engine", 120f),
new VehicleModule(VehicleModuleType.FrontLeftWheel, "Front Left Wheel", 70f).WithWheel(WheelSlot.FrontLeft, true),
new VehicleModule(VehicleModuleType.FrontRightWheel, "Front Right Wheel", 70f).WithWheel(WheelSlot.FrontRight, true),
new VehicleModule(VehicleModuleType.RearLeftWheel, "Rear Left Wheel", 70f).WithWheel(WheelSlot.RearLeft, true),
new VehicleModule(VehicleModuleType.RearRightWheel, "Rear Right Wheel", 70f).WithWheel(WheelSlot.RearRight, true)
};
}
private static bool IsWheelModule(VehicleModuleType moduleType)
{
return moduleType == VehicleModuleType.FrontLeftWheel ||
moduleType == VehicleModuleType.FrontRightWheel ||
moduleType == VehicleModuleType.RearLeftWheel ||
moduleType == VehicleModuleType.RearRightWheel;
}
private static VehicleModuleType WheelSlotToModule(WheelSlot slot)
{
return slot switch
{
WheelSlot.FrontLeft => VehicleModuleType.FrontLeftWheel,
WheelSlot.FrontRight => VehicleModuleType.FrontRightWheel,
WheelSlot.RearLeft => VehicleModuleType.RearLeftWheel,
WheelSlot.RearRight => VehicleModuleType.RearRightWheel,
_ => VehicleModuleType.Body
};
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 23a901881a64d704fbdbdf8716ec0229

View File

@ -1,4 +1,5 @@
using RaceFields.CameraSystem; using RaceFields.CameraSystem;
using RaceFields.Damage.VehicleDamage;
using RaceFields.Vehicles; using RaceFields.Vehicles;
using UnityEditor; using UnityEditor;
using UnityEngine; using UnityEngine;
@ -24,7 +25,7 @@ namespace RaceFields.EditorTools
EnsureComponent<Rigidbody>(root, ConfigureBody); EnsureComponent<Rigidbody>(root, ConfigureBody);
EnsureComponent<BoxCollider>(root, collider => ConfigureBodyCollider(root, collider)); EnsureComponent<BoxCollider>(root, collider => ConfigureBodyCollider(root, collider));
ArcadeBuggyController controller = EnsureComponent<ArcadeBuggyController>(root, null); ArcadeBuggyController controller = EnsureComponent<ArcadeBuggyController>(root, null);
BuggyWheelSetup wheelSetup = EnsureComponent<BuggyWheelSetup>(root, ConfigureWheelSetup); EnsureComponent<VehicleDamageController>(root, null);
SetupWheel(root.transform, "Wheel_FL", "WheelCollider_FL"); SetupWheel(root.transform, "Wheel_FL", "WheelCollider_FL");
SetupWheel(root.transform, "Wheel_FR", "WheelCollider_FR"); SetupWheel(root.transform, "Wheel_FR", "WheelCollider_FR");
@ -34,8 +35,6 @@ namespace RaceFields.EditorTools
SetupEffects(root.transform, controller); SetupEffects(root.transform, controller);
SetupSounds(root.transform, controller); SetupSounds(root.transform, controller);
wheelSetup.AlignAllWheels();
PrefabUtility.SaveAsPrefabAsset(root, BuggyPrefabPath); PrefabUtility.SaveAsPrefabAsset(root, BuggyPrefabPath);
} }
finally finally
@ -172,20 +171,6 @@ namespace RaceFields.EditorTools
wheelCollider.suspensionSpring = spring; wheelCollider.suspensionSpring = spring;
} }
private static void ConfigureWheelSetup(BuggyWheelSetup setup)
{
SerializedObject serializedSetup = new SerializedObject(setup);
serializedSetup.FindProperty("frontLeftWheelName").stringValue = "Wheel_FL";
serializedSetup.FindProperty("frontRightWheelName").stringValue = "Wheel_FR";
serializedSetup.FindProperty("rearLeftWheelName").stringValue = "Wheel_RL";
serializedSetup.FindProperty("rearRightWheelName").stringValue = "Wheel_RR";
serializedSetup.FindProperty("frontLeftColliderName").stringValue = "WheelCollider_FL";
serializedSetup.FindProperty("frontRightColliderName").stringValue = "WheelCollider_FR";
serializedSetup.FindProperty("rearLeftColliderName").stringValue = "WheelCollider_RL";
serializedSetup.FindProperty("rearRightColliderName").stringValue = "WheelCollider_RR";
serializedSetup.ApplyModifiedPropertiesWithoutUndo();
}
private static void SetupControllerReferences(Transform root, ArcadeBuggyController controller) private static void SetupControllerReferences(Transform root, ArcadeBuggyController controller)
{ {
SerializedObject serializedController = new SerializedObject(controller); SerializedObject serializedController = new SerializedObject(controller);

View File

@ -1,4 +1,6 @@
using RaceFields.CameraSystem; using RaceFields.CameraSystem;
using RaceFields.Damage.VehicleDamage;
using RaceFields.UI.HUD;
using RaceFields.Vehicles; using RaceFields.Vehicles;
using UnityEngine; using UnityEngine;
@ -22,18 +24,34 @@ namespace RaceFields.GameFlow
Transform targetSpawn = spawnPoint != null ? spawnPoint : transform; Transform targetSpawn = spawnPoint != null ? spawnPoint : transform;
GameObject vehicle = Instantiate(prefab, targetSpawn.position, targetSpawn.rotation); GameObject vehicle = Instantiate(prefab, targetSpawn.position, targetSpawn.rotation);
AssignCameraTarget(vehicle.transform); AssignCameraTarget(vehicle.transform);
AssignDamageHud(vehicle);
} }
private static void AssignCameraTarget(Transform vehicle) private static void AssignCameraTarget(Transform vehicle)
{ {
BuggyFollowCamera followCamera = FindFirstObjectByType<BuggyFollowCamera>(); BuggyFollowCamera followCamera = FindAnyObjectByType<BuggyFollowCamera>();
if (followCamera != null) if (followCamera != null)
followCamera.SetTarget(vehicle, true); followCamera.SetTarget(vehicle, true);
RearViewMirrorCamera rearViewCamera = FindAnyObjectByType<RearViewMirrorCamera>();
if (rearViewCamera != null)
rearViewCamera.SetTarget(vehicle, true);
}
private static void AssignDamageHud(GameObject vehicle)
{
VehicleDamageController damageController = vehicle.GetComponentInChildren<VehicleDamageController>();
if (damageController == null)
return;
VehicleDamageHud damageHud = FindAnyObjectByType<VehicleDamageHud>();
if (damageHud != null)
damageHud.Bind(damageController);
} }
private static void DestroyExistingVehicleControllers() private static void DestroyExistingVehicleControllers()
{ {
ArcadeBuggyController[] existingVehicles = FindObjectsByType<ArcadeBuggyController>(FindObjectsSortMode.None); ArcadeBuggyController[] existingVehicles = FindObjectsByType<ArcadeBuggyController>(FindObjectsInactive.Exclude);
for (int i = 0; i < existingVehicles.Length; i++) for (int i = 0; i < existingVehicles.Length; i++)
{ {
if (existingVehicles[i] != null) if (existingVehicles[i] != null)

View File

@ -0,0 +1,20 @@
using UnityEngine;
public class WeaponPickup : MonoBehaviour
{
[SerializeField] private GameObject pickupPrefab;
private void OnTriggerEnter(Collider other)
{
if (pickupPrefab == null)
return;
VehicleWeaponInventory inventory = other.GetComponentInParent<VehicleWeaponInventory>();
if (inventory == null)
return;
inventory.AddWeapon(pickupPrefab);
Destroy(gameObject);
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 9ba2d729446c7924fae0c23b6f68a343

View File

@ -0,0 +1,127 @@
using RaceFields.Damage;
using RaceFields.Damage.VehicleDamage;
using UnityEngine;
using UnityEngine.UI;
namespace RaceFields.UI.HUD
{
public sealed class VehicleDamageHud : MonoBehaviour
{
[System.Serializable]
public sealed class ModuleImage
{
public VehicleModuleType moduleType;
public Image image;
}
[SerializeField] private VehicleDamageController target;
[SerializeField] private bool autoFindTarget = true;
[SerializeField] private float targetSearchInterval = 0.35f;
[SerializeField] private Image fullVehicleImage;
[SerializeField] private ModuleImage[] moduleImages;
[SerializeField] private Color healthyColor = new Color(1f, 1f, 1f, 0f);
[SerializeField] private Color damagedColor = new Color(1f, 0f, 0f, 0.7f);
[SerializeField] private Color destroyedColor = new Color(0f, 0f, 0f, 0.85f);
private VehicleDamageController boundTarget;
private float nextTargetSearchTime;
private void OnEnable()
{
Bind(target);
}
private void OnDisable()
{
Unbind();
}
private void Update()
{
if (target != null || !autoFindTarget)
return;
if (Time.unscaledTime < nextTargetSearchTime)
return;
nextTargetSearchTime = Time.unscaledTime + targetSearchInterval;
Bind(Object.FindAnyObjectByType<VehicleDamageController>());
}
public void Bind(VehicleDamageController newTarget)
{
if (boundTarget == newTarget)
{
target = newTarget;
RefreshAll();
return;
}
Unbind();
target = newTarget;
boundTarget = newTarget;
if (boundTarget != null)
boundTarget.ModuleStateChanged += HandleModuleStateChanged;
RefreshAll();
}
private void Unbind()
{
if (boundTarget != null)
boundTarget.ModuleStateChanged -= HandleModuleStateChanged;
boundTarget = null;
}
private void HandleModuleStateChanged(VehicleDamageController.VehicleModule module)
{
RefreshModule(module);
}
private void RefreshAll()
{
if (fullVehicleImage != null)
{
fullVehicleImage.enabled = true;
fullVehicleImage.color = Color.white;
}
if (moduleImages == null)
return;
for (int i = 0; i < moduleImages.Length; i++)
{
VehicleDamageController.VehicleModule module = target != null ? target.GetModule(moduleImages[i].moduleType) : null;
SetModuleImage(moduleImages[i], module != null ? module.State : VehicleModuleState.Healthy);
}
}
private void RefreshModule(VehicleDamageController.VehicleModule module)
{
if (moduleImages == null || module == null)
return;
for (int i = 0; i < moduleImages.Length; i++)
{
if (moduleImages[i].moduleType == module.ModuleType)
SetModuleImage(moduleImages[i], module.State);
}
}
private void SetModuleImage(ModuleImage moduleImage, VehicleModuleState state)
{
if (moduleImage == null || moduleImage.image == null)
return;
moduleImage.image.enabled = true;
moduleImage.image.color = state switch
{
VehicleModuleState.Damaged => damagedColor,
VehicleModuleState.Destroyed => destroyedColor,
VehicleModuleState.Detached => destroyedColor,
_ => healthyColor
};
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 0bfd334c2a5c6d34b95197adeff4252e

View File

@ -50,6 +50,42 @@ namespace RaceFields.Vehicles
public bool IsDrifting { get; private set; } public bool IsDrifting { get; private set; }
public bool IsTractionLocked { get; private set; } public bool IsTractionLocked { get; private set; }
public WheelCollider GetWheelCollider(WheelSlot slot)
{
return slot switch
{
WheelSlot.FrontLeft => frontLeftCollider,
WheelSlot.FrontRight => frontRightCollider,
WheelSlot.RearLeft => rearLeftCollider,
WheelSlot.RearRight => rearRightCollider,
_ => null
};
}
public Transform GetWheelVisual(WheelSlot slot)
{
return slot switch
{
WheelSlot.FrontLeft => frontLeftVisual,
WheelSlot.FrontRight => frontRightVisual,
WheelSlot.RearLeft => rearLeftVisual,
WheelSlot.RearRight => rearRightVisual,
_ => null
};
}
public void SetWheelEnabled(WheelSlot slot, bool enabled)
{
WheelCollider wheel = GetWheelCollider(slot);
if (wheel != null)
{
wheel.motorTorque = 0f;
wheel.brakeTorque = enabled ? 0f : brakeForce;
wheel.steerAngle = 0f;
wheel.enabled = enabled;
}
}
private const float TorquePerAccelerationStep = 50f; private const float TorquePerAccelerationStep = 50f;
private const float DriftVelocityThreshold = 2.5f; private const float DriftVelocityThreshold = 2.5f;
private const float SkidVelocityThreshold = 5f; private const float SkidVelocityThreshold = 5f;
@ -83,7 +119,7 @@ namespace RaceFields.Vehicles
private void Awake() private void Awake()
{ {
body = GetComponent<Rigidbody>(); body = GetComponent<Rigidbody>();
AutoFindReferences(); ValidateRequiredReferences();
CacheVisualRotationOffsets(); CacheVisualRotationOffsets();
CacheWheelFriction(); CacheWheelFriction();
@ -197,7 +233,7 @@ namespace RaceFields.Vehicles
throttleAxis = Mathf.MoveTowards(throttleAxis, 0f, Time.fixedDeltaTime * 10f); throttleAxis = Mathf.MoveTowards(throttleAxis, 0f, Time.fixedDeltaTime * 10f);
ApplyMotorTorque(0f); ApplyMotorTorque(0f);
if (!handbrakeInput) if (!handbrakeInput && IsAnyWheelGrounded())
{ {
ApplyBrakeTorque(0f); ApplyBrakeTorque(0f);
body.linearVelocity *= 1f / (1f + 0.025f * decelerationMultiplier); body.linearVelocity *= 1f / (1f + 0.025f * decelerationMultiplier);
@ -229,6 +265,9 @@ namespace RaceFields.Vehicles
private void ApplyDownforce() private void ApplyDownforce()
{ {
if (!IsAnyWheelGrounded())
return;
body.AddForce(-transform.up * downforce * body.linearVelocity.magnitude, ForceMode.Force); body.AddForce(-transform.up * downforce * body.linearVelocity.magnitude, ForceMode.Force);
} }
@ -310,7 +349,7 @@ namespace RaceFields.Vehicles
private void ApplySidewaysFriction(WheelCollider wheel, ref WheelFrictionCurve friction, float defaultExtremumSlip, float drift) private void ApplySidewaysFriction(WheelCollider wheel, ref WheelFrictionCurve friction, float defaultExtremumSlip, float drift)
{ {
if (wheel == null) if (wheel == null || !wheel.enabled)
return; return;
float driftExtremumSlip = defaultExtremumSlip * handbrakeDriftMultiplier; float driftExtremumSlip = defaultExtremumSlip * handbrakeDriftMultiplier;
@ -336,25 +375,25 @@ namespace RaceFields.Vehicles
private static void SetSteerAngle(WheelCollider wheel, float angle, float lerp) private static void SetSteerAngle(WheelCollider wheel, float angle, float lerp)
{ {
if (wheel != null) if (wheel != null && wheel.enabled)
wheel.steerAngle = Mathf.Lerp(wheel.steerAngle, angle, lerp); wheel.steerAngle = Mathf.Lerp(wheel.steerAngle, angle, lerp);
} }
private static void SetDriveTorque(WheelCollider wheel, float torque) private static void SetDriveTorque(WheelCollider wheel, float torque)
{ {
if (wheel != null) if (wheel != null && wheel.enabled)
wheel.motorTorque = torque; wheel.motorTorque = torque;
} }
private static void SetBrakeTorque(WheelCollider wheel, float torque) private static void SetBrakeTorque(WheelCollider wheel, float torque)
{ {
if (wheel != null) if (wheel != null && wheel.enabled)
wheel.brakeTorque = torque; wheel.brakeTorque = torque;
} }
private static void SyncWheelVisual(WheelCollider collider, Transform visual, Quaternion visualRotationOffset) private static void SyncWheelVisual(WheelCollider collider, Transform visual, Quaternion visualRotationOffset)
{ {
if (collider == null || visual == null) if (collider == null || !collider.enabled || visual == null)
return; return;
collider.GetWorldPose(out Vector3 position, out Quaternion rotation); collider.GetWorldPose(out Vector3 position, out Quaternion rotation);
@ -388,7 +427,15 @@ namespace RaceFields.Vehicles
private static bool IsWheelGrounded(WheelCollider wheel) private static bool IsWheelGrounded(WheelCollider wheel)
{ {
return wheel != null && wheel.isGrounded; return wheel != null && wheel.enabled && wheel.isGrounded;
}
private bool IsAnyWheelGrounded()
{
return IsWheelGrounded(frontLeftCollider) ||
IsWheelGrounded(frontRightCollider) ||
IsWheelGrounded(rearLeftCollider) ||
IsWheelGrounded(rearRightCollider);
} }
private static void StopAudio(AudioSource source) private static void StopAudio(AudioSource source)
@ -397,25 +444,13 @@ namespace RaceFields.Vehicles
source.Stop(); source.Stop();
} }
private void AutoFindReferences() private void ValidateRequiredReferences()
{ {
frontLeftCollider ??= FindChildComponent<WheelCollider>("WheelCollider_FL"); if (frontLeftCollider != null && frontRightCollider != null && rearLeftCollider != null && rearRightCollider != null)
frontRightCollider ??= FindChildComponent<WheelCollider>("WheelCollider_FR"); return;
rearLeftCollider ??= FindChildComponent<WheelCollider>("WheelCollider_RL");
rearRightCollider ??= FindChildComponent<WheelCollider>("WheelCollider_RR");
frontLeftVisual ??= FindFirstChildTransform("F_L", "WheelVisual_FL"); Debug.LogError($"{name} is missing one or more wheel collider references.", this);
frontRightVisual ??= FindFirstChildTransform("F_R", "WheelVisual_FR"); enabled = false;
rearLeftVisual ??= FindFirstChildTransform("B_L", "WheelVisual_RL");
rearRightVisual ??= FindFirstChildTransform("B_R", "WheelVisual_RR");
rearLeftSmoke ??= FindChildComponent<ParticleSystem>("LeftTireSmoke_PS");
rearRightSmoke ??= FindChildComponent<ParticleSystem>("RightTireSmoke_PS");
rearLeftSkid ??= FindChildComponent<TrailRenderer>("LeftTireSkid");
rearRightSkid ??= FindChildComponent<TrailRenderer>("RightTireSkid");
engineSound ??= FindChildComponent<AudioSource>("EngineSound");
tireScreechSound ??= FindChildComponent<AudioSource>("TireScreechSound");
} }
private void CacheVisualRotationOffsets() private void CacheVisualRotationOffsets()
@ -434,34 +469,5 @@ namespace RaceFields.Vehicles
return Quaternion.Inverse(collider.transform.rotation) * visual.rotation; return Quaternion.Inverse(collider.transform.rotation) * visual.rotation;
} }
private T FindChildComponent<T>(string childName) where T : Component
{
Transform child = FindChildTransform(childName);
return child != null ? child.GetComponent<T>() : null;
}
private Transform FindChildTransform(string childName)
{
Transform[] children = GetComponentsInChildren<Transform>(true);
for (int i = 0; i < children.Length; i++)
{
if (children[i].name == childName)
return children[i];
}
return null;
}
private Transform FindFirstChildTransform(params string[] childNames)
{
for (int i = 0; i < childNames.Length; i++)
{
Transform child = FindChildTransform(childNames[i]);
if (child != null)
return child;
}
return null;
}
} }
} }

View File

@ -1,89 +0,0 @@
using UnityEngine;
namespace RaceFields.Vehicles
{
[ExecuteAlways]
public sealed class BuggyWheelSetup : MonoBehaviour
{
[SerializeField] private string frontLeftWheelName = "F_L";
[SerializeField] private string frontRightWheelName = "F_R";
[SerializeField] private string rearLeftWheelName = "B_L";
[SerializeField] private string rearRightWheelName = "B_R";
[SerializeField] private string frontLeftColliderName = "WheelCollider_FL";
[SerializeField] private string frontRightColliderName = "WheelCollider_FR";
[SerializeField] private string rearLeftColliderName = "WheelCollider_RL";
[SerializeField] private string rearRightColliderName = "WheelCollider_RR";
[SerializeField] private float radiusMultiplier = 0.5f;
[SerializeField] private float minimumRadius = 0.12f;
[SerializeField] private float suspensionDistance = 0.28f;
[SerializeField] private float wheelMass = 20f;
private void Awake()
{
AlignAllWheels();
}
private void OnValidate()
{
AlignAllWheels();
}
[ContextMenu("Align Wheel Colliders")]
public void AlignAllWheels()
{
AlignWheel(frontLeftWheelName, frontLeftColliderName);
AlignWheel(frontRightWheelName, frontRightColliderName);
AlignWheel(rearLeftWheelName, rearLeftColliderName);
AlignWheel(rearRightWheelName, rearRightColliderName);
}
private void AlignWheel(string visualName, string colliderName)
{
Transform visual = FindChild(visualName);
WheelCollider wheelCollider = FindWheelCollider(colliderName);
if (visual == null || wheelCollider == null)
return;
wheelCollider.transform.position = visual.position;
wheelCollider.transform.rotation = transform.rotation;
wheelCollider.transform.localScale = Vector3.one;
wheelCollider.mass = wheelMass;
wheelCollider.radius = Mathf.Max(minimumRadius, EstimateWheelRadius(visual) * radiusMultiplier);
wheelCollider.suspensionDistance = suspensionDistance;
wheelCollider.forceAppPointDistance = 0.05f;
wheelCollider.wheelDampingRate = 0.35f;
}
private float EstimateWheelRadius(Transform visual)
{
Renderer renderer = visual.GetComponentInChildren<Renderer>();
if (renderer == null)
return minimumRadius;
Vector3 size = renderer.bounds.size;
return Mathf.Max(size.y, size.z);
}
private WheelCollider FindWheelCollider(string colliderName)
{
Transform child = FindChild(colliderName);
return child != null ? child.GetComponent<WheelCollider>() : null;
}
private Transform FindChild(string childName)
{
Transform[] children = GetComponentsInChildren<Transform>(true);
for (int i = 0; i < children.Length; i++)
{
if (children[i].name == childName)
return children[i];
}
return null;
}
}
}

View File

@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 5f00271deee9d014d92d5672e1fe2baa

View File

@ -0,0 +1,10 @@
namespace RaceFields.Vehicles
{
public enum WheelSlot
{
FrontLeft,
FrontRight,
RearLeft,
RearRight
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 56b479bfe048d174ab8a31e6e5ffb13c

View File

@ -0,0 +1,26 @@
using UnityEngine;
public class VehicleWeaponInventory : MonoBehaviour
{
[SerializeField] private GameObject currentWeapon;
[SerializeField] private Transform spawnPoint;
public void AddWeapon(GameObject weaponPrefab)
{
if (weaponPrefab == null)
return;
if (currentWeapon != null)
Destroy(currentWeapon);
Transform parent = spawnPoint != null ? spawnPoint : transform;
currentWeapon = Instantiate(weaponPrefab, parent);
currentWeapon.transform.localPosition = Vector3.zero;
currentWeapon.transform.localRotation = Quaternion.identity;
MachineGunWeapon machineGun = currentWeapon.GetComponentInChildren<MachineGunWeapon>();
if (machineGun != null)
machineGun.SetOwner(transform);
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 89aedc67121ea4f4c98085bc8c9ad0d4

View File

@ -0,0 +1,81 @@
using RaceFields.Damage;
using RaceFields.Damage.VehicleDamage;
using UnityEngine;
public sealed class BulletProjectile : MonoBehaviour
{
[SerializeField] private float damage = 8f;
[SerializeField] private float impactForce = 25f;
[SerializeField] private float lifeTime = 2.5f;
private Transform ownerRoot;
private Rigidbody body;
private bool hasHit;
private void Awake()
{
body = GetComponent<Rigidbody>();
}
private void OnEnable()
{
hasHit = false;
}
public void Launch(Vector3 velocity, float shotDamage, float shotLifeTime, Transform owner)
{
damage = shotDamage;
lifeTime = Mathf.Max(0.05f, shotLifeTime);
ownerRoot = owner != null ? owner.root : null;
if (body == null)
body = GetComponent<Rigidbody>();
if (body != null)
body.linearVelocity = velocity;
Destroy(gameObject, lifeTime);
}
private void OnCollisionEnter(Collision collision)
{
if (collision.collider == null)
return;
Vector3 point = collision.contactCount > 0 ? collision.GetContact(0).point : transform.position;
HandleHit(collision.collider, point, body != null ? body.linearVelocity.normalized : transform.forward, collision.rigidbody);
}
private void OnTriggerEnter(Collider other)
{
HandleHit(other, transform.position, body != null ? body.linearVelocity.normalized : transform.forward, other.attachedRigidbody);
}
private void HandleHit(Collider hitCollider, Vector3 point, Vector3 direction, Rigidbody hitBody)
{
if (hasHit || hitCollider == null)
return;
if (ownerRoot != null && hitCollider.transform.root == ownerRoot)
return;
hasHit = true;
DamageHitbox hitbox = hitCollider.GetComponentInParent<DamageHitbox>();
if (hitbox != null)
{
hitbox.ApplyDamage(new DamageHit(damage, DamageType.Projectile, point, direction, gameObject));
}
else
{
SimpleDamageReceiver damageReceiver = hitCollider.GetComponentInParent<SimpleDamageReceiver>();
if (damageReceiver != null)
damageReceiver.ApplyDamage(damage, point, direction, gameObject);
}
if (hitBody != null && (ownerRoot == null || hitBody.transform.root != ownerRoot))
hitBody.AddForceAtPosition(direction * impactForce, point, ForceMode.Impulse);
Destroy(gameObject);
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 9a787488e597d6a4ca2a4d452e6ee62a

View File

@ -0,0 +1,151 @@
using RaceFields.Harvesters.AI;
using UnityEngine;
#if ENABLE_INPUT_SYSTEM
using UnityEngine.InputSystem;
#endif
public sealed class MachineGunWeapon : MonoBehaviour
{
[Header("References")]
[SerializeField] private Transform aimPivot;
[SerializeField] private Transform muzzle;
[SerializeField] private BulletProjectile projectilePrefab;
[SerializeField] private ParticleSystem muzzleFlash;
[Header("Targeting")]
[SerializeField] private float targetSearchRadius = 80f;
[SerializeField] private float targetHeightOffset = 1.1f;
[SerializeField] private float aimTurnSpeed = 18f;
[Header("Shooting")]
[SerializeField] private float fireRate = 12f;
[SerializeField] private float damagePerShot = 8f;
[SerializeField] private float projectileSpeed = 70f;
[SerializeField] private float projectileLifeTime = 2.5f;
[SerializeField] private float spreadAngle = 1.2f;
private Transform ownerRoot;
private Transform currentTarget;
private float nextShotTime;
private void Awake()
{
if (aimPivot == null)
aimPivot = transform;
if (muzzle == null)
muzzle = transform;
}
private void OnEnable()
{
nextShotTime = 0f;
}
private void Update()
{
AcquireTarget();
AimAtTarget();
if (IsFireHeld())
TryShoot();
}
public void SetOwner(Transform owner)
{
ownerRoot = owner != null ? owner.root : null;
}
private void AcquireTarget()
{
if (IsValidTarget(currentTarget))
return;
currentTarget = null;
HarvesterChaseController[] enemies = Object.FindObjectsByType<HarvesterChaseController>(FindObjectsInactive.Exclude, FindObjectsSortMode.None);
float bestDistanceSqr = targetSearchRadius * targetSearchRadius;
Vector3 origin = transform.position;
for (int i = 0; i < enemies.Length; i++)
{
if (enemies[i] == null)
continue;
Transform candidate = enemies[i].transform;
float distanceSqr = (candidate.position - origin).sqrMagnitude;
if (distanceSqr >= bestDistanceSqr)
continue;
currentTarget = candidate;
bestDistanceSqr = distanceSqr;
}
}
private bool IsValidTarget(Transform target)
{
if (target == null || !target.gameObject.activeInHierarchy)
return false;
return (target.position - transform.position).sqrMagnitude <= targetSearchRadius * targetSearchRadius;
}
private void AimAtTarget()
{
if (currentTarget == null || aimPivot == null)
return;
Vector3 targetPoint = currentTarget.position + Vector3.up * targetHeightOffset;
Vector3 direction = targetPoint - aimPivot.position;
if (direction.sqrMagnitude < 0.001f)
return;
Quaternion targetRotation = Quaternion.LookRotation(direction.normalized, Vector3.up);
aimPivot.rotation = Quaternion.Slerp(aimPivot.rotation, targetRotation, aimTurnSpeed * Time.deltaTime);
}
private void TryShoot()
{
if (Time.time < nextShotTime || projectilePrefab == null)
return;
nextShotTime = Time.time + 1f / Mathf.Max(0.01f, fireRate);
ShootProjectile();
}
private void ShootProjectile()
{
Vector3 direction = ApplySpread(muzzle.forward);
BulletProjectile projectile = Instantiate(projectilePrefab, muzzle.position, Quaternion.LookRotation(direction, Vector3.up));
projectile.Launch(direction * projectileSpeed, damagePerShot, projectileLifeTime, ownerRoot);
if (muzzleFlash != null)
muzzleFlash.Play();
}
private Vector3 ApplySpread(Vector3 direction)
{
if (spreadAngle <= 0f)
return direction.normalized;
Quaternion spread = Quaternion.Euler(
Random.Range(-spreadAngle, spreadAngle),
Random.Range(-spreadAngle, spreadAngle),
0f);
return (spread * direction).normalized;
}
private static bool IsFireHeld()
{
#if ENABLE_INPUT_SYSTEM
if (Mouse.current != null)
return Mouse.current.leftButton.isPressed;
#endif
#if ENABLE_LEGACY_INPUT_MANAGER
return Input.GetMouseButton(0);
#else
return false;
#endif
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: d3422cd562818d448a78afdc747d8166

1078
Assets/_Recovery/0 (3).unity Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: bafbd2a0515a0f9428d348bd954e9327
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,6 +1,7 @@
{ {
"dependencies": { "dependencies": {
"com.coplaydev.unity-mcp": "https://github.com/CoplayDev/unity-mcp.git?path=/MCPForUnity#main", "com.coplaydev.unity-mcp": "https://github.com/CoplayDev/unity-mcp.git?path=/MCPForUnity#main",
"com.unity.2d.psdimporter": "14.0.3",
"com.unity.2d.sprite": "1.0.0", "com.unity.2d.sprite": "1.0.0",
"com.unity.ai.navigation": "2.0.13", "com.unity.ai.navigation": "2.0.13",
"com.unity.collab-proxy": "2.12.4", "com.unity.collab-proxy": "2.12.4",

View File

@ -17,12 +17,47 @@
}, },
"hash": "11836003a5e2ffcb7715ecec7e1fbb9d9cdb5bb8" "hash": "11836003a5e2ffcb7715ecec7e1fbb9d9cdb5bb8"
}, },
"com.unity.2d.common": {
"version": "14.0.1",
"depth": 1,
"source": "registry",
"dependencies": {
"com.unity.burst": "1.8.4",
"com.unity.2d.sprite": "1.0.0",
"com.unity.collections": "2.4.3",
"com.unity.mathematics": "1.1.0",
"com.unity.modules.animation": "1.0.0",
"com.unity.modules.uielements": "1.0.0",
"com.unity.modules.imageconversion": "1.0.0"
},
"url": "https://packages.unity.com"
},
"com.unity.2d.psdimporter": {
"version": "14.0.3",
"depth": 0,
"source": "registry",
"dependencies": {
"com.unity.2d.common": "14.0.1",
"com.unity.2d.sprite": "1.0.0",
"com.unity.2d.tilemap": "1.0.0"
},
"url": "https://packages.unity.com"
},
"com.unity.2d.sprite": { "com.unity.2d.sprite": {
"version": "1.0.0", "version": "1.0.0",
"depth": 0, "depth": 0,
"source": "builtin", "source": "builtin",
"dependencies": {} "dependencies": {}
}, },
"com.unity.2d.tilemap": {
"version": "1.0.0",
"depth": 1,
"source": "builtin",
"dependencies": {
"com.unity.modules.tilemap": "1.0.0",
"com.unity.modules.uielements": "1.0.0"
}
},
"com.unity.ai.navigation": { "com.unity.ai.navigation": {
"version": "2.0.13", "version": "2.0.13",
"depth": 0, "depth": 0,
@ -106,7 +141,7 @@
}, },
"com.unity.mathematics": { "com.unity.mathematics": {
"version": "1.4.0", "version": "1.4.0",
"depth": 3, "depth": 2,
"source": "builtin", "source": "builtin",
"dependencies": {} "dependencies": {}
}, },