From 18f0a6ef894dd59fdb8ef751f5d2f942bc63b28d Mon Sep 17 00:00:00 2001 From: Warwick Date: Fri, 1 Aug 2025 15:42:48 +0100 Subject: [PATCH] Real simple character controller --- Assets/Player/Player v2.prefab | 242 +++++++++++++++++++++++ Assets/Player/Player v2.prefab.meta | 7 + Assets/Player/PlayerController.cs | 17 +- Assets/Player/PlayerControllerV2.cs | 74 +++++++ Assets/Player/PlayerControllerV2.cs.meta | 2 + Assets/Scenes/SampleScene.unity | 40 ++-- 6 files changed, 361 insertions(+), 21 deletions(-) create mode 100644 Assets/Player/Player v2.prefab create mode 100644 Assets/Player/Player v2.prefab.meta create mode 100644 Assets/Player/PlayerControllerV2.cs create mode 100644 Assets/Player/PlayerControllerV2.cs.meta diff --git a/Assets/Player/Player v2.prefab b/Assets/Player/Player v2.prefab new file mode 100644 index 0000000..11b4f9a --- /dev/null +++ b/Assets/Player/Player v2.prefab @@ -0,0 +1,242 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &2141177638863853690 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7697809476534322287} + - component: {fileID: 1083078546844739873} + - component: {fileID: 8561671271692338072} + - component: {fileID: 5613749609374521207} + m_Layer: 0 + m_Name: Player v2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7697809476534322287 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2141177638863853690} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 5.48, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6376801734831298219} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!143 &1083078546844739873 +CharacterController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2141177638863853690} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Height: 2 + m_Radius: 0.5 + m_SlopeLimit: 45 + m_StepOffset: 0.3 + m_SkinWidth: 0.08 + m_MinMoveDistance: 0.001 + m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &8561671271692338072 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2141177638863853690} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 62899f850307741f2a39c98a8b639597, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Actions: {fileID: -944628639613478452, guid: 052faaac586de48259a63d0c4782560b, type: 3} + m_NotificationBehavior: 0 + m_UIInputModule: {fileID: 0} + m_DeviceLostEvent: + m_PersistentCalls: + m_Calls: [] + m_DeviceRegainedEvent: + m_PersistentCalls: + m_Calls: [] + m_ControlsChangedEvent: + m_PersistentCalls: + m_Calls: [] + m_ActionEvents: [] + m_NeverAutoSwitchControlSchemes: 0 + m_DefaultControlScheme: + m_DefaultActionMap: Player + m_SplitScreenIndex: -1 + m_Camera: {fileID: 0} +--- !u!114 &5613749609374521207 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2141177638863853690} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2ea132b548a841a92b8b15f59bc0d06d, type: 3} + m_Name: + m_EditorClassIdentifier: + m_LookSensitivity: 25 +--- !u!1 &8826976905446641190 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6376801734831298219} + - component: {fileID: 6344181611153634006} + - component: {fileID: 6064830331528158381} + - component: {fileID: 4447036270723459215} + m_Layer: 0 + m_Name: Camera + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6376801734831298219 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8826976905446641190} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0.75, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 7697809476534322287} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!20 &6344181611153634006 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8826976905446641190} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!81 &6064830331528158381 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8826976905446641190} + m_Enabled: 1 +--- !u!114 &4447036270723459215 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8826976905446641190} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_RenderShadows: 1 + m_RequiresDepthTextureOption: 2 + m_RequiresOpaqueTextureOption: 2 + m_CameraType: 0 + m_Cameras: [] + m_RendererIndex: -1 + m_VolumeLayerMask: + serializedVersion: 2 + m_Bits: 1 + m_VolumeTrigger: {fileID: 0} + m_VolumeFrameworkUpdateModeOption: 2 + m_RenderPostProcessing: 0 + m_Antialiasing: 0 + m_AntialiasingQuality: 2 + m_StopNaN: 0 + m_Dithering: 0 + m_ClearDepth: 1 + m_AllowXRRendering: 1 + m_AllowHDROutput: 1 + m_UseScreenCoordOverride: 0 + m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0} + m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0} + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_Version: 2 + m_TaaSettings: + m_Quality: 3 + m_FrameInfluence: 0.1 + m_JitterScale: 1 + m_MipBias: 0 + m_VarianceClampScale: 0.9 + m_ContrastAdaptiveSharpening: 0 diff --git a/Assets/Player/Player v2.prefab.meta b/Assets/Player/Player v2.prefab.meta new file mode 100644 index 0000000..6eaf929 --- /dev/null +++ b/Assets/Player/Player v2.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e40d6e6334224f4b9bf92360e9672abb +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Player/PlayerController.cs b/Assets/Player/PlayerController.cs index b7c2b1b..7ca0108 100644 --- a/Assets/Player/PlayerController.cs +++ b/Assets/Player/PlayerController.cs @@ -1,4 +1,5 @@ using UnityEngine; +using UnityEngine.InputSystem; public class PlayerController : MonoBehaviour { @@ -12,6 +13,12 @@ public class PlayerController : MonoBehaviour private float m_MovementSmoothing = .05f; private bool m_isColliding = false; + void Awake() + { + m_Rigidbody = GetComponent(); + m_Camera = GetComponent(); + } + void FixedUpdate() { m_IsGrounded = false; @@ -32,9 +39,13 @@ void OnJump() } } - void Awake() + void OnMove(InputValue value) { - m_Rigidbody = GetComponent(); - m_Camera = GetComponent(); + m_MoveInput = value.Get(); + } + + void OnLook(InputValue value) + { + m_LookInput = value.Get(); } } \ No newline at end of file diff --git a/Assets/Player/PlayerControllerV2.cs b/Assets/Player/PlayerControllerV2.cs new file mode 100644 index 0000000..f639fd1 --- /dev/null +++ b/Assets/Player/PlayerControllerV2.cs @@ -0,0 +1,74 @@ +using UnityEngine; +using UnityEngine.InputSystem; + +public class PlayerControllerV2 : MonoBehaviour +{ + private CharacterController m_CharacterController; + private Camera m_Camera; + private bool m_IsGrounded = false; + private bool m_WantJump = false; + public float m_LookSensitivity = 25f; + public float m_PlayerSpeed = 10f; + private Vector2 m_MoveInput = Vector2.zero; + private Vector2 m_LookInput = Vector2.zero; + private Vector3 m_Velocity = Vector3.zero; + private float m_MovementSmoothing = .05f; + private bool m_isColliding = false; + + void Awake() + { + m_CharacterController = GetComponent(); + m_Camera = GetComponentInChildren(); + Cursor.lockState = CursorLockMode.Locked; + } + + void FixedUpdate() + { + m_IsGrounded = false; + RaycastHit hit; // TODO: Use to see if on train later and ground angle if that's relevant + if (Physics.Raycast(transform.position, Vector3.down, out hit, 1.1f)) + { + m_IsGrounded = true; + } + + Look(); + Move(); + } + + private void Look() + { + m_CharacterController.transform.Rotate(Vector3.up * m_LookInput.x * m_LookSensitivity * Time.deltaTime); + + float pitchRotation = m_Camera.transform.eulerAngles.x; + if (pitchRotation > 270) pitchRotation -= 360; + pitchRotation -= m_LookInput.y * m_LookSensitivity * Time.deltaTime; + //pitchRotation = Mathf.Clamp(pitchRotation, -90f, 90f); + + m_Camera.transform.localRotation = Quaternion.Euler(pitchRotation, 0f, 0f); + } + private void Move() + { + Vector3 direction = transform.right * m_MoveInput.x + + transform.forward * m_MoveInput.y; + m_CharacterController.Move(direction * m_PlayerSpeed * Time.deltaTime); + } + + void OnJump() + { + if (m_IsGrounded) + { + //m_CharacterController.AddForce(new Vector3(0f,400f,0f)); + m_IsGrounded = false; + } + } + + void OnMove(InputValue value) + { + m_MoveInput = value.Get(); + } + + void OnLook(InputValue value) + { + m_LookInput = value.Get(); + } +} \ No newline at end of file diff --git a/Assets/Player/PlayerControllerV2.cs.meta b/Assets/Player/PlayerControllerV2.cs.meta new file mode 100644 index 0000000..9561edc --- /dev/null +++ b/Assets/Player/PlayerControllerV2.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2ea132b548a841a92b8b15f59bc0d06d diff --git a/Assets/Scenes/SampleScene.unity b/Assets/Scenes/SampleScene.unity index 32f5094..897fd27 100644 --- a/Assets/Scenes/SampleScene.unity +++ b/Assets/Scenes/SampleScene.unity @@ -398,7 +398,7 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1001 &1476481899 +--- !u!1001 &1578543071 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 @@ -406,55 +406,59 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 0} m_Modifications: - - target: {fileID: 8225490198093921212, guid: 72d28109bada8ab47a916e31869629ab, type: 3} + - target: {fileID: 2141177638863853690, guid: e40d6e6334224f4b9bf92360e9672abb, type: 3} + propertyPath: m_Name + value: Player v2 + objectReference: {fileID: 0} + - target: {fileID: 5613749609374521207, guid: e40d6e6334224f4b9bf92360e9672abb, type: 3} + propertyPath: m_LookSensitivity + value: 25 + objectReference: {fileID: 0} + - target: {fileID: 7697809476534322287, guid: e40d6e6334224f4b9bf92360e9672abb, type: 3} propertyPath: m_LocalPosition.x value: 0 objectReference: {fileID: 0} - - target: {fileID: 8225490198093921212, guid: 72d28109bada8ab47a916e31869629ab, type: 3} + - target: {fileID: 7697809476534322287, guid: e40d6e6334224f4b9bf92360e9672abb, type: 3} propertyPath: m_LocalPosition.y - value: 1.65 + value: 5.48 objectReference: {fileID: 0} - - target: {fileID: 8225490198093921212, guid: 72d28109bada8ab47a916e31869629ab, type: 3} + - target: {fileID: 7697809476534322287, guid: e40d6e6334224f4b9bf92360e9672abb, type: 3} propertyPath: m_LocalPosition.z value: 0 objectReference: {fileID: 0} - - target: {fileID: 8225490198093921212, guid: 72d28109bada8ab47a916e31869629ab, type: 3} + - target: {fileID: 7697809476534322287, guid: e40d6e6334224f4b9bf92360e9672abb, type: 3} propertyPath: m_LocalRotation.w value: 1 objectReference: {fileID: 0} - - target: {fileID: 8225490198093921212, guid: 72d28109bada8ab47a916e31869629ab, type: 3} + - target: {fileID: 7697809476534322287, guid: e40d6e6334224f4b9bf92360e9672abb, type: 3} propertyPath: m_LocalRotation.x value: 0 objectReference: {fileID: 0} - - target: {fileID: 8225490198093921212, guid: 72d28109bada8ab47a916e31869629ab, type: 3} + - target: {fileID: 7697809476534322287, guid: e40d6e6334224f4b9bf92360e9672abb, type: 3} propertyPath: m_LocalRotation.y value: 0 objectReference: {fileID: 0} - - target: {fileID: 8225490198093921212, guid: 72d28109bada8ab47a916e31869629ab, type: 3} + - target: {fileID: 7697809476534322287, guid: e40d6e6334224f4b9bf92360e9672abb, type: 3} propertyPath: m_LocalRotation.z value: 0 objectReference: {fileID: 0} - - target: {fileID: 8225490198093921212, guid: 72d28109bada8ab47a916e31869629ab, type: 3} + - target: {fileID: 7697809476534322287, guid: e40d6e6334224f4b9bf92360e9672abb, type: 3} propertyPath: m_LocalEulerAnglesHint.x value: 0 objectReference: {fileID: 0} - - target: {fileID: 8225490198093921212, guid: 72d28109bada8ab47a916e31869629ab, type: 3} + - target: {fileID: 7697809476534322287, guid: e40d6e6334224f4b9bf92360e9672abb, type: 3} propertyPath: m_LocalEulerAnglesHint.y value: 0 objectReference: {fileID: 0} - - target: {fileID: 8225490198093921212, guid: 72d28109bada8ab47a916e31869629ab, type: 3} + - target: {fileID: 7697809476534322287, guid: e40d6e6334224f4b9bf92360e9672abb, type: 3} propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} - - target: {fileID: 8489361161931675719, guid: 72d28109bada8ab47a916e31869629ab, type: 3} - propertyPath: m_Name - value: Player - objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 72d28109bada8ab47a916e31869629ab, type: 3} + m_SourcePrefab: {fileID: 100100000, guid: e40d6e6334224f4b9bf92360e9672abb, type: 3} --- !u!1660057539 &9223372036854775807 SceneRoots: m_ObjectHideFlags: 0 @@ -462,4 +466,4 @@ SceneRoots: - {fileID: 410087041} - {fileID: 832575519} - {fileID: 825820392} - - {fileID: 1476481899} + - {fileID: 1578543071}