箱子在地面上和向前移动时旋转

Box spins when on ground and going forward

提问人:Arnaud Girard 提问时间:11/8/2023 最后编辑:JanSArnaud Girard 更新时间:11/8/2023 访问量:42

问:

我正在尝试创建一个可以跳跃、前进/后退和向右/向左移动的移动盒子。 但是当这个盒子接触或用对撞机接触某物时,它开始旋转并且不允许我移动它/不是很多,所以它开始绕圈(小圈子)。

盒子有 3 个组件:
1 - 未设置为触发
的盒子碰撞器 2 - 不使用重力的刚体(我在脚本中这样做)
3 - 我的脚本移动播放器

enter image description here enter image description here

这是我的自定义脚本:

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

[RequireComponent(typeof(Rigidbody))]
[RequireComponent(typeof(Collider))]

public class PlayerMovement : MonoBehaviour {
    public float moveSpeed = 9f;
    public float airMoveSpeed = 0.6f;
    public float jumpSpeed = 8f;
    public float gravity = 20f;
    public float groundDrag = 6f;
    public float airDrag = 4f;
    public Camera playerCamera;
    public float sensitivity = 2f;
    public float lookXLimit = 45f;
    public GroundCheck groundCheck;

    Vector3 moveDirection = Vector3.zero;
    Rigidbody rb;
    float rotationX = 0;
    bool isGrounded;

    [HideInInspector]
    public bool canMove = true;

    void Start()
    {
        rb = gameObject.GetComponent<Rigidbody>();

        isGrounded = false;

        // Lock cursor
        Cursor.lockState = CursorLockMode.Locked;
        Cursor.visible = false;
    }

    void Update()
    {
        CheckGround();
        MovePlayer();
        Gun();
        ControlDrag();
    }

    void CheckGround() {
        isGrounded = groundCheck.isGrounded;
    }

    void MovePlayer() {
        // Recalculate move direction based on axes
        Vector3 forward = transform.TransformDirection(Vector3.forward);
        Vector3 right = transform.TransformDirection(Vector3.right);
        float curSpeedX = canMove ? moveSpeed * Input.GetAxis("Vertical") : 0;
        float curSpeedY = canMove ? moveSpeed * Input.GetAxis("Horizontal") : 0;
        moveDirection = (forward * curSpeedX) + (right * curSpeedY);

        // moveDirection.y -= gravity * 1000;

        if (Input.GetButton("Jump") && canMove && isGrounded)
        {
            rb.AddForce(transform.up * jumpSpeed, ForceMode.Impulse);
        }

        // Move the player
        if(isGrounded) {
            // transform.position += moveDirection;
            rb.AddForce(moveDirection * Time.deltaTime, ForceMode.Acceleration);
        } else {
            // transform.position += moveDirection;
            rb.AddForce(moveDirection * Time.deltaTime * airMoveSpeed, ForceMode.Acceleration);
        }

        // Player and Camera rotation
        if (canMove)
        {
            rotationX += -Input.GetAxis("Mouse Y") * sensitivity;
            rotationX = Mathf.Clamp(rotationX, -lookXLimit, lookXLimit);
            playerCamera.transform.localRotation = Quaternion.Euler(rotationX, 0, 0);
            transform.rotation *= Quaternion.Euler(0, Input.GetAxis("Mouse X") * sensitivity, 0);
        }
    }

    void ControlDrag() {
        if(isGrounded) rb.drag = groundDrag;
        else rb.drag = airDrag;
    }
}
unity-game-engine game-physics 碰撞 刚体

评论


答:

0赞 JanS 11/8/2023 #1

首先,尝试将所有与物理相关的东西放入 .这是Unity进行所有物理计算的地方。这很可能不是这里的原因,但通常建议这样做。FixedUpdate()

碰撞是“正面”发生还是没有全脸接触?可能只是部分碰撞会给您的球员运动带来扭矩,而在您发布的代码中,我没有看到任何控制角运动的部件。

如果是这种情况,那么您也可以尝试冻结围绕 y 轴的旋转,就像您已经对其他两个轴所做的那样。

另一种选择是通过脚本控制立方体的朝向。

评论

0赞 Arnaud Girard 11/8/2023
所以我可以控制玩家面对的位置。在addforce之后的最后一部分,我基本上只是根据鼠标轴旋转播放器,但我尝试将其删除,它没有改变任何东西