当运动开始统一时,角色会振动

时间:2016-03-24 15:11:58

标签: c# visual-studio unity3d

我正在完成一本书,并且遇到了一个问题。它是一款自上而下的射击游戏,玩家可以通过鼠标旋转并随键盘移动。问题是在测试时,如果鼠标或键盘引起移动,图像会振动。如果我按下箭头键,它会移动一圈,我按住键的时间越长,圆圈越宽。以下是我正在使用的脚本。

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class PlayerBehaviour : MonoBehaviour
{
    //movement modifier applied to directional movement
    public float playerSpeed = 2.0f;

    //current player speed
    private float currentSpeed = 0.0f;

    /*
    * Allows us to have multiple inputs and supports keyboard,
    * joystick, etc.
    */
    public List<KeyCode> upButton;
    public List<KeyCode> downButton;
    public List<KeyCode> leftButton;
    public List<KeyCode> rightButton;

    //last movement made
    private Vector3 lastMovement = new Vector3();

    // Update is called once per frame
    void Update()
    {
        //rotates ship to face mouse
        Rotation();
        //moves ship
        Movement();
    }

    void Rotation()
    {
        //finds mouse in relation to player location
        Vector3 worldPos = Input.mousePosition;
        worldPos = Camera.main.ScreenToWorldPoint(worldPos);

        /*
        get x and y screen positions
        */
        float dx = this.transform.position.x - worldPos.x;
        float dy = this.transform.position.y - worldPos.y;

        //find the angle between objects
        float angle = Mathf.Atan2(dy, dx) * Mathf.Rad2Deg;

        /*
        * The transform's rotation property uses a Quaternion,
        * so we need to convert the angle in a Vector
        * (The Z axis is for rotation for 2D).
        */
        Quaternion rot = Quaternion.Euler(new Vector3(0, 0, angle + 90));
        // Assign the ship's rotation
        this.transform.rotation = rot;
    }

    // Will move the player based off of keys pressed
    void Movement()
    {
        // The movement that needs to occur this frame
        Vector3 movement = new Vector3();
        // Check for input
        movement += MoveIfPressed(upButton, Vector3.up);
        movement += MoveIfPressed(downButton, Vector3.down);
        movement += MoveIfPressed(leftButton, Vector3.left);
        movement += MoveIfPressed(rightButton, Vector3.right);
        /*
        * If we pressed multiple buttons, make sure we're only
        * moving the same length.
        */
        movement.Normalize();
        // Check if we pressed anything
        if (movement.magnitude > 0)
        {
            // If we did, move in that direction
            currentSpeed = playerSpeed;
            this.transform.Translate(movement * Time.deltaTime * playerSpeed, Space.World);
            lastMovement = movement;
        }
        else
        {
            // Otherwise, move in the direction we were going
            this.transform.Translate(lastMovement * Time.deltaTime * currentSpeed, Space.World);
            // Slow down over time
            currentSpeed *= .9f;
        }
    }

    /*
    * Will return the movement if any of the keys are pressed,
    * otherwise it will return (0,0,0)
    */
    Vector3 MoveIfPressed(List<KeyCode> keyList, Vector3 Movement)
    {
        // Check each key in our list
        foreach (KeyCode element in keyList)
        {
            if (Input.GetKey(element))
            {
                /*
                * It was pressed so we leave the function
                * with the movement applied.
                */
                return Movement;
            }
        }
        // None of the keys were pressed, so don't need to move
        return Vector3.zero;
    }
}

1 个答案:

答案 0 :(得分:1)

我研究了你的代码一段时间后发现它没有任何问题。所以我自己测试了它,它完美无缺。

所以我想你的场景有问题。例如,你可能让你的玩家对象成为旋转你的轴的某个对象的孩子:这会引起我想的问题。

有一个新的空场景。添加一个新的GameObject(例如3D立方体或2D精灵)并为其分配PlayerBehaviour。现在测试:它应该可以正常工作。