unity3d 物体穿过墙壁

dw1jzc5e  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(179)

当名为Player的物体碰到墙壁时,就会发生碰撞。但是当我旋转物体并希望它前进时,它却穿过了墙壁。这是什么原因呢?

public float movementSpeed = 5.0f;
    public Rigidbody rb;
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }
    void Update()
    {
        if (Input.GetKey(KeyCode.W))
        {
            transform.position += transform.forward * Time.deltaTime * movementSpeed;
        }
        else if (Input.GetKey(KeyCode.S))
        {
            transform.position -= transform.forward * Time.deltaTime * movementSpeed;
        }

        if (Input.GetKey(KeyCode.D))
        {
            transform.Rotate(0, 150 * Time.deltaTime, 0);
        }
        else if (Input.GetKey(KeyCode.A))
        {
            transform.Rotate(0, - 150 * Time.deltaTime , 0);
        }
    }

我希望在不增加墙的宽度后它不会进入对象内部,但事实并非如此。

8qgya5xd

8qgya5xd1#

正如已经提到的,改变变换位置将传送你的对象,从而忽略碰撞。
有不同的方法来实现移动。如果你想让你的对象发生碰撞,你必须给你移动的游戏对象添加一个刚体或角色控制器。这里是每种方法的例子-两种方法都应该向前移动你的对象-所以你仍然需要改变方向来完成移动。
刚体:

private void MoveForward() {
 Rigidbody rb = GetComponent<Rigidbody>;
 Vector3 direction = (transform.forward).normalized;
 float speed = 2;
 rb.AddForce(direction * speed)
}

角色控制器

private void MoveForward() {
    CharacterController controller = GetComponent<CharacterController>;
    Vector3 direction = (transform.forward).normalized;
    float speed = 2f;
    controller.Move(direction * speed * Time.deltaTime);
}

编辑:你可能最终会使用刚体,因为你已经在你的脚本中有了它-变量初始化不应该在方法中,我这样做只是为了简单(也许除了方向,如果你想让它们相对于你的相机)

相关问题