diff --git a/Assembly-CSharp.csproj b/Assembly-CSharp.csproj index ad33ed2..329420c 100644 --- a/Assembly-CSharp.csproj +++ b/Assembly-CSharp.csproj @@ -65,6 +65,7 @@ + diff --git a/Assets/Art/P1.aseprite b/Assets/Art/P1.aseprite new file mode 100644 index 0000000..1eec699 Binary files /dev/null and b/Assets/Art/P1.aseprite differ diff --git a/Assets/Art/P2.aseprite b/Assets/Art/P2.aseprite new file mode 100644 index 0000000..028e7f6 Binary files /dev/null and b/Assets/Art/P2.aseprite differ diff --git a/Assets/Art/P3.aseprite b/Assets/Art/P3.aseprite new file mode 100644 index 0000000..7b11c44 Binary files /dev/null and b/Assets/Art/P3.aseprite differ diff --git a/Assets/Art/P4.aseprite b/Assets/Art/P4.aseprite new file mode 100644 index 0000000..90cc81f Binary files /dev/null and b/Assets/Art/P4.aseprite differ diff --git a/Assets/InputSystem_Actions.inputactions b/Assets/InputSystem_Actions.inputactions index 3c88953..aa0e1f3 100644 --- a/Assets/InputSystem_Actions.inputactions +++ b/Assets/InputSystem_Actions.inputactions @@ -41,7 +41,7 @@ "path": "/leftStick", "interactions": "", "processors": "", - "groups": ";Gamepad", + "groups": "Gamepad", "action": "Move", "isComposite": false, "isPartOfComposite": false @@ -214,7 +214,7 @@ { "name": "", "id": "b3f66d0b-7751-423f-908b-a11c5bd95930", - "path": "/buttonNorth", + "path": "/buttonEast", "interactions": "", "processors": "", "groups": "Gamepad", @@ -285,7 +285,7 @@ "path": "/buttonEast", "interactions": "", "processors": "", - "groups": ";Gamepad", + "groups": "Gamepad", "action": "Interact", "isComposite": false, "isPartOfComposite": false @@ -313,6 +313,15 @@ "processors": "", "interactions": "", "initialStateCheck": false + }, + { + "name": "Interact", + "type": "Button", + "id": "c8a2c7b1-7c4b-4b6c-9c67-5f4a2a6f8c1c", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false } ], "bindings": [ @@ -337,6 +346,17 @@ "action": "Jump", "isComposite": false, "isPartOfComposite": false + }, + { + "name": "", + "id": "c3c7b8ad-6b3b-4a4c-9b0b-1c2f7e9a4d5e", + "path": "/buttonEast", + "interactions": "", + "processors": "", + "groups": "Gamepad", + "action": "Interact", + "isComposite": false, + "isPartOfComposite": false } ] }, @@ -361,6 +381,15 @@ "processors": "", "interactions": "", "initialStateCheck": false + }, + { + "name": "Interact", + "type": "Button", + "id": "e2e9b2d1-8f44-4a8b-b5a0-4f1d6a7c9b2a", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false } ], "bindings": [ @@ -385,6 +414,17 @@ "action": "Jump", "isComposite": false, "isPartOfComposite": false + }, + { + "name": "", + "id": "b1f0f4f1-2d7a-4c1e-9c6a-8e5b7c9d1a3f", + "path": "/buttonEast", + "interactions": "", + "processors": "", + "groups": "Gamepad", + "action": "Interact", + "isComposite": false, + "isPartOfComposite": false } ] }, @@ -501,7 +541,7 @@ "path": "/leftStick/up", "interactions": "", "processors": "", - "groups": ";Gamepad", + "groups": "Gamepad", "action": "Navigate", "isComposite": false, "isPartOfComposite": true @@ -512,7 +552,7 @@ "path": "/rightStick/up", "interactions": "", "processors": "", - "groups": ";Gamepad", + "groups": "Gamepad", "action": "Navigate", "isComposite": false, "isPartOfComposite": true @@ -523,7 +563,7 @@ "path": "/leftStick/down", "interactions": "", "processors": "", - "groups": ";Gamepad", + "groups": "Gamepad", "action": "Navigate", "isComposite": false, "isPartOfComposite": true @@ -534,7 +574,7 @@ "path": "/rightStick/down", "interactions": "", "processors": "", - "groups": ";Gamepad", + "groups": "Gamepad", "action": "Navigate", "isComposite": false, "isPartOfComposite": true @@ -545,7 +585,7 @@ "path": "/leftStick/left", "interactions": "", "processors": "", - "groups": ";Gamepad", + "groups": "Gamepad", "action": "Navigate", "isComposite": false, "isPartOfComposite": true @@ -556,7 +596,7 @@ "path": "/rightStick/left", "interactions": "", "processors": "", - "groups": ";Gamepad", + "groups": "Gamepad", "action": "Navigate", "isComposite": false, "isPartOfComposite": true @@ -567,7 +607,7 @@ "path": "/leftStick/right", "interactions": "", "processors": "", - "groups": ";Gamepad", + "groups": "Gamepad", "action": "Navigate", "isComposite": false, "isPartOfComposite": true @@ -578,7 +618,7 @@ "path": "/rightStick/right", "interactions": "", "processors": "", - "groups": ";Gamepad", + "groups": "Gamepad", "action": "Navigate", "isComposite": false, "isPartOfComposite": true @@ -589,7 +629,7 @@ "path": "/dpad", "interactions": "", "processors": "", - "groups": ";Gamepad", + "groups": "Gamepad", "action": "Navigate", "isComposite": false, "isPartOfComposite": false @@ -967,4 +1007,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/Assets/Physics.meta b/Assets/Physics.meta new file mode 100644 index 0000000..3a779f0 --- /dev/null +++ b/Assets/Physics.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 58ffb2142b4f20f4388243f51a413e0e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Physics/TrickNoFriction.physicsMaterial2D b/Assets/Physics/TrickNoFriction.physicsMaterial2D new file mode 100644 index 0000000..b040ecd --- /dev/null +++ b/Assets/Physics/TrickNoFriction.physicsMaterial2D @@ -0,0 +1,11 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!62 &6200000 +PhysicsMaterial2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: TrickNoFriction + friction: 0 + bounciness: 0 diff --git a/Assets/Physics/TrickNoFriction.physicsMaterial2D.meta b/Assets/Physics/TrickNoFriction.physicsMaterial2D.meta new file mode 100644 index 0000000..18f1845 --- /dev/null +++ b/Assets/Physics/TrickNoFriction.physicsMaterial2D.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 71737e52316f484b8c59e24137491385 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 6200000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/Player.prefab b/Assets/Prefabs/Player.prefab index 1164b48..ac716ea 100644 --- a/Assets/Prefabs/Player.prefab +++ b/Assets/Prefabs/Player.prefab @@ -16,7 +16,7 @@ GameObject: - component: {fileID: 7763498473808654306} - component: {fileID: 3659140714710275197} - component: {fileID: 9133098163257611752} - m_Layer: 0 + m_Layer: 6 m_Name: Player m_TagString: Untagged m_Icon: {fileID: 0} @@ -233,7 +233,7 @@ MonoBehaviour: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 3937090937419967315} - m_Enabled: 1 + m_Enabled: 0 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: b88e05c37f07ccf48bcc436a9d7def5d, type: 3} m_Name: @@ -251,7 +251,7 @@ GameObject: m_Component: - component: {fileID: 5569302833446856119} - component: {fileID: 6635970933810939283} - m_Layer: 0 + m_Layer: 6 m_Name: HoldLocation m_TagString: Untagged m_Icon: {fileID: 0} diff --git a/Assets/Prefabs/Treat.prefab b/Assets/Prefabs/Treat.prefab index 4577bf2..7bc8382 100644 --- a/Assets/Prefabs/Treat.prefab +++ b/Assets/Prefabs/Treat.prefab @@ -12,7 +12,7 @@ GameObject: - component: {fileID: 1016927753207964800} - component: {fileID: 2635922278447379203} - component: {fileID: 6828521680597590390} - m_Layer: 0 + m_Layer: 7 m_Name: Treat m_TagString: Interactable m_Icon: {fileID: 0} diff --git a/Assets/Prefabs/Trick.prefab b/Assets/Prefabs/Trick.prefab index fd937a9..abc688a 100644 --- a/Assets/Prefabs/Trick.prefab +++ b/Assets/Prefabs/Trick.prefab @@ -13,7 +13,7 @@ GameObject: - component: {fileID: 700000003} - component: {fileID: 700000004} - component: {fileID: 700000005} - m_Layer: 0 + m_Layer: 3 m_Name: Trick m_TagString: Interactable m_Icon: {fileID: 0} @@ -110,7 +110,7 @@ Rigidbody2D: m_LinearDamping: 0 m_AngularDamping: 0.05 m_GravityScale: 0 - m_Material: {fileID: 0} + m_Material: {fileID: 6200000, guid: 71737e52316f484b8c59e24137491385, type: 2} m_IncludeLayers: serializedVersion: 2 m_Bits: 0 @@ -131,7 +131,7 @@ BoxCollider2D: m_Enabled: 1 serializedVersion: 3 m_Density: 1 - m_Material: {fileID: 0} + m_Material: {fileID: 6200000, guid: 71737e52316f484b8c59e24137491385, type: 2} m_IncludeLayers: serializedVersion: 2 m_Bits: 0 @@ -184,4 +184,20 @@ MonoBehaviour: targetRefreshInterval: 0.4 consumeDistance: 0.35 wanderInterval: 1.2 + consumeCooldown: 3 trickPrefab: {fileID: 700000005} + avoidPlayerRadius: 0 + avoidTrickRadius: 0 + treatSeekWeight: 1 + wanderWeight: 0.4 + maxTricks: 50 + jumpImpulse: 6 + jumpCooldown: 1 + jumpChancePerSecond: 0.5 + groundMask: + serializedVersion: 2 + m_Bits: 4294967295 + groundCheckDistance: 0.05 + despawnMinX: -12 + despawnMaxX: 12 + despawnMinY: -10 diff --git a/Assets/Scenes/Experiment.unity b/Assets/Scenes/Experiment.unity index 2bdb122..ab6b03d 100644 --- a/Assets/Scenes/Experiment.unity +++ b/Assets/Scenes/Experiment.unity @@ -410,7 +410,7 @@ BoxCollider2D: m_Enabled: 1 serializedVersion: 3 m_Density: 1 - m_Material: {fileID: 0} + m_Material: {fileID: 6200000, guid: 71737e52316f484b8c59e24137491385, type: 2} m_IncludeLayers: serializedVersion: 2 m_Bits: 0 @@ -549,7 +549,7 @@ BoxCollider2D: m_Enabled: 1 serializedVersion: 3 m_Density: 1 - m_Material: {fileID: 0} + m_Material: {fileID: 6200000, guid: 71737e52316f484b8c59e24137491385, type: 2} m_IncludeLayers: serializedVersion: 2 m_Bits: 0 @@ -686,84 +686,6 @@ Rigidbody2D: m_SleepingMode: 1 m_CollisionDetection: 0 m_Constraints: 0 ---- !u!1 &477169534 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 477169536} - - component: {fileID: 477169535} - m_Layer: 0 - m_Name: Right Barrier - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!61 &477169535 -BoxCollider2D: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 477169534} - 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: 1.4146457} - 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_Size: {x: 1, y: 6.956403} - m_EdgeRadius: 0 ---- !u!4 &477169536 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 477169534} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 6.8, y: 1.94, 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 &486463122 GameObject: m_ObjectHideFlags: 0 @@ -929,7 +851,7 @@ BoxCollider2D: m_Enabled: 1 serializedVersion: 3 m_Density: 1 - m_Material: {fileID: 0} + m_Material: {fileID: 6200000, guid: 71737e52316f484b8c59e24137491385, type: 2} m_IncludeLayers: serializedVersion: 2 m_Bits: 0 @@ -1039,84 +961,6 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 90} ---- !u!1 &689117238 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 689117240} - - component: {fileID: 689117239} - m_Layer: 0 - m_Name: Left Barrier - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!61 &689117239 -BoxCollider2D: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 689117238} - 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: 1.4146457} - 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_Size: {x: 1, y: 6.956403} - m_EdgeRadius: 0 ---- !u!4 &689117240 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 689117238} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -6.82, y: 1.25, 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 &707098062 GameObject: m_ObjectHideFlags: 0 @@ -1145,7 +989,7 @@ BoxCollider2D: m_Enabled: 1 serializedVersion: 3 m_Density: 1 - m_Material: {fileID: 0} + m_Material: {fileID: 6200000, guid: 71737e52316f484b8c59e24137491385, type: 2} m_IncludeLayers: serializedVersion: 2 m_Bits: 0 @@ -1340,7 +1184,7 @@ BoxCollider2D: m_Enabled: 1 serializedVersion: 3 m_Density: 1 - m_Material: {fileID: 0} + m_Material: {fileID: 6200000, guid: 71737e52316f484b8c59e24137491385, type: 2} m_IncludeLayers: serializedVersion: 2 m_Bits: 0 @@ -1478,7 +1322,7 @@ BoxCollider2D: m_Enabled: 1 serializedVersion: 3 m_Density: 1 - m_Material: {fileID: 0} + m_Material: {fileID: 6200000, guid: 71737e52316f484b8c59e24137491385, type: 2} m_IncludeLayers: serializedVersion: 2 m_Bits: 0 @@ -1621,6 +1465,7 @@ MonoBehaviour: spawnInterval: 5 maxAlive: 0 spawnOnStart: 1 + repeatSpawns: 1 --- !u!4 &908853550 Transform: m_ObjectHideFlags: 0 @@ -2120,6 +1965,7 @@ MonoBehaviour: spawnInterval: 5 maxAlive: 0 spawnOnStart: 1 + repeatSpawns: 1 --- !u!4 &1466477813 Transform: m_ObjectHideFlags: 0 @@ -2135,84 +1981,6 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1518904086 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1518904088} - - component: {fileID: 1518904087} - m_Layer: 0 - m_Name: Top Barrier - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!61 &1518904087 -BoxCollider2D: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1518904086} - 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: 1.4146457} - 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_Size: {x: 1, y: 6.956403} - m_EdgeRadius: 0 ---- !u!4 &1518904088 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1518904086} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0.7071068, w: 0.7071068} - m_LocalPosition: {x: 4.19, y: 5.55, z: 0} - m_LocalScale: {x: 1, y: 2.94, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 90} --- !u!1 &1654086541 GameObject: m_ObjectHideFlags: 0 @@ -2241,7 +2009,7 @@ BoxCollider2D: m_Enabled: 1 serializedVersion: 3 m_Density: 1 - m_Material: {fileID: 0} + m_Material: {fileID: 6200000, guid: 71737e52316f484b8c59e24137491385, type: 2} m_IncludeLayers: serializedVersion: 2 m_Bits: 0 @@ -2481,6 +2249,7 @@ MonoBehaviour: spawnInterval: 5 maxAlive: 0 spawnOnStart: 1 + repeatSpawns: 1 --- !u!4 &1759124604 Transform: m_ObjectHideFlags: 0 @@ -2529,6 +2298,7 @@ MonoBehaviour: spawnInterval: 5 maxAlive: 0 spawnOnStart: 1 + repeatSpawns: 1 --- !u!4 &1830238253 Transform: m_ObjectHideFlags: 0 @@ -2572,7 +2342,7 @@ BoxCollider2D: m_Enabled: 1 serializedVersion: 3 m_Density: 1 - m_Material: {fileID: 0} + m_Material: {fileID: 6200000, guid: 71737e52316f484b8c59e24137491385, type: 2} m_IncludeLayers: serializedVersion: 2 m_Bits: 0 @@ -2710,7 +2480,7 @@ BoxCollider2D: m_Enabled: 1 serializedVersion: 3 m_Density: 1 - m_Material: {fileID: 0} + m_Material: {fileID: 6200000, guid: 71737e52316f484b8c59e24137491385, type: 2} m_IncludeLayers: serializedVersion: 2 m_Bits: 0 @@ -2865,9 +2635,68 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::Spawner objectToSpawn: {fileID: 700000000, guid: 8bf8957665594a718535d06aba0cdee7, type: 3} - spawnInterval: 3 + spawnInterval: 5 maxAlive: 1 spawnOnStart: 1 + repeatSpawns: 1 +--- !u!1 &2100000100 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2100000101} + - component: {fileID: 2100000102} + m_Layer: 0 + m_Name: Trick Collision Manager + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2100000101 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2100000100} + 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 &2100000102 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2100000100} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 44f2fea877e8498fa4898917356fb2e6, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &2100000103 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2100000100} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4eb1753179e848ed8662b6f039a33df9, type: 3} + m_Name: + m_EditorClassIdentifier: + spawner: {fileID: 2100000002} + checkInterval: 1 --- !u!1001 &1760117322204329348 PrefabInstance: m_ObjectHideFlags: 0 @@ -2941,6 +2770,58 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 99cce68fc82caea44b5a140697be00a8, type: 3} +--- !u!1 &2200000000 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2200000001} + - component: {fileID: 2200000002} + m_Layer: 0 + m_Name: Treat Spawner Center + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2200000001 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2200000000} + 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 &2200000002 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2200000000} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 14b0bf07aa1abc44a8ebd00cecacd6f4, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::Spawner + objectToSpawn: {fileID: 262983251238298495, guid: 80c527a86ad6fc34dbc73ee80c1f2951, type: 3} + spawnInterval: 5 + maxAlive: 0 + spawnOnStart: 1 + repeatSpawns: 1 + launchForce: 4 + launchRandomAngle: 360 + spinSpeed: 180 --- !u!1660057539 &9223372036854775807 SceneRoots: m_ObjectHideFlags: 0 @@ -2956,9 +2837,6 @@ SceneRoots: - {fileID: 808792726} - {fileID: 495541366} - {fileID: 1118230347} - - {fileID: 477169536} - - {fileID: 1518904088} - - {fileID: 689117240} - {fileID: 1760117322204329348} - {fileID: 1277412258} - {fileID: 1227312797} @@ -2972,4 +2850,6 @@ SceneRoots: - {fileID: 29258076} - {fileID: 375061916} - {fileID: 2100000001} + - {fileID: 2100000101} + - {fileID: 2200000001} - {fileID: 1063739950} diff --git a/Assets/Scripts/PlayerPickupController.cs b/Assets/Scripts/PlayerPickupController.cs index e960e34..6a869ed 100644 --- a/Assets/Scripts/PlayerPickupController.cs +++ b/Assets/Scripts/PlayerPickupController.cs @@ -12,15 +12,24 @@ public class PlayerPickupController : MonoBehaviour [SerializeField] private string controlSchemeName = ""; [SerializeField] private int gamepadIndex = -1; private bool deviceFilterEnabled; + [SerializeField] private float minThrowSpeed = 6f; + [SerializeField] private float maxThrowSpeed = 20f; + [SerializeField] private float throwChargeTime = 0.75f; + [SerializeField] private float throwUpwardForce = 0f; + [SerializeField] private float throwTriggerThreshold = 0.6f; [Header("Setup")] public Transform holdPoint; // Empty GameObject above head public float pickupRange = 2.0f; private GameObject heldObject; + private PlayerPlatformerController platformerController; + private bool isChargingThrow; + private float throwChargeStartTime; private void OnEnable() { + platformerController = GetComponent(); if (inputActions == null) { Debug.LogError("PlayerPickupController missing InputActionAsset reference.", this); @@ -61,6 +70,7 @@ public class PlayerPickupController : MonoBehaviour } InputSystem.onDeviceChange -= HandleDeviceChange; + platformerController = null; } private void OnInteractPerformed(InputAction.CallbackContext context) @@ -69,13 +79,46 @@ public class PlayerPickupController : MonoBehaviour if(heldObject != null) { Debug.Log("Dropping held object"); - DropObject(); + DropObject(false); return; } TryPickUp(); } + private void Update() + { + if (heldObject == null) + { + return; + } + + if (!heldObject.TryGetComponent(out _)) + { + return; + } + + var gamepad = GetGamepad(); + if (gamepad == null) + { + return; + } + + var triggerValue = gamepad.rightTrigger.ReadValue(); + if (triggerValue >= throwTriggerThreshold) + { + if (!isChargingThrow) + { + isChargingThrow = true; + throwChargeStartTime = Time.time; + } + } + else if (isChargingThrow) + { + DropObject(true); + } + } + void TryPickUp() { // Find all colliders within range @@ -83,45 +126,93 @@ public class PlayerPickupController : MonoBehaviour Debug.Log(colliders.Length + " colliders found in range"); foreach (var col in colliders) { - if (col.CompareTag("Interactable")) + if (col.gameObject == gameObject) { - heldObject = col.gameObject; - - // Parent the object to the HoldPoint and reset its local position - heldObject.transform.SetParent(holdPoint); - heldObject.transform.localPosition = Vector3.zero; - heldObject.transform.localRotation = Quaternion.identity; - - // Disable physics so it doesn't fall or collide with the player - if (heldObject.TryGetComponent(out Rigidbody2D rb)) - { - rb.bodyType = RigidbodyType2D.Kinematic; - rb.gravityScale = 0; - rb.mass = 0; - } - - if (heldObject.TryGetComponent(out var trick)) - { - trick.SetCarried(true); - } - - if (col != null) col.enabled = false; - break; + continue; } + + var hasTrick = col.TryGetComponent(out var trick); + var hasPlayer = col.TryGetComponent(out var playerController); + if (!hasTrick && !hasPlayer && !col.CompareTag("Interactable")) + { + continue; + } + + heldObject = col.gameObject; + + // Parent the object to the HoldPoint and reset its local position + heldObject.transform.SetParent(holdPoint); + heldObject.transform.localPosition = Vector3.zero; + heldObject.transform.localRotation = Quaternion.identity; + + // Disable physics so it doesn't fall or collide with the player + if (heldObject.TryGetComponent(out Rigidbody2D rb)) + { + rb.bodyType = RigidbodyType2D.Kinematic; + rb.gravityScale = 0; + rb.mass = 0; + } + + if (trick != null) + { + trick.SetCarried(true); + } + + if (playerController != null) + { + playerController.enabled = false; + if (heldObject.TryGetComponent(out var heldPickup)) + { + heldPickup.enabled = false; + } + } + + if (col != null) col.enabled = false; + break; } } - void DropObject() + void DropObject(bool applyThrow) { // Re-enable physics if (heldObject.TryGetComponent(out Rigidbody2D rb)) { rb.bodyType = RigidbodyType2D.Dynamic; rb.gravityScale = 1; + rb.linearVelocity = Vector2.zero; } if (heldObject.TryGetComponent(out var trick)) { trick.SetCarried(false); + if (applyThrow) + { + trick.OnThrown(); + } + } + if (heldObject.TryGetComponent(out var playerController)) + { + playerController.enabled = true; + if (heldObject.TryGetComponent(out var heldPickup)) + { + heldPickup.enabled = true; + } + } + if (applyThrow && heldObject.TryGetComponent(out Rigidbody2D throwBody)) + { + var direction = 1f; + if (platformerController != null && Mathf.Abs(platformerController.LastMoveX) > 0.01f) + { + direction = Mathf.Sign(platformerController.LastMoveX); + } + var charge01 = 1f; + if (isChargingThrow) + { + var heldTime = Time.time - throwChargeStartTime; + charge01 = Mathf.Clamp01(heldTime / Mathf.Max(0.01f, throwChargeTime)); + } + var throwSpeed = Mathf.Lerp(minThrowSpeed, maxThrowSpeed, charge01); + throwBody.linearVelocity = new Vector2(direction * throwSpeed, 0f); + throwBody.angularVelocity = 0f; } Collider2D col = heldObject.GetComponent(); if (col != null) col.enabled = true; @@ -129,6 +220,29 @@ public class PlayerPickupController : MonoBehaviour // Unparent heldObject.transform.SetParent(null); heldObject = null; + isChargingThrow = false; + } + + private Gamepad GetGamepad() + { + if (runtimeActions == null) + { + return null; + } + + var devices = runtimeActions.devices; + if (devices != null) + { + foreach (var device in devices) + { + if (device is Gamepad gamepad) + { + return gamepad; + } + } + } + + return Gamepad.current; } private bool ShouldFilterDevices() diff --git a/Assets/Scripts/PlayerPlatformerController.cs b/Assets/Scripts/PlayerPlatformerController.cs index 2562486..97d4962 100644 --- a/Assets/Scripts/PlayerPlatformerController.cs +++ b/Assets/Scripts/PlayerPlatformerController.cs @@ -22,6 +22,7 @@ public class PlayerPlatformerController : MonoBehaviour private InputActionAsset runtimeActions; private InputAction moveAction; private InputAction jumpAction; + public float LastMoveX { get; private set; } private bool deviceFilterEnabled; private void Awake() @@ -86,6 +87,10 @@ public class PlayerPlatformerController : MonoBehaviour } var input = moveAction.ReadValue(); + if (Mathf.Abs(input.x) > 0.01f) + { + LastMoveX = input.x; + } var velocity = body.linearVelocity; velocity.x = input.x * moveSpeed; body.linearVelocity = velocity; diff --git a/Assets/Scripts/Spawner.cs b/Assets/Scripts/Spawner.cs index 2559848..4fc23fe 100644 --- a/Assets/Scripts/Spawner.cs +++ b/Assets/Scripts/Spawner.cs @@ -10,6 +10,10 @@ public class Spawner : MonoBehaviour public float spawnInterval = 1f; [SerializeField] private int maxAlive = 0; [SerializeField] private bool spawnOnStart = true; + [SerializeField] private bool repeatSpawns = true; + [SerializeField] private float launchForce = 0f; + [SerializeField] private float launchRandomAngle = 0f; + [SerializeField] private float spinSpeed = 0f; private readonly List spawned = new List(); @@ -23,8 +27,24 @@ public class Spawner : MonoBehaviour void Start() { - // Start the spawning process using a Coroutine - StartCoroutine(SpawnRoutine()); + if (repeatSpawns) + { + // Start the spawning process using a Coroutine + StartCoroutine(SpawnRoutine()); + } + } + + private void Update() + { + if (spinSpeed != 0f) + { + transform.Rotate(0f, 0f, spinSpeed * Time.deltaTime); + } + } + + public void SpawnNow() + { + SpawnOnce(); } private IEnumerator SpawnRoutine() @@ -62,6 +82,13 @@ public class Spawner : MonoBehaviour var instance = Instantiate(objectToSpawn, transform.position, Quaternion.identity); spawned.Add(instance); + + if (launchForce > 0f && instance.TryGetComponent(out var body)) + { + var angleOffset = launchRandomAngle > 0f ? Random.Range(-launchRandomAngle, launchRandomAngle) : 0f; + var direction = Quaternion.Euler(0f, 0f, angleOffset) * transform.right; + body.AddForce(direction.normalized * launchForce, ForceMode2D.Impulse); + } } private int CountAlive() diff --git a/Assets/Scripts/TrickCollisionManager.cs b/Assets/Scripts/TrickCollisionManager.cs new file mode 100644 index 0000000..de5f81e --- /dev/null +++ b/Assets/Scripts/TrickCollisionManager.cs @@ -0,0 +1,46 @@ +using UnityEngine; + +public class TrickCollisionManager : MonoBehaviour +{ + [SerializeField] private string trickLayerName = "Trick"; + [SerializeField] private string playerLayerName = "Player"; + [SerializeField] private string treatLayerName = "Treat"; + private bool initialized; + + private void Awake() + { + Initialize(); + } + + private void Initialize() + { + if (initialized) + { + return; + } + + var trickLayer = LayerMask.NameToLayer(trickLayerName); + if (trickLayer == -1) + { + Debug.LogWarning("Trick layer not found. Create a layer named 'Trick' and assign it to Trick prefab."); + return; + } + + Physics2D.IgnoreLayerCollision(trickLayer, trickLayer, true); + IgnoreLayerPair(trickLayer, playerLayerName); + IgnoreLayerPair(trickLayer, treatLayerName); + initialized = true; + } + + private void IgnoreLayerPair(int trickLayer, string otherLayerName) + { + var otherLayer = LayerMask.NameToLayer(otherLayerName); + if (otherLayer == -1) + { + Debug.LogWarning($"Layer '{otherLayerName}' not found. Configure it if you want Trick to ignore collisions with it."); + return; + } + + Physics2D.IgnoreLayerCollision(trickLayer, otherLayer, true); + } +} diff --git a/Assets/Scripts/TrickCollisionManager.cs.meta b/Assets/Scripts/TrickCollisionManager.cs.meta new file mode 100644 index 0000000..5ce1d5a --- /dev/null +++ b/Assets/Scripts/TrickCollisionManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 44f2fea877e8498fa4898917356fb2e6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/TrickController.cs b/Assets/Scripts/TrickController.cs index c27237f..f1775d2 100644 --- a/Assets/Scripts/TrickController.cs +++ b/Assets/Scripts/TrickController.cs @@ -1,16 +1,38 @@ +using System; using System.Collections.Generic; using UnityEngine; +using Random = UnityEngine.Random; + [RequireComponent(typeof(Rigidbody2D))] [RequireComponent(typeof(Collider2D))] public class TrickController : MonoBehaviour { + private static readonly List ActiveTricks = new List(); + private static PlayerPlatformerController[] cachedPlayers = Array.Empty(); + private static float nextPlayerCacheTime; + public static int ActiveCount => ActiveTricks.Count; + [SerializeField] private string treatTag = "Interactable"; [SerializeField] private float moveSpeed = 3.5f; [SerializeField] private float targetRefreshInterval = 0.4f; [SerializeField] private float consumeDistance = 0.35f; [SerializeField] private float wanderInterval = 1.2f; + [SerializeField] private float consumeCooldown = 1.5f; [SerializeField] private TrickController trickPrefab; + [SerializeField] private float avoidPlayerRadius = 1.2f; + [SerializeField] private float treatSeekWeight = 1f; + [SerializeField] private float wanderWeight = 0.4f; + [SerializeField] private int maxTricks = 50; + [SerializeField] private float jumpImpulse = 6f; + [SerializeField] private float jumpCooldown = 1f; + [SerializeField] private float jumpChancePerSecond = 0.5f; + [SerializeField] private LayerMask groundMask = ~0; + [SerializeField] private float groundCheckDistance = 0.05f; + [SerializeField] private float despawnMinX = -12f; + [SerializeField] private float despawnMaxX = 12f; + [SerializeField] private float despawnMinY = -10f; + [SerializeField] private float throwControlLockTime = 0.35f; private Rigidbody2D body; private Transform target; @@ -18,6 +40,10 @@ public class TrickController : MonoBehaviour private Vector2 wanderDirection; private float nextWanderTime; private bool isCarried; + private float nextConsumeTime; + private float desiredXVelocity; + private float nextJumpTime; + private float movementLockUntil; private void Awake() { @@ -29,6 +55,22 @@ public class TrickController : MonoBehaviour body.interpolation = RigidbodyInterpolation2D.Interpolate; } + private void OnEnable() + { + if (!ActiveTricks.Contains(this)) + { + ActiveTricks.Add(this); + } + + nextConsumeTime = Time.time + consumeCooldown; + } + + private void OnDisable() + { + ActiveTricks.Remove(this); + } + + private void Update() { if (isCarried) @@ -36,6 +78,13 @@ public class TrickController : MonoBehaviour return; } + var position = transform.position; + if (position.x < despawnMinX || position.x > despawnMaxX || position.y < despawnMinY) + { + Destroy(gameObject); + return; + } + if (Time.time >= nextTargetTime) { target = FindNearestTreat(); @@ -52,7 +101,7 @@ public class TrickController : MonoBehaviour nextTargetTime = Time.time + targetRefreshInterval; } - if (target == null && Time.time >= nextWanderTime) + if (Time.time >= nextWanderTime) { wanderDirection = Random.insideUnitCircle.normalized; if (wanderDirection.sqrMagnitude < 0.01f) @@ -72,22 +121,50 @@ public class TrickController : MonoBehaviour return; } + if (Time.time < movementLockUntil) + { + return; + } + + if (!IsGrounded()) + { + var airborne = body.linearVelocity; + airborne.x = 0f; + body.linearVelocity = airborne; + return; + } + Vector2 desiredVelocity; - var stopForTreat = false; - if (target != null) + var hasTarget = target != null; + var canConsume = Time.time >= nextConsumeTime; + + var desiredX = 0f; + if (hasTarget && canConsume) { var direction = ((Vector2)target.position - (Vector2)transform.position).normalized; - desiredVelocity = new Vector2(direction.x * moveSpeed, 0f); - stopForTreat = Vector2.Distance(transform.position, target.position) <= consumeDistance; + desiredX += direction.x * treatSeekWeight; } else { - desiredVelocity = new Vector2(wanderDirection.x * (moveSpeed * 0.6f), 0f); + desiredX += wanderDirection.x * wanderWeight; } + // No trick-avoidance bias. + + if (Mathf.Abs(desiredX) < 0.01f) + { + desiredX = wanderDirection.x * 0.2f; + } + + desiredVelocity = new Vector2(Mathf.Clamp(desiredX, -1f, 1f) * moveSpeed, 0f); + var velocity = body.linearVelocity; - velocity.x = stopForTreat ? 0f : desiredVelocity.x; + desiredXVelocity = desiredVelocity.x; + velocity.x = Mathf.Lerp(velocity.x, desiredXVelocity, 0.25f); body.linearVelocity = velocity; + + var isMoving = Mathf.Abs(desiredXVelocity) > 0.1f; + TryJump(isMoving, desiredXVelocity); } private Transform FindNearestTreat() @@ -136,6 +213,11 @@ public class TrickController : MonoBehaviour return; } + if (Time.time < nextConsumeTime) + { + return; + } + var hits = Physics2D.OverlapCircleAll(transform.position, consumeDistance); for (var i = 0; i < hits.Length; i++) { @@ -146,18 +228,26 @@ public class TrickController : MonoBehaviour } var spawnPosition = hit.transform.position; + hit.enabled = false; + hit.gameObject.tag = "Untagged"; Destroy(hit.gameObject); if (target == hit.transform) { target = null; } SpawnTrick(spawnPosition); + nextConsumeTime = Time.time + consumeCooldown; break; } } private void SpawnTrick(Vector3 position) { + if (maxTricks > 0 && ActiveTricks.Count >= maxTricks) + { + return; + } + if (trickPrefab != null) { Instantiate(trickPrefab, position, Quaternion.identity); @@ -167,15 +257,136 @@ public class TrickController : MonoBehaviour Instantiate(gameObject, position, Quaternion.identity); } + private float GetAvoidPlayerDirection() + { + if (Time.time >= nextPlayerCacheTime) + { + cachedPlayers = FindObjectsByType(FindObjectsSortMode.None); + nextPlayerCacheTime = Time.time + 0.5f; + } + + var players = cachedPlayers; + if (players == null || players.Length == 0) + { + return 0f; + } + + Transform closest = null; + var closestDist = float.MaxValue; + var origin = transform.position; + for (var i = 0; i < players.Length; i++) + { + var candidate = players[i]; + if (candidate == null || !candidate.gameObject.activeInHierarchy) + { + continue; + } + + var dist = Vector2.Distance(origin, candidate.transform.position); + if (dist < closestDist) + { + closestDist = dist; + closest = candidate.transform; + } + } + + if (closest == null || closestDist > avoidPlayerRadius) + { + return 0f; + } + + return Mathf.Sign(origin.x - closest.position.x); + } + + + private void TryJump(bool isMoving, float jumpDirection) + { + if (!isMoving || Time.time < nextJumpTime) + { + return; + } + + if (!IsGrounded()) + { + return; + } + + var chance = jumpChancePerSecond * Time.fixedDeltaTime; + if (Random.value > chance) + { + return; + } + + var velocity = body.linearVelocity; + velocity.y = 0f; + var jumpDir = Mathf.Sign(jumpDirection); + if (jumpDir == 0f) + { + jumpDir = Random.value < 0.5f ? -1f : 1f; + } + velocity.x = jumpDir * moveSpeed; + body.linearVelocity = velocity; + body.AddForce(Vector2.up * jumpImpulse, ForceMode2D.Impulse); + nextJumpTime = Time.time + jumpCooldown; + } + + private bool IsGrounded() + { + var collider = GetComponent(); + if (collider == null) + { + return false; + } + + var bounds = collider.bounds; + var checkSize = new Vector2(bounds.size.x * 0.9f, groundCheckDistance * 2f); + var checkCenter = new Vector2(bounds.center.x, bounds.min.y - groundCheckDistance); + var hits = Physics2D.OverlapBoxAll(checkCenter, checkSize, 0f, groundMask); + for (var i = 0; i < hits.Length; i++) + { + var hit = hits[i]; + if (hit != null && hit != collider) + { + return true; + } + } + + return false; + } + + public void SetCarried(bool carried) { isCarried = carried; if (carried) { target = null; + desiredXVelocity = 0f; var velocity = body.linearVelocity; velocity.x = 0f; + velocity.y = 0f; body.linearVelocity = velocity; + nextJumpTime = Time.time + 0.1f; + if (TryGetComponent(out var collider)) + { + collider.enabled = false; + } + } + else + { + var velocity = body.linearVelocity; + velocity.x = 0f; + velocity.y = 0f; + body.linearVelocity = velocity; + if (TryGetComponent(out var collider)) + { + collider.enabled = true; + } } } + + public void OnThrown() + { + movementLockUntil = Time.time + throwControlLockTime; + } } diff --git a/Assets/Scripts/TrickSpawnKeeper.cs b/Assets/Scripts/TrickSpawnKeeper.cs new file mode 100644 index 0000000..cbeb6c0 --- /dev/null +++ b/Assets/Scripts/TrickSpawnKeeper.cs @@ -0,0 +1,27 @@ +using UnityEngine; + +public class TrickSpawnKeeper : MonoBehaviour +{ + [SerializeField] private Spawner spawner; + [SerializeField] private float checkInterval = 1f; + private float nextCheckTime; + + private void Update() + { + if (Time.time < nextCheckTime) + { + return; + } + + nextCheckTime = Time.time + checkInterval; + if (spawner == null) + { + return; + } + + if (TrickController.ActiveCount == 0) + { + spawner.SpawnNow(); + } + } +} diff --git a/Assets/Scripts/TrickSpawnKeeper.cs.meta b/Assets/Scripts/TrickSpawnKeeper.cs.meta new file mode 100644 index 0000000..6fdd91f --- /dev/null +++ b/Assets/Scripts/TrickSpawnKeeper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4eb1753179e848ed8662b6f039a33df9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ProjectSettings/TagManager.asset b/ProjectSettings/TagManager.asset index e3bd134..8374309 100644 --- a/ProjectSettings/TagManager.asset +++ b/ProjectSettings/TagManager.asset @@ -9,7 +9,7 @@ TagManager: - Default - TransparentFX - Ignore Raycast - - + - Trick - Water - UI - @@ -42,3 +42,5 @@ TagManager: - name: Default uniqueID: 0 locked: 0 + m_RenderingLayers: + - Default