【问题标题】:change movement direction on rotation旋转时改变运动方向
【发布时间】:2018-09-30 05:41:41
【问题描述】:

我创建了一个 FPS 动作,但玩家的动作是错误的。向左或向右旋转时,玩家仍会向前移动。

PlayerMovement.cs

public class PlayerMovement : MonoBehaviour
{
    private Vector3 movement;
    private Rigidbody rigid;
    private bool jumpPressed;

    private const int MOVEMENT_SPEED = 8;
    private const int JUMP_POWER = 20;

    private void Awake()
    {
        rigid = GetComponent<Rigidbody>();
    }

    private void Update()
    {
        SetInputs();
    }

    private void FixedUpdate()
    {
        Jump();
        Move();
    }

    private void SetInputs()
    {
        movement.x = Input.GetAxis("Horizontal") * MOVEMENT_SPEED;
        movement.y = rigid.velocity.y;
        movement.z = Input.GetAxis("Vertical") * MOVEMENT_SPEED;
        jumpPressed = Input.GetKeyDown(KeyCode.Space);
    }

    private void Jump()
    {
        if (jumpPressed && GroundCheck())
        {
            movement.y = JUMP_POWER;
            jumpPressed = false;
        }
    }

    private void Move()
    {
        rigid.velocity = movement;
    }

    private bool GroundCheck()
    {
        return true;
    }
}

CameraMovement.cs

public class CameraMovement : MonoBehaviour
{
    private Transform player;
    private Vector2 rotation;

    private Quaternion originalRotation;

    private const int HORIZONTAL_ROTATION_SPEED = 5;
    private const int VERTICAL_ROTATION_SPEED = 5;
    private const int VERTICAL_ROTATION_MIN = -80;
    private const int VERTICAL_ROTATION_MAX = 80;

    private void Awake()
    {
        player = GameObject.FindGameObjectWithTag("Player").transform;
    }

    private void Start()
    {
        originalRotation = transform.localRotation;
    }

    private void Update()
    {
        SetInputs();
        RotateCamera();
        RotatePlayer();
    }

    private void SetInputs()
    {
        rotation.x = Input.GetAxisRaw("Mouse X") * HORIZONTAL_ROTATION_SPEED;

        rotation.y += Input.GetAxisRaw("Mouse Y") * VERTICAL_ROTATION_SPEED;
        rotation.y = Mathf.Clamp(rotation.y, VERTICAL_ROTATION_MIN, VERTICAL_ROTATION_MAX);
    }

    private void RotateCamera()
    {
        Quaternion verticalRotation = Quaternion.AngleAxis(rotation.y, Vector3.left);
        transform.localRotation = originalRotation * verticalRotation;
    }

    private void RotatePlayer()
    {
        player.localRotation *= Quaternion.AngleAxis(rotation.x, player.up);
    }
}

我提供了一个小 gif,显示旋转时的错误动作。

https://media.giphy.com/media/2jMy38g1PjckODc6B0/giphy.gif

当通过旋转相机旋转播放器时,播放器会围绕其 y 轴正确旋转。不知怎的,他并没有朝着他所面对的方向前进,他只是沿着一个方向前进。

需要解决什么问题?

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    我看到你的移动逻辑不是处理相机朝向的方向,它只是让对象随着输入轴值移动,这就是你的对象像这样移动的原因。

    如果你想让'forward'轴意味着'向前走到我面对的方向',你应该将移动与相机旋转结合起来。

    你可以试试

    rigid.velocity = Camera.main.transform.rotation * movement;
    

    在你的 Move() 中。

    【讨论】:

      【解决方案2】:

      这是在重新发明轮子。 unity 标准资产包带有一个可定制且运行良好的 fps 预制件。脚本健壮,控件优雅,稍加调整即可轻松制作,节省一点时间,从统一商店下载Unity Standard Asset 包,并使用第一人称字符预制件。我想你会很高兴的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-26
        • 2023-03-04
        • 2015-07-29
        • 1970-01-01
        相关资源
        最近更新 更多