- Home /
Trying to get a smooth gridmove
I'm using a modified gridmove script thats on the wiki. The exact code is below. The issues I have is when I'm holding down the arrow keys, the movement isn't smooth. Its like it pauses a fraction of a second on each grid before moving to the next location. It seems as though there is a curve to the speed from grid to grid location, starts slow, speeds up, slows down, pauses 200ms and then moves on.
How can I get smooth movement when the arrow keys are pressed, but still limit the movement to a grid?
using System.Collections;
using UnityEngine;
class GridMove : MonoBehaviour {
private float moveSpeed = 4f;
private float gridSize = 1f;
private enum Orientation {
Horizontal,
Vertical
};
private Orientation gridOrientation = Orientation.Horizontal;
private bool allowDiagonals = false;
private bool correctDiagonalSpeed = true;
private Vector2 input;
private bool isMoving = false;
private Vector3 startPosition;
private Vector3 endPosition;
private float t;
private float factor;
private string lastDirection = "";
public void Update() {
if (!isMoving) {
input = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
if (!allowDiagonals) {
if (Mathf.Abs(input.x) > Mathf.Abs(input.y)) {
input.y = 0;
} else {
input.x = 0;
}
}
string direction = "none";
if (input.x > 0 && input.y == 0) {
direction = "right";
}
else if (input.x < 0 && input.y == 0) {
direction = "left";
}
else if (input.x == 0 && input.y > 0) {
direction = "up";
}
else if (input.x == 0 && input.y < 0) {
direction = "down";
}
if (!lastDirection.Equals(direction)) {
Messenger.Broadcast<GameObject, string>("PlayerDirection", transform.gameObject, direction);
lastDirection = direction;
}
if (input != Vector2.zero) {
StartCoroutine(move(transform));
}
}
}
public IEnumerator move(Transform transform) {
isMoving = true;
t = 0;
if (startPosition == endPosition) {
startPosition = transform.position;
if(gridOrientation == Orientation.Horizontal) {
endPosition = new Vector3(startPosition.x + System.Math.Sign(input.x) * gridSize,
startPosition.y, startPosition.z + System.Math.Sign(input.y) * gridSize);
} else {
endPosition = new Vector3(startPosition.x + System.Math.Sign(input.x) * gridSize,
startPosition.y + System.Math.Sign(input.y) * gridSize, startPosition.z);
}
}
RaycastHit hitInfo;
if (Physics.Linecast(startPosition, endPosition, out hitInfo)) {
if (hitInfo.transform.tag.Equals("NO_PASS") || hitInfo.transform.tag.Equals("ROCK")) {
endPosition = startPosition;
}
Messenger.Broadcast<GameObject>("PlayerEat", hitInfo.transform.gameObject);
}
if(allowDiagonals && correctDiagonalSpeed && input.x != 0 && input.y != 0) {
factor = 0.7071f;
} else {
factor = 1f;
}
while (t < 1f) {
t += Time.deltaTime * (moveSpeed/gridSize) * factor;
if (t > 1.0) {
t = 1.0f;
}
transform.position = Vector3.Lerp(startPosition, endPosition, t);
yield return null;
}
startPosition = endPosition;
isMoving = false;
yield return 0;
}
}
Comment
Your answer
![](https://koobas.hobune.stream/wayback/20220613192706im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
2D Game, Player Not to move if a wall is next to it C# 1 Answer
GridMove-based movement 'jerkiness' 1 Answer
Fixed Step Movement 2 Answers
Faults with Grid-Based movement... 2 Answers