From f593bc2e209e36db0d11f17743d2510de2342f49 Mon Sep 17 00:00:00 2001 From: Pierre Ryssen Date: Tue, 31 Mar 2026 20:54:44 +0200 Subject: [PATCH] perf: add a grabbable layer and set all things that can be grab in one file --- .../Code/Scripts/Player/PlayerHeadControll.cs | 111 ++++-- Assets/Level/Scenes/Level/01/Level01.unity | 349 +++++++++--------- ProjectSettings/TagManager.asset | 2 +- 3 files changed, 243 insertions(+), 219 deletions(-) diff --git a/Assets/Code/Scripts/Player/PlayerHeadControll.cs b/Assets/Code/Scripts/Player/PlayerHeadControll.cs index a6b70ea..e8dd525 100644 --- a/Assets/Code/Scripts/Player/PlayerHeadControll.cs +++ b/Assets/Code/Scripts/Player/PlayerHeadControll.cs @@ -2,18 +2,25 @@ using UnityEngine; public class PlayerHeadController : MonoBehaviour { + [Header("Head")] public Transform Head; public Transform CameraTransform; - public Transform BodyTransform; - - public float ThrowForce; public float PickupDistance; public bool isHoldingHead; - private Rigidbody m_headRigidbody; + [Header("Grabbable")] + public Transform HandTransform; // in teh future hand maybe grab items but for now its an empty object + public float ItemThrowForce = 10f; + public float ItemPickupDistance = 5f; + private bool isHoldingItem; + private Rigidbody m_itemRigidbody; + private Collider m_itemCollider; + private Transform m_currentItem; + + private Rigidbody m_headRigidbody; private Vector3 m_headInitialLocalPos; private Quaternion m_headInitialLocalRot; @@ -31,7 +38,6 @@ public class PlayerHeadController : MonoBehaviour Cursor.lockState = CursorLockMode.Locked; Vector3 offset = new Vector3(0f, -0.5f, 0.5f); - m_headInitialLocalPos = BodyTransform.localPosition + offset; m_headInitialLocalRot = BodyTransform.localRotation; m_headRigidbody = Head.GetComponent(); @@ -42,14 +48,20 @@ public class PlayerHeadController : MonoBehaviour void Update() { if (input.HeadInteractionPressed) - { InteractHead(); - } - if (input.ThrowPressed) - { + if (input.ThrowPressed && isHoldingHead) ThrowHead(); + + if (input.InteractPressed) + { + if (!isHoldingItem) + TryPickupItem(); + else + DropItem(); } + if (input.ThrowPressed && isHoldingItem) + ThrowItem(); } private void InteractHead() @@ -60,61 +72,84 @@ public class PlayerHeadController : MonoBehaviour DropHead(); } + private void TryPickupHead() + { + if (isHoldingHead || isHoldingItem) + return; + if (Vector3.Distance(transform.position, Head.position) <= PickupDistance) + PickupHead(); + } + + private void PickupHead() + { + isHoldingHead = true; + + if (m_headRigidbody != null) + Destroy(m_headRigidbody); + + Head.SetParent(transform); + Head.localPosition = m_headInitialLocalPos; + Head.localRotation = m_headInitialLocalRot; + } private void DropHead() { - Debug.Log("DropHead"); animator.SetTrigger("Throw"); - isHoldingHead = false; Head.SetParent(null); m_headRigidbody = Head.gameObject.AddComponent(); m_headRigidbody.mass = 1f; - m_headRigidbody.constraints = RigidbodyConstraints.FreezeRotationX | RigidbodyConstraints.FreezeRotationZ | RigidbodyConstraints.FreezeRotationY; } - private void ThrowHead() { - Debug.Log("ThrowHead"); - if (!isHoldingHead) - return; - DropHead(); - m_headRigidbody.AddForce(CameraTransform.forward * ThrowForce, ForceMode.Impulse); } - - private void TryPickupHead() + private void TryPickupItem() { - if (isHoldingHead) + if (isHoldingHead || isHoldingItem) return; + int grabbableLayer = LayerMask.GetMask("Grabbable"); + Collider[] hits = Physics.OverlapSphere(transform.position, ItemPickupDistance, grabbableLayer); - float distance = Vector3.Distance(transform.position, Head.position); - - if (distance <= PickupDistance) + foreach (Collider hit in hits) { - PickupHead(); + m_currentItem = hit.transform; + m_itemRigidbody = hit.GetComponent(); + m_itemCollider = hit.GetComponent(); + PickupItem(); + return; } } - private void PickupHead() + private void PickupItem() { - Debug.Log("PickupHead"); - isHoldingHead = true; + isHoldingItem = true; + m_itemRigidbody.isKinematic = true; + m_itemCollider.enabled = false; - if (m_headRigidbody != null) - { - Destroy(m_headRigidbody); - } - - Head.SetParent(transform); - - Head.localPosition = m_headInitialLocalPos; - Head.localRotation = m_headInitialLocalRot; + m_currentItem.SetParent(HandTransform); + m_currentItem.localPosition = Vector3.zero; + m_currentItem.localRotation = Quaternion.identity; } -} \ No newline at end of file + + private void DropItem() + { + isHoldingItem = false; + m_currentItem.SetParent(null); + m_itemRigidbody.isKinematic = false; + m_itemCollider.enabled = true; + m_currentItem = null; + } + + private void ThrowItem() + { + DropItem(); + m_itemRigidbody.AddForce(BodyTransform.forward * ItemThrowForce, ForceMode.Impulse); + } +} \ No newline at end of file diff --git a/Assets/Level/Scenes/Level/01/Level01.unity b/Assets/Level/Scenes/Level/01/Level01.unity index 03534d5..4ee2df5 100644 --- a/Assets/Level/Scenes/Level/01/Level01.unity +++ b/Assets/Level/Scenes/Level/01/Level01.unity @@ -297,6 +297,11 @@ Mesh: - serializedVersion: 1 m_IndexStart: 0 m_IndexCount: 0 +--- !u!4 &53730944 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 8258725777112540271, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3} + m_PrefabInstance: {fileID: 2031184782} + m_PrefabAsset: {fileID: 0} --- !u!43 &70226124 Mesh: m_ObjectHideFlags: 0 @@ -2443,181 +2448,6 @@ Mesh: - serializedVersion: 1 m_IndexStart: 0 m_IndexCount: 0 ---- !u!1 &830206780 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 830206784} - - component: {fileID: 830206783} - - component: {fileID: 830206782} - - component: {fileID: 830206781} - - component: {fileID: 830206786} - - component: {fileID: 830206785} - - component: {fileID: 830206787} - m_Layer: 0 - m_Name: Cube - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!65 &830206781 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 830206780} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: 0, z: 0} ---- !u!23 &830206782 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 830206780} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RayTracingAccelStructBuildFlagsOverride: 0 - m_RayTracingAccelStructBuildFlags: 1 - m_SmallMeshCulling: 1 - m_ForceMeshLod: -1 - m_MeshLodSelectionBias: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, 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: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_GlobalIlluminationMeshLod: 0 - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_MaskInteraction: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &830206783 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 830206780} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &830206784 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 830206780} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -39.38, y: 6.56, z: -9.27} - 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!65 &830206785 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 830206780} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: 0, z: 0} ---- !u!54 &830206786 -Rigidbody: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 830206780} - serializedVersion: 5 - m_Mass: 1 - m_LinearDamping: 0 - m_AngularDamping: 0.05 - m_CenterOfMass: {x: 0, y: 0, z: 0} - m_InertiaTensor: {x: 1, y: 1, z: 1} - m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ImplicitCom: 1 - m_ImplicitTensor: 1 - m_UseGravity: 1 - m_IsKinematic: 0 - m_Interpolate: 0 - m_Constraints: 0 - m_CollisionDetection: 0 ---- !u!114 &830206787 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 830206780} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a36af2e55a3732eb2abc110ae2365702, type: 3} - m_Name: - m_EditorClassIdentifier: '::' --- !u!43 &883770463 Mesh: m_ObjectHideFlags: 0 @@ -6431,6 +6261,11 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 2da51dfecccc45b469912e3bb3f1953b, type: 3} m_Name: m_EditorClassIdentifier: Assembly-CSharp::PlayerHeadController +--- !u!4 &1707402985 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7821156882341915560, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3} + m_PrefabInstance: {fileID: 2031184782} + m_PrefabAsset: {fileID: 0} --- !u!43 &1732395164 Mesh: m_ObjectHideFlags: 0 @@ -7203,6 +7038,80 @@ MonoBehaviour: textColor: {r: 1, g: 1, b: 1, a: 1} speakerColor: {r: 1, g: 0.85, b: 0.35, a: 1} backgroundColor: {r: 0, g: 0, b: 0, a: 0.62} +--- !u!1001 &1902652822 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 53541677567227536, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: HandTransform + value: + objectReference: {fileID: 2137556223} + - target: {fileID: 53541677567227536, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: CameraTransform + value: + objectReference: {fileID: 53730944} + - target: {fileID: 53541677567227536, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: PlayerTransform + value: + objectReference: {fileID: 1707402985} + - target: {fileID: 1945301683602458784, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: m_LocalPosition.x + value: -35.48739 + objectReference: {fileID: 0} + - target: {fileID: 1945301683602458784, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: m_LocalPosition.y + value: 0.49999958 + objectReference: {fileID: 0} + - target: {fileID: 1945301683602458784, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: m_LocalPosition.z + value: 2.5272882 + objectReference: {fileID: 0} + - target: {fileID: 1945301683602458784, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1945301683602458784, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1945301683602458784, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1945301683602458784, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1945301683602458784, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1945301683602458784, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1945301683602458784, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8295937476714018201, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: m_Name + value: ThrowableCube (1) + objectReference: {fileID: 0} + - target: {fileID: 8295937476714018201, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: m_Layer + value: 6 + objectReference: {fileID: 0} + m_RemovedComponents: + - {fileID: 53541677567227536, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} --- !u!43 &1929503721 Mesh: m_ObjectHideFlags: 0 @@ -7976,14 +7885,14 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: + - target: {fileID: 4313489822343726709, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3} + propertyPath: HandTransform + value: + objectReference: {fileID: 2137556223} - target: {fileID: 6544026473454475707, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3} propertyPath: m_Name value: Player objectReference: {fileID: 0} - - target: {fileID: 6975610370707183838, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - target: {fileID: 7821156882341915560, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3} propertyPath: m_LocalPosition.x value: -30.54 @@ -8207,6 +8116,11 @@ Mesh: - serializedVersion: 1 m_IndexStart: 0 m_IndexCount: 0 +--- !u!4 &2137556223 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 3832855070939641903, guid: d7417f9daec269d43bdfd5a35f2da89a, type: 3} + m_PrefabInstance: {fileID: 2031184782} + m_PrefabAsset: {fileID: 0} --- !u!1001 &2029273738738782450 PrefabInstance: m_ObjectHideFlags: 0 @@ -8749,6 +8663,80 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 93cf9d955f7e24b6aa0837b955d009e3, type: 3} +--- !u!1001 &5783770961855197083 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 53541677567227536, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: HandTransform + value: + objectReference: {fileID: 2137556223} + - target: {fileID: 53541677567227536, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: CameraTransform + value: + objectReference: {fileID: 53730944} + - target: {fileID: 53541677567227536, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: PlayerTransform + value: + objectReference: {fileID: 1707402985} + - target: {fileID: 1945301683602458784, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: m_LocalPosition.x + value: -39.38 + objectReference: {fileID: 0} + - target: {fileID: 1945301683602458784, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: m_LocalPosition.y + value: 6.56 + objectReference: {fileID: 0} + - target: {fileID: 1945301683602458784, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: m_LocalPosition.z + value: -9.27 + objectReference: {fileID: 0} + - target: {fileID: 1945301683602458784, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1945301683602458784, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1945301683602458784, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1945301683602458784, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1945301683602458784, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1945301683602458784, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1945301683602458784, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8295937476714018201, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: m_Name + value: ThrowableCube + objectReference: {fileID: 0} + - target: {fileID: 8295937476714018201, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + propertyPath: m_Layer + value: 6 + objectReference: {fileID: 0} + m_RemovedComponents: + - {fileID: 53541677567227536, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: c786dcd5f720bb47dbf843bd97137452, type: 3} --- !u!1001 &8573843940365930253 PrefabInstance: m_ObjectHideFlags: 0 @@ -9204,4 +9192,5 @@ SceneRoots: - {fileID: 1539339757} - {fileID: 2031184782} - {fileID: 1368253247} - - {fileID: 830206784} + - {fileID: 5783770961855197083} + - {fileID: 1902652822} diff --git a/ProjectSettings/TagManager.asset b/ProjectSettings/TagManager.asset index e46a9b9..83a677c 100644 --- a/ProjectSettings/TagManager.asset +++ b/ProjectSettings/TagManager.asset @@ -13,7 +13,7 @@ TagManager: - Ground - Water - UI - - + - Grabbable - - -