2016-09-30 4 views
0

Momentan arbeite ich an einigen Spielerbewegungen. Die Grundidee meines Spielers bewegt sich nur horizontal und vertikal, nicht diagonal. Ich konnte keine vernünftige Lösung für dieses Problem finden. Ich möchte wirklich nicht starricbody oder character.controller für jetzt verwenden. Die andere Sache, die ich erreichen möchte, ist, wenn ich mehrere Richtungstasten drücke, möchte ich, dass sich mein Player direkt in die zuletzt gedrückte Richtung bewegt. Hier ist mein Code:in die letzte gedrückte Richtung ohne diagonale Bewegung bewegen

using UnityEngine; 
using System.Collections; 


public class controller : MonoBehaviour { 
    public int movementspeed; 
    // Use this for initialization 
    void Start() { 

    } 

    // Update is called once per frame 
    void Update() { 


     if (Input.GetKey (KeyCode.A)) { 
      //ratation 
      transform.localEulerAngles = new Vector3(0,270,0); 
      //move 
      transform.Translate (transform.right * movementspeed * Time.deltaTime); 

     } 
     else if(Input.GetKey (KeyCode.D)) { 
      //ratation 
      transform.localEulerAngles = new Vector3(0,90,0); 
      //move 
      transform.Translate (transform.right *(-1)* movementspeed * Time.deltaTime); 


     } 
     else if(Input.GetKey (KeyCode.S)) { 
      //ratation 
      transform.localEulerAngles = new Vector3(0,180,0); 
      //move 
      transform.Translate (transform.forward * (-1) * movementspeed * Time.deltaTime); 
     } 
     else if (Input.GetKey (KeyCode.W)) { 
      //ratation 
      transform.localEulerAngles = new Vector3(0,0,0); 
      //move 
      transform.Translate (transform.forward * movementspeed * Time.deltaTime); 

     } 
     else if (Input.GetKey (KeyCode.A)) { 
      //ratation 
      transform.localEulerAngles = new Vector3(0,270,0); 
      //move 
      transform.Translate (transform.right * movementspeed * Time.deltaTime); 

     } 
    } 
} 

Antwort

2

Die Struktur Ihrer Auswahlanweisung wird Ihnen diese Funktionalität nicht geben. Da es das erste if prüft, dann wenn es falsch ist, wird es das nächste else if und so weiter prüfen. Also, wenn ich A gedrückt halte, egal was ich drücke, werde ich immer nur den A-Teil des Codes erreichen.

Was ich tun würde, wenn ich Sie wäre, ist eine weitere Schicht darüber hinzuzufügen. Erkennt nur Key-Down-Ereignisse und setzt passende Variablen. Wenn Sie diese festlegen, deaktivieren Sie die anderen. Verwenden Sie dann diese Variablen zum Verschieben. Gefällt mir:

bool left, right, up, down; 
void CheckInput() { 
    if (Input.GetKeyDown(KeyCode.W) { 
     up = true; 
     left = right = down = false; 
    } 
    if (Input.GetKeyDown(KeyCode.S) { 
     down = true; 
     left = right = up = false; 
    } 
    if (Input.GetKeyDown(KeyCode.A) { 
     left = true; 
     right = up = down = false; 
    } 
    if (Input.GetKeyDown(KeyCode.D) { 
     right= true; 
     left= up = down = false; 
    } 
    //And then do matching OnKeyUp events to set them false 
} 

void Update() { 
    CheckInput(); 
    if (left) 
     //Move left 
    if (right) 
     //Move right 
    //etc. 
} 
+0

danke für deine antwort, nach einiger arbeit habe ich festgestellt, dass es kein guter weg ist, um bewegungsskript zu machen. Ich habe meine Arbeit gewechselt, ich benutze jetzt den Charaktercontroller. – umuur

+0

Kein Problem. Ich kann dir empfehlen, irgendwann deine eigenen Charakter-Controller zu machen. Es ist gut für das Training und auf diese Weise können Sie es bekommen, wie Sie wollen. – Martin

Verwandte Themen