2016-11-01 5 views
0

オブジェクトを移動するためにAS、SD、DWまたはWAの組み合わせキーを押した後、オブジェクトは正常に斜めに移動して正しい位置に回転し、キーを離した後は、キーを離した後に最も近い回転に応じて0,90,180または360に戻って回転します。その1フレームがタッチされているために、そのコードが実行され、移動しました0,90,180,360。しかし、私はそれを解決する方法を知らない。オブジェクトを斜めに回転させて90,180,0,360度に戻らないようにする

十分な情報を提供していただき、ありがとうございました。 enter image description here

私は鍵を解放した後 enter image description here

一緒にAWキーの上を押すんだ、それはその方法が左または上のいずれか

PlayerMovement.csに移動滞在していません。

using UnityEngine; 
using System.Collections; 

public class playerMovement : MonoBehaviour { 

    private float speedWalk = 7.5f; 
    private float speedRotate = 7.5f; 
    private GameObject raycastObject; 

    // Update is called once per frame 
    void FixedUpdate() 
    { 
     //Non-Diagonal Movements 
     if (Input.GetKey(KeyCode.W) && !Input.GetKey(KeyCode.A) && !Input.GetKey(KeyCode.S) && !Input.GetKey(KeyCode.D)) //player movement up 
     { 
      transform.localPosition += new Vector3(0.0f, 0.0f, speedWalk * Time.deltaTime); 
     } 
     if (Input.GetKey(KeyCode.S) && !Input.GetKey(KeyCode.A) && !Input.GetKey(KeyCode.W) && !Input.GetKey(KeyCode.D)) //player movement down 
     { 
      transform.localPosition -= new Vector3(0.0f, 0.0f, speedWalk * Time.deltaTime); 
     } 
     if (Input.GetKey(KeyCode.D) && !Input.GetKey(KeyCode.A) && !Input.GetKey(KeyCode.W) && !Input.GetKey(KeyCode.S)) //player movement right 
     { 
      transform.localPosition += new Vector3(speedWalk * Time.deltaTime, 0.0f, 0.0f); 
     } 
     if (Input.GetKey(KeyCode.A) && !Input.GetKey(KeyCode.D) && !Input.GetKey(KeyCode.W) && !Input.GetKey(KeyCode.S)) //player movement left 
     { 
      transform.localPosition -= new Vector3(speedWalk * Time.deltaTime, 0.0f, 0.0f); 
     } 

     //Diagonal Movements **@@@@@@@@** I think this is the problem. 
     if (Input.GetKey(KeyCode.A) && Input.GetKey(KeyCode.W)) //player movement Top Left 
     { 
      transform.localPosition -= new Vector3(speedWalk * Time.deltaTime, 0.0f, 0.0f); 
      transform.localPosition += new Vector3(0.0f, 0.0f, speedWalk * Time.deltaTime); 
     } 
     if (Input.GetKey(KeyCode.W) && Input.GetKey(KeyCode.D)) //player movement Top Right 
     { 
      transform.localPosition += new Vector3(0.0f, 0.0f, speedWalk * Time.deltaTime); 
      transform.localPosition += new Vector3(speedWalk * Time.deltaTime, 0.0f, 0.0f); 
     } 
     if (Input.GetKey(KeyCode.D) && Input.GetKey(KeyCode.S)) //player movement Bottom Right 
     { 
      transform.localPosition += new Vector3(speedWalk * Time.deltaTime, 0.0f, 0.0f); 
      transform.localPosition -= new Vector3(0.0f, 0.0f, speedWalk * Time.deltaTime); 
     } 
     if (Input.GetKey(KeyCode.S) && Input.GetKey(KeyCode.A)) //player movement Bottom Left 
     { 
      transform.localPosition -= new Vector3(0.0f, 0.0f, speedWalk * Time.deltaTime); 
      transform.localPosition -= new Vector3(speedWalk * Time.deltaTime, 0.0f, 0.0f); 
     } 
    } 
} 

playerRotateMouse.cs

using UnityEngine; 
using System.Collections; 

public class playerRotateMouse : MonoBehaviour 
{ 
    public Transform Player; 
    private float speed = 7.5f; 
    Quaternion targetRotation; 

    void FixedUpdate() 
    { 
     Plane playerPlane = new Plane(Vector3.up, transform.position); 

     // Generates a ray from cursor 
     Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 

     float hitdist = 0.0f; 

     if (Input.GetButtonDown("Fire1") || Input.GetButtonDown("Fire2")) 
     { 
      if (playerPlane.Raycast(ray, out hitdist)) 
      { 
       Vector3 targetPoint = ray.GetPoint(hitdist); 
       Debug.DrawRay(transform.position, targetPoint, Color.green); 
       targetRotation = Quaternion.LookRotation(targetPoint - transform.position); 
      } 
     } 
     // Smooth rotation towards point. 
     transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, speed * Time.deltaTime); 

     //Rotate base on key pressed 
     if (Input.GetKey(KeyCode.W) && !(Input.GetButton("Fire1") || Input.GetButton("Fire2"))) //player rotate up 
     { 
      targetRotation = Quaternion.LookRotation(Vector3.forward); 
      transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, speed * Time.deltaTime); 
     } 
     if (Input.GetKey(KeyCode.S) && !(Input.GetButton("Fire1") || Input.GetButton("Fire2"))) //player rotate down 
     { 
      targetRotation = Quaternion.LookRotation(Vector3.forward * -1); 
      transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, speed * Time.deltaTime); 
     } 
     if (Input.GetKey(KeyCode.D) && !(Input.GetButton("Fire1") || Input.GetButton("Fire2"))) //player rotate right 
     { 
      targetRotation = Quaternion.LookRotation(Vector3.right); 
      transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, speed * Time.deltaTime); 
     } 
     if (Input.GetKey(KeyCode.A) && !(Input.GetButton("Fire1") || Input.GetButton("Fire2"))) //player rotate left 
     { 
      targetRotation = Quaternion.LookRotation(Vector3.left); 
      transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, speed * Time.deltaTime); 
     } 
    } 
} 
+0

両方のキーを離しても、同時に100%解放されないことがあります。したがって、最後にリリースされたキーの角度を指します。私は推測する。 –

+0

ええ、私はそれに気付いたが、私はこれを回避する他の方法を考えることができなかった –

答えて

0

最後のタイムスタンプを保存し、第2のキーのリリースが特定の時間枠内にあるかどうかを確認します。 20ms以内にリリースされている場合は、リセットしないでください。例えば

:(擬似)

private bool[] _directionKeysPressed = new bool[4]; 
private DateTime _previousKeyRelease; 

private void KeyDown(object sender, EventArgs e) 
{ 
    _keyPressedCount++; 

    switch(keys) 
    { 
     case(W): _directionKeysPressed[0] = true; 
     case(D): _directionKeysPressed[1] = true; 
     // ................. 
    } 
} 

private void KeyUp(object sender, EventArgs e) 
{ 
    _keyPressedCount--; 

    if(_keyPressedCount == 0) 
    { 
     // all keys released 
     _directionKeysPressed[] <--- last direction... 

     // reset all bools 
     return; 
    } 

    // ONLY if the key is released outside the 20 ms, reset the key. 
    if(_previousKeyRelease.AddMilliseconds(20) < DateTime.UTCNow) 
    { // RESET KEY 
     switch(keys) 
     { 
      case(W): _directionKeysPressed[0] = false; 
      case(D): _directionKeysPressed[1] = false; 
      // ................. 
     } 
    } 

    _previousKeyRelease = DateTime.UTCNow; 
} 

個人IがのInt32にビットフィールドでこれを行うだろうが、それはブール値のアレイでより明らかです。

+0

私はあなたが言及し、仕事のためにそれを持っているタイムスタンプで、 –

関連する問題