using Darkmatter.Core; using Darkmatter.Domain; using System; using System.Collections; using UnityEngine; using UnityEngine.Animations.Rigging; using VContainer; namespace Darkmatter.Presentation { public class PlayerMotor : MonoBehaviour, IPlayerPawn { [Header("LookSetting")] public Transform cinemachineFollowTarget; [Header("MoveSetting")] public CharacterController characterController; [Header("GravitySetting")] private float verticalVelocity; public bool isGrounded => IsOnGround(); [Header("GroundCheckSensorSetting")] public float groundOffset; public float groundCheckRadius; public LayerMask groundLayer; [Header("TurnSetting")] public float turnSpeed = 5f; [Inject] private PlayerConfigSO playerConfig; private void Start() { Cursor.lockState = CursorLockMode.Locked; } //state based functions public void Move(Vector3 motion) { ApplyGravity(); //apply gravity before moving Vector3 finalMove = motion; finalMove.y = verticalVelocity; characterController.Move(finalMove * Time.deltaTime); } public void SetCameraRotation(float pitch, float yaw) { cinemachineFollowTarget.rotation = Quaternion.Euler(pitch, yaw, 0); transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(0,yaw,0), Time.deltaTime*turnSpeed); //rotate player towards the camera forward axis } public void Jump(float jumpForce) { verticalVelocity = jumpForce; } public bool IsOnGround() { Vector3 groundPos = transform.position + Vector3.down * groundOffset; return Physics.CheckSphere( groundPos, groundCheckRadius, groundLayer, QueryTriggerInteraction.Ignore ); } public void ApplyGravity() { if (isGrounded && verticalVelocity < 0f) { verticalVelocity = -2f; // snap to ground } verticalVelocity += playerConfig.gravity * Time.deltaTime; } void OnDrawGizmosSelected() { Gizmos.color = Color.green; Vector3 groundPos = transform.position + Vector3.down * groundOffset; Gizmos.DrawWireSphere(groundPos, groundCheckRadius); } } }