Help regarding "Collect Cubes" Like Player Movement and Rotation

Hi fellow game devs,
I am having difficulty recreating kinda same movement and rotation like the game “Collect Cubes”

So far I have wrote an script that somewhat works like the game but I haven’t yet been able to reach the desired outcome. In Collect cubes the player moves and smoothly rotates along the user touch swipe/drag direction and the smooth transition don’t mess with collision or other physics properties.

Here is what I have done so far…

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;

public class PlayerController : MonoBehaviour
{
    private Rigidbody rigidBody;
    private Vector3 screenPoint;
    private Vector3 offset;
    private Vector2 startPos;
    private bool isSwiping;
    private Vector3 direction;
    private Vector2 currentSwipeDelta;
    private Vector2 previousSwipeDelta;
    private Vector3 moveDirection;
    public float movementSpeed;
    private Vector3 newDir;
    private float swipeStartTime;
    private float swipeEndTime;
    private float swipeInterval;

    // Start is called before the first frame update
    void Start()
    {
        rigidBody = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        PlayerInput();
    }

    private void PlayerInput()
    {
        if (Input.GetMouseButtonDown(0))
        {
            startPos = Input.mousePosition;
            GameManager.Instance.StartGame();
        }

        if (Input.GetMouseButton(0))
        {
            isSwiping = true;
            direction = Input.mousePosition - (Vector3)startPos;
            direction = Vector3.Normalize(direction);
        }

        if (Input.GetMouseButtonUp(0))
        {
            isSwiping = false;
            direction = Vector2.zero;
        }

        currentSwipeDelta = Vector2.zero;

        if (isSwiping)
        {
            currentSwipeDelta = Input.mousePosition - (Vector3)startPos;
        }

        transform.localPosition = new Vector3(Mathf.Clamp(transform.localPosition.x, -5.9f, 5.9f), transform.position.y, Mathf.Clamp(transform.localPosition.z, -1f, 21f));
    }

    private void FixedUpdate()
    {
        if (currentSwipeDelta.magnitude > 30)
        {
            moveDirection.x = direction.x;
            moveDirection.z = direction.y;
            moveDirection.y = 0f;

            // Rotation
            Quaternion newRotation = Quaternion.LookRotation(moveDirection);
            Quaternion deltaRotation = Quaternion.Euler(new Vector3(0f, 360f, 0f) * Time.deltaTime);
            rigidBody.MoveRotation(newRotation * deltaRotation);

            // Move
            rigidBody.velocity = moveDirection * movementSpeed;
        }
    }
}

What I am doing wrong and what needs to be done to achive the smooth movement like Collect Cubes?
Any help will be appreciated. Thanks in advance :slight_smile:

Hello @theAbtahi,

here are some easy tweaks (i’m not sure which one would actually be the one you seek) ;

To smooth direction change (and also velocity change given your script)

// Smooth directions changes
float directionSmoothing = 0.5f,
moveDirection.x = Mathf.Lerp(moveDirection.x, direction.x, directionSmoothing) ;
moveDirection.z = Mathf.Lerp(moveDirection.z, direction.y, directionSmoothing) ;
moveDirection.y = 0f;

To avoid lags (typo)

Quaternion deltaRotation = Quaternion.Euler(new Vector3(0f, 360f, 0f) * Time.fixedDeltaTime);

To limit the force applied by other objects on your player, try putting player rigidbody mass to a very high value (tho it might reject objects quite violently). An other way would be to control player position in the LateUpdate function (and not it’s rigidbody).