Так что мы пытаемся сделать плавное движение для персонажа нашего игрока, когда они ходят. Прогулка продиктована пользовательским вводом с помощью клавиш со стрелками. У нее есть класс анимации и класс коллайдера, который прилагается к ней, чтобы держать ход на ходу и держать ее на игровом поле. Проблема в том, что он будет перемещать только одно рывкое движение за раз, а не продолжать движение, когда клавиша со стрелкой вниз. Какие-либо предложения?Анимации сглаживания в единстве (2D Unity in C#)
using UnityEngine;
using System.Collections;
public class GridMove : MonoBehaviour
{
private float moveSpeed = 128f;
private float gridSize = 64f;
private enum Orientation { Horizontal, Vertical };
private Orientation gridOrientation = Orientation.Horizontal;
private bool allowDiagonals = false;
private bool correctDiagonalSpeed = true;
private Vector2 input;
public bool isMoving = false;
private Vector3 startPosition, endPosition;
private float t;
private float factor;
public bool wallLeft = false;
public bool wallRight = false;
public bool wallUp = false;
public bool wallDown = false;
void Start()
{
startPosition = transform.position;
}
// Update is called once per frame
void Update()
{
CheckInput();
if (isMoving)
{
transform.position = endPosition;
isMoving = false;
}
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;
}
}
if (input != Vector2.zero)
{
StartCoroutine(move(transform));
}
}
}
public IEnumerator move(Transform transform)
{
isMoving = true;
startPosition = transform.position;
t = 0;
if (allowDiagonals && correctDiagonalSpeed && input.x != 0 && input.y != 0)
{
factor = 0.7071f;
}
else
{
factor = 1f;
}
while (t < 1f)
{
t += Time.deltaTime * (moveSpeed/gridSize) * factor;
transform.position = Vector3.Lerp(startPosition, endPosition, t);
yield return null;
}
isMoving = false;
yield return 0;
}
private void CheckInput()
{
if (Input.GetKeyDown(KeyCode.D) || Input.GetKeyDown(KeyCode.RightArrow) && wallRight == false)
{
endPosition += Vector3.right * gridSize;
isMoving = true;
}
else if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.LeftArrow) && wallLeft == false)
{
endPosition -= Vector3.right * gridSize;
isMoving = true;
}
else if (Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.UpArrow) && wallUp == false)
{
endPosition += Vector3.up * gridSize;
isMoving = true;
}
else if (Input.GetKeyDown(KeyCode.S) || Input.GetKeyDown(KeyCode.DownArrow) && wallDown == false)
{
endPosition -= Vector3.up * gridSize;
isMoving = true;
}
}
}
коллайдер SCRIPT
using UnityEngine;
using System.Collections;
public class Collider : MonoBehaviour
{
void OnTriggerEnter2D(Collider2D col)
{
Debug.Log("enter");
if (col.CompareTag("left wall"))
{
Debug.Log("i see a little sillouetto of a man");
GetComponent<GridMove>().wallLeft = true;
Debug.Log("left");
}
else if (col.CompareTag("right wall"))
{
GetComponent<GridMove>().wallRight = true;
}
else if (col.CompareTag("up wall"))
{
GetComponent<GridMove>().wallUp = true;
}
else if (col.CompareTag("down wall"))
{
GetComponent<GridMove>().wallDown = true;
}
}
void OnTriggerExit2D(Collider2D col)
{
if (col.CompareTag("left wall"))
{
GetComponent<GridMove>().wallLeft = false;
}
else if (col.CompareTag("right wall"))
{
GetComponent<GridMove>().wallRight = false;
}
else if (col.CompareTag("up wall"))
{
GetComponent<GridMove>().wallUp = false;
}
else if (col.CompareTag("down wall"))
{
GetComponent<GridMove>().wallDown = false;
}
}
}
Неужели это анимация не гладкая или это просто движение/скорость плавности? – 111WARLOCK111
Я действительно не понимаю, почему вы используете эту сопрограмму в обновлении, а не просто перемещаете, насколько далеко вы можете за один кадр, пока кнопка удерживается. я совершенно уверен, что проблема также лежит там, но до тех пор, пока я не понимаю, почему она должна быть там, я не могу дать дальнейшие рекомендации. – yes