移动时旋转3D角色

时间:2017-01-06 18:36:45

标签: unity3d 3d game-physics

我想从Unity上的一个小平台游戏开始。当我移动时,我希望角色看向移动的方向。所以当我按下左/" A"我希望角色立即左转并向前走。其他方向相同。问题是当我离开钥匙时,角色会回到默认旋转状态。

重要代码:

private void FixedUpdate()
    {
        float inputX = Input.GetAxis("Horizontal"); // Input
        float inputZ = Input.GetAxis("Vertical"); // Input

        if (GroundCheck()) // On the ground?
        {
            verticalVelocity = -gravity * Time.deltaTime; // velocity on y-axis
            if (Input.GetButtonDown("Jump")) // Jump Key pressed
            {
                verticalVelocity = jumpPower; // jump in the air
            }
        }
        else // Player is not grounded
        {
            verticalVelocity -= gravity * Time.deltaTime; // Get back to the ground
        }

        Vector3 movement = new Vector3(inputX, verticalVelocity, inputZ); // the movement vector
        if (movement.magnitude != 0) // Input given?
        {
            transform.rotation = Quaternion.LookRotation(new Vector3(movement.x, 0, movement.z)); // Rotate the Player to the moving direction
        }
        rigid.velocity = movement * movementSpeed; // Move the character
    }

第二件事是,

transform.rotation = Quaternion.LookRotation(new Vector3(movement.x, 0, movement.z));

y轴上有0。它说观察向量为零。当我传递另一个数字movement.y时,角色会向地板倾斜。所以我不知道该在那里传递什么。

1 个答案:

答案 0 :(得分:0)

关于放开钥匙时的重置:你的行

if (movement.magnitude != 0) // Input given?

是一个好主意,但是你的控制器很有可能略微偏离0,所以即使你实际上没有移动,你的角色的方向也会改变。我会把它改成

if (movement.magnitude >.1f) // Input given?

或接近(但不完全)为零的其他数字。在处理此问题时,我会将Debug.Log(movement.magnitude);添加到此函数中,并确保值在您期望的范围内。

关于第二个主题: 虽然在运动矢量中使用verticalVelocity非常重要,因为当你将它应用于rigidBody.velocity时,你不希望它面向你的角色向量。如果你想让你的角色只在一个平面上看,那么只考虑两个维度是完全合理的。如上所述,添加第三维可以让它看到天空或地面。此外,我还会更改您的输入检查行以使用它,因为您只想根据角色是否水平移动来改变面部。这将使您的代码看起来像这样:

Vector3 movement = new Vector3(inputX, verticalVelocity, inputZ); // the movement vector
Vector3 horizontalMovement = new Vector3(inputX, 0f, inputZ);
        if (horizontalMovement.magnitude != 0) // Input given?
        {
            transform.rotation = Quaternion.LookRotation(horizontalMovement); // Rotate the Player to the moving direction
        }
        rigid.velocity = movement * movementSpeed; // Move the character

最后一点,当你接地时,你可能想将verticalVelocity设置为0,而不是-gravity * deltaTime。这个错误可能不可见(物理引擎会将你的角色从地板上抬起来),但是如果用户使用alt-tabs并且框架之间的距离太长,你的角色将会传送到地板!

祝你好运。