Hello, I have a player that moves on the platform and rotates 90 degree when it collides with a bend. After it passes the bend, it must continue moving from the middle of the next platform. I could set its position manually but I don’t want it to teleport. I have tried to reach the middle by changing player’s rotating speed but it is pretty hard to find the “perfect” speed. I want to know if there is a proper way to do this ? Thank you.
It must rotate like this after rotating.
When i increase rotation speed it continues moving like this. I want to keep distances between edges equal and independent from rotation speed. How can I achieve it ?
Here I have a video that shows how it goes out of the middle of the platform:
Movement Controller:
public class PlayerMovementController : MonoBehaviour
{
[SerializeField] private ScriptablePlayerMovementSettings _movementSettings;
private Rigidbody rb;
private void Awake()
{
Initialize();
}
private void Initialize()
{
rb = GetComponent<Rigidbody>();
}
private void FixedUpdate()
{
Move();
}
private void Move()
{
Vector3 movement = transform.forward * _movementSettings.MovementSpeed * Time.fixedDeltaTime;
rb.MovePosition(transform.position + movement);
}
}
Rotation Controller:
public class PlayerRotationController : MonoBehaviour
{
[SerializeField] private ScriptablePlayerRotationSettings _rotationSettings;
private float _direction = 0;
public float Direction { get => _direction; set => _direction = value; }
private Vector3 _lastRotation = Vector3.zero;
private void Update()
{
if (Direction != 0)
Rotate();
}
private void Rotate()
{
PlayerManager.Instance.PlayerState = PlayerState.Rotating;
Vector3 targetRotation = GetLastRotation() + Vector3.up * Direction * 90f;
targetRotation = new Vector3(targetRotation.x, targetRotation.y % 360, targetRotation.z);
transform.rotation = Quaternion.RotateTowards(transform.rotation, Quaternion.Euler(targetRotation), _rotationSettings.RotationSpeed * Time.deltaTime);
if (transform.eulerAngles.Equals(Quaternion.Euler(targetRotation).eulerAngles))
{
SetLastRotation();
Direction = 0;
PlayerManager.Instance.PlayerState = PlayerState.Normal;
}
}
private void SetLastRotation()
{
_lastRotation = transform.rotation.eulerAngles;
}
private Vector3 GetLastRotation()
{
return _lastRotation;
}
}
I get the direction value based on bend type:
public class PlatformCollisionManager : MonoBehaviour
{
private void OnTriggerEnter(Collider other)
{
if (other.gameObject.GetComponentInParent<PlayerRotationController>() != null)
{
PlayerRotationController playerRotationController = other.gameObject.GetComponentInParent<PlayerRotationController>();
playerRotationController.Direction = (GetComponentInParent<MiddlePlatformMono>().GetPlatformType == PlatformType.TurnLeft) ? -1f : 1f;
}
}
}

