using RebootKit.Engine.Extensions; using RebootKit.Engine.Foundation; using RebootKit.Engine.Services.Simulation; using RebootKit.FPPKit; using Unity.Mathematics; using UnityEngine; using Logger = RebootKit.Engine.Foundation.Logger; namespace RealityReboot.jelycho.Player { public class PlayerActor : Actor { static readonly Logger s_logger = new(nameof(PlayerActor)); [SerializeField] PlayerFPPLocomotion m_Locomotion; [SerializeField] FPPCamera m_Camera; [SerializeField] Animator m_Animator; [SerializeField] Transform m_DragGutStartPosition; [SerializeField] PhysicsObjectDragger m_PhysicsDragger; [SerializeField] FloatRange m_DragDistanceRange = new(1.0f, 5.0f); [SerializeField] LineRenderer m_LineRenderer; public override void OnTick() { m_PhysicsDragger.TargetWorldPosition = m_Camera.Camera.transform.position + m_Camera.Camera.transform.forward * 2.0f; if (m_PhysicsDragger.Current.OrNull() != null) { m_LineRenderer.enabled = true; m_LineRenderer.SetPosition(0, m_LineRenderer.transform.InverseTransformPoint(m_DragGutStartPosition.position)); m_LineRenderer.SetPosition(1, m_LineRenderer.transform.InverseTransformPoint(m_PhysicsDragger.Current.position)); } else { m_LineRenderer.enabled = false; } UpdateAnimator(); } public void Jump() { m_Locomotion.Jump(); } public void Look(Vector2 input) { m_Camera.Rotate(input.x, input.y); } public void SetMoveInput(Vector2 input) { float3 direction = Quaternion.AngleAxis(m_Camera.Yaw, Vector3.up) * new float3(input.x, 0.0f, input.y); m_Locomotion.SetWishDirection(direction); } public void StartDrag() { GameObject pickedGameObject = m_Camera.Sensor.Sense(); if (pickedGameObject != null && pickedGameObject.TryGetComponent(out Rigidbody rigidbody)) { m_PhysicsDragger.Grab(rigidbody); } } public void StopDrag() { m_PhysicsDragger.Drop(); } struct AnimatorParamHashes { public static readonly int s_VelocityForwardNormalized = Animator.StringToHash("VelocityForwardNormalized"); public static readonly int s_VelocityRightNormalized = Animator.StringToHash("VelocityRightNormalized"); public static readonly int s_IsGrounded = Animator.StringToHash("IsGrounded"); } void UpdateAnimator() { float forwardNormalized = m_Locomotion.LocalVelocity.z / m_Locomotion.runSpeed; m_Animator.SetFloat(AnimatorParamHashes.s_VelocityForwardNormalized, forwardNormalized); m_Animator.SetFloat(AnimatorParamHashes.s_VelocityRightNormalized, 0.0f); m_Animator.SetBool(AnimatorParamHashes.s_IsGrounded, m_Locomotion.IsGrounded); } } }