2016-09-30 15 views
0

В настоящее время я работаю над некоторыми движениями игроков. Основная идея моего игрока перемещается только по горизонтали и по вертикали, а не по диагонали. Я не мог найти разумного решения этой проблемы. На самом деле я не хочу использовать hardidbody или character.controller. Другая вещь, которую я хочу достичь, - когда я нажал несколько клавиш направления, я хочу, чтобы мой игрок переместился непосредственно в последнее нажатое направление. Вот мой код:перейти к последнему нажатому направлению без диагонального перемещения

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

     } 
    } 
} 

ответ

2

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

Что бы я сделал, если бы был вами, это добавить еще один слой поверх этого. Только обнаруживайте события нажатия клавиш и задайте соответствующие переменные. Когда вы установите их, отключите остальные. Затем используйте эти переменные для перемещения. Например:

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

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

+0

Нет проблем. В какой-то момент я могу порекомендовать создавать собственные персональные контроллеры. Это хорошо для практики, и таким образом вы можете получить его, как хотите. – Martin