Build gameplay systems and service settings

Подробные изменения:
- Добавлены и доработаны модальные окна главного меню, сервисные настройки, шаблоны UI Toolkit и единый scene-flow сервис для переходов между сценами.
- Расширена gameplay-архитектура: сессия забега, HUD, спавн контента платформ, collectible-предметы, оборудование, хрупкие и движущиеся платформы.
- Добавлена база противников: типы спавна, патрулирование, процедурный спавнер, правила размещения через ScriptableObject-сложности и убийство врагов прыжком сверху.
- Исправлены смерть и respawn игрока, финальный GameOver, отскоки от врагов, пружин и boost-предметов, а также проход сквозь врагов при усиленном подъеме.
- Проведен рефакторинг взаимодействия систем: общий landing context, единые правила player-contact, NonLazy gameplay session, fail-fast installer и централизованный выбор точек спавна.
- Обновлены сцены, prefab-ассеты, difficulty stages, ресурсы главного меню, настройки проекта, roadmap и аппаратная COM-интеграция.
- Добавлены ассеты летучей мыши, врагов, collectibles, TextMesh Pro, ProjectContext и gameplay UI.

Проверки:
- dotnet build .\\Assembly-CSharp.csproj --no-restore
- Unity validation ключевых gameplay/UI/scene-flow скриптов
- Unity Console после force refresh без ошибок
This commit is contained in:
Данил Ярош 2026-05-27 16:34:51 +03:00
parent cefb2fd345
commit 1f6884c5ac
292 changed files with 81017 additions and 605 deletions

View File

@ -17,7 +17,7 @@
- `claude-explorer` следует предпочитать для изучения архитектуры, исходников, команд и внутренних инструментов Claude Code.
- `claude-rag` следует предпочитать для семантического поиска по проекту, анализа больших объёмов кода и ситуаций, где локальный индекс даёт преимущество над обычным текстовым поиском.
- Память о проекте, его договорённостях, архитектурных решениях, важных гайдах, кодовой базе и ранее выявленном контексте следует по возможности сохранять и повторно использовать через `claude-rag`.
- Кодовую базу проекта также следует по возможности индексировать и использовать через `claude-rag`, чтобы агент мог опираться на локальную семантическую память о структуре, модулях, связях и ранее изученных участках кода.
- Кодовую базу проекта также следует по возможности индексировать и использовать через `claude-rag`, чтобы агент мог опираться на локальную семантическую память о структуре, модулях, связях и ранее изученных участках кода.
- При повторяющихся задачах, исследовании крупных подсистем, возвращении к старым решениям, поиске проектного контекста и анализе существующей кодовой базы агенту следует сначала опираться на `claude-rag`, если для этого подходит локальный индекс.
- Если MCP-инструмент хуже подходит для конкретной задачи, недоступен или создаёт лишние ограничения, агент может использовать встроенные инструменты как запасной вариант.

View File

@ -15,7 +15,7 @@ MonoBehaviour:
m_DefaultGroup: 89fc1fb0b7336ca419f23062b0857137
m_currentHash:
serializedVersion: 2
Hash: f52a25da7976b11e0a29af72b2abf0c3
Hash: 4f891804dbd068047c1c49dbfdb37a72
m_OptimizeCatalogSize: 0
m_BuildRemoteCatalog: 0
m_CatalogRequestsTimeout: 0
@ -58,7 +58,7 @@ MonoBehaviour:
m_ContentStateBuildPathProfileVariableName:
m_CustomContentStateBuildPath:
m_ContentStateBuildPath:
m_BuildAddressablesWithPlayerBuild: 0
m_BuildAddressablesWithPlayerBuild: 1
m_overridePlayerVersion: '[UnityEditor.PlayerSettings.bundleVersion]'
m_GroupAssets:
- {fileID: 11400000, guid: a538a44e0a6ac93488028f109a2d8913, type: 2}
@ -111,6 +111,8 @@ MonoBehaviour:
- Locale
- Locale-ru
- Locale-en
- settings
- service
m_SchemaTemplates: []
m_GroupTemplateObjects:
- {fileID: 11400000, guid: 9c5c03b019376ac43b6730325a038195, type: 2}

View File

@ -14,7 +14,14 @@ MonoBehaviour:
m_EditorClassIdentifier: Unity.Addressables.Editor::UnityEditor.AddressableAssets.Settings.AddressableAssetGroup
m_GroupName: Default Local Group
m_GUID: 89fc1fb0b7336ca419f23062b0857137
m_SerializeEntries: []
m_SerializeEntries:
- m_GUID: 40905558cac5cdb4894f2f9b76c5f92e
m_Address: settings/service-settings-database
m_ReadOnly: 0
m_SerializedLabels:
- service
- settings
FlaggedDuringContentUpdateRestriction: 0
m_ReadOnly: 0
m_Settings: {fileID: 11400000, guid: 2ab5dad59ce41a7468cdf522a3e8755d, type: 2}
m_SchemaSet:

View File

@ -0,0 +1,28 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 7e3976da977cb49238499ea3b4c237ae, type: 3}
m_Name: ProfileDataSourceSettings
m_EditorClassIdentifier: Unity.Addressables.Editor::UnityEditor.AddressableAssets.Settings.ProfileDataSourceSettings
profileGroupTypes:
- m_GroupTypePrefix: Built-In
m_Variables:
- m_Suffix: BuildPath
m_Value: '[UnityEngine.AddressableAssets.Addressables.BuildPath]/[BuildTarget]'
- m_Suffix: LoadPath
m_Value: '{UnityEngine.AddressableAssets.Addressables.RuntimePath}/[BuildTarget]'
environments: []
currentEnvironment:
id:
projectId:
projectGenesisId:
name:
isDefault: 0

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 4846fae8984a95b449132820bb1b4b63
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

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

View File

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

View File

@ -0,0 +1,101 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1102 &-8396895325890622289
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: New Animation_Bat
m_Speed: 2
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 62ff08544e561a7418dded4606da6b55, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!91 &9100000
AnimatorController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Bat
serializedVersion: 5
m_AnimatorParameters: []
m_AnimatorLayers:
- serializedVersion: 5
m_Name: Base Layer
m_StateMachine: {fileID: 3455026678298623027}
m_Mask: {fileID: 0}
m_Motions: []
m_Behaviours: []
m_BlendingMode: 0
m_SyncedLayerIndex: -1
m_DefaultWeight: 0
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
--- !u!1107 &3455026678298623027
AnimatorStateMachine:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Base Layer
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: -8396895325890622289}
m_Position: {x: 440, y: 220, z: 0}
- serializedVersion: 1
m_State: {fileID: 5233408764562546203}
m_Position: {x: 235, y: 65, z: 0}
m_ChildStateMachines: []
m_AnyStateTransitions: []
m_EntryTransitions: []
m_StateMachineTransitions: {}
m_StateMachineBehaviours: []
m_AnyStatePosition: {x: 50, y: 20, z: 0}
m_EntryPosition: {x: 30, y: 140, z: 0}
m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: -8396895325890622289}
--- !u!1102 &5233408764562546203
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: New Animation_Bat 0
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 62ff08544e561a7418dded4606da6b55, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

@ -322,6 +322,9 @@ MonoBehaviour:
highQualityFiltering:
m_OverrideState: 1
m_Value: 0
filter:
m_OverrideState: 1
m_Value: 0
downscale:
m_OverrideState: 1
m_Value: 0

View File

@ -1,4 +1,5 @@
{
"version": 1,
"name": "InputSystem_Actions",
"maps": [
{
@ -501,7 +502,7 @@
"name": "Cancel",
"type": "Button",
"id": "15cef263-9014-4fd5-94d9-4e4a6234a6ef",
"expectedControlType": "Button",
"expectedControlType": "",
"processors": "",
"interactions": "",
"initialStateCheck": false
@ -568,6 +569,15 @@
"processors": "",
"interactions": "",
"initialStateCheck": false
},
{
"name": "Secret",
"type": "Button",
"id": "1f9d3187-9fdb-4228-a91b-26d8dc96e7d0",
"expectedControlType": "",
"processors": "",
"interactions": "",
"initialStateCheck": false
}
],
"bindings": [
@ -988,6 +998,17 @@
"action": "TrackedDeviceOrientation",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "4d76d233-1faa-47fe-8595-55c39fbe3552",
"path": "<Keyboard>/f6",
"interactions": "",
"processors": "",
"groups": "",
"action": "Secret",
"isComposite": false,
"isPartOfComposite": false
}
]
}

View File

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

View File

@ -0,0 +1,159 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &1649926752591026283
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3454048493872327249}
- component: {fileID: 3591721972395430666}
- component: {fileID: 9139793318294144304}
- component: {fileID: 6495022491269397702}
- component: {fileID: 8526854025431675824}
m_Layer: 0
m_Name: BounceBoostCollectible
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &3454048493872327249
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1649926752591026283}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!212 &3591721972395430666
SpriteRenderer:
serializedVersion: 2
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1649926752591026283}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 0
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 0
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: 10
m_MaskInteraction: 0
m_Sprite: {fileID: 21300000, guid: 341628d8840484648b84419110eeabfa, type: 3}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_FlipX: 0
m_FlipY: 0
m_DrawMode: 0
m_Size: {x: 0.59, y: 0.62}
m_AdaptiveModeThreshold: 0.5
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_SpriteSortPoint: 0
--- !u!58 &9139793318294144304
CircleCollider2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1649926752591026283}
m_Enabled: 1
serializedVersion: 3
m_Density: 1
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_ForceSendLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ForceReceiveLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ContactCaptureLayers:
serializedVersion: 2
m_Bits: 4294967295
m_CallbackLayers:
serializedVersion: 2
m_Bits: 4294967295
m_IsTrigger: 1
m_UsedByEffector: 0
m_CompositeOperation: 0
m_CompositeOrder: 0
m_Offset: {x: 0, y: 0}
m_Radius: 0.25
--- !u!114 &6495022491269397702
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1649926752591026283}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 45176cc3d2b0adf4592469063916cafe, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.BounceBoostCollectible
disableOnCollected: 1
bounceVelocity: 40
scoreValue: 5
--- !u!114 &8526854025431675824
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1649926752591026283}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 87915a1531f287e40b455801243acc45, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.PlatformSpawnedContent

View File

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

View File

@ -0,0 +1,192 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &7341068655679281185
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4026968076215623752}
- component: {fileID: 9140651947484360701}
- component: {fileID: 6853623286791460233}
- component: {fileID: 8462963241259200514}
m_Layer: 0
m_Name: CrystalCollectible
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &4026968076215623752
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7341068655679281185}
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: 8349381518911893225}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!70 &9140651947484360701
CapsuleCollider2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7341068655679281185}
m_Enabled: 1
serializedVersion: 3
m_Density: 1
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_ForceSendLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ForceReceiveLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ContactCaptureLayers:
serializedVersion: 2
m_Bits: 4294967295
m_CallbackLayers:
serializedVersion: 2
m_Bits: 4294967295
m_IsTrigger: 1
m_UsedByEffector: 0
m_CompositeOperation: 0
m_CompositeOrder: 0
m_Offset: {x: 0, y: 0}
m_Size: {x: 0.5, y: 0.75}
m_Direction: 0
--- !u!114 &6853623286791460233
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7341068655679281185}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: deb903e81ee443948b7397fcac22b117, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.CoinCollectible
disableOnCollected: 1
coinValue: 1
scoreValue: 1
--- !u!114 &8462963241259200514
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7341068655679281185}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 87915a1531f287e40b455801243acc45, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.PlatformSpawnedContent
--- !u!1 &9134611908005895849
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8349381518911893225}
- component: {fileID: 8296298383556791415}
m_Layer: 0
m_Name: Crystal
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &8349381518911893225
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9134611908005895849}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.2, y: 0.2, z: 0.2}
m_ConstrainProportionsScale: 1
m_Children: []
m_Father: {fileID: 4026968076215623752}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!212 &8296298383556791415
SpriteRenderer:
serializedVersion: 2
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9134611908005895849}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 0
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 0
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_Sprite: {fileID: 7479642271789056252, guid: d61b05f68855c484e824fc5acfb172a1, type: 3}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_FlipX: 0
m_FlipY: 0
m_DrawMode: 0
m_Size: {x: 1, y: 1}
m_AdaptiveModeThreshold: 0.5
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_SpriteSortPoint: 0

View File

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

View File

@ -0,0 +1,160 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &382672864354709237
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 384491279874040987}
- component: {fileID: 6170450325268674343}
- component: {fileID: 8596285276108703207}
- component: {fileID: 406616014793274496}
- component: {fileID: 7456204191848197440}
m_Layer: 0
m_Name: HeightLiftCollectible
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &384491279874040987
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 382672864354709237}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!212 &6170450325268674343
SpriteRenderer:
serializedVersion: 2
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 382672864354709237}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 0
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 0
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: 10
m_MaskInteraction: 0
m_Sprite: {fileID: 21300000, guid: 83d3aff135b0eba41879575691eb5bb8, type: 3}
m_Color: {r: 0.9622642, g: 0.34950158, b: 0.38523003, a: 1}
m_FlipX: 0
m_FlipY: 0
m_DrawMode: 0
m_Size: {x: 0.62, y: 0.65}
m_AdaptiveModeThreshold: 0.5
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_SpriteSortPoint: 0
--- !u!58 &8596285276108703207
CircleCollider2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 382672864354709237}
m_Enabled: 1
serializedVersion: 3
m_Density: 1
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_ForceSendLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ForceReceiveLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ContactCaptureLayers:
serializedVersion: 2
m_Bits: 4294967295
m_CallbackLayers:
serializedVersion: 2
m_Bits: 4294967295
m_IsTrigger: 1
m_UsedByEffector: 0
m_CompositeOperation: 0
m_CompositeOrder: 0
m_Offset: {x: 0, y: 0}
m_Radius: 0.27
--- !u!114 &406616014793274496
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 382672864354709237}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d6608696d5f177540b0f06b9cbb46826, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.HeightLiftCollectible
disableOnCollected: 1
liftSpeed: 40
liftHeight: 100
scoreValue: 10
--- !u!114 &7456204191848197440
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 382672864354709237}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 87915a1531f287e40b455801243acc45, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.PlatformSpawnedContent

View File

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

View File

@ -159,7 +159,9 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.OneWayPlatformCollider
player: {fileID: 0}
topBoundaryPadding: 0.02
topBoundaryPadding: 0
landingVelocityThreshold: 0.05
crossingGraceDistance: 0.8
--- !u!114 &2235637253677343842
MonoBehaviour:
m_ObjectHideFlags: 0
@ -253,8 +255,8 @@ SpriteRenderer:
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingLayerID: 1658682819
m_SortingLayer: -1
m_SortingOrder: 0
m_MaskInteraction: 0
m_Sprite: {fileID: -70544561768458129, guid: d440231d6f96217499ab62926952e2b3, type: 3}
@ -391,8 +393,8 @@ SpriteRenderer:
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingLayerID: 1658682819
m_SortingLayer: -1
m_SortingOrder: 0
m_MaskInteraction: 0
m_Sprite: {fileID: 8449129219236236317, guid: d440231d6f96217499ab62926952e2b3, type: 3}

View File

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

View File

@ -0,0 +1,339 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1001 &6060741554283226580
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: -8653719598885068355, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_Name
value: Bat
objectReference: {fileID: 0}
- target: {fileID: -7573160195067319704, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalRotation.w
value: 0.9657164
objectReference: {fileID: 0}
- target: {fileID: -7573160195067319704, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalRotation.x
value: -0
objectReference: {fileID: 0}
- target: {fileID: -7573160195067319704, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: -7573160195067319704, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalRotation.z
value: 0.25959963
objectReference: {fileID: 0}
- target: {fileID: -7573160195067319704, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 30.093
objectReference: {fileID: 0}
- target: {fileID: -7552582706839291426, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalScale.x
value: 0.1
objectReference: {fileID: 0}
- target: {fileID: -7552582706839291426, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalScale.y
value: 0.1
objectReference: {fileID: 0}
- target: {fileID: -7552582706839291426, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalScale.z
value: 0.1
objectReference: {fileID: 0}
- target: {fileID: -7552582706839291426, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalPosition.x
value: -0.8778173
objectReference: {fileID: 0}
- target: {fileID: -7552582706839291426, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalPosition.y
value: -6.702254
objectReference: {fileID: 0}
- target: {fileID: -7552582706839291426, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: -7552582706839291426, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: -7552582706839291426, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: -7552582706839291426, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: -7552582706839291426, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: -7552582706839291426, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: -7552582706839291426, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: -7552582706839291426, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: -7552582706839291426, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_ConstrainProportionsScale
value: 1
objectReference: {fileID: 0}
- target: {fileID: -7221020487405985688, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalRotation.w
value: 0.9978294
objectReference: {fileID: 0}
- target: {fileID: -7221020487405985688, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalRotation.x
value: -0
objectReference: {fileID: 0}
- target: {fileID: -7221020487405985688, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: -7221020487405985688, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalRotation.z
value: -0.06585223
objectReference: {fileID: 0}
- target: {fileID: -7221020487405985688, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: -7.552
objectReference: {fileID: 0}
- target: {fileID: -1914268060482745136, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalRotation.w
value: 0.9865411
objectReference: {fileID: 0}
- target: {fileID: -1914268060482745136, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalRotation.x
value: -0
objectReference: {fileID: 0}
- target: {fileID: -1914268060482745136, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: -1914268060482745136, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalRotation.z
value: -0.16351335
objectReference: {fileID: 0}
- target: {fileID: -1914268060482745136, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: -18.822
objectReference: {fileID: 0}
- target: {fileID: -103470509922460878, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalRotation.w
value: 0.93103963
objectReference: {fileID: 0}
- target: {fileID: -103470509922460878, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalRotation.x
value: -0
objectReference: {fileID: 0}
- target: {fileID: -103470509922460878, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: -103470509922460878, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalRotation.z
value: -0.36491826
objectReference: {fileID: 0}
- target: {fileID: -103470509922460878, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: -42.805
objectReference: {fileID: 0}
- target: {fileID: 2471920254983572574, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalRotation.w
value: 0.90787965
objectReference: {fileID: 0}
- target: {fileID: 2471920254983572574, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalRotation.x
value: -0
objectReference: {fileID: 0}
- target: {fileID: 2471920254983572574, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: 2471920254983572574, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalRotation.z
value: 0.4192309
objectReference: {fileID: 0}
- target: {fileID: 2471920254983572574, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 49.572
objectReference: {fileID: 0}
- target: {fileID: 7905440446968883676, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalRotation.w
value: 0.85633266
objectReference: {fileID: 0}
- target: {fileID: 7905440446968883676, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalRotation.x
value: -0
objectReference: {fileID: 0}
- target: {fileID: 7905440446968883676, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: 7905440446968883676, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalRotation.z
value: -0.5164246
objectReference: {fileID: 0}
- target: {fileID: 7905440446968883676, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: -62.185
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents:
- targetCorrespondingSourceObject: {fileID: -8653719598885068355, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
insertIndex: -1
addedObject: {fileID: 6616969598510582301}
- targetCorrespondingSourceObject: {fileID: -8653719598885068355, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
insertIndex: -1
addedObject: {fileID: 7030633707417827889}
- targetCorrespondingSourceObject: {fileID: -8653719598885068355, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
insertIndex: -1
addedObject: {fileID: 9214245330110399167}
- targetCorrespondingSourceObject: {fileID: -8653719598885068355, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
insertIndex: -1
addedObject: {fileID: 5029523047635980553}
m_SourcePrefab: {fileID: 4843985084834002234, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
--- !u!4 &4842427733413059594 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -7552582706839291426, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
m_PrefabInstance: {fileID: 6060741554283226580}
m_PrefabAsset: {fileID: 0}
--- !u!1 &6051671913546024041 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: -8653719598885068355, guid: 5e0dbc12e9f97e14cbad53fb747704c9, type: 3}
m_PrefabInstance: {fileID: 6060741554283226580}
m_PrefabAsset: {fileID: 0}
--- !u!95 &6616969598510582301
Animator:
serializedVersion: 7
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6051671913546024041}
m_Enabled: 1
m_Avatar: {fileID: 0}
m_Controller: {fileID: 9100000, guid: 3f4c71c00bf3d624cb0e59d388599684, type: 2}
m_CullingMode: 0
m_UpdateMode: 0
m_ApplyRootMotion: 0
m_LinearVelocityBlending: 0
m_StabilizeFeet: 0
m_AnimatePhysics: 0
m_WarningMessage:
m_HasTransformHierarchy: 1
m_AllowConstantClipSamplingOptimization: 1
m_KeepAnimatorStateOnDisable: 0
m_WriteDefaultValuesOnDisable: 0
--- !u!114 &7030633707417827889
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6051671913546024041}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: c29cff538c195c249b69c6f2236de67b, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.2D.Animation.Runtime::UnityEngine.U2D.Animation.SpriteLibrary
m_Library: []
m_SpriteLibraryAsset: {fileID: 7108339969198208228, guid: 303efce1e093b814d8980dc929aff8ed, type: 3}
--- !u!60 &9214245330110399167
PolygonCollider2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6051671913546024041}
m_Enabled: 1
serializedVersion: 3
m_Density: 1
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_ForceSendLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ForceReceiveLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ContactCaptureLayers:
serializedVersion: 2
m_Bits: 4294967295
m_CallbackLayers:
serializedVersion: 2
m_Bits: 4294967295
m_IsTrigger: 1
m_UsedByEffector: 0
m_CompositeOperation: 0
m_CompositeOrder: 0
m_Offset: {x: 0, y: 0}
m_SpriteTilingProperty:
border: {x: 0, y: 0, z: 0, w: 0}
pivot: {x: 0, y: 0}
oldSize: {x: 0, y: 0}
newSize: {x: 0, y: 0}
adaptiveTilingThreshold: 0
drawMode: 0
adaptiveTiling: 0
m_AutoTiling: 0
m_Points:
m_Paths:
- - {x: 5.2754264, y: 15.056673}
- {x: 2.2463593, y: 10.904937}
- {x: 2.055397, y: 10.063164}
- {x: 2.8733213, y: 7.463923}
- {x: 0.6368122, y: 8.815968}
- {x: -1.6915423, y: 7.731138}
- {x: -1.9680666, y: 5.7833405}
- {x: -3.9252276, y: 8.813034}
- {x: -10.103769, y: 9.624693}
- {x: -11.543783, y: 8.284389}
- {x: -6.7071548, y: 3.448938}
- {x: -2.083034, y: 1.3314323}
- {x: 3.1557622, y: 0.10868433}
- {x: 6.223524, y: 4.1325207}
- {x: 8.0000925, y: 8.740171}
- {x: 8.46353, y: 15.634463}
m_UseDelaunayMesh: 1
--- !u!114 &5029523047635980553
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6051671913546024041}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 605dc94842c31e540ae7a09b17007591, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.PatrolEnemy
spawnKind: 1
stompBounceVelocity: 17
stompScore: 10
stompTopTolerance: 0.2
stompMinimumHeightFactor: 0.55
localPatrolAxis: {x: 1, y: 0}
patrolDistance: 1.2
patrolSpeed: 1.4
flipWhenMovingBack: 1
visualFacesPositiveDirection: 0
visualRoot: {fileID: 4842427733413059594}

View File

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

View File

@ -0,0 +1,194 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &1911682497373903437
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8262002995828152749}
- component: {fileID: 5577005654857578664}
- component: {fileID: 3404602057596076165}
- component: {fileID: 1556031391106333805}
m_Layer: 0
m_Name: PatrolEnemy
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &8262002995828152749
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1911682497373903437}
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: 4866556234619625411}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!58 &5577005654857578664
CircleCollider2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1911682497373903437}
m_Enabled: 1
serializedVersion: 3
m_Density: 1
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_ForceSendLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ForceReceiveLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ContactCaptureLayers:
serializedVersion: 2
m_Bits: 4294967295
m_CallbackLayers:
serializedVersion: 2
m_Bits: 4294967295
m_IsTrigger: 1
m_UsedByEffector: 0
m_CompositeOperation: 0
m_CompositeOrder: 0
m_Offset: {x: 0, y: 0}
m_Radius: 0.38
--- !u!114 &3404602057596076165
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1911682497373903437}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 605dc94842c31e540ae7a09b17007591, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.PatrolEnemy
localPatrolAxis: {x: 1, y: 0}
patrolDistance: 1.2
patrolSpeed: 1.4
stompBounceVelocity: 17
stompScore: 10
stompTopTolerance: 0.2
--- !u!114 &1556031391106333805
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1911682497373903437}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 87915a1531f287e40b455801243acc45, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.PlatformSpawnedContent
--- !u!1 &6676621499933334337
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4866556234619625411}
- component: {fileID: 8366382549807975629}
m_Layer: 0
m_Name: Sprite
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &4866556234619625411
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6676621499933334337}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.2, y: 0.2, z: 0.2}
m_ConstrainProportionsScale: 1
m_Children: []
m_Father: {fileID: 8262002995828152749}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!212 &8366382549807975629
SpriteRenderer:
serializedVersion: 2
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6676621499933334337}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 0
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 0
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_Sprite: {fileID: -8781757214100938709, guid: dfda0581a0387f14fb9b79970fbe2478, type: 3}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_FlipX: 0
m_FlipY: 0
m_DrawMode: 0
m_Size: {x: 3.89, y: 3.05}
m_AdaptiveModeThreshold: 0.5
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_SpriteSortPoint: 0

View File

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

View File

@ -0,0 +1,157 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &6689162642216591743
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5085244689812310206}
- component: {fileID: 4464912994306914734}
- component: {fileID: 517635067233225658}
- component: {fileID: 7544208898612138932}
- component: {fileID: 5070194482802988398}
m_Layer: 0
m_Name: HazardEquipment
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &5085244689812310206
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6689162642216591743}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!212 &4464912994306914734
SpriteRenderer:
serializedVersion: 2
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6689162642216591743}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 0
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 0
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: 10
m_MaskInteraction: 0
m_Sprite: {fileID: 21300000, guid: 83d3aff135b0eba41879575691eb5bb8, type: 3}
m_Color: {r: 1, g: 0.35, b: 0.35, a: 1}
m_FlipX: 0
m_FlipY: 0
m_DrawMode: 0
m_Size: {x: 0.62, y: 0.65}
m_AdaptiveModeThreshold: 0.5
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_SpriteSortPoint: 0
--- !u!58 &517635067233225658
CircleCollider2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6689162642216591743}
m_Enabled: 1
serializedVersion: 3
m_Density: 1
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_ForceSendLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ForceReceiveLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ContactCaptureLayers:
serializedVersion: 2
m_Bits: 4294967295
m_CallbackLayers:
serializedVersion: 2
m_Bits: 4294967295
m_IsTrigger: 1
m_UsedByEffector: 0
m_CompositeOperation: 0
m_CompositeOrder: 0
m_Offset: {x: 0, y: 0}
m_Radius: 0.25
--- !u!114 &7544208898612138932
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6689162642216591743}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: cf34504aafe850849b76ddd3857f681b, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.HazardEquipment
activationCooldown: 0.2
--- !u!114 &5070194482802988398
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6689162642216591743}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 87915a1531f287e40b455801243acc45, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.PlatformSpawnedContent

View File

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

View File

@ -0,0 +1,160 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &6394508084590719524
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8225866807125319873}
- component: {fileID: 7400502600871487111}
- component: {fileID: 6910139583701154754}
- component: {fileID: 8861890666834832349}
- component: {fileID: 101100010298365801}
m_Layer: 0
m_Name: SpeedBoostEquipment
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &8225866807125319873
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6394508084590719524}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!212 &7400502600871487111
SpriteRenderer:
serializedVersion: 2
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6394508084590719524}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 0
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 0
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: 10
m_MaskInteraction: 0
m_Sprite: {fileID: 21300000, guid: 7414a1b979dd3124699a42c794a592d3, type: 3}
m_Color: {r: 0.5, g: 1, b: 1, a: 1}
m_FlipX: 0
m_FlipY: 0
m_DrawMode: 0
m_Size: {x: 0.62, y: 0.64}
m_AdaptiveModeThreshold: 0.5
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_SpriteSortPoint: 0
--- !u!58 &6910139583701154754
CircleCollider2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6394508084590719524}
m_Enabled: 1
serializedVersion: 3
m_Density: 1
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_ForceSendLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ForceReceiveLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ContactCaptureLayers:
serializedVersion: 2
m_Bits: 4294967295
m_CallbackLayers:
serializedVersion: 2
m_Bits: 4294967295
m_IsTrigger: 1
m_UsedByEffector: 0
m_CompositeOperation: 0
m_CompositeOrder: 0
m_Offset: {x: 0, y: 0}
m_Radius: 0.25
--- !u!114 &8861890666834832349
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6394508084590719524}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 747a5c8ca2dafe94babc0829532cf3b4, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.SpeedBoostEquipment
moveSpeedMultiplier: 1.45
duration: 3
bounceVelocity: 0
activationCooldown: 0.25
--- !u!114 &101100010298365801
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6394508084590719524}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 87915a1531f287e40b455801243acc45, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.PlatformSpawnedContent

View File

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

View File

@ -0,0 +1,694 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &964816656659499055
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1205885904080248378}
- component: {fileID: 3222511668002816921}
- component: {fileID: 390504419653235742}
- component: {fileID: 8258886993694919767}
- component: {fileID: 315965220548801040}
- component: {fileID: 2235637253677343842}
- component: {fileID: 310175300831842493}
m_Layer: 0
m_Name: FragilePlatform
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1205885904080248378
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 964816656659499055}
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: 6710763819495474449}
- {fileID: 1053927436537949408}
- {fileID: 2175820264372441907}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!50 &3222511668002816921
Rigidbody2D:
serializedVersion: 5
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 964816656659499055}
m_BodyType: 1
m_Simulated: 1
m_UseFullKinematicContacts: 0
m_UseAutoMass: 0
m_Mass: 1
m_LinearDamping: 0
m_AngularDamping: 0.05
m_GravityScale: 1
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_Interpolate: 0
m_SleepingMode: 1
m_CollisionDetection: 0
m_Constraints: 0
--- !u!66 &390504419653235742
CompositeCollider2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 964816656659499055}
m_Enabled: 1
serializedVersion: 3
m_Density: 1
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_ForceSendLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ForceReceiveLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ContactCaptureLayers:
serializedVersion: 2
m_Bits: 4294967295
m_CallbackLayers:
serializedVersion: 2
m_Bits: 4294967295
m_IsTrigger: 0
m_UsedByEffector: 0
m_CompositeOperation: 0
m_CompositeOrder: 0
m_Offset: {x: 0, y: 0}
m_GeometryType: 1
m_GenerationType: 0
m_EdgeRadius: 0
m_ColliderPaths:
- m_Collider: {fileID: 3218710261601004859}
m_ColliderPaths:
- - X: 5000000
Y: 5000000
- X: -5000000
Y: 5000000
- X: -5000000
Y: 0
- X: 5000000
Y: 0
- m_Collider: {fileID: 5554127825943555543}
m_ColliderPaths:
- - X: 15000000
Y: 5000000
- X: 5000000
Y: 5000000
- X: 5000000
Y: 0
- X: 15000000
Y: 0
m_CompositePaths:
m_Paths:
- - {x: 1.4999707, y: 0}
- {x: 1.4999707, y: 0.5}
- {x: -0.5, y: 0.4999707}
- {x: -0.4999707, y: 0}
m_VertexDistance: 0.0005
m_OffsetDistance: 0.00005
m_UseDelaunayMesh: 0
m_CompositeGameObject: {fileID: 964816656659499055}
--- !u!114 &8258886993694919767
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 964816656659499055}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 63a76cd9bb67ade47b92da08d5312f7a, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.JumpPlatform
--- !u!114 &315965220548801040
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 964816656659499055}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b7304af1773d2d841ac6233d76035ef1, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.OneWayPlatformCollider
player: {fileID: 0}
topBoundaryPadding: 0
landingVelocityThreshold: 0.05
crossingGraceDistance: 0.8
--- !u!114 &2235637253677343842
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 964816656659499055}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0a288dffeb6d69d4699ecd00e49b0f2c, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.PlatformController
collectibleSpawnPoints:
- {fileID: 8634086561103883683}
equipmentSpawnPoints:
- {fileID: 7063958560061733011}
enemySpawnPoints: []
--- !u!114 &310175300831842493
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 964816656659499055}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: de467f1f456b3c1409c4e51eca4911e2, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.FragilePlatformBehaviour
breakDelay: 0.08
suppressAutoJump: 0
disabledOnBreak: []
colliders: []
--- !u!1 &2372201055787281608
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2175820264372441907}
m_Layer: 0
m_Name: SpawnPoints
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &2175820264372441907
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2372201055787281608}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0.5, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 7296410561034137608}
- {fileID: 8232334407418952531}
m_Father: {fileID: 1205885904080248378}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &5077136950761168767
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2540267024819485677}
- component: {fileID: 1978967242000210638}
m_Layer: 0
m_Name: Square
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
--- !u!4 &2540267024819485677
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5077136950761168767}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.6, y: 0.6, z: 0.6}
m_ConstrainProportionsScale: 1
m_Children: []
m_Father: {fileID: 8232334407418952531}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!212 &1978967242000210638
SpriteRenderer:
serializedVersion: 2
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5077136950761168767}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 0
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 0
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_Sprite: {fileID: 21300000, guid: a7ea8ba2d9fa2eb42a0b8af96e11fc66, type: 3}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_FlipX: 0
m_FlipY: 0
m_DrawMode: 0
m_Size: {x: 1, y: 1}
m_AdaptiveModeThreshold: 0.5
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_SpriteSortPoint: 0
--- !u!1 &6543131293092626866
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1053927436537949408}
- component: {fileID: 1219762918678929400}
- component: {fileID: 5554127825943555543}
m_Layer: 0
m_Name: PlatformTile_2
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1053927436537949408
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6543131293092626866}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 1, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1205885904080248378}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!212 &1219762918678929400
SpriteRenderer:
serializedVersion: 2
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6543131293092626866}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 0
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 0
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 1658682819
m_SortingLayer: -1
m_SortingOrder: 0
m_MaskInteraction: 0
m_Sprite: {fileID: -70544561768458129, guid: d440231d6f96217499ab62926952e2b3, type: 3}
m_Color: {r: 0.8207547, g: 0.41424885, b: 0.41424885, a: 1}
m_FlipX: 0
m_FlipY: 0
m_DrawMode: 0
m_Size: {x: 1, y: 1}
m_AdaptiveModeThreshold: 0.5
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_SpriteSortPoint: 0
--- !u!61 &5554127825943555543
BoxCollider2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6543131293092626866}
m_Enabled: 1
serializedVersion: 3
m_Density: 1
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_ForceSendLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ForceReceiveLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ContactCaptureLayers:
serializedVersion: 2
m_Bits: 4294967295
m_CallbackLayers:
serializedVersion: 2
m_Bits: 4294967295
m_IsTrigger: 0
m_UsedByEffector: 0
m_CompositeOperation: 1
m_CompositeOrder: 0
m_Offset: {x: 0, y: 0.25}
m_SpriteTilingProperty:
border: {x: 0, y: 0, z: 0, w: 0}
pivot: {x: 0.5, y: 0.5}
oldSize: {x: 1, y: 1}
newSize: {x: 1, y: 1}
adaptiveTilingThreshold: 0.5
drawMode: 0
adaptiveTiling: 0
m_AutoTiling: 0
m_Size: {x: 1, y: 0.5}
m_EdgeRadius: 0
--- !u!1 &7236042952510876049
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8232334407418952531}
- component: {fileID: 7063958560061733011}
m_Layer: 0
m_Name: EqiupmentSpawnPoint
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &8232334407418952531
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7236042952510876049}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0.65, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 2540267024819485677}
m_Father: {fileID: 2175820264372441907}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &7063958560061733011
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7236042952510876049}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4b8997e854b32fc45b20a35799d85c67, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.PlatformSpawnPoint
kind: 1
optional: 0
weight: 1
--- !u!1 &7300961631766593696
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6710763819495474449}
- component: {fileID: 3849633677881264400}
- component: {fileID: 3218710261601004859}
m_Layer: 0
m_Name: PlatformTile
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &6710763819495474449
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7300961631766593696}
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: 1205885904080248378}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!212 &3849633677881264400
SpriteRenderer:
serializedVersion: 2
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7300961631766593696}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 0
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 0
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 1658682819
m_SortingLayer: -1
m_SortingOrder: 0
m_MaskInteraction: 0
m_Sprite: {fileID: 8449129219236236317, guid: d440231d6f96217499ab62926952e2b3, type: 3}
m_Color: {r: 0.8207547, g: 0.41424885, b: 0.41424885, a: 1}
m_FlipX: 0
m_FlipY: 0
m_DrawMode: 0
m_Size: {x: 1, y: 1}
m_AdaptiveModeThreshold: 0.5
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_SpriteSortPoint: 0
--- !u!61 &3218710261601004859
BoxCollider2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7300961631766593696}
m_Enabled: 1
serializedVersion: 3
m_Density: 1
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_ForceSendLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ForceReceiveLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ContactCaptureLayers:
serializedVersion: 2
m_Bits: 4294967295
m_CallbackLayers:
serializedVersion: 2
m_Bits: 4294967295
m_IsTrigger: 0
m_UsedByEffector: 0
m_CompositeOperation: 1
m_CompositeOrder: 0
m_Offset: {x: 0, y: 0.25}
m_SpriteTilingProperty:
border: {x: 0, y: 0, z: 0, w: 0}
pivot: {x: 0.5, y: 0.5}
oldSize: {x: 1, y: 1}
newSize: {x: 1, y: 1}
adaptiveTilingThreshold: 0.5
drawMode: 0
adaptiveTiling: 0
m_AutoTiling: 0
m_Size: {x: 1, y: 0.5}
m_EdgeRadius: 0
--- !u!1 &7729436994615948155
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7296410561034137608}
- component: {fileID: 8634086561103883683}
m_Layer: 0
m_Name: CollectibleSpawnPoint
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &7296410561034137608
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7729436994615948155}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 1.5, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 2175820264372441907}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &8634086561103883683
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7729436994615948155}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4b8997e854b32fc45b20a35799d85c67, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.PlatformSpawnPoint
kind: 0
optional: 1
weight: 1

View File

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

View File

@ -0,0 +1,743 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &964816656659499055
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1205885904080248378}
- component: {fileID: 3222511668002816921}
- component: {fileID: 390504419653235742}
- component: {fileID: 8258886993694919767}
- component: {fileID: 315965220548801040}
- component: {fileID: 2235637253677343842}
- component: {fileID: 2103314207307173484}
m_Layer: 0
m_Name: MovingPlatform
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1205885904080248378
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 964816656659499055}
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: 6710763819495474449}
- {fileID: 1053927436537949408}
- {fileID: 2175820264372441907}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!50 &3222511668002816921
Rigidbody2D:
serializedVersion: 5
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 964816656659499055}
m_BodyType: 1
m_Simulated: 1
m_UseFullKinematicContacts: 0
m_UseAutoMass: 0
m_Mass: 1
m_LinearDamping: 0
m_AngularDamping: 0.05
m_GravityScale: 1
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_Interpolate: 0
m_SleepingMode: 1
m_CollisionDetection: 0
m_Constraints: 0
--- !u!66 &390504419653235742
CompositeCollider2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 964816656659499055}
m_Enabled: 1
serializedVersion: 3
m_Density: 1
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_ForceSendLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ForceReceiveLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ContactCaptureLayers:
serializedVersion: 2
m_Bits: 4294967295
m_CallbackLayers:
serializedVersion: 2
m_Bits: 4294967295
m_IsTrigger: 0
m_UsedByEffector: 0
m_CompositeOperation: 0
m_CompositeOrder: 0
m_Offset: {x: 0, y: 0}
m_GeometryType: 1
m_GenerationType: 0
m_EdgeRadius: 0
m_ColliderPaths:
- m_Collider: {fileID: 3218710261601004859}
m_ColliderPaths:
- - X: 5000000
Y: 5000000
- X: -5000000
Y: 5000000
- X: -5000000
Y: 0
- X: 5000000
Y: 0
- m_Collider: {fileID: 5554127825943555543}
m_ColliderPaths:
- - X: 15000000
Y: 5000000
- X: 5000000
Y: 5000000
- X: 5000000
Y: 0
- X: 15000000
Y: 0
m_CompositePaths:
m_Paths:
- - {x: 1.4999707, y: 0}
- {x: 1.4999707, y: 0.5}
- {x: -0.5, y: 0.4999707}
- {x: -0.4999707, y: 0}
m_VertexDistance: 0.0005
m_OffsetDistance: 0.00005
m_UseDelaunayMesh: 0
m_CompositeGameObject: {fileID: 964816656659499055}
--- !u!114 &8258886993694919767
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 964816656659499055}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 63a76cd9bb67ade47b92da08d5312f7a, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.JumpPlatform
--- !u!114 &315965220548801040
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 964816656659499055}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b7304af1773d2d841ac6233d76035ef1, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.OneWayPlatformCollider
player: {fileID: 0}
topBoundaryPadding: 0
landingVelocityThreshold: 0.05
crossingGraceDistance: 0.8
--- !u!114 &2235637253677343842
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 964816656659499055}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0a288dffeb6d69d4699ecd00e49b0f2c, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.PlatformController
collectibleSpawnPoints:
- {fileID: 8634086561103883683}
equipmentSpawnPoints:
- {fileID: 7063958560061733011}
enemySpawnPoints:
- {fileID: 5305667757614428695}
--- !u!114 &2103314207307173484
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 964816656659499055}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2263840105d5eb34fb85ba6f13d89c65, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.MovingPlatformBehaviour
localMoveAxis: {x: 1, y: 0}
amplitude: 1.25
cycleDuration: 2.5
useSpawnIndexOffset: 1
--- !u!1 &2372201055787281608
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2175820264372441907}
m_Layer: 0
m_Name: SpawnPoints
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &2175820264372441907
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2372201055787281608}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0.5, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 7296410561034137608}
- {fileID: 8232334407418952531}
- {fileID: 6950890482960297564}
m_Father: {fileID: 1205885904080248378}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &5077136950761168767
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2540267024819485677}
- component: {fileID: 1978967242000210638}
m_Layer: 0
m_Name: Square
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
--- !u!4 &2540267024819485677
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5077136950761168767}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.6, y: 0.6, z: 0.6}
m_ConstrainProportionsScale: 1
m_Children: []
m_Father: {fileID: 8232334407418952531}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!212 &1978967242000210638
SpriteRenderer:
serializedVersion: 2
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5077136950761168767}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 0
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 0
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_Sprite: {fileID: 21300000, guid: a7ea8ba2d9fa2eb42a0b8af96e11fc66, type: 3}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_FlipX: 0
m_FlipY: 0
m_DrawMode: 0
m_Size: {x: 1, y: 1}
m_AdaptiveModeThreshold: 0.5
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_SpriteSortPoint: 0
--- !u!1 &6543131293092626866
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1053927436537949408}
- component: {fileID: 1219762918678929400}
- component: {fileID: 5554127825943555543}
m_Layer: 0
m_Name: PlatformTile_2
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1053927436537949408
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6543131293092626866}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 1, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1205885904080248378}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!212 &1219762918678929400
SpriteRenderer:
serializedVersion: 2
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6543131293092626866}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 0
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 0
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_Sprite: {fileID: -70544561768458129, guid: d440231d6f96217499ab62926952e2b3, type: 3}
m_Color: {r: 0.20496617, g: 0.5488127, b: 0.9245283, a: 1}
m_FlipX: 0
m_FlipY: 0
m_DrawMode: 0
m_Size: {x: 1, y: 1}
m_AdaptiveModeThreshold: 0.5
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_SpriteSortPoint: 0
--- !u!61 &5554127825943555543
BoxCollider2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6543131293092626866}
m_Enabled: 1
serializedVersion: 3
m_Density: 1
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_ForceSendLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ForceReceiveLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ContactCaptureLayers:
serializedVersion: 2
m_Bits: 4294967295
m_CallbackLayers:
serializedVersion: 2
m_Bits: 4294967295
m_IsTrigger: 0
m_UsedByEffector: 0
m_CompositeOperation: 1
m_CompositeOrder: 0
m_Offset: {x: 0, y: 0.25}
m_SpriteTilingProperty:
border: {x: 0, y: 0, z: 0, w: 0}
pivot: {x: 0.5, y: 0.5}
oldSize: {x: 1, y: 1}
newSize: {x: 1, y: 1}
adaptiveTilingThreshold: 0.5
drawMode: 0
adaptiveTiling: 0
m_AutoTiling: 0
m_Size: {x: 1, y: 0.5}
m_EdgeRadius: 0
--- !u!1 &7236042952510876049
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8232334407418952531}
- component: {fileID: 7063958560061733011}
m_Layer: 0
m_Name: EqiupmentSpawnPoint
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &8232334407418952531
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7236042952510876049}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0.65, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 2540267024819485677}
m_Father: {fileID: 2175820264372441907}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &7063958560061733011
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7236042952510876049}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4b8997e854b32fc45b20a35799d85c67, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.PlatformSpawnPoint
kind: 1
optional: 0
weight: 1
--- !u!1 &7300961631766593696
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6710763819495474449}
- component: {fileID: 3849633677881264400}
- component: {fileID: 3218710261601004859}
m_Layer: 0
m_Name: PlatformTile
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &6710763819495474449
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7300961631766593696}
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: 1205885904080248378}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!212 &3849633677881264400
SpriteRenderer:
serializedVersion: 2
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7300961631766593696}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 0
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 0
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_Sprite: {fileID: 8449129219236236317, guid: d440231d6f96217499ab62926952e2b3, type: 3}
m_Color: {r: 0.20496617, g: 0.5488127, b: 0.9245283, a: 1}
m_FlipX: 0
m_FlipY: 0
m_DrawMode: 0
m_Size: {x: 1, y: 1}
m_AdaptiveModeThreshold: 0.5
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_SpriteSortPoint: 0
--- !u!61 &3218710261601004859
BoxCollider2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7300961631766593696}
m_Enabled: 1
serializedVersion: 3
m_Density: 1
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_ForceSendLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ForceReceiveLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ContactCaptureLayers:
serializedVersion: 2
m_Bits: 4294967295
m_CallbackLayers:
serializedVersion: 2
m_Bits: 4294967295
m_IsTrigger: 0
m_UsedByEffector: 0
m_CompositeOperation: 1
m_CompositeOrder: 0
m_Offset: {x: 0, y: 0.25}
m_SpriteTilingProperty:
border: {x: 0, y: 0, z: 0, w: 0}
pivot: {x: 0.5, y: 0.5}
oldSize: {x: 1, y: 1}
newSize: {x: 1, y: 1}
adaptiveTilingThreshold: 0.5
drawMode: 0
adaptiveTiling: 0
m_AutoTiling: 0
m_Size: {x: 1, y: 0.5}
m_EdgeRadius: 0
--- !u!1 &7729436994615948155
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7296410561034137608}
- component: {fileID: 8634086561103883683}
m_Layer: 0
m_Name: CollectibleSpawnPoint
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &7296410561034137608
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7729436994615948155}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 1.5, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 2175820264372441907}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &8634086561103883683
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7729436994615948155}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4b8997e854b32fc45b20a35799d85c67, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.PlatformSpawnPoint
kind: 0
optional: 1
weight: 1
--- !u!1 &8846698754903096030
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6950890482960297564}
- component: {fileID: 5305667757614428695}
m_Layer: 0
m_Name: EnemySpawnPoint
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &6950890482960297564
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8846698754903096030}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 1.25, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 2175820264372441907}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &5305667757614428695
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8846698754903096030}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4b8997e854b32fc45b20a35799d85c67, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.PlatformSpawnPoint
kind: 2
optional: 0
weight: 1

View File

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

View File

@ -1837,7 +1837,7 @@ MonoBehaviour:
groundProbeDistance: 0.34
equipmentProbeHalfExtents: {x: 0.5, y: 0.35}
horizontalWrapPadding: 0.65
fallResetDistance: 5
fallResetDistance: 0.5
fallResetFromCameraBottom: 1
respawnViewportY: 0.28
centerRespawnX: 1

View File

@ -160,7 +160,9 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.OneWayPlatformCollider
player: {fileID: 0}
topBoundaryPadding: 0.02
topBoundaryPadding: 0
landingVelocityThreshold: 0.05
crossingGraceDistance: 0.8
--- !u!114 &2235637253677343842
MonoBehaviour:
m_ObjectHideFlags: 0
@ -204,7 +206,7 @@ Transform:
m_GameObject: {fileID: 2372201055787281608}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0.8688, y: 0.24718, z: 0}
m_LocalPosition: {x: 0.5, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
@ -382,8 +384,8 @@ SpriteRenderer:
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingLayerID: 1658682819
m_SortingLayer: -1
m_SortingOrder: 0
m_MaskInteraction: 0
m_Sprite: {fileID: -70544561768458129, guid: d440231d6f96217499ab62926952e2b3, type: 3}
@ -468,7 +470,7 @@ Transform:
m_GameObject: {fileID: 7236042952510876049}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -0.35, y: 0.43, z: 0}
m_LocalPosition: {x: 0, y: 0.65, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
@ -568,8 +570,8 @@ SpriteRenderer:
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingLayerID: 1658682819
m_SortingLayer: -1
m_SortingOrder: 0
m_MaskInteraction: 0
m_Sprite: {fileID: 8449129219236236317, guid: d440231d6f96217499ab62926952e2b3, type: 3}
@ -639,7 +641,7 @@ GameObject:
- component: {fileID: 7296410561034137608}
- component: {fileID: 8634086561103883683}
m_Layer: 0
m_Name: CollectibleSpanPoint
m_Name: CollectibleSpawnPoint
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@ -654,7 +656,7 @@ Transform:
m_GameObject: {fileID: 7729436994615948155}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0.5, z: 0}
m_LocalPosition: {x: 0, y: 1.5, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
@ -701,7 +703,7 @@ Transform:
m_GameObject: {fileID: 8846698754903096030}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -0.4, y: 0.43, z: 0}
m_LocalPosition: {x: 0, y: 1.25, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []

View File

@ -0,0 +1,83 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &1890352100173040858
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6987677732352224487}
- component: {fileID: 6104063899786295062}
- component: {fileID: 1793366000134005455}
m_Layer: 0
m_Name: ProjectContext
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &6987677732352224487
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1890352100173040858}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &6104063899786295062
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1890352100173040858}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a4e6589720da476459dc6dd71624b071, type: 3}
m_Name:
m_EditorClassIdentifier: Zenject::Zenject.ProjectContext
_scriptableObjectInstallers: []
_monoInstallers:
- {fileID: 1793366000134005455}
_installerPrefabs: []
_findSiblingMonoInstallers: 0
_parentNewObjectsUnderContext: 0
_editorReflectionBakingCoverageMode: 0
_buildsReflectionBakingCoverageMode: 0
_settings:
_ensureDeterministicDestructionOrderOnApplicationQuit: 0
_displayWarningWhenResolvingDuringInstall: 1
_validationRootResolveMethod: 0
_validationErrorResponse: 0
_constructorChoiceStrategy: 0
_signalSettings:
_defaultSyncMode: 0
_missingHandlerDefaultResponse: 2
_requireStrictUnsubscribe: 0
_defaultAsyncTickPriority: 1
--- !u!114 &1793366000134005455
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1890352100173040858}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 9aa54c60d21f3754a9bbead2e5c6875b, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Settings.ServiceSettingsInstaller
databaseAddress: settings/service-settings-database
fallbackDatabase: {fileID: 0}
fileName: service-settings.json
loadImmediately: 1
bindActionsInScene: 1

View File

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

8
Assets/Resources/UI.meta Normal file
View File

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

View File

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

View File

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

View File

@ -0,0 +1,6 @@
<ui:UXML xmlns:ui="UnityEngine.UIElements" editor-extension-mode="False">
<ui:Button name="SettingsBoolControlRoot" focusable="false" class="settings-control settings-bool-control" style="width: auto; min-height: 54px; padding-left: 0; padding-right: 0; padding-top: 0; padding-bottom: 0; border-left-width: 0; border-right-width: 0; border-top-width: 0; border-bottom-width: 0; flex-direction: row; align-items: center; justify-content: flex-start; background-color: rgba(255, 255, 255, 0); color: rgb(255, 255, 255); -unity-text-auto-size: best-fit 10px 100px; -unity-text-generator: advanced; margin-left: 4%; margin-top: 1%; margin-right: 2%; margin-bottom: 1%;">
<ui:Label name="SettingsControlTitle" text="Показывать номер поддержки" class="settings-name" style="width: 300px; min-width: 190px; margin-right: 22px; font-size: 20px; -unity-font-style: normal; white-space: normal; -unity-text-align: middle-left; color: rgb(255, 255, 255); -unity-text-generator: advanced; -unity-text-auto-size: best-fit 10px 28px; -unity-font-definition: url(&quot;project://database/Assets/Fonts/RifficFree-Bold.ttf?fileID=12800000&amp;guid=63991fec8a53abe4d9a7907ef7f0db77&amp;type=3#RifficFree-Bold&quot;);"/>
<ui:VisualElement name="SettingsBoolIndicator" class="settings-checkbox" style="width: 38px; height: 38px; min-width: 38px; min-height: 38px; border-left-width: 4px; border-right-width: 4px; border-top-width: 4px; border-bottom-width: 4px; border-left-color: rgb(255, 255, 255); border-right-color: rgb(255, 255, 255); border-top-color: rgb(255, 255, 255); border-bottom-color: rgb(255, 255, 255); background-color: rgba(255, 255, 255, 0);"/>
</ui:Button>
</ui:UXML>

View File

@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 2ac8a4d8759da50468703edffcdb63fb
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}

View File

@ -0,0 +1,7 @@
<ui:UXML xmlns:ui="UnityEngine.UIElements" editor-extension-mode="False">
<ui:VisualElement name="SettingsButtonControlRoot" class="settings-control settings-button-control" style="width: 350px; min-height: 70px; flex-direction: row; align-items: center; justify-content: flex-start; color: rgb(255, 255, 255);">
<ui:Button name="SettingsActionButton" text="Выполнить" focusable="false" class="settings-action-button" style="width: auto; min-width: 100%; height: auto; min-height: 70px; margin-left: 4%; padding-left: 15%; padding-right: 15%; padding-top: 0%; padding-bottom: 0%; border-left-width: 0; border-right-width: 0; border-top-width: 0; border-bottom-width: 0; font-size: 24px; -unity-font-style: normal; -unity-text-align: middle-center; color: rgb(84, 68, 174); background-color: rgba(255, 255, 255, 0); background-image: url(&quot;project://database/Assets/Sprites/UI/Components/plashka_central.png?fileID=-854326483344920349&amp;guid=347f2b50b8b847141848f1e1c06d59af&amp;type=3#plashka_central_0&quot;); -unity-background-scale-mode: stretch-to-fill; -unity-background-image-tint-color: rgb(255, 203, 72); -unity-text-generator: advanced; -unity-text-auto-size: best-fit 14px 28px; -unity-font-definition: url(&quot;project://database/Assets/Fonts/RifficFree-Bold.ttf?fileID=12800000&amp;guid=63991fec8a53abe4d9a7907ef7f0db77&amp;type=3#RifficFree-Bold&quot;); margin-top: 2%; margin-right: 2%; margin-bottom: 2%; -unity-slice-scale: 0.4px;">
<ui:Label name="SettingsControlTitle" text="Тест выдачи приза" class="settings-name" style="display: none; -unity-text-generator: advanced; -unity-text-auto-size: best-fit 10px 100px; font-size: 28px;"/>
</ui:Button>
</ui:VisualElement>
</ui:UXML>

View File

@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 3dc41f4dd71944f4a84b73b3617d0187
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}

View File

@ -0,0 +1,6 @@
<ui:UXML xmlns:ui="UnityEngine.UIElements" editor-extension-mode="False">
<ui:Button name="SettingsGroupHeaderRoot" focusable="true" class="settings-group-title settings-focus-target" style="width: auto; height: 70px; min-height: 70px; margin-top: 4%; margin-bottom: 2%; padding-left: 6%; padding-right: 31%; padding-top: 0; padding-bottom: 0; border-left-width: 0; border-right-width: 0; border-top-width: 0; border-bottom-width: 0; flex-direction: row; align-items: center; justify-content: space-between; background-image: url(&quot;project://database/Assets/Sprites/UI/Components/icon_1.png?fileID=8218771907821357143&amp;guid=dd3ae1d0db6319e48abc746c0d56666c&amp;type=3#icon_1_0&quot;); -unity-background-image-tint-color: rgb(255, 255, 255); -unity-background-scale-mode: stretch-to-fill; background-color: rgba(255, 255, 255, 0); color: rgb(84, 68, 174); margin-right: 1%; margin-left: 1%; -unity-text-generator: advanced; -unity-text-auto-size: best-fit 10px 100px; -unity-slice-scale: 0.5px;">
<ui:Label name="SettingsGroupTitle" text="ГРУППА" class="settings-group-label" style="flex-grow: 1; font-size: 28px; -unity-font-style: normal; -unity-text-align: middle-left; color: rgb(84, 68, 174); -unity-font-definition: url(&quot;project://database/Assets/Fonts/RifficFree-Bold.ttf?fileID=12800000&amp;guid=63991fec8a53abe4d9a7907ef7f0db77&amp;type=3#RifficFree-Bold&quot;);"/>
<ui:Label name="SettingsGroupDisclosure" text="▼" class="settings-group-disclosure" style="display: none;"/>
</ui:Button>
</ui:UXML>

View File

@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 8bdc16de0a8def84884149599b00c65f
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}

View File

@ -0,0 +1,10 @@
<ui:UXML xmlns:ui="UnityEngine.UIElements" editor-extension-mode="False">
<ui:VisualElement name="SettingsStepperControlRoot" class="settings-control settings-stepper" style="width: auto; min-height: 54px; flex-direction: row; align-items: center; justify-content: flex-start; color: rgb(255, 255, 255); margin-left: 4%; margin-bottom: 1%; margin-right: 2%; margin-top: 1%;">
<ui:Label name="SettingsControlTitle" text="Громкость музыки" class="settings-name" style="width: 300px; min-width: 190px; margin-right: 12px; font-size: 20px; -unity-font-style: normal; white-space: normal; -unity-text-align: middle-left; color: rgb(255, 255, 255); -unity-text-generator: advanced; -unity-text-auto-size: best-fit 10px 28px; -unity-font-definition: url(&quot;project://database/Assets/Fonts/RifficFree-Bold.ttf?fileID=12800000&amp;guid=63991fec8a53abe4d9a7907ef7f0db77&amp;type=3#RifficFree-Bold&quot;);"/>
<ui:VisualElement name="SettingsStepperValueContainer" class="settings-stepper-value" style="width: 218px; min-width: 218px; height: 54px; flex-direction: row; align-items: center; justify-content: center;">
<ui:Button name="SettingsStepperPreviousButton" text="◀" focusable="false" class="settings-arrow-button" style="width: 48px; height: 54px; min-width: 48px; border-left-width: 0; border-right-width: 0; border-top-width: 0; border-bottom-width: 0; font-size: 28px; color: rgb(255, 255, 255); background-color: rgba(255, 255, 255, 0);"/>
<ui:Label name="SettingsStepperValueLabel" text="0%" class="settings-value-label" style="width: 122px; height: 54px; font-size: 30px; -unity-font-style: normal; -unity-text-align: middle-center; color: rgb(255, 255, 255); -unity-text-generator: advanced; -unity-text-auto-size: best-fit 16px 30px; -unity-font-definition: url(&quot;project://database/Assets/Fonts/RifficFree-Bold.ttf?fileID=12800000&amp;guid=63991fec8a53abe4d9a7907ef7f0db77&amp;type=3#RifficFree-Bold&quot;);"/>
<ui:Button name="SettingsStepperNextButton" text="▶" focusable="false" class="settings-arrow-button" style="width: 48px; height: 54px; min-width: 48px; border-left-width: 0; border-right-width: 0; border-top-width: 0; border-bottom-width: 0; font-size: 28px; color: rgb(255, 255, 255); background-color: rgba(255, 255, 255, 0);"/>
</ui:VisualElement>
</ui:VisualElement>
</ui:UXML>

View File

@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: c12ecb9297b1a4a45a32d3913894fb87
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}

View File

@ -0,0 +1,6 @@
<ui:UXML xmlns:ui="UnityEngine.UIElements" editor-extension-mode="False">
<ui:VisualElement name="SettingsTextControlRoot" class="settings-control settings-text-control" style="width: auto; min-height: 54px; flex-direction: row; align-items: center; justify-content: flex-start; color: rgb(255, 255, 255); margin-top: 1%; margin-right: 2%; margin-bottom: 1%; margin-left: 4%;">
<ui:Label name="SettingsControlTitle" text="Номер поддержки" class="settings-name" style="width: 300px; min-width: 190px; margin-right: 16px; font-size: 20px; -unity-font-style: normal; white-space: normal; -unity-text-align: middle-left; color: rgb(255, 255, 255); -unity-text-generator: advanced; -unity-text-auto-size: best-fit 10px 28px; -unity-font-definition: url(&quot;project://database/Assets/Fonts/RifficFree-Bold.ttf?fileID=12800000&amp;guid=63991fec8a53abe4d9a7907ef7f0db77&amp;type=3#RifficFree-Bold&quot;);"/>
<ui:TextField name="SettingsTextField" value="+79999999999" class="settings-text-field" style="width: 220px; min-width: 220px; min-height: 46px; font-size: 20px; color: rgb(84, 68, 174); -unity-text-generator: advanced; -unity-text-auto-size: best-fit 12px 22px;"/>
</ui:VisualElement>
</ui:UXML>

View File

@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 94d66c77f966ace46af48ae1bfdc3b67
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}

View File

@ -161,6 +161,7 @@ GameObject:
m_Component:
- component: {fileID: 344459309}
- component: {fileID: 344459308}
- component: {fileID: 344459310}
m_Layer: 0
m_Name: Platform Spawner
m_TagString: Untagged
@ -184,7 +185,8 @@ MonoBehaviour:
horizontalPadding: 0.85
recycleDistanceBelowCameraBottom: 12
useHardwareRandomSeed: 1
randomSeed: 1207
randomSeed: 1
proceduralEnemySpawner: {fileID: 344459310}
--- !u!4 &344459309
Transform:
m_ObjectHideFlags: 0
@ -200,6 +202,83 @@ Transform:
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &344459310
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 344459307}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 47ed0f3875f8ad348bdfdce600932c12, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.ProceduralEnemySpawner
initialSpawnY: 8
verticalStep: 12
maxAliveEnemies: 8
spawnAttempts: 12
horizontalPadding: 0.85
verticalJitter: 1.5
fallbackEnemyHalfExtents: {x: 0.55, y: 0.55}
platformClearance: {x: 0.15, y: 0.15}
blockingMask:
serializedVersion: 2
m_Bits: 4294967295
--- !u!1 &624463940
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 624463943}
- component: {fileID: 624463941}
m_Layer: 0
m_Name: Gameplay HUD
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &624463941
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 624463940}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f64c7f029e315df4e80ec13942c0a85e, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.UI.Gameplay.GameplayHudController
visualTreeAsset: {fileID: 9197481963319205126, guid: e5019473f4474704f8a8e8c93608eafc, type: 3}
panelSettings: {fileID: 11400000, guid: d0960c9338bdb86469da533ffbbbc1fb, type: 2}
sortingOrder: 10
scoreLabelName: ScoreValue
heightLabelName: HeightValue
bestHeightLabelName: BestHeightValue
livesLabelName: LivesValue
coinsLabelName: CoinsValue
deathsLabelName: DeathsValue
stateLabelName: StateValue
--- !u!4 &624463943
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 624463940}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &973362138
GameObject:
m_ObjectHideFlags: 0
@ -310,6 +389,85 @@ PrefabInstance:
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: d705af614a982e74bba9e2a3b697f565, type: 3}
--- !u!1 &1693654372
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1693654375}
- component: {fileID: 1693654374}
- component: {fileID: 1693654373}
m_Layer: 0
m_Name: EventSystem
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &1693654373
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1693654372}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 01614664b831546d2ae94a42149d80ac, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.InputSystem::UnityEngine.InputSystem.UI.InputSystemUIInputModule
m_SendPointerHoverToParent: 1
m_MoveRepeatDelay: 0.5
m_MoveRepeatRate: 0.1
m_XRTrackingOrigin: {fileID: 0}
m_ActionsAsset: {fileID: -944628639613478452, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3}
m_PointAction: {fileID: -1654692200621890270, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3}
m_MoveAction: {fileID: -8784545083839296357, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3}
m_SubmitAction: {fileID: 392368643174621059, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3}
m_CancelAction: {fileID: 7727032971491509709, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3}
m_LeftClickAction: {fileID: 3001919216989983466, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3}
m_MiddleClickAction: {fileID: -2185481485913320682, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3}
m_RightClickAction: {fileID: -4090225696740746782, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3}
m_ScrollWheelAction: {fileID: 6240969308177333660, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3}
m_TrackedDevicePositionAction: {fileID: 6564999863303420839, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3}
m_TrackedDeviceOrientationAction: {fileID: 7970375526676320489, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3}
m_DeselectOnBackgroundClick: 1
m_PointerBehavior: 0
m_CursorLockBehavior: 0
m_ScrollDeltaPerTick: 6
--- !u!114 &1693654374
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1693654372}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.EventSystems.EventSystem
m_FirstSelected: {fileID: 0}
m_sendNavigationEvents: 1
m_DragThreshold: 10
--- !u!4 &1693654375
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1693654372}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!4 &1740411098 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 7172431620267875091, guid: d705af614a982e74bba9e2a3b697f565, type: 3}
@ -557,8 +715,8 @@ SpriteRenderer:
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingLayerID: -876065631
m_SortingLayer: -2
m_SortingOrder: -200
m_MaskInteraction: 0
m_Sprite: {fileID: 21300000, guid: cf6b76e72a39f144aab3928a6d6f71ad, type: 3}
@ -709,11 +867,15 @@ MonoBehaviour:
groundProbeStartOffset: 0.08
groundProbeDistance: 0.34
equipmentProbeHalfExtents: {x: 0.5, y: 0.35}
sweptLandingProbeHalfExtents: {x: 0.48, y: 0.08}
sweptLandingExtraDistance: 0.18
collisionDetectionMode: 1
horizontalWrapPadding: 0.65
fallResetDistance: 5
fallResetDistance: 0.5
fallResetFromCameraBottom: 1
respawnViewportY: 0.28
centerRespawnX: 1
deathRespawnDelay: 0.35
animator: {fileID: 0}
visualRoot: {fileID: 0}
visualRootName: Body
@ -854,3 +1016,5 @@ SceneRoots:
- {fileID: 344459309}
- {fileID: 1998332553}
- {fileID: 973362140}
- {fileID: 624463943}
- {fileID: 1693654375}

View File

@ -222,7 +222,7 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3}
m_Name:
m_Name:
m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Runtime::UnityEngine.Rendering.Universal.UniversalAdditionalCameraData
m_RenderShadows: 1
m_RequiresDepthTextureOption: 2
@ -256,6 +256,127 @@ MonoBehaviour:
m_VarianceClampScale: 0.9
m_ContrastAdaptiveSharpening: 0
m_Version: 2
--- !u!1 &8222466
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8222469}
- component: {fileID: 8222468}
- component: {fileID: 8222467}
m_Layer: 0
m_Name: EventSystem
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &8222467
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8222466}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 01614664b831546d2ae94a42149d80ac, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.InputSystem::UnityEngine.InputSystem.UI.InputSystemUIInputModule
m_SendPointerHoverToParent: 1
m_MoveRepeatDelay: 0.5
m_MoveRepeatRate: 0.1
m_XRTrackingOrigin: {fileID: 0}
m_ActionsAsset: {fileID: -944628639613478452, guid: 2bcd2660ca9b64942af0de543d8d7100, type: 3}
m_PointAction: {fileID: 1932080467}
m_MoveAction: {fileID: 2130237725}
m_SubmitAction: {fileID: 1037422209}
m_CancelAction: {fileID: 491707281}
m_LeftClickAction: {fileID: 589680430}
m_MiddleClickAction: {fileID: 647806552}
m_RightClickAction: {fileID: 953355540}
m_ScrollWheelAction: {fileID: 1409131790}
m_TrackedDevicePositionAction: {fileID: 1014446460}
m_TrackedDeviceOrientationAction: {fileID: 2034036131}
m_DeselectOnBackgroundClick: 1
m_PointerBehavior: 0
m_CursorLockBehavior: 0
m_ScrollDeltaPerTick: 6
--- !u!114 &8222468
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8222466}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.EventSystems.EventSystem
m_FirstSelected: {fileID: 0}
m_sendNavigationEvents: 1
m_DragThreshold: 10
--- !u!4 &8222469
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8222466}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &491707281
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fc1515ab76e54f068e2f2207940fab32, type: 3}
m_Name: UI/Cancel
m_EditorClassIdentifier: Unity.InputSystem::UnityEngine.InputSystem.InputActionReference
m_Asset: {fileID: -944628639613478452, guid: 2bcd2660ca9b64942af0de543d8d7100, type: 3}
m_ActionId: 15cef263-9014-4fd5-94d9-4e4a6234a6ef
--- !u!114 &589680430
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fc1515ab76e54f068e2f2207940fab32, type: 3}
m_Name: UI/Click
m_EditorClassIdentifier: Unity.InputSystem::UnityEngine.InputSystem.InputActionReference
m_Asset: {fileID: -944628639613478452, guid: 2bcd2660ca9b64942af0de543d8d7100, type: 3}
m_ActionId: 3c7022bf-7922-4f7c-a998-c437916075ad
--- !u!114 &647806552
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fc1515ab76e54f068e2f2207940fab32, type: 3}
m_Name: UI/MiddleClick
m_EditorClassIdentifier: Unity.InputSystem::UnityEngine.InputSystem.InputActionReference
m_Asset: {fileID: -944628639613478452, guid: 2bcd2660ca9b64942af0de543d8d7100, type: 3}
m_ActionId: dad70c86-b58c-4b17-88ad-f5e53adf419e
--- !u!1 &653892269
GameObject:
m_ObjectHideFlags: 0
@ -340,9 +461,9 @@ Transform:
m_GameObject: {fileID: 653892269}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 9.5, y: 0, z: 0}
m_LocalScale: {x: 5.4, y: 9.6, z: 1}
m_ConstrainProportionsScale: 0
m_LocalPosition: {x: 12, y: 0, z: 0}
m_LocalScale: {x: 10.8, y: 19.2, z: 2}
m_ConstrainProportionsScale: 1
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@ -378,6 +499,11 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.UI.MainMenu.MainMenuController
gameplaySceneName: Game
settingsSceneName:
defaultFocusedButtonName: RulesButton
normalButtonImageTint: {r: 1, g: 1, b: 1, a: 1}
focusedButtonImageTint: {r: 0.80784315, g: 1, b: 0.101960786, a: 1}
secretActionReference: {fileID: 7552203824317127043, guid: 2bcd2660ca9b64942af0de543d8d7100, type: 3}
legacyInputActionsAsset: {fileID: -944628639613478452, guid: 2bcd2660ca9b64942af0de543d8d7100, type: 3}
--- !u!114 &916321582
MonoBehaviour:
m_ObjectHideFlags: 0
@ -416,6 +542,104 @@ Transform:
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &953355540
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fc1515ab76e54f068e2f2207940fab32, type: 3}
m_Name: UI/RightClick
m_EditorClassIdentifier: Unity.InputSystem::UnityEngine.InputSystem.InputActionReference
m_Asset: {fileID: -944628639613478452, guid: 2bcd2660ca9b64942af0de543d8d7100, type: 3}
m_ActionId: 44b200b1-1557-4083-816c-b22cbdf77ddf
--- !u!114 &1014446460
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fc1515ab76e54f068e2f2207940fab32, type: 3}
m_Name: UI/TrackedDevicePosition
m_EditorClassIdentifier: Unity.InputSystem::UnityEngine.InputSystem.InputActionReference
m_Asset: {fileID: -944628639613478452, guid: 2bcd2660ca9b64942af0de543d8d7100, type: 3}
m_ActionId: 24908448-c609-4bc3-a128-ea258674378a
--- !u!114 &1037422209
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fc1515ab76e54f068e2f2207940fab32, type: 3}
m_Name: UI/Submit
m_EditorClassIdentifier: Unity.InputSystem::UnityEngine.InputSystem.InputActionReference
m_Asset: {fileID: -944628639613478452, guid: 2bcd2660ca9b64942af0de543d8d7100, type: 3}
m_ActionId: 7607c7b6-cd76-4816-beef-bd0341cfe950
--- !u!114 &1409131790
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fc1515ab76e54f068e2f2207940fab32, type: 3}
m_Name: UI/ScrollWheel
m_EditorClassIdentifier: Unity.InputSystem::UnityEngine.InputSystem.InputActionReference
m_Asset: {fileID: -944628639613478452, guid: 2bcd2660ca9b64942af0de543d8d7100, type: 3}
m_ActionId: 0489e84a-4833-4c40-bfae-cea84b696689
--- !u!114 &1932080467
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fc1515ab76e54f068e2f2207940fab32, type: 3}
m_Name: UI/Point
m_EditorClassIdentifier: Unity.InputSystem::UnityEngine.InputSystem.InputActionReference
m_Asset: {fileID: -944628639613478452, guid: 2bcd2660ca9b64942af0de543d8d7100, type: 3}
m_ActionId: 32b35790-4ed0-4e9a-aa41-69ac6d629449
--- !u!114 &2034036131
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fc1515ab76e54f068e2f2207940fab32, type: 3}
m_Name: UI/TrackedDeviceOrientation
m_EditorClassIdentifier: Unity.InputSystem::UnityEngine.InputSystem.InputActionReference
m_Asset: {fileID: -944628639613478452, guid: 2bcd2660ca9b64942af0de543d8d7100, type: 3}
m_ActionId: 9caa3d8a-6b2f-4e8e-8bad-6ede561bd9be
--- !u!114 &2130237725
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fc1515ab76e54f068e2f2207940fab32, type: 3}
m_Name: UI/Navigate
m_EditorClassIdentifier: Unity.InputSystem::UnityEngine.InputSystem.InputActionReference
m_Asset: {fileID: -944628639613478452, guid: 2bcd2660ca9b64942af0de543d8d7100, type: 3}
m_ActionId: c95b2375-e6d9-4b88-9c4c-c5e76515df4b
--- !u!1660057539 &9223372036854775807
SceneRoots:
m_ObjectHideFlags: 0
@ -423,3 +647,4 @@ SceneRoots:
- {fileID: 200001}
- {fileID: 916321583}
- {fileID: 653892272}
- {fileID: 8222469}

8
Assets/Screenshots.meta Normal file
View File

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

View File

@ -14,13 +14,17 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.GameplayDifficultyStage
stageName: "\u042D\u043A\u0441\u0442\u0440\u0435\u043C\u0430\u043B\u044C\u043D\u044B\u0439
\u044D\u0442\u0430\u043F"
startY: 800
startY: 650
verticalLength: 200
horizontalDistribution: 0.65
platforms:
platforms:
- prefab: {fileID: 964816656659499055, guid: b314e5b810bdbd841824f4b5d47bdd92, type: 3}
weight: 1
- prefab: {fileID: 964816656659499055, guid: 15b31b8e5d8677545b1ce2c8f700f901, type: 3}
weight: 0.55
- prefab: {fileID: 964816656659499055, guid: fa1b0ae89608c924e92657d291389138, type: 3}
weight: 0.35
verticalSpacingCurve:
serializedVersion: 2
m_Curve:
@ -76,9 +80,11 @@ MonoBehaviour:
m_PostInfinity: 2
m_RotationOrder: 4
initialSpawnChance: 0.5
maximumSpawnChance: 0.75
maximumSpawnChance: 0.78
enemies:
prefabs: []
prefabs:
- prefab: {fileID: 6051671913546024041, guid: dc382d4fdc981aa439af1624e230f11f, type: 3}
weight: 1
spawnChanceCurve:
serializedVersion: 2
m_Curve:
@ -103,10 +109,14 @@ MonoBehaviour:
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
initialSpawnChance: 0
maximumSpawnChance: 0
initialSpawnChance: 0.13
maximumSpawnChance: 0.3
collectibles:
prefabs: []
prefabs:
- prefab: {fileID: 7341068655679281185, guid: 9987915360f9bf740bc0939e23db9349, type: 3}
weight: 1
- prefab: {fileID: 1649926752591026283, guid: 42ac5c9fb765781449b1a8cdc5bd3d64, type: 3}
weight: 0.35
spawnChanceCurve:
serializedVersion: 2
m_Curve:
@ -131,5 +141,5 @@ MonoBehaviour:
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
initialSpawnChance: 0
maximumSpawnChance: 0
initialSpawnChance: 0.3
maximumSpawnChance: 0.62

View File

@ -13,13 +13,17 @@ MonoBehaviour:
m_Name: HardStage
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.GameplayDifficultyStage
stageName: "\u0421\u043B\u043E\u0436\u043D\u044B\u0439 \u044D\u0442\u0430\u043F"
startY: 600
startY: 450
verticalLength: 200
horizontalDistribution: 0.6
platforms:
platforms:
- prefab: {fileID: 964816656659499055, guid: b314e5b810bdbd841824f4b5d47bdd92, type: 3}
weight: 1
- prefab: {fileID: 964816656659499055, guid: 15b31b8e5d8677545b1ce2c8f700f901, type: 3}
weight: 0.55
- prefab: {fileID: 964816656659499055, guid: fa1b0ae89608c924e92657d291389138, type: 3}
weight: 0.35
verticalSpacingCurve:
serializedVersion: 2
m_Curve:
@ -75,9 +79,11 @@ MonoBehaviour:
m_PostInfinity: 2
m_RotationOrder: 4
initialSpawnChance: 0.5
maximumSpawnChance: 0.5
maximumSpawnChance: 0.68
enemies:
prefabs: []
prefabs:
- prefab: {fileID: 6051671913546024041, guid: dc382d4fdc981aa439af1624e230f11f, type: 3}
weight: 1
spawnChanceCurve:
serializedVersion: 2
m_Curve:
@ -102,10 +108,14 @@ MonoBehaviour:
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
initialSpawnChance: 0
maximumSpawnChance: 0
initialSpawnChance: 0.09
maximumSpawnChance: 0.22
collectibles:
prefabs: []
prefabs:
- prefab: {fileID: 7341068655679281185, guid: 9987915360f9bf740bc0939e23db9349, type: 3}
weight: 1
- prefab: {fileID: 1649926752591026283, guid: 42ac5c9fb765781449b1a8cdc5bd3d64, type: 3}
weight: 0.35
spawnChanceCurve:
serializedVersion: 2
m_Curve:
@ -130,5 +140,5 @@ MonoBehaviour:
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
initialSpawnChance: 0
maximumSpawnChance: 0
initialSpawnChance: 0.25
maximumSpawnChance: 0.55

View File

@ -14,13 +14,15 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.GameplayDifficultyStage
stageName: "\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u044B\u0439
\u044D\u0442\u0430\u043F"
startY: 800
startY: 850
verticalLength: 200
horizontalDistribution: 0.8
platforms:
platforms:
- prefab: {fileID: 964816656659499055, guid: b314e5b810bdbd841824f4b5d47bdd92, type: 3}
weight: 1
- prefab: {fileID: 964816656659499055, guid: 15b31b8e5d8677545b1ce2c8f700f901, type: 3}
weight: 0.55
verticalSpacingCurve:
serializedVersion: 2
m_Curve:
@ -45,7 +47,7 @@ MonoBehaviour:
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
initialVerticalSpacing: 18
initialVerticalSpacing: 16
maximumVerticalSpacing: 18
equipment:
prefabs:
@ -78,7 +80,9 @@ MonoBehaviour:
initialSpawnChance: 1
maximumSpawnChance: 1
enemies:
prefabs: []
prefabs:
- prefab: {fileID: 6051671913546024041, guid: dc382d4fdc981aa439af1624e230f11f, type: 3}
weight: 1
spawnChanceCurve:
serializedVersion: 2
m_Curve:
@ -103,10 +107,14 @@ MonoBehaviour:
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
initialSpawnChance: 0
maximumSpawnChance: 0
initialSpawnChance: 0.18
maximumSpawnChance: 0.38
collectibles:
prefabs: []
prefabs:
- prefab: {fileID: 7341068655679281185, guid: 9987915360f9bf740bc0939e23db9349, type: 3}
weight: 1
- prefab: {fileID: 1649926752591026283, guid: 42ac5c9fb765781449b1a8cdc5bd3d64, type: 3}
weight: 0.35
spawnChanceCurve:
serializedVersion: 2
m_Curve:
@ -131,5 +139,5 @@ MonoBehaviour:
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
initialSpawnChance: 0
maximumSpawnChance: 0
initialSpawnChance: 0.35
maximumSpawnChance: 0.68

View File

@ -14,7 +14,7 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.GameplayDifficultyStage
stageName: "\u041D\u0430\u0447\u0430\u043B\u044C\u043D\u044B\u0439 \u044D\u0442\u0430\u043F"
startY: -3.25
verticalLength: 203.25
verticalLength: 53.25
horizontalDistribution: 0
platforms:
platforms:
@ -57,9 +57,9 @@ MonoBehaviour:
m_Curve:
- serializedVersion: 3
time: 0
value: 0
value: 1
inSlope: 0
outSlope: 1
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
@ -67,17 +67,17 @@ MonoBehaviour:
- serializedVersion: 3
time: 1
value: 1
inSlope: 1
outSlope: 0
inSlope: -0
outSlope: -0
tangentMode: 0
weightedMode: 0
inWeight: 0
inWeight: 0.2916667
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
initialSpawnChance: 0.2
maximumSpawnChance: 0.75
initialSpawnChance: 1
maximumSpawnChance: 1
enemies:
prefabs: []
spawnChanceCurve:

View File

@ -13,13 +13,17 @@ MonoBehaviour:
m_Name: NormalStage
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.GameplayDifficultyStage
stageName: "\u041D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u044D\u0442\u0430\u043F"
startY: 400
startY: 250
verticalLength: 200
horizontalDistribution: 0.5
platforms:
platforms:
- prefab: {fileID: 964816656659499055, guid: b314e5b810bdbd841824f4b5d47bdd92, type: 3}
weight: 1
- prefab: {fileID: 964816656659499055, guid: 15b31b8e5d8677545b1ce2c8f700f901, type: 3}
weight: 0.55
- prefab: {fileID: 964816656659499055, guid: fa1b0ae89608c924e92657d291389138, type: 3}
weight: 0.35
verticalSpacingCurve:
serializedVersion: 2
m_Curve:
@ -77,7 +81,9 @@ MonoBehaviour:
initialSpawnChance: 0.5
maximumSpawnChance: 0.85
enemies:
prefabs: []
prefabs:
- prefab: {fileID: 6051671913546024041, guid: dc382d4fdc981aa439af1624e230f11f, type: 3}
weight: 1
spawnChanceCurve:
serializedVersion: 2
m_Curve:
@ -102,10 +108,14 @@ MonoBehaviour:
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
initialSpawnChance: 0
maximumSpawnChance: 0
initialSpawnChance: 0.05
maximumSpawnChance: 0.14
collectibles:
prefabs: []
prefabs:
- prefab: {fileID: 7341068655679281185, guid: 9987915360f9bf740bc0939e23db9349, type: 3}
weight: 1
- prefab: {fileID: 1649926752591026283, guid: 42ac5c9fb765781449b1a8cdc5bd3d64, type: 3}
weight: 0.35
spawnChanceCurve:
serializedVersion: 2
m_Curve:
@ -130,5 +140,5 @@ MonoBehaviour:
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
initialSpawnChance: 0
maximumSpawnChance: 0
initialSpawnChance: 0.22
maximumSpawnChance: 0.45

View File

@ -13,13 +13,15 @@ MonoBehaviour:
m_Name: SimpleStage
m_EditorClassIdentifier: Assembly-CSharp::DanroJump.Gameplay.GameplayDifficultyStage
stageName: "\u041F\u0440\u043E\u0441\u0442\u043E\u0439 \u044D\u0442\u0430\u043F"
startY: 200
startY: 50
verticalLength: 200
horizontalDistribution: 0
platforms:
platforms:
- prefab: {fileID: 964816656659499055, guid: b314e5b810bdbd841824f4b5d47bdd92, type: 3}
weight: 1
- prefab: {fileID: 964816656659499055, guid: fa1b0ae89608c924e92657d291389138, type: 3}
weight: 0.35
verticalSpacingCurve:
serializedVersion: 2
m_Curve:
@ -77,7 +79,9 @@ MonoBehaviour:
initialSpawnChance: 0.3
maximumSpawnChance: 0.75
enemies:
prefabs: []
prefabs:
- prefab: {fileID: 0}
weight: 1
spawnChanceCurve:
serializedVersion: 2
m_Curve:
@ -102,10 +106,16 @@ MonoBehaviour:
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
initialSpawnChance: 0
maximumSpawnChance: 0
initialSpawnChance: 0.02
maximumSpawnChance: 0.08
collectibles:
prefabs: []
prefabs:
- prefab: {fileID: 7341068655679281185, guid: 9987915360f9bf740bc0939e23db9349, type: 3}
weight: 1
- prefab: {fileID: 1649926752591026283, guid: 42ac5c9fb765781449b1a8cdc5bd3d64, type: 3}
weight: 0.35
- prefab: {fileID: 382672864354709237, guid: 23063041ef8ecb449b37527f2279534f, type: 3}
weight: 0.35
spawnChanceCurve:
serializedVersion: 2
m_Curve:
@ -130,5 +140,5 @@ MonoBehaviour:
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
initialSpawnChance: 0
maximumSpawnChance: 0
initialSpawnChance: 0.18
maximumSpawnChance: 0.35

View File

@ -4,8 +4,14 @@ using UnityEngine;
namespace DanroJump.Editor.Gameplay
{
/// <summary>
/// Editor-окно для быстрой проверки текущего этапа сложности и прогресса генерации.
/// </summary>
public sealed class GameplayProgressionOverlayWindow : EditorWindow
{
/// <summary>
/// Открывает overlay-окно прогрессии из меню Unity.
/// </summary>
[MenuItem("Window/Danro Jump/Gameplay Progression Overlay")]
public static void Open()
{
@ -14,16 +20,25 @@ namespace DanroJump.Editor.Gameplay
window.Show();
}
/// <summary>
/// Подписывается на editor update, чтобы overlay обновлялся без ручного Repaint.
/// </summary>
private void OnEnable()
{
EditorApplication.update += Repaint;
}
/// <summary>
/// Снимает подписку на editor update при закрытии окна.
/// </summary>
private void OnDisable()
{
EditorApplication.update -= Repaint;
}
/// <summary>
/// Рисует актуальные данные сцены без ручной привязки к конкретному объекту.
/// </summary>
private void OnGUI()
{
var progression = FindFirstObjectByType<GameplayDifficultyProgression>();
@ -32,6 +47,9 @@ namespace DanroJump.Editor.Gameplay
}
}
/// <summary>
/// Добавляет компактный preview прогрессии прямо в инспектор GameplayDifficultyProgression.
/// </summary>
[CustomEditor(typeof(GameplayDifficultyProgression))]
public sealed class GameplayDifficultyProgressionEditor : UnityEditor.Editor
{
@ -46,8 +64,14 @@ namespace DanroJump.Editor.Gameplay
}
}
/// <summary>
/// Общий IMGUI-рендерер для отдельного окна и встроенного блока в инспекторе.
/// </summary>
internal static class GameplayProgressionOverlayGui
{
/// <summary>
/// Рисует состояние этапа игрока и этапа генерации платформ.
/// </summary>
public static void Draw(GameplayDifficultyProgression progression, PlatformSpawner spawner, bool showHeader)
{
if (showHeader)
@ -83,6 +107,9 @@ namespace DanroJump.Editor.Gameplay
$"Generation Y: {spawner.CurrentGenerationY:0.##} | Distribution: {spawner.CurrentPlatformDistribution:0.##}");
}
/// <summary>
/// Рисует одну карточку этапа с числовым прогрессом и progress bar.
/// </summary>
private static void DrawStageBlock(string title, string stageName, float progress, string subtitle)
{
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
@ -101,6 +128,9 @@ namespace DanroJump.Editor.Gameplay
EditorGUILayout.EndVertical();
}
/// <summary>
/// Возвращает подсказку о том, из какого режима редактора сейчас читаются данные.
/// </summary>
private static string GetPlayModeHint()
{
return EditorApplication.isPlaying ? "Play Mode: данные обновляются runtime-логикой" : "Edit Mode: данные рассчитаны по текущим ссылкам сцены";

View File

@ -5,11 +5,70 @@ using UnityEngine.SceneManagement;
namespace DanroJump.Bootstrap
{
/// <summary>
/// Первая точка входа приложения: фиксирует портретное соотношение сторон и загружает главное меню.
/// </summary>
[DefaultExecutionOrder(-10000)]
public sealed class BootstrapEntryPoint : MonoBehaviour
{
[SerializeField] private string mainMenuSceneName = "MainMenu";
private const float AspectTolerance = 0.0025f;
private static BootstrapEntryPoint instance;
[SerializeField] private string mainMenuSceneName = "MainMenu";
[SerializeField] private bool forceBuildAspectRatio = true;
[SerializeField] [Min(1)] private int targetAspectWidth = 9;
[SerializeField] [Min(1)] private int targetAspectHeight = 16;
[SerializeField] [Min(1)] private int preferredPortraitHeight = 1920;
[SerializeField] private bool clampToDisplaySize = true;
[SerializeField] private FullScreenMode buildFullScreenMode = FullScreenMode.Windowed;
[SerializeField] [Min(1)] private int startupEnforcementFrames = 8;
[SerializeField] [Min(0.1f)] private float aspectCheckInterval = 0.5f;
private float nextAspectCheckTime;
/// <summary>
/// Создает singleton bootstrap-объект и применяет разрешение билда до загрузки меню.
/// </summary>
private void Awake()
{
if (instance != null && instance != this)
{
Destroy(gameObject);
return;
}
instance = this;
DontDestroyOnLoad(gameObject);
// В редакторе не вмешиваемся в Game View, а в билде принудительно держим 9:16.
if (!Application.isEditor && forceBuildAspectRatio)
{
ApplyBuildAspectResolution();
StartCoroutine(EnforceBuildAspectOnStartup());
}
}
/// <summary>
/// Периодически возвращает разрешение к целевому aspect ratio, если окно было изменено.
/// </summary>
private void Update()
{
if (Application.isEditor || !forceBuildAspectRatio || Time.unscaledTime < nextAspectCheckTime)
{
return;
}
nextAspectCheckTime = Time.unscaledTime + aspectCheckInterval;
if (!HasTargetAspectRatio(Screen.width, Screen.height))
{
ApplyBuildAspectResolution();
}
}
/// <summary>
/// Загружает сцену главного меню после bootstrap-настройки.
/// </summary>
private IEnumerator Start()
{
if (string.IsNullOrWhiteSpace(mainMenuSceneName))
@ -35,6 +94,95 @@ namespace DanroJump.Bootstrap
yield return null;
}
/// <summary>
/// Очищает singleton-ссылку при выходе из Play Mode или уничтожении bootstrap-объекта.
/// </summary>
private void OnDestroy()
{
if (instance == this)
{
instance = null;
}
}
/// <summary>
/// Несколько кадров подряд повторяет установку разрешения, пока Unity завершает старт окна.
/// </summary>
private IEnumerator EnforceBuildAspectOnStartup()
{
for (int i = 0; i < startupEnforcementFrames; i++)
{
if (!HasTargetAspectRatio(Screen.width, Screen.height))
{
ApplyBuildAspectResolution();
}
yield return null;
}
}
/// <summary>
/// Применяет рассчитанное разрешение к окну игры.
/// </summary>
private void ApplyBuildAspectResolution()
{
Vector2Int resolution = CalculateTargetResolution();
Screen.SetResolution(resolution.x, resolution.y, buildFullScreenMode);
}
/// <summary>
/// Рассчитывает целевое портретное разрешение с ограничением по размеру основного дисплея.
/// </summary>
private Vector2Int CalculateTargetResolution()
{
int height = Mathf.Max(1, preferredPortraitHeight);
int width = Mathf.Max(1, Mathf.RoundToInt(height * GetTargetAspect()));
if (clampToDisplaySize && Display.main != null)
{
int displayWidth = Display.main.systemWidth;
int displayHeight = Display.main.systemHeight;
if (displayHeight > 0 && height > displayHeight)
{
height = displayHeight;
width = Mathf.Max(1, Mathf.RoundToInt(height * GetTargetAspect()));
}
if (displayWidth > 0 && width > displayWidth)
{
width = displayWidth;
height = Mathf.Max(1, Mathf.RoundToInt(width / GetTargetAspect()));
}
}
return new Vector2Int(width, height);
}
/// <summary>
/// Проверяет, совпадает ли текущее разрешение с целевым соотношением сторон.
/// </summary>
private bool HasTargetAspectRatio(int width, int height)
{
if (width <= 0 || height <= 0)
{
return false;
}
return Mathf.Abs(width / (float)height - GetTargetAspect()) <= AspectTolerance;
}
/// <summary>
/// Возвращает целевой aspect ratio из настроек ширины и высоты.
/// </summary>
private float GetTargetAspect()
{
return targetAspectWidth / (float)targetAspectHeight;
}
/// <summary>
/// Проверяет, добавлена ли сцена в Build Settings.
/// </summary>
private static bool SceneExistsInBuildSettings(string sceneName)
{
for (int i = 0; i < SceneManager.sceneCountInBuildSettings; i++)

View File

@ -0,0 +1,33 @@
using UnityEngine;
namespace DanroJump.Gameplay
{
/// <summary>
/// Collectible, который дает игроку усиленный вертикальный отскок и очки.
/// </summary>
public sealed class BounceBoostCollectible : CollectibleBase
{
[SerializeField] [Min(0f)] private float bounceVelocity = 24f;
[SerializeField] [Min(0)] private int scoreValue = 5;
private GameplaySession session;
/// <summary>
/// Получает игровую сессию для начисления очков.
/// </summary>
[Zenject.Inject]
public void Construct(GameplaySession injectedSession)
{
session = injectedSession;
}
/// <summary>
/// Применяет усиленный прыжок и награду за подбор.
/// </summary>
protected override void OnCollected(JumpPlayerController player)
{
player.BounceWithEnemyPassThrough(bounceVelocity);
session?.AddScore(scoreValue);
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 45176cc3d2b0adf4592469063916cafe

View File

@ -0,0 +1,33 @@
using UnityEngine;
namespace DanroJump.Gameplay
{
/// <summary>
/// Collectible монеты, который увеличивает счетчик монет и очки сессии.
/// </summary>
public sealed class CoinCollectible : CollectibleBase
{
[SerializeField] [Min(1)] private int coinValue = 1;
[SerializeField] [Min(0)] private int scoreValue = 1;
private GameplaySession session;
/// <summary>
/// Получает игровую сессию для записи награды.
/// </summary>
[Zenject.Inject]
public void Construct(GameplaySession injectedSession)
{
session = injectedSession;
}
/// <summary>
/// Начисляет монеты и очки после подбора.
/// </summary>
protected override void OnCollected(JumpPlayerController player)
{
session?.AddCoins(coinValue);
session?.AddScore(scoreValue);
}
}
}

View File

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

View File

@ -2,13 +2,22 @@ using UnityEngine;
namespace DanroJump.Gameplay
{
/// <summary>
/// Базовый класс collectible-предметов с trigger-контактом и защитой от повторного подбора.
/// </summary>
[RequireComponent(typeof(Collider2D))]
public abstract class CollectibleBase : MonoBehaviour, ICollectible, IPlayerContactHandler
{
[SerializeField] private bool disableOnCollected = true;
/// <summary>
/// Показывает, был ли предмет уже подобран в текущем цикле жизни объекта.
/// </summary>
public bool IsCollected { get; private set; }
/// <summary>
/// В редакторе автоматически переводит коллайдер предмета в trigger.
/// </summary>
protected virtual void Reset()
{
if (TryGetComponent(out Collider2D collectibleCollider))
@ -17,27 +26,39 @@ namespace DanroJump.Gameplay
}
}
/// <summary>
/// При переиспользовании prefab сбрасывает состояние подбора.
/// </summary>
protected virtual void OnEnable()
{
IsCollected = false;
}
/// <summary>
/// Реагирует на вход игрока в trigger-зону предмета.
/// </summary>
private void OnTriggerEnter2D(Collider2D other)
{
if (other.TryGetComponent(out JumpPlayerController player))
if (PlayerContactUtility.TryGetAlivePlayer(other, out var player))
{
HandlePlayerContact(player, this);
}
}
/// <summary>
/// Обрабатывает контакт через общий интерфейс игровых объектов.
/// </summary>
public void HandlePlayerContact(JumpPlayerController player, Component source)
{
Collect(player);
}
/// <summary>
/// Применяет эффект предмета и при необходимости выключает объект.
/// </summary>
public void Collect(JumpPlayerController player)
{
if (IsCollected || player == null)
if (IsCollected || player == null || player.IsDead)
{
return;
}
@ -51,6 +72,9 @@ namespace DanroJump.Gameplay
}
}
/// <summary>
/// Точка расширения для конкретного эффекта collectible.
/// </summary>
protected virtual void OnCollected(JumpPlayerController player)
{
}

View File

@ -0,0 +1,34 @@
using UnityEngine;
namespace DanroJump.Gameplay
{
/// <summary>
/// Collectible, который временно поднимает игрока вверх с заданной скоростью.
/// </summary>
public sealed class HeightLiftCollectible : CollectibleBase
{
[SerializeField] [Min(0f)] private float liftSpeed = 18f;
[SerializeField] [Min(0f)] private float liftHeight = 12f;
[SerializeField] [Min(0)] private int scoreValue = 8;
private GameplaySession session;
/// <summary>
/// Получает игровую сессию для начисления очков.
/// </summary>
[Zenject.Inject]
public void Construct(GameplaySession injectedSession)
{
session = injectedSession;
}
/// <summary>
/// Запускает плавный подъем игрока и начисляет награду.
/// </summary>
protected override void OnCollected(JumpPlayerController player)
{
player.ApplyHeightLift(liftSpeed, liftHeight);
session?.AddScore(scoreValue);
}
}
}

View File

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

View File

@ -1,9 +1,18 @@
namespace DanroJump.Gameplay
{
/// <summary>
/// Общий контракт подбираемого предмета.
/// </summary>
public interface ICollectible
{
/// <summary>
/// True, если предмет уже был подобран текущим игроком.
/// </summary>
bool IsCollected { get; }
/// <summary>
/// Применяет эффект предмета к игроку.
/// </summary>
void Collect(JumpPlayerController player);
}
}

View File

@ -2,8 +2,14 @@ using UnityEngine;
namespace DanroJump.Gameplay
{
/// <summary>
/// Контракт объектов, которые реагируют на контакт с игроком.
/// </summary>
public interface IPlayerContactHandler
{
/// <summary>
/// Обрабатывает контакт игрока с источником события.
/// </summary>
void HandlePlayerContact(JumpPlayerController player, Component source);
}
}

View File

@ -2,15 +2,35 @@ using UnityEngine;
namespace DanroJump.Gameplay
{
/// <summary>
/// Collectible, который начисляет только очки.
/// </summary>
public sealed class ScoreCollectible : CollectibleBase
{
[SerializeField] private int scoreValue = 1;
private GameplaySession session;
/// <summary>
/// Количество очков, начисляемое при подборе.
/// </summary>
public int Value => scoreValue;
/// <summary>
/// Получает игровую сессию для начисления очков.
/// </summary>
[Zenject.Inject]
public void Construct(GameplaySession injectedSession)
{
session = injectedSession;
}
/// <summary>
/// Добавляет очки в текущую сессию после подбора.
/// </summary>
protected override void OnCollected(JumpPlayerController player)
{
Debug.Log($"{nameof(ScoreCollectible)} collected for {scoreValue} points.", this);
session?.AddScore(scoreValue);
}
}
}

View File

@ -2,52 +2,167 @@ using UnityEngine;
namespace DanroJump.Gameplay
{
/// <summary>
/// Базовый класс противника с обработкой trigger- и collision-контакта с игроком.
/// </summary>
[RequireComponent(typeof(Collider2D))]
public abstract class EnemyBase : MonoBehaviour, IEnemy, IPlayerContactHandler
{
[SerializeField] private EnemySpawnKind spawnKind = EnemySpawnKind.GroundedOnly;
[SerializeField] [Min(0)] private int stompScore = 10;
[SerializeField] private float stompTopTolerance = 0.2f;
[SerializeField] [Range(0f, 1f)] private float stompMinimumHeightFactor = 0.55f;
private GameplaySession session;
private Collider2D enemyCollider;
/// <summary>
/// Тип мест, где этот prefab врага разрешено создавать.
/// </summary>
public EnemySpawnKind SpawnKind => spawnKind;
/// <summary>
/// True, если врага можно создавать на точках платформ.
/// </summary>
public bool CanSpawnOnPlatform => spawnKind == EnemySpawnKind.GroundedOnly || spawnKind == EnemySpawnKind.Universal;
/// <summary>
/// True, если врага можно создавать процедурно в поле, отдельно от платформ.
/// </summary>
public bool CanSpawnProcedurally => spawnKind == EnemySpawnKind.FlyingOnly || spawnKind == EnemySpawnKind.Universal;
/// <summary>
/// True, если противник сейчас должен реагировать на игрока.
/// </summary>
public bool IsActive { get; private set; }
/// <summary>
/// Получает игровую сессию для начисления очков за stomp.
/// </summary>
[Zenject.Inject]
public void Construct(GameplaySession injectedSession)
{
session = injectedSession;
}
/// <summary>
/// Активирует противника при включении объекта.
/// </summary>
protected virtual void OnEnable()
{
ActivateEnemy();
}
/// <summary>
/// Деактивирует противника при выключении объекта.
/// </summary>
protected virtual void OnDisable()
{
DeactivateEnemy();
}
/// <summary>
/// Передает trigger-контакт с игроком в конкретную реализацию.
/// </summary>
private void OnTriggerEnter2D(Collider2D other)
{
if (other.TryGetComponent(out JumpPlayerController player))
if (PlayerContactUtility.TryGetAlivePlayer(other, out var player))
{
HandlePlayerContact(player, this);
}
}
/// <summary>
/// Передает физическое столкновение с игроком в конкретную реализацию.
/// </summary>
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.collider.TryGetComponent(out JumpPlayerController player))
if (PlayerContactUtility.TryGetAlivePlayer(collision.collider, out var player))
{
HandlePlayerContact(player, this);
}
}
/// <summary>
/// Включает противника.
/// </summary>
public virtual void ActivateEnemy()
{
IsActive = true;
}
/// <summary>
/// Выключает противника.
/// </summary>
public virtual void DeactivateEnemy()
{
IsActive = false;
}
/// <summary>
/// Сбрасывает противника к активному состоянию.
/// </summary>
public virtual void ResetEnemy()
{
ActivateEnemy();
}
public abstract void HandlePlayerContact(JumpPlayerController player, Component source);
/// <summary>
/// Обрабатывает stomp сверху или убивает игрока при обычном контакте.
/// </summary>
public virtual void HandlePlayerContact(JumpPlayerController player, Component source)
{
if (!IsActive || player == null)
{
return;
}
if (player.TryIgnoreEnemy(this))
{
return;
}
if (IsStomp(player))
{
HandleStomp(player);
return;
}
player.Kill();
}
/// <summary>
/// Реакция врага на успешное уничтожение прыжком сверху.
/// </summary>
protected virtual void HandleStomp(JumpPlayerController player)
{
session?.AddScore(stompScore);
player.Bounce(player.AutoJumpVelocity);
DeactivateEnemy();
gameObject.SetActive(false);
}
/// <summary>
/// Проверяет, что игрок падает и его GroundCheck находится выше верхней части противника.
/// </summary>
protected virtual bool IsStomp(JumpPlayerController player)
{
enemyCollider ??= GetComponent<Collider2D>();
var bounds = enemyCollider != null
? enemyCollider.bounds
: new Bounds(transform.position, Vector3.one);
var groundCheck = player.GroundCheckPosition;
var isAboveEnemyHorizontally =
groundCheck.x >= bounds.min.x - stompTopTolerance &&
groundCheck.x <= bounds.max.x + stompTopTolerance;
var stompLineY = Mathf.Lerp(bounds.min.y, bounds.max.y, stompMinimumHeightFactor);
var isInUpperZone =
groundCheck.y >= stompLineY - stompTopTolerance ||
player.PreviousGroundCheckY >= bounds.max.y - stompTopTolerance;
return player.VerticalVelocity <= 0.05f &&
isAboveEnemyHorizontally &&
isInUpperZone;
}
}
}

View File

@ -0,0 +1,35 @@
using UnityEngine;
namespace DanroJump.Gameplay
{
/// <summary>
/// Проверяет, в каких контекстах разрешено создавать enemy-prefab.
/// </summary>
public static class EnemyPrefabRules
{
/// <summary>
/// True, если prefab можно создать на платформенной точке.
/// </summary>
public static bool CanSpawnOnPlatform(GameObject prefab)
{
return TryGetEnemy(prefab, out var enemy) && enemy.CanSpawnOnPlatform;
}
/// <summary>
/// True, если prefab можно создать процедурно в свободном поле.
/// </summary>
public static bool CanSpawnProcedurally(GameObject prefab)
{
return TryGetEnemy(prefab, out var enemy) && enemy.CanSpawnProcedurally;
}
/// <summary>
/// Получает базовый enemy-компонент из prefab.
/// </summary>
public static bool TryGetEnemy(GameObject prefab, out EnemyBase enemy)
{
enemy = prefab != null ? prefab.GetComponentInChildren<EnemyBase>(true) : null;
return enemy != null;
}
}
}

View File

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

View File

@ -0,0 +1,23 @@
namespace DanroJump.Gameplay
{
/// <summary>
/// Описывает, в каких местах допустимо создавать врага.
/// </summary>
public enum EnemySpawnKind
{
/// <summary>
/// Враг живет на платформе и не должен появляться в воздухе сам по себе.
/// </summary>
GroundedOnly = 0,
/// <summary>
/// Враг появляется только в свободном поле, отдельно от платформ.
/// </summary>
FlyingOnly = 1,
/// <summary>
/// Враг подходит и для платформенного, и для процедурного полевого спавна.
/// </summary>
Universal = 2
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 99f6706e719352342843eda151910111

View File

@ -1,11 +1,23 @@
namespace DanroJump.Gameplay
{
/// <summary>
/// Контракт противника, которого можно активировать, деактивировать и сбрасывать при рецикле платформы.
/// </summary>
public interface IEnemy
{
/// <summary>
/// Переводит противника в активное игровое состояние.
/// </summary>
void ActivateEnemy();
/// <summary>
/// Выключает игровую логику противника.
/// </summary>
void DeactivateEnemy();
/// <summary>
/// Возвращает противника к начальному состоянию.
/// </summary>
void ResetEnemy();
}
}

View File

@ -0,0 +1,122 @@
using UnityEngine;
namespace DanroJump.Gameplay
{
/// <summary>
/// Противник, который патрулирует локальный отрезок и может быть побежден прыжком сверху.
/// </summary>
public sealed class PatrolEnemy : EnemyBase
{
[SerializeField] private Vector2 localPatrolAxis = Vector2.right;
[SerializeField] [Min(0f)] private float patrolDistance = 1.2f;
[SerializeField] [Min(0f)] private float patrolSpeed = 1.4f;
[SerializeField] private bool flipWhenMovingBack = true;
[SerializeField] private bool visualFacesPositiveDirection = true;
[SerializeField] private Transform visualRoot;
private Transform cachedTransform;
private Vector3 visualRootInitialScale = Vector3.one;
private Vector3 basePosition;
private Vector2 normalizedPatrolAxis = Vector2.right;
private Vector3 patrolAxis = Vector3.right;
private int direction = 1;
/// <summary>
/// Запоминает локальную стартовую позицию патруля.
/// </summary>
private void Awake()
{
cachedTransform = transform;
ResolveVisualRoot();
RefreshPatrolAxis();
basePosition = cachedTransform.localPosition;
ApplyFacing();
}
#if UNITY_EDITOR
private void OnValidate()
{
RefreshPatrolAxis();
}
#endif
/// <summary>
/// Двигает противника туда-обратно по локальной оси.
/// </summary>
private void Update()
{
if (!IsActive || patrolDistance <= 0f || patrolSpeed <= 0f)
{
return;
}
var nextPosition = cachedTransform.localPosition + patrolAxis * (direction * patrolSpeed * Time.deltaTime);
var offset = Vector2.Dot((Vector2)(nextPosition - basePosition), normalizedPatrolAxis);
if (Mathf.Abs(offset) >= patrolDistance)
{
direction *= -1;
nextPosition = basePosition + patrolAxis * Mathf.Clamp(offset, -patrolDistance, patrolDistance);
ApplyFacing();
}
cachedTransform.localPosition = nextPosition;
}
/// <summary>
/// Возвращает противника в начало патруля при рецикле платформы.
/// </summary>
public override void ResetEnemy()
{
base.ResetEnemy();
(cachedTransform != null ? cachedTransform : transform).localPosition = basePosition;
direction = 1;
ApplyFacing();
}
private void RefreshPatrolAxis()
{
normalizedPatrolAxis = localPatrolAxis.sqrMagnitude > 0f ? localPatrolAxis.normalized : Vector2.right;
patrolAxis = normalizedPatrolAxis;
}
/// <summary>
/// Находит визуальный корень, который можно отражать без изменения коллайдера.
/// </summary>
private void ResolveVisualRoot()
{
if (visualRoot == null)
{
var spriteRenderer = GetComponentInChildren<SpriteRenderer>(true);
visualRoot = spriteRenderer != null ? spriteRenderer.transform : transform;
}
visualRootInitialScale = visualRoot != null ? visualRoot.localScale : Vector3.one;
}
/// <summary>
/// Разворачивает визуал при движении назад, если это включено в инспекторе.
/// </summary>
private void ApplyFacing()
{
if (visualRoot == null)
{
return;
}
var scale = visualRootInitialScale;
if (flipWhenMovingBack)
{
var facingSign = direction < 0 ? -1f : 1f;
if (!visualFacesPositiveDirection)
{
facingSign *= -1f;
}
scale.x = Mathf.Abs(scale.x) * facingSign;
}
visualRoot.localScale = scale;
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 605dc94842c31e540ae7a09b17007591

View File

@ -0,0 +1,207 @@
using UnityEngine;
using Zenject;
namespace DanroJump.Gameplay
{
/// <summary>
/// Создает летающих и универсальных врагов в диапазонах высоты, которые подготовил PlatformSpawner.
/// Перед созданием проверяет, что область врага не пересекает платформенные коллайдеры.
/// </summary>
public sealed class ProceduralEnemySpawner : MonoBehaviour
{
[Header("Spawn cadence")]
[SerializeField] [Min(0f)] private float initialSpawnY = 8f;
[SerializeField] [Min(0.1f)] private float verticalStep = 12f;
[SerializeField] [Min(0)] private int maxAliveEnemies = 8;
[SerializeField] [Min(1)] private int spawnAttempts = 12;
[Header("Spawn area")]
[SerializeField] [Min(0f)] private float horizontalPadding = 0.85f;
[SerializeField] [Min(0f)] private float verticalJitter = 1.5f;
[SerializeField] private Vector2 fallbackEnemyHalfExtents = new(0.55f, 0.55f);
[SerializeField] private Vector2 platformClearance = new(0.15f, 0.15f);
[SerializeField] private LayerMask blockingMask = ~0;
private readonly Collider2D[] overlapBuffer = new Collider2D[16];
private readonly System.Collections.Generic.List<GameObject> aliveEnemies = new();
private DiContainer container;
private Camera gameplayCamera;
private IGameplayDifficultyProgression difficultyProgression;
private System.Random random;
private float nextSpawnY;
private bool isInitialized;
/// <summary>
/// Инициализирует спавнер из PlatformSpawner, чтобы seed и генерация были синхронизированы.
/// </summary>
public void Initialize(
DiContainer injectedContainer,
Camera injectedGameplayCamera,
IGameplayDifficultyProgression injectedDifficultyProgression,
int seed)
{
container = injectedContainer;
gameplayCamera = injectedGameplayCamera;
difficultyProgression = injectedDifficultyProgression;
random = new System.Random(seed);
nextSpawnY = initialSpawnY;
isInitialized = true;
}
/// <summary>
/// Создает врагов в новом вертикальном диапазоне, который только что сгенерировал PlatformSpawner.
/// </summary>
public void SpawnForGeneratedRange(float fromY, float toY)
{
CleanupDestroyedEnemies();
if (!CanTrySpawn())
{
return;
}
var minY = Mathf.Min(fromY, toY);
var maxY = Mathf.Max(fromY, toY);
while (nextSpawnY < minY)
{
nextSpawnY += verticalStep;
}
while (nextSpawnY <= maxY && CanTrySpawn())
{
TrySpawnEnemyAtNextStep(minY, maxY);
nextSpawnY += verticalStep;
}
}
/// <summary>
/// Удаляет процедурных врагов ниже линии рецикла платформ.
/// </summary>
public void CleanupBelow(float worldY)
{
for (var index = aliveEnemies.Count - 1; index >= 0; index--)
{
var enemy = aliveEnemies[index];
if (enemy == null)
{
aliveEnemies.RemoveAt(index);
continue;
}
if (enemy.transform.position.y < worldY)
{
enemy.SetActive(false);
Destroy(enemy);
aliveEnemies.RemoveAt(index);
}
}
}
private bool CanTrySpawn()
{
return isInitialized &&
gameplayCamera != null &&
container != null &&
difficultyProgression != null &&
(maxAliveEnemies <= 0 || aliveEnemies.Count < maxAliveEnemies);
}
private void TrySpawnEnemyAtNextStep(float minGeneratedY, float maxGeneratedY)
{
if (!difficultyProgression.TryGetProceduralEnemyPrefab(nextSpawnY, random, out var prefab))
{
return;
}
var halfExtents = GetEnemyHalfExtents(prefab);
for (var attempt = 0; attempt < spawnAttempts; attempt++)
{
var position = CreateSpawnPosition(minGeneratedY, maxGeneratedY, halfExtents);
if (IntersectsBlockingCollider(position, halfExtents + platformClearance))
{
continue;
}
Spawn(prefab, position);
return;
}
}
private Vector3 CreateSpawnPosition(float minGeneratedY, float maxGeneratedY, Vector2 halfExtents)
{
var cameraHalfWidth = gameplayCamera.orthographicSize * gameplayCamera.aspect;
var minX = gameplayCamera.transform.position.x - cameraHalfWidth + horizontalPadding + halfExtents.x;
var maxX = gameplayCamera.transform.position.x + cameraHalfWidth - horizontalPadding - halfExtents.x;
var minY = minGeneratedY + halfExtents.y;
var maxY = Mathf.Max(minY, maxGeneratedY - halfExtents.y);
var jitteredY = nextSpawnY + RandomRange(-verticalJitter, verticalJitter);
return new Vector3(
RandomRange(minX, maxX),
Mathf.Clamp(jitteredY, minY, maxY),
0f);
}
private void Spawn(GameObject prefab, Vector3 position)
{
var instance = container.InstantiatePrefab(prefab, position, Quaternion.identity, transform);
instance.SetActive(true);
aliveEnemies.Add(instance);
}
private bool IntersectsBlockingCollider(Vector3 position, Vector2 halfExtents)
{
var contactFilter = new ContactFilter2D
{
useLayerMask = true,
layerMask = blockingMask,
useTriggers = false
};
var count = Physics2D.OverlapBox(position, halfExtents * 2f, 0f, contactFilter, overlapBuffer);
for (var index = 0; index < count; index++)
{
var hit = overlapBuffer[index];
if (hit != null && !hit.GetComponentInParent<EnemyBase>())
{
return true;
}
}
return false;
}
private Vector2 GetEnemyHalfExtents(GameObject prefab)
{
var collider = prefab != null ? prefab.GetComponentInChildren<Collider2D>(true) : null;
if (collider == null)
{
return fallbackEnemyHalfExtents;
}
return new Vector2(
Mathf.Max(fallbackEnemyHalfExtents.x, collider.bounds.extents.x),
Mathf.Max(fallbackEnemyHalfExtents.y, collider.bounds.extents.y));
}
private void CleanupDestroyedEnemies()
{
for (var index = aliveEnemies.Count - 1; index >= 0; index--)
{
if (aliveEnemies[index] == null || !aliveEnemies[index].activeInHierarchy)
{
aliveEnemies.RemoveAt(index);
}
}
}
private float RandomRange(float min, float max)
{
if (max <= min)
{
return min;
}
return Mathf.Lerp(min, max, (float)(random?.NextDouble() ?? 0d));
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 47ed0f3875f8ad348bdfdce600932c12

View File

@ -0,0 +1,36 @@
using UnityEngine;
namespace DanroJump.Gameplay
{
/// <summary>
/// Опасное оборудование платформы, которое убивает игрока при контакте.
/// </summary>
public sealed class HazardEquipment : PlatformEquipmentBase
{
[SerializeField] [Min(0f)] private float activationCooldown = 0.2f;
private float lastActivationTime = -999f;
/// <summary>
/// Сбрасывает cooldown при переиспользовании оборудования.
/// </summary>
public override void ResetEquipment()
{
lastActivationTime = -999f;
}
/// <summary>
/// Убивает игрока, если контакт не находится внутри cooldown.
/// </summary>
public override void HandlePlayerContact(JumpPlayerController player, Component source)
{
if (player == null || Time.time - lastActivationTime < activationCooldown)
{
return;
}
lastActivationTime = Time.time;
player.Kill();
}
}
}

View File

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

View File

@ -0,0 +1,13 @@
namespace DanroJump.Gameplay
{
/// <summary>
/// Контракт оборудования, которое должно срабатывать от посадки игрока сверху.
/// </summary>
public interface ILandingEquipment
{
/// <summary>
/// Пробует активировать оборудование из общего landing flow игрока.
/// </summary>
bool TryActivateFromLanding(JumpPlayerController player);
}
}

View File

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

View File

@ -1,9 +1,18 @@
namespace DanroJump.Gameplay
{
/// <summary>
/// Контракт оборудования, которое устанавливается на платформу.
/// </summary>
public interface IPlatformEquipment
{
/// <summary>
/// Привязывает оборудование к runtime-платформе.
/// </summary>
void Install(IPlatformRuntime platform);
/// <summary>
/// Сбрасывает состояние оборудования при спавне или переиспользовании.
/// </summary>
void ResetEquipment();
}
}

View File

@ -1,11 +1,16 @@
using System.Collections;
using System;
using System.Threading;
using Cysharp.Threading.Tasks;
using UnityEngine;
namespace DanroJump.Gameplay
{
/// <summary>
/// Пружинная площадка, которая усиливает прыжок игрока и проигрывает squash/stretch-анимацию.
/// </summary>
[DisallowMultipleComponent]
[RequireComponent(typeof(Collider2D))]
public sealed class JumpPad : PlatformEquipmentBase
public sealed class JumpPad : PlatformEquipmentBase, ILandingEquipment
{
[SerializeField] [Min(1f)] private float jumpHeightMultiplier = 3f;
[SerializeField] private float landingVelocityThreshold = 0.05f;
@ -18,13 +23,19 @@ namespace DanroJump.Gameplay
[SerializeField] [Min(0f)] private float recoverDuration = 0.14f;
private Collider2D jumpPadCollider;
private Coroutine stretchRoutine;
private CancellationTokenSource stretchCancellation;
private Vector3 visualBaseScale = Vector3.one;
private float lastActivationTime = -1f;
private bool hasVisualBaseScale;
/// <summary>
/// Во сколько раз пружина усиливает стандартный прыжок игрока.
/// </summary>
public float JumpHeightMultiplier => jumpHeightMultiplier;
/// <summary>
/// Подготавливает trigger-коллайдер и визуальную часть пружины.
/// </summary>
private void Awake()
{
EnsureTriggerCollider();
@ -32,16 +43,25 @@ namespace DanroJump.Gameplay
CacheVisualBaseScale();
}
/// <summary>
/// Проверяет контакт при первом входе игрока в trigger.
/// </summary>
private void OnTriggerEnter2D(Collider2D other)
{
TryHandlePlayerContact(other);
}
/// <summary>
/// Повторно проверяет контакт, если игрок уже находится внутри trigger.
/// </summary>
private void OnTriggerStay2D(Collider2D other)
{
TryHandlePlayerContact(other);
}
/// <summary>
/// Преобразует Collider2D в игрока и передает контакт в общий handler.
/// </summary>
private void TryHandlePlayerContact(Collider2D other)
{
if (other.TryGetComponent(out JumpPlayerController player))
@ -50,6 +70,9 @@ namespace DanroJump.Gameplay
}
}
/// <summary>
/// Сбрасывает cooldown, коллайдер и визуальный scale при переиспользовании.
/// </summary>
public override void ResetEquipment()
{
lastActivationTime = -1f;
@ -59,11 +82,18 @@ namespace DanroJump.Gameplay
ResetVisualScale();
}
/// <summary>
/// Пробует активировать пружину от контакта игрока.
/// </summary>
public override void HandlePlayerContact(JumpPlayerController player, Component source)
{
TryActivate(player);
}
/// <summary>
/// Активирует усиленный прыжок, если игрок действительно приземляется сверху.
/// </summary>
/// <returns>True, если пружина сработала.</returns>
public bool TryActivate(JumpPlayerController player)
{
if (!CanActivate(player))
@ -71,12 +101,20 @@ namespace DanroJump.Gameplay
return false;
}
player.Bounce(CalculateBoostVelocity(player));
player.BounceWithEnemyPassThrough(CalculateBoostVelocity(player));
lastActivationTime = Time.time;
PlayStretchAnimation();
return true;
}
public bool TryActivateFromLanding(JumpPlayerController player)
{
return TryActivate(player);
}
/// <summary>
/// Проверяет направление движения, cooldown и высоту GroundCheck относительно верха пружины.
/// </summary>
private bool CanActivate(JumpPlayerController player)
{
if (player == null || Time.time - lastActivationTime < activationCooldown)
@ -84,7 +122,9 @@ namespace DanroJump.Gameplay
return false;
}
if (player.VerticalVelocity > landingVelocityThreshold)
var isLanding = player.VerticalVelocity <= landingVelocityThreshold ||
player.PreviousVerticalVelocity <= landingVelocityThreshold;
if (!isLanding)
{
return false;
}
@ -94,14 +134,26 @@ namespace DanroJump.Gameplay
EnsureTriggerCollider();
}
return jumpPadCollider != null && player.GroundCheckY >= jumpPadCollider.bounds.min.y - landingTopTolerance;
if (jumpPadCollider == null)
{
return false;
}
var landingLineY = jumpPadCollider.bounds.max.y - landingTopTolerance;
return player.GroundCheckY >= landingLineY || player.PreviousGroundCheckY >= landingLineY;
}
/// <summary>
/// Переводит множитель высоты в скорость прыжка через квадратный корень.
/// </summary>
private float CalculateBoostVelocity(JumpPlayerController player)
{
return player.AutoJumpVelocity * Mathf.Sqrt(jumpHeightMultiplier);
}
/// <summary>
/// Гарантирует, что коллайдер пружины работает как trigger.
/// </summary>
private void EnsureTriggerCollider()
{
jumpPadCollider = GetComponent<Collider2D>();
@ -111,6 +163,9 @@ namespace DanroJump.Gameplay
}
}
/// <summary>
/// Находит визуальный корень пружины для stretch-анимации.
/// </summary>
private void ResolveVisualRoot()
{
if (visualRoot != null)
@ -125,6 +180,9 @@ namespace DanroJump.Gameplay
}
}
/// <summary>
/// Запоминает исходный scale визуала, чтобы корректно восстановить его после анимации.
/// </summary>
private void CacheVisualBaseScale()
{
if (visualRoot == null || hasVisualBaseScale)
@ -136,6 +194,9 @@ namespace DanroJump.Gameplay
hasVisualBaseScale = true;
}
/// <summary>
/// Запускает короткую анимацию растяжения пружины.
/// </summary>
private void PlayStretchAnimation()
{
ResolveVisualRoot();
@ -146,21 +207,17 @@ namespace DanroJump.Gameplay
return;
}
if (stretchRoutine != null)
{
StopCoroutine(stretchRoutine);
}
stretchRoutine = StartCoroutine(StretchVisualRoutine());
CancelStretchAnimation();
stretchCancellation = new CancellationTokenSource();
StretchVisualAsync(stretchCancellation).Forget();
}
/// <summary>
/// Останавливает активную stretch-анимацию и возвращает базовый scale.
/// </summary>
private void ResetVisualScale()
{
if (stretchRoutine != null)
{
StopCoroutine(stretchRoutine);
stretchRoutine = null;
}
CancelStretchAnimation();
if (visualRoot != null && hasVisualBaseScale)
{
@ -168,39 +225,102 @@ namespace DanroJump.Gameplay
}
}
private IEnumerator StretchVisualRoutine()
private void OnDestroy()
{
CancelStretchAnimation();
}
private void CancelStretchAnimation()
{
if (stretchCancellation == null)
{
return;
}
try
{
stretchCancellation.Cancel();
}
catch
{
// ignored
}
stretchCancellation.Dispose();
stretchCancellation = null;
}
/// <summary>
/// Последовательно растягивает визуал и возвращает его к исходному размеру.
/// </summary>
private async UniTaskVoid StretchVisualAsync(CancellationTokenSource cancellationSource)
{
var stretchedScale = new Vector3(
visualBaseScale.x * stretchScale.x,
visualBaseScale.y * stretchScale.y,
visualBaseScale.z);
yield return AnimateVisualScale(visualBaseScale, stretchedScale, stretchOutDuration);
yield return AnimateVisualScale(stretchedScale, visualBaseScale, recoverDuration);
var token = cancellationSource.Token;
try
{
await AnimateVisualScaleAsync(visualBaseScale, stretchedScale, stretchOutDuration, token);
await AnimateVisualScaleAsync(stretchedScale, visualBaseScale, recoverDuration, token);
visualRoot.localScale = visualBaseScale;
stretchRoutine = null;
if (!token.IsCancellationRequested && visualRoot != null)
{
visualRoot.localScale = visualBaseScale;
}
}
catch (OperationCanceledException) when (token.IsCancellationRequested)
{
// ignored
}
finally
{
if (stretchCancellation == cancellationSource)
{
stretchCancellation = null;
cancellationSource.Dispose();
}
}
}
private IEnumerator AnimateVisualScale(Vector3 from, Vector3 to, float duration)
/// <summary>
/// Интерполирует scale визуального корня за указанное время.
/// </summary>
private async UniTask AnimateVisualScaleAsync(Vector3 from, Vector3 to, float duration, CancellationToken cancellationToken)
{
if (duration <= 0f)
{
visualRoot.localScale = to;
yield break;
if (visualRoot != null)
{
visualRoot.localScale = to;
}
return;
}
var elapsed = 0f;
while (elapsed < duration)
{
cancellationToken.ThrowIfCancellationRequested();
if (visualRoot == null)
{
return;
}
elapsed += Time.deltaTime;
var t = Mathf.Clamp01(elapsed / duration);
var easedT = 1f - (1f - t) * (1f - t);
visualRoot.localScale = Vector3.LerpUnclamped(from, to, easedT);
yield return null;
await UniTask.Yield(PlayerLoopTiming.Update, cancellationToken);
}
visualRoot.localScale = to;
if (visualRoot != null)
{
visualRoot.localScale = to;
}
}
}
}

View File

@ -2,39 +2,63 @@ using UnityEngine;
namespace DanroJump.Gameplay
{
/// <summary>
/// Базовый класс оборудования платформы с trigger-контактом игрока.
/// </summary>
[RequireComponent(typeof(Collider2D))]
public abstract class PlatformEquipmentBase : MonoBehaviour, IPlatformEquipment, IPlayerContactHandler
{
/// <summary>
/// Платформа, на которую установлено оборудование.
/// </summary>
protected IPlatformRuntime Platform { get; private set; }
/// <summary>
/// В редакторе переводит коллайдер оборудования в trigger.
/// </summary>
protected virtual void Reset()
{
var equipmentCollider = GetComponent<Collider2D>();
equipmentCollider.isTrigger = true;
}
/// <summary>
/// Сбрасывает состояние при включении, чтобы объект можно было переиспользовать.
/// </summary>
private void OnEnable()
{
ResetEquipment();
}
/// <summary>
/// Передает контакт с игроком в конкретную реализацию оборудования.
/// </summary>
private void OnTriggerEnter2D(Collider2D other)
{
if (other.TryGetComponent(out JumpPlayerController player))
if (PlayerContactUtility.TryGetAlivePlayer(other, out var player))
{
HandlePlayerContact(player, this);
}
}
/// <summary>
/// Привязывает оборудование к платформе.
/// </summary>
public virtual void Install(IPlatformRuntime platform)
{
Platform = platform;
}
/// <summary>
/// Точка расширения для сброса внутреннего состояния оборудования.
/// </summary>
public virtual void ResetEquipment()
{
}
/// <summary>
/// Обрабатывает контакт игрока с оборудованием.
/// </summary>
public abstract void HandlePlayerContact(JumpPlayerController player, Component source);
}
}

View File

@ -0,0 +1,46 @@
using UnityEngine;
namespace DanroJump.Gameplay
{
/// <summary>
/// Оборудование платформы, которое временно ускоряет горизонтальное движение игрока.
/// </summary>
public sealed class SpeedBoostEquipment : PlatformEquipmentBase
{
[SerializeField] [Min(0.01f)] private float moveSpeedMultiplier = 1.45f;
[SerializeField] [Min(0.01f)] private float duration = 3f;
[SerializeField] [Min(0f)] private float bounceVelocity;
[SerializeField] [Min(0f)] private float activationCooldown = 0.25f;
private float lastActivationTime = -999f;
/// <summary>
/// Сбрасывает cooldown при переиспользовании оборудования.
/// </summary>
public override void ResetEquipment()
{
lastActivationTime = -999f;
}
/// <summary>
/// Применяет ускорение и опциональный отскок при контакте с игроком.
/// </summary>
public override void HandlePlayerContact(JumpPlayerController player, Component source)
{
if (player == null || Time.time - lastActivationTime < activationCooldown)
{
return;
}
player.ApplyMoveSpeedMultiplier(moveSpeedMultiplier, duration);
// Bounce опционален: при нуле оборудование влияет только на скорость.
if (bounceVelocity > 0f)
{
player.Bounce(bounceVelocity);
}
lastActivationTime = Time.time;
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 747a5c8ca2dafe94babc0829532cf3b4

View File

@ -2,20 +2,107 @@ using UnityEngine;
namespace DanroJump.Gameplay
{
public sealed class SpringEquipment : PlatformEquipmentBase
/// <summary>
/// Простая пружина платформы, которая задает игроку фиксированный вертикальный отскок.
/// </summary>
public sealed class SpringEquipment : PlatformEquipmentBase, ILandingEquipment
{
[SerializeField] private float bounceVelocity = 22f;
[SerializeField] private float landingVelocityThreshold = 0.05f;
[SerializeField] private float landingTopTolerance = 0.2f;
[SerializeField] private float activationCooldown = 0.08f;
private Collider2D springCollider;
private float lastActivationTime = -1f;
/// <summary>
/// Вертикальная скорость, которую пружина задает игроку.
/// </summary>
public float BounceVelocity => bounceVelocity;
/// <summary>
/// Сбрасывает cooldown и кэширует trigger-коллайдер.
/// </summary>
public override void ResetEquipment()
{
lastActivationTime = -1f;
EnsureTriggerCollider();
}
/// <summary>
/// Отталкивает игрока вверх только при падении сверху.
/// </summary>
public override void HandlePlayerContact(JumpPlayerController player, Component source)
{
TryActivate(player);
}
/// <summary>
/// Пробует активировать пружину от контакта игрока.
/// </summary>
public bool TryActivate(JumpPlayerController player)
{
if (player == null)
{
return;
return false;
}
player.Bounce(bounceVelocity);
if (!CanActivate(player))
{
return false;
}
player.BounceWithEnemyPassThrough(bounceVelocity);
lastActivationTime = Time.time;
return true;
}
public bool TryActivateFromLanding(JumpPlayerController player)
{
return TryActivate(player);
}
/// <summary>
/// Проверяет направление движения, cooldown и высоту GroundCheck относительно верха пружины.
/// </summary>
private bool CanActivate(JumpPlayerController player)
{
if (Time.time - lastActivationTime < activationCooldown)
{
return false;
}
var isLanding = player.VerticalVelocity <= landingVelocityThreshold ||
player.PreviousVerticalVelocity <= landingVelocityThreshold;
if (!isLanding)
{
return false;
}
if (springCollider == null)
{
EnsureTriggerCollider();
}
if (springCollider == null)
{
return false;
}
var landingLineY = springCollider.bounds.max.y - landingTopTolerance;
return player.GroundCheckY >= landingLineY || player.PreviousGroundCheckY >= landingLineY;
}
/// <summary>
/// Гарантирует, что коллайдер пружины работает как trigger.
/// </summary>
private void EnsureTriggerCollider()
{
springCollider = GetComponent<Collider2D>();
if (springCollider != null)
{
springCollider.isTrigger = true;
}
}
}
}

View File

@ -4,29 +4,56 @@ using Zenject;
namespace DanroJump.Gameplay
{
/// <summary>
/// Выбирает активный этап сложности по максимальной высоте игрока или Y-координате генерации.
/// </summary>
public sealed class GameplayDifficultyProgression : MonoBehaviour, IGameplayDifficultyProgression
{
[SerializeField] private JumpPlayerController player;
[SerializeField] private bool progressionEnabled = true;
[SerializeField] private List<GameplayDifficultyStage> stages = new();
public bool HasStages => stages != null && stages.Exists(stage => stage != null);
/// <summary>
/// Показывает, есть ли хотя бы один настроенный этап сложности.
/// </summary>
public bool HasStages => progressionEnabled && stages != null && stages.Exists(stage => stage != null);
/// <summary>
/// Начальная Y-координата генерации по первому этапу.
/// </summary>
public float InitialSpawnY => GetInitialSpawnY();
/// <summary>
/// Прогресс игрока внутри текущего этапа по максимальной высоте забега.
/// </summary>
public float CurrentProgress => CalculateProgress(player != null ? player.HighestY : 0f);
/// <summary>
/// Имя текущего этапа игрока для HUD и editor overlay.
/// </summary>
public string CurrentStageName => GetStage(player != null ? player.HighestY : 0f)?.StageName ?? string.Empty;
/// <summary>
/// Получает игрока из SceneContext, чтобы UI и диагностические окна видели текущий этап забега.
/// </summary>
[Inject]
public void Construct(JumpPlayerController injectedPlayer)
{
player = injectedPlayer;
}
/// <summary>
/// Выбирает prefab платформы для указанной высоты по настройкам активного этапа.
/// </summary>
public GameObject GetPlatformPrefab(float worldY, System.Random random)
{
var stage = GetStage(worldY);
return stage != null ? stage.GetPlatformPrefab(random) : null;
}
/// <summary>
/// Возвращает расстояние между платформами для указанной высоты.
/// </summary>
public float GetVerticalSpacing(float worldY)
{
var stage = GetStage(worldY);
@ -38,12 +65,18 @@ namespace DanroJump.Gameplay
return stage.GetVerticalSpacing(worldY);
}
/// <summary>
/// Возвращает распределение платформ по ширине уровня для указанной высоты.
/// </summary>
public float GetHorizontalDistribution(float worldY)
{
var stage = GetStage(worldY);
return stage != null ? stage.GetHorizontalDistribution() : 0f;
}
/// <summary>
/// Создает профиль контента активного этапа: collectibles, equipment и enemies.
/// </summary>
public IPlatformContentSource CreateContentSource(float worldY)
{
var stage = GetStage(worldY);
@ -55,11 +88,32 @@ namespace DanroJump.Gameplay
return stage.CreateContentSource(worldY);
}
/// <summary>
/// Пробует выбрать процедурного врага для указанной высоты из активного ScriptableObject-этапа.
/// </summary>
public bool TryGetProceduralEnemyPrefab(float worldY, System.Random random, out GameObject prefab)
{
var stage = GetStage(worldY);
if (stage == null)
{
prefab = null;
return false;
}
return stage.TryGetProceduralEnemyPrefab(worldY, random, out prefab);
}
/// <summary>
/// Возвращает имя этапа для диагностики и overlay-окна.
/// </summary>
public string GetStageName(float worldY)
{
return GetStage(worldY)?.StageName ?? string.Empty;
}
/// <summary>
/// Возвращает прогресс внутри текущего этапа в диапазоне 0..1.
/// </summary>
public float GetStageProgress(float worldY)
{
var stage = GetStage(worldY);
@ -72,12 +126,18 @@ namespace DanroJump.Gameplay
return stage != null ? stage.CalculateProgress(worldY) : 0f;
}
/// <summary>
/// Возвращает стартовую высоту генерации из первого доступного этапа.
/// </summary>
private float GetInitialSpawnY()
{
var firstStage = GetFirstStage();
return firstStage != null ? firstStage.StartY : 0f;
}
/// <summary>
/// Находит первый этап по минимальной стартовой высоте.
/// </summary>
private GameplayDifficultyStage GetFirstStage()
{
if (stages == null || stages.Count == 0)
@ -102,6 +162,9 @@ namespace DanroJump.Gameplay
return firstStage;
}
/// <summary>
/// Находит последний этап, стартовая высота которого уже пройдена.
/// </summary>
private GameplayDifficultyStage GetStage(float worldY)
{
if (!progressionEnabled || stages == null || stages.Count == 0)
@ -123,12 +186,15 @@ namespace DanroJump.Gameplay
}
}
// The last reached stage intentionally keeps running forever after its length ends.
// verticalLength controls curve progress only; it does not disable the stage.
// Последний достигнутый этап намеренно продолжается бесконечно.
// verticalLength управляет только прогрессом кривых, а не выключением этапа.
return currentStage;
}
}
/// <summary>
/// Интерфейс чтения прогрессии сложности для gameplay-систем и диагностических окон.
/// </summary>
public interface IGameplayDifficultyProgression
{
float CurrentProgress { get; }
@ -139,6 +205,7 @@ namespace DanroJump.Gameplay
float GetVerticalSpacing(float worldY);
float GetHorizontalDistribution(float worldY);
IPlatformContentSource CreateContentSource(float worldY);
bool TryGetProceduralEnemyPrefab(float worldY, System.Random random, out GameObject prefab);
string GetStageName(float worldY);
float GetStageProgress(float worldY);
}

View File

@ -4,12 +4,19 @@ using UnityEngine.Serialization;
namespace DanroJump.Gameplay
{
/// <summary>
/// ScriptableObject-описание одного вертикального этапа сложности.
/// Хранит веса платформ, кривые расстояний и вероятности спавна контента.
/// </summary>
[CreateAssetMenu(
fileName = "GameplayDifficultyStage",
menuName = "Danro Jump/Gameplay/Difficulty Stage",
order = 10)]
public sealed class GameplayDifficultyStage : ScriptableObject
{
/// <summary>
/// Настройки платформ этапа: какие prefab доступны и как меняется вертикальный шаг.
/// </summary>
[System.Serializable]
private sealed class StagePlatformSettings
{
@ -18,11 +25,17 @@ namespace DanroJump.Gameplay
[SerializeField] [Min(0.1f)] private float initialVerticalSpacing = 1.15f;
[SerializeField] [Min(0.1f)] private float maximumVerticalSpacing = 1.95f;
/// <summary>
/// Выбирает prefab платформы по весам.
/// </summary>
public GameObject GetPlatformPrefab(System.Random random)
{
return WeightedPrefabOption.TrySelect(platforms, random, out var prefab) ? prefab : null;
}
/// <summary>
/// Вычисляет расстояние до следующей платформы по прогрессу этапа.
/// </summary>
public float EvaluateVerticalSpacing(float progress)
{
var spacingProgress = EvaluateCurve01(verticalSpacingCurve, progress);
@ -32,6 +45,9 @@ namespace DanroJump.Gameplay
}
/// <summary>
/// Настройки одной категории спавнимого контента этапа.
/// </summary>
[System.Serializable]
private sealed class StageContentSettings
{
@ -40,14 +56,54 @@ namespace DanroJump.Gameplay
[SerializeField] [Range(0f, 1f)] private float initialSpawnChance;
[SerializeField] [Range(0f, 1f)] private float maximumSpawnChance;
/// <summary>
/// Взвешенный список prefab этой категории контента.
/// </summary>
public IReadOnlyList<WeightedPrefabOption> Prefabs => prefabs;
/// <summary>
/// Вычисляет шанс появления контента по прогрессу этапа.
/// </summary>
public float EvaluateSpawnChance(float progress)
{
if (!HasValidPrefab())
{
return 0f;
}
var chanceProgress = EvaluateCurve01(spawnChanceCurve, progress);
var maxChance = Mathf.Max(initialSpawnChance, maximumSpawnChance);
return Mathf.Lerp(initialSpawnChance, maxChance, chanceProgress);
}
/// <summary>
/// Выбирает prefab из этой категории с учетом дополнительного фильтра.
/// </summary>
public bool TryGetPrefab(
System.Random random,
System.Predicate<GameObject> prefabFilter,
out GameObject prefab)
{
return WeightedPrefabOption.TrySelect(prefabs, random, prefabFilter, out prefab);
}
private bool HasValidPrefab()
{
if (prefabs == null)
{
return false;
}
foreach (var option in prefabs)
{
if (option?.Prefab != null && option.Weight > 0f)
{
return true;
}
}
return false;
}
}
[Header("Общие настройки этапа")]
@ -69,24 +125,43 @@ namespace DanroJump.Gameplay
[Header("Подбираемые предметы")]
[SerializeField] private StageContentSettings collectibles = new();
/// <summary>
/// Отображаемое имя этапа для инспектора, overlay и диагностики.
/// </summary>
public string StageName => stageName;
/// <summary>
/// Y-координата, с которой этап начинает действовать.
/// </summary>
public float StartY => startY;
/// <summary>
/// Выбирает платформу этапа по весам.
/// </summary>
public GameObject GetPlatformPrefab(System.Random random)
{
return platforms.GetPlatformPrefab(random);
}
/// <summary>
/// Возвращает вертикальное расстояние до следующей платформы на указанной высоте.
/// </summary>
public float GetVerticalSpacing(float worldY)
{
return platforms.EvaluateVerticalSpacing(CalculateProgress(worldY));
}
/// <summary>
/// Возвращает распределение платформ по горизонтали: -1 центр, 0 вся ширина, 1 края.
/// </summary>
public float GetHorizontalDistribution()
{
return Mathf.Clamp(horizontalDistribution, -1f, 1f);
}
/// <summary>
/// Создает источник контента с вероятностями, актуальными для указанной высоты.
/// </summary>
public IPlatformContentSource CreateContentSource(float worldY)
{
var progress = CalculateProgress(worldY);
@ -99,6 +174,31 @@ namespace DanroJump.Gameplay
enemies.EvaluateSpawnChance(progress));
}
/// <summary>
/// Пробует выбрать процедурного врага из настроек противников текущего этапа.
/// </summary>
public bool TryGetProceduralEnemyPrefab(float worldY, System.Random random, out GameObject prefab)
{
var progress = CalculateProgress(worldY);
var spawnChance = enemies.EvaluateSpawnChance(progress);
if (spawnChance <= 0f)
{
prefab = null;
return false;
}
if (spawnChance < 1f && (random != null ? random.NextDouble() : 0d) > spawnChance)
{
prefab = null;
return false;
}
return enemies.TryGetPrefab(random, EnemyPrefabRules.CanSpawnProcedurally, out prefab);
}
/// <summary>
/// Считает прогресс внутри этапа в диапазоне 0..1.
/// </summary>
public float CalculateProgress(float worldY)
{
if (verticalLength <= 0f)
@ -109,6 +209,9 @@ namespace DanroJump.Gameplay
return Mathf.Clamp01((worldY - startY) / verticalLength);
}
/// <summary>
/// Безопасно вычисляет значение кривой и ограничивает результат диапазоном 0..1.
/// </summary>
private static float EvaluateCurve01(AnimationCurve curve, float progress)
{
if (curve == null || curve.length == 0)

View File

@ -3,6 +3,10 @@ using Zenject;
namespace DanroJump.Gameplay
{
/// <summary>
/// Регистрирует зависимости игровой сцены в SceneContext Extenject.
/// Является единой точкой связывания gameplay-сервисов и сценовых объектов.
/// </summary>
public sealed class GameplayInstaller : MonoInstaller
{
[SerializeField] private JumpPlayerController player;
@ -10,19 +14,25 @@ namespace DanroJump.Gameplay
[SerializeField] private PlatformSpawner platformSpawner;
[SerializeField] private GameplayDifficultyProgression difficultyProgression;
/// <summary>
/// Привязывает игрока, камеру, спавнер, прогрессию сложности и runtime-сервисы.
/// </summary>
public override void InstallBindings()
{
if (!ValidateReferences())
{
return;
throw new ZenjectException($"{nameof(GameplayInstaller)} has missing required scene references.");
}
Container.BindInstance(player).AsSingle();
Container.BindInstance(gameplayCamera).AsSingle();
Container.BindInstance(platformSpawner).AsSingle();
Container.BindInstance(difficultyProgression).AsSingle();
Container.Bind<IGameplayDifficultyProgression>().FromInstance(difficultyProgression).AsSingle();
Container.Bind<GameplaySession>().AsSingle().NonLazy();
Container.Bind<PlatformContentSpawner>().AsSingle();
// Сценовые MonoBehaviour уже существуют, поэтому явно ставим их в очередь на injection.
Container.QueueForInject(player);
Container.QueueForInject(difficultyProgression);
Container.QueueForInject(platformSpawner);
@ -33,6 +43,10 @@ namespace DanroJump.Gameplay
}
}
/// <summary>
/// Проверяет обязательные ссылки сцены до регистрации зависимостей.
/// </summary>
/// <returns>True, если SceneContext настроен достаточно для запуска gameplay.</returns>
private bool ValidateReferences()
{
var isValid = true;
@ -45,6 +59,9 @@ namespace DanroJump.Gameplay
return isValid;
}
/// <summary>
/// Валидирует одну сценовую ссылку и пишет понятную ошибку в Unity Console.
/// </summary>
private bool ValidateReference(Object reference, string fieldName)
{
if (reference != null)
@ -55,5 +72,6 @@ namespace DanroJump.Gameplay
Debug.LogError($"{nameof(GameplayInstaller)} is missing '{fieldName}' reference.", this);
return false;
}
}
}

View File

@ -0,0 +1,246 @@
using System;
using DanroJump.SceneFlow;
using DanroJump.Settings;
using UnityEngine;
namespace DanroJump.Gameplay
{
/// <summary>
/// Хранит состояние текущего забега: счет, монеты, жизни, высоту и рекорд.
/// </summary>
public sealed class GameplaySession : IDisposable
{
private const string RecordHeightPrefsKey = "DanroJump.Gameplay.RecordHeight";
private const int DefaultStartingLives = 3;
private static readonly TimeSpan GameOverReturnDelay = TimeSpan.FromSeconds(0.35f);
private readonly JumpPlayerController player;
private readonly IReadOnlyServiceSettings serviceSettings;
private readonly ISceneFlowService sceneFlow;
private readonly int startingLives;
private float savedRecordHeight;
/// <summary>
/// Очки, набранные в текущем забеге.
/// </summary>
public int Score { get; private set; }
/// <summary>
/// Монеты, собранные в текущем забеге.
/// </summary>
public int Coins { get; private set; }
/// <summary>
/// Количество смертей в текущем забеге.
/// </summary>
public int DeathCount { get; private set; }
/// <summary>
/// Оставшиеся жизни до завершения забега.
/// </summary>
public int RemainingLives { get; private set; }
/// <summary>
/// Текущее состояние gameplay-сессии.
/// </summary>
public GameplaySessionState State { get; private set; }
/// <summary>
/// Фактическая текущая высота игрока над стартом.
/// </summary>
public float CurrentHeight => player != null ? Mathf.Max(0f, player.transform.position.y) : 0f;
/// <summary>
/// Максимальная высота, достигнутая в текущем забеге.
/// </summary>
public float MaxRunHeight => player != null ? Mathf.Max(0f, player.HighestY) : 0f;
/// <summary>
/// Лучшая высота текущего забега.
/// </summary>
public float BestHeight => MaxRunHeight;
/// <summary>
/// Абсолютный рекорд с учетом сохраненного значения и текущего забега.
/// </summary>
public float RecordHeight => Mathf.Max(savedRecordHeight, MaxRunHeight);
/// <summary>
/// Показывает, находится ли игрок в состоянии смерти или завершенного забега.
/// </summary>
public bool IsPlayerDead => State == GameplaySessionState.Respawning || State == GameplaySessionState.GameOver;
public event Action Changed;
/// <summary>
/// Создает сессию и подписывается на события смерти/respawn игрока.
/// </summary>
public GameplaySession(
JumpPlayerController player,
[Zenject.InjectOptional] IReadOnlyServiceSettings serviceSettings = null,
[Zenject.InjectOptional] ISceneFlowService sceneFlow = null)
{
this.player = player;
this.serviceSettings = serviceSettings;
this.sceneFlow = sceneFlow;
startingLives = ResolveStartingLives();
RemainingLives = startingLives;
State = GameplaySessionState.Running;
savedRecordHeight = PlayerPrefs.GetFloat(RecordHeightPrefsKey, 0f);
if (this.player != null)
{
this.player.Died += HandlePlayerDied;
this.player.Respawned += HandlePlayerRespawned;
}
}
/// <summary>
/// Добавляет очки в текущий забег.
/// </summary>
public void AddScore(int amount)
{
if (amount <= 0)
{
return;
}
Score += amount;
Changed?.Invoke();
}
/// <summary>
/// Добавляет монеты в текущий забег.
/// </summary>
public void AddCoins(int amount)
{
if (amount <= 0)
{
return;
}
Coins += amount;
Changed?.Invoke();
}
/// <summary>
/// Полностью сбрасывает забег, сохранив рекорд при необходимости.
/// </summary>
public void ResetSession()
{
SaveRecordIfNeeded();
Score = 0;
Coins = 0;
DeathCount = 0;
RemainingLives = startingLives;
State = GameplaySessionState.Running;
player?.ResetRun();
Changed?.Invoke();
}
/// <summary>
/// Сохраняет рекорд и отписывается от событий игрока.
/// </summary>
public void Dispose()
{
SaveRecordIfNeeded();
if (player == null)
{
return;
}
player.Died -= HandlePlayerDied;
player.Respawned -= HandlePlayerRespawned;
}
/// <summary>
/// Обновляет состояние сессии после смерти игрока.
/// </summary>
private void HandlePlayerDied(JumpPlayerController _)
{
DeathCount++;
RemainingLives = Mathf.Max(0, RemainingLives - 1);
State = RemainingLives > 0 ? GameplaySessionState.Respawning : GameplaySessionState.GameOver;
if (State == GameplaySessionState.GameOver)
{
player?.BlockPendingRespawn();
StartGameOverReturn();
}
else
{
player?.ScheduleRespawn(player.DeathRespawnDelay);
}
SaveRecordIfNeeded();
Changed?.Invoke();
}
/// <summary>
/// Возвращает сессию в Running после respawn, если игра еще не закончена.
/// </summary>
private void HandlePlayerRespawned(JumpPlayerController _)
{
if (State != GameplaySessionState.GameOver)
{
State = GameplaySessionState.Running;
}
Changed?.Invoke();
}
/// <summary>
/// Читает стартовое количество жизней из сервисных настроек.
/// </summary>
private int ResolveStartingLives()
{
if (serviceSettings == null)
{
return DefaultStartingLives;
}
var configuredLives = serviceSettings.GetInt(ServiceSettingsKeys.StartingLives);
return Mathf.Max(1, configuredLives);
}
/// <summary>
/// Сохраняет лучший результат по высоте в PlayerPrefs.
/// </summary>
private void SaveRecordIfNeeded()
{
if (MaxRunHeight <= savedRecordHeight)
{
return;
}
savedRecordHeight = MaxRunHeight;
PlayerPrefs.SetFloat(RecordHeightPrefsKey, savedRecordHeight);
PlayerPrefs.Save();
}
/// <summary>
/// Запускает возврат в главное меню после финальной смерти.
/// </summary>
private void StartGameOverReturn()
{
if (sceneFlow == null)
{
Debug.LogWarning($"{nameof(GameplaySession)} cannot return to main menu because {nameof(ISceneFlowService)} is not bound.");
return;
}
sceneFlow.ReturnToMainMenuAfterGameOver(GameOverReturnDelay);
}
}
/// <summary>
/// Состояние игрового забега.
/// </summary>
public enum GameplaySessionState
{
Waiting = 0,
Running = 1,
Respawning = 2,
GameOver = 3,
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 993f37ab6fd94234b9fc09213874df63

View File

@ -2,6 +2,9 @@ using UnityEngine;
namespace DanroJump.Gameplay
{
/// <summary>
/// Маркер обычной платформы, которую игрок может использовать для автопрыжка.
/// </summary>
[RequireComponent(typeof(Collider2D))]
public sealed class JumpPlatform : MonoBehaviour
{

File diff suppressed because it is too large Load Diff

View File

@ -3,31 +3,44 @@ using Zenject;
namespace DanroJump.Gameplay
{
/// <summary>
/// Кастомная one-way логика платформы.
/// Игнорирует столкновение, если GroundCheck игрока ниже верхней границы платформы.
/// </summary>
[DisallowMultipleComponent]
[RequireComponent(typeof(Collider2D))]
public sealed class OneWayPlatformCollider : MonoBehaviour
{
[SerializeField] private JumpPlayerController player;
[SerializeField] private float topBoundaryPadding;
[SerializeField] private float landingVelocityThreshold = 0.05f;
[SerializeField] private float crossingGraceDistance = 0.8f;
private Collider2D platformCollider;
private BoxCollider2D boxPlatformCollider;
private Collider2D playerCollider;
private bool isIgnoringPlayerCollision;
/// <summary>
/// Y-координата верхней границы коллайдера платформы.
/// </summary>
public float TopY
{
get
{
if (platformCollider is BoxCollider2D boxCollider)
if (boxPlatformCollider != null)
{
var localTop = boxCollider.offset + Vector2.up * (boxCollider.size.y * 0.5f);
return boxCollider.transform.TransformPoint(localTop).y;
var localTop = boxPlatformCollider.offset + Vector2.up * (boxPlatformCollider.size.y * 0.5f);
return boxPlatformCollider.transform.TransformPoint(localTop).y;
}
return platformCollider != null ? platformCollider.bounds.max.y : transform.position.y;
}
}
/// <summary>
/// Получает игрока через DI, чтобы не искать его по сцене на каждой платформе.
/// </summary>
[Inject]
public void Construct(JumpPlayerController injectedPlayer)
{
@ -35,9 +48,13 @@ namespace DanroJump.Gameplay
ResolvePlayerCollider();
}
/// <summary>
/// Подготавливает Collider2D и отключает стандартный PlatformEffector2D, если он остался на prefab.
/// </summary>
private void Awake()
{
platformCollider = GetComponent<Collider2D>();
boxPlatformCollider = platformCollider as BoxCollider2D;
platformCollider.usedByEffector = false;
if (TryGetComponent(out PlatformEffector2D platformEffector))
@ -48,16 +65,33 @@ namespace DanroJump.Gameplay
RefreshColliderState();
}
/// <summary>
/// После повторного включения сразу синхронизирует IgnoreCollision, не ожидая следующего FixedUpdate.
/// </summary>
private void OnEnable()
{
RefreshColliderState();
}
/// <summary>
/// При выключении платформы обязательно возвращает столкновение с игроком.
/// </summary>
private void OnDisable()
{
SetPlayerCollisionIgnored(false);
}
/// <summary>
/// Синхронизирует состояние IgnoreCollision с текущей позицией GroundCheck игрока.
/// </summary>
private void FixedUpdate()
{
RefreshColliderState();
}
/// <summary>
/// Обновляет режим столкновения между платформой и игроком.
/// </summary>
private void RefreshColliderState()
{
if (player == null && !ResolvePlayer())
@ -73,16 +107,48 @@ namespace DanroJump.Gameplay
SetPlayerCollisionIgnored(!ShouldCollideWith(player));
}
/// <summary>
/// Проверяет, должен ли игрок столкнуться с платформой в текущем физическом шаге.
/// </summary>
/// <param name="targetPlayer">Игрок, для которого проверяется столкновение.</param>
/// <returns>True, если игрок падает сверху или только что пересек верх платформы сверху вниз.</returns>
public bool ShouldCollideWith(JumpPlayerController targetPlayer)
{
return targetPlayer != null && targetPlayer.GroundCheckY >= TopY + topBoundaryPadding;
if (targetPlayer == null)
{
return false;
}
var topY = TopY + topBoundaryPadding;
var isFalling = targetPlayer.VerticalVelocity <= landingVelocityThreshold ||
targetPlayer.PreviousVerticalVelocity <= landingVelocityThreshold;
if (!isFalling)
{
return false;
}
if (targetPlayer.GroundCheckY >= topY)
{
return true;
}
// Grace-зона закрывает быстрые кадры, когда GroundCheck успел проскочить немного ниже верхней границы.
var crossedFromAbove = targetPlayer.PreviousGroundCheckY >= topY &&
targetPlayer.GroundCheckY >= topY - crossingGraceDistance;
return crossedFromAbove;
}
/// <summary>
/// Возвращает true, если ссылка на игрока уже получена.
/// </summary>
private bool ResolvePlayer()
{
return player != null;
}
/// <summary>
/// Кэширует коллайдер игрока для Physics2D.IgnoreCollision.
/// </summary>
private bool ResolvePlayerCollider()
{
if (player == null)
@ -93,6 +159,9 @@ namespace DanroJump.Gameplay
return player.TryGetComponent(out playerCollider);
}
/// <summary>
/// Включает или выключает физическое столкновение пары игрок-платформа.
/// </summary>
private void SetPlayerCollisionIgnored(bool shouldIgnore)
{
if (platformCollider == null || playerCollider == null || isIgnoringPlayerCollision == shouldIgnore)

Some files were not shown because too many files have changed in this diff Show More