2016-04-27 11 views
1

Wir versuchen also, den Spielercharakter beim Laufen fließend zu bewegen. Der Weg wird durch Benutzereingaben über die Pfeiltasten bestimmt. Sie hat eine Animationsklasse und eine Collider-Klasse, die an ihr befestigt ist, um ihren Laufzyklus im Laufen zu halten und sie auf dem Spielbrett zu halten. Das Problem ist, dass es nur eine ruckartige Bewegung auf einmal bewegt, anstatt weiter zu bewegen, wenn die Pfeiltaste herunterhilft. Irgendwelche Vorschläge?Glättung von Gehanimationen in Einheit (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; 
     } 
    } 

} 

COLLIDER 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

Ist es die Animation nicht glatt oder Es ist nur die Bewegung/Geschwindigkeit Glätte? – 111WARLOCK111

+0

ich verstehe nicht wirklich, warum Sie diese Coroutine im Update verwenden, anstatt nur zu verschieben, wie weit Sie pro Frame gehen können, solange die Taste gedrückt gehalten wird. Ich bin mir ziemlich sicher, dass das Problem auch dort begraben liegt, aber solange ich nicht verstehe, warum es da sein muss, kann ich keine weiteren Ratschläge geben. – yes

Antwort

0

Ihr Code hat ein paar mehr Probleme, die aufgeräumt werden konnte. Aber um Ihr Problem mit dem Code zu beheben, den Sie gerade geändert haben, ändern Sie Ihre Update-Schleife in den folgenden.

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