I have a character moving with a Rigidbody on a skateboard in first person
When I arrive at the springboard, I need to write a method that would twist the character, relative to the springboard, as the character arrives
How to implement it, please tell me?
Here is the code of the character’s movement on the skateboard:
using UnityEngine;
public class PlayerSkate : MonoBehaviour
{
private const float RotateFloatX = 2.25f;
private const float SpeedChanged = 0.25f;
private const float RotateSkateboardInFly = 8.0f;
private const float LandingAccelerationRatio = 0.5f;
[Header("Основные настройки скейтборда для игрока")]
public Transform[] WheelsMesh;
[Range(0.0f,65.0f)]
public float MaxSpeed = 30.0f;
[Range(2.5f, 20.0f)]
public float BackSpeed = 2.5f;
[Range(2.0f,10.0f)]
public float MultiPlayerPower = 4.0f;
[Range(3.0f, 12.5f)]
public float JumpForce = 8.0f;
[Range(2.0f, 10.0f)]
public float EulerPower = 6.0f;
private RaycastHit _slopeHit;
private float _speed = 0.0f;
private float _jumpForce = 0.0f;
private float _rotateXFloat = 0.0f;
private float _vertical;
private float _horizontal;
private Vector3 _eulerAngles;
private Vector3 _moveDirection;
private PlayerInput _playerInput;
private PlayerComponent _thisPlayer;
private PlayerMovement _playerMovement;
private MouseLook _mouseLook;
private Collider[] _isGroundedColliders;
private Collider[] _isLayerColliders;
private void Start()
{
InitializationPlayerInput();
}
private void InitializationPlayerInput()
{
PlayerInput = GetComponent<PlayerInput>();
PlayerMovement = GetComponent<PlayerMovement>();
ThisPlayer = GetComponent<PlayerComponent>();
GroundedData();
}
private void Update()
{
GroundedData();
DirectionPlayerUpdate();
DragPlayerUpdate();
SpeedSkatePlayerUpdate();
JumpPlayerUpdate();
}
private void FixedUpdate()
{
SkateMovement();
WheelsAnimated();
PlayerAnimated();
}
private void PlayerAnimated()
{
foreach (var comp in ThisPlayer.PlayerAnimations)
{
comp.SkateMovement = (Speed < MaxSpeed - 0.7f && VerticalAxis > 0) || (Speed > BackSpeed - 0.7f && VerticalAxis < 0);
}
}
private void SkateMovement()
{
if (!PlayerMovement.PressedSelectorWeapon)
{
if (IsGrounded && !OnSlope())
{
PlayerMovement.Controller.AddForce(MoveDirectionNormalized * Speed * MultiPlayerPower, ForceMode.Acceleration);
}
else if (!IsGrounded)
{
PlayerMovement.Controller.AddForce(_moveDirection.normalized * JumpForce * MultiPlayerPower * PlayerMovement.AirMultiplier, ForceMode.Acceleration);
}
}
}
private void JumpPlayerUpdate()
{
if (PressedJumpUpButton && IsGrounded)
{
PlayerMovement.Controller.velocity = new Vector3(PlayerMovement.Controller.velocity.x, 0, PlayerMovement.Controller.velocity.z);
PlayerMovement.Controller.AddForce(Orientation.forward * VerticalAxis + Orientation.up * JumpForce, ForceMode.Impulse);
}
}
public void GroundedData()
{
_isGroundedColliders = Physics.OverlapSphere(_thisPlayer.GroundChecker.position, PlayerMovement.CheckerGroundSphereRadius, PlayerMovement.GroundMask);
_isLayerColliders = Physics.OverlapSphere(_thisPlayer.GroundChecker.position, PlayerMovement.CheckerGroundSphereRadius, PlayerMovement.GroundLayer);
}
public bool IsGrounded
{
get
{
return _isGroundedColliders.Length > 0;
}
}
private void SpeedSkatePlayerUpdate()
{
if (VerticalAxis > 0)
{
Speed = Mathf.Lerp(Speed, MaxSpeed, Time.deltaTime * SpeedChanged);
RotateXFloat = Mathf.Lerp(RotateXFloat, 1f, Time.deltaTime * RotateFloatX);
}
else if (VerticalAxis < 0)
{
Speed = Mathf.Lerp(Speed, BackSpeed, Time.deltaTime * MultiPlayerPower);
RotateXFloat = Mathf.Lerp(RotateXFloat, -1f, Time.deltaTime * RotateFloatX);
}
else
{
Speed = Mathf.Lerp(Speed, 0f, Time.deltaTime * SpeedChanged);
RotateXFloat = Mathf.Lerp(RotateXFloat, 0f, Time.deltaTime * RotateFloatX);
}
}
private void DirectionPlayerUpdate()
{
_moveDirection = Orientation.forward * RotateXFloat;
}
public Vector3 MoveDirectionNormalized
{
get
{
return _moveDirection.normalized;
}
}
private void DragPlayerUpdate()
{
if (PressedSlidingButton && OnSlope())
{
PlayerMovement.Controller.drag = PlayerMovement.SlopeDrag;
}
else if (IsGrounded && !PressedCrouchButton)
{
PlayerMovement.Controller.drag = PlayerMovement.GroundDrag;
}
else if (IsGrounded && PressedCrouchButton)
{
PlayerMovement.Controller.drag = PlayerMovement.CrouchGroundDrag;
}
else
{
PlayerMovement.Controller.drag = PlayerMovement.AirDrag;
}
}
public bool OnSlope()
{
var height = ThisPlayer.PlayerHeight / 2 + PlayerMovement.GroundDistance;
if (Physics.Raycast(ThisPlayer.GroundChecker.position, Vector3.down, out _slopeHit, height))
{
return _slopeHit.normal != Vector3.up;
}
return false;
}
private void WheelsAnimated()
{
for(var i = 0; i < WheelsMesh.Length; i++)
{
WheelsMesh[i].transform.Rotate(RotateXFloat, 0, 0);
}
}
public bool PressedJumpHotButton
{
get
{
return PlayerInput.JumpHot;
}
}
public bool PressedJumpButton
{
get
{
return PlayerInput.Jump;
}
}
public bool PressedJumpUpButton
{
get
{
return PlayerInput.JumpUp;
}
}
public bool PressedCrouchButton
{
get
{
return _playerInput.Crouch;
}
}
public bool PressedSlidingButton
{
get
{
return _playerInput.Sliding;
}
}
public float VerticalAxis
{
get
{
return PlayerInput.VerticalMovement();
}
}
public float HorizontalAxis
{
get
{
return PlayerInput.HorizontalMovement();
}
}
private Transform Orientation
{
get
{
return PlayerMovement.Orientation;
}
}
public PlayerInput PlayerInput { get => _playerInput; set => _playerInput = value; }
public float Speed { get => _speed; set => _speed = value; }
public float RotateXFloat { get => _rotateXFloat; set => _rotateXFloat = value; }
public PlayerComponent ThisPlayer { get => _thisPlayer; set => _thisPlayer = value; }
public PlayerMovement PlayerMovement { get => _playerMovement; set => _playerMovement = value; }
public MouseLook MouseLook { get => _mouseLook; set => _mouseLook = value; }
public Vector3 EulerAngles { get => _eulerAngles; set => _eulerAngles = value; }
public float Vertical { get => _vertical; set => _vertical = value; }
public float Horizontal { get => _horizontal; set => _horizontal = value; }
}
