How do I obtain smooth movement of a 3d object on an int grid?
I have the following code that works well at a basic level:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour {
Vector3 destination;
public float moveSpeed = 5;
void Start() {
// Set destination to current position
destination = transform.position;
}
void Update() {
// Is the object already at it's destination?
if(transform.position != destination) {
// Move object towards destination at set moveSpeed
transform.position = Vector3.MoveTowards(transform.position,destination,moveSpeed * Time.deltaTime);
} else {
// If object is already at destination, check if player wants to move horizontally or vertically or neither
if(Input.GetAxisRaw("Horizontal") != 0) {
// Set the new destination to a fixed int position, maintaining grid coordinates
destination = new Vector3(transform.position.x + Mathf.RoundToInt(Input.GetAxisRaw("Horizontal")),0,transform.position.z);
} else if (Input.GetAxisRaw("Vertical") != 0) {
// Set the new destination to a fixed int position, maintaining grid coordinates
destination = new Vector3(transform.position.x,0,transform.position.z + Mathf.RoundToInt(Input.GetAxisRaw("Vertical")));
}
}
}
}
My problem occurs when the Vector3.MoveTowards function moves the object the very last time, it only moves a fraction of it's previous distances with each move. By only moving the last remaining distance to the destination - the time between the partial movement and the next frame results in a jitter/staggered movement. I would like to be able to move the object smoothly without a stutter in the next direction the player is pressing. Any help would be appreciated, the resources on the internet don't appear to solve this problem.
It doesn't seem possible to do... *Attempting to calculate the average maximum displacement per frame to get a round total when adding all the steps, looks like it could make the problem worse because of the very variable nature of delta time. If the last maximum displacement won't be just enough to arrive at destination, by very little, then the next frame needs to move that very little. Worse. *I considered FixedUpdate, but then realized it's really not applicable here because it won't match screen updates. *Ditching delta time is not an option for obvious reasons. I think the nature of the variable frame duration makes your goal impossible to attain. I won't swear by it tho. I wish you good luck and I'll be following this as it's an interesting dilemma. Cheers.