2016-04-27 6 views
1

Так что мы пытаемся сделать плавное движение для персонажа нашего игрока, когда они ходят. Прогулка продиктована пользовательским вводом с помощью клавиш со стрелками. У нее есть класс анимации и класс коллайдера, который прилагается к ней, чтобы держать ход на ходу и держать ее на игровом поле. Проблема в том, что он будет перемещать только одно рывкое движение за раз, а не продолжать движение, когда клавиша со стрелкой вниз. Какие-либо предложения?Анимации сглаживания в единстве (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; 
     } 
    } 

} 
+0

Неужели это анимация не гладкая или это просто движение/скорость плавности? – 111WARLOCK111

+0

Я действительно не понимаю, почему вы используете эту сопрограмму в обновлении, а не просто перемещаете, насколько далеко вы можете за один кадр, пока кнопка удерживается. я совершенно уверен, что проблема также лежит там, но до тех пор, пока я не понимаю, почему она должна быть там, я не могу дать дальнейшие рекомендации. – yes

ответ

0

Ваш код имеет несколько вопросов, которые могут быть очищены. Но чтобы исправить вашу проблему с помощью кода, который вы только что изменили, цикл обновления приведен ниже.

void Update() 
{ 
    if(!isMoving) 
    { 
     CheckInput(); 

     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; 
       } 
      } 

      StartCoroutine(move(transform)); 
     } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^