1

大家好,我的玩家正在石头上行走并穿过石头。名为 Champ 的玩家有一个 Box Collider,而 Stone 有一个 Mesh Collider。玩家也有刚体。我尝试了我发现的一切,但没有任何帮助解决我的问题。

MovePlayer.cs 脚本

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

public class MovePlayer : MonoBehaviour
{

    Rigidbody rb;

    public float speed = 10f;
    private Vector3 moveDirection;
    public float rotationSpeed = 0.05f;

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

    void Update()
    {
        moveDirection = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")).normalized;
    }

    void FixedUpdate()
    {
        rb.MovePosition(rb.position + transform.TransformDirection(moveDirection * speed * Time.deltaTime));
        RotatePlayer();
    }

    void RotatePlayer()
    {
        if (moveDirection != Vector3.zero)
        {
            transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(moveDirection.normalized), rotationSpeed);
        }
        transform.Translate(moveDirection * speed * Time.deltaTime, Space.World);
    }

}

检查器中的播放器设置

检查器中的石头设置

场景预览

谢谢你们的帮助!:)

4

2 回答 2

0

测试您的代码和冲突似乎对我来说工作正常。

通过将脚本添加到带有盒子碰撞器的游戏对象并使用立方体创建一个小关卡来对其进行测试。还做了一堵墙,我修改为使用网格对撞机而不是盒子对撞机。玩家与场景中的物体正常碰撞。

您应该从 Project 中仔细检查您的图层碰撞矩阵,Settings > Physics您是否已将图层播放器和墙设置为碰撞。

  1. 您还可以尝试将新立方体添加到场景中并将其图层设置为墙壁以查看玩家是否与它发生碰撞。如果是这样,那么石头的网格可能存在问题。
  2. 如果没有,那么我会禁用玩家的动画师和重力体组件,以确保它们不会干扰碰撞

Rigidbody.MovePosition基本上使玩家瞬移可能导致意外行为。一般建议Rigidbody.AddForce改用。可用于精确运动ForceMode.VeloictyChange

public float maxVelocityChange = 5.0f;

void moveUsingForces(){

    Vector3 targetVelocity = moveDirection;
    // Doesn't work with the given RotatePlayer implementation.
    // targetVelocity = transform.TransformDirection(targetVelocity);
    targetVelocity *= speed;

    // Apply a force that attempts to reach our target velocity
    Vector3 velocity = rb.velocity;
    Vector3 velocityChange = (targetVelocity - velocity);
    velocityChange.x = Mathf.Clamp(velocityChange.x, -maxVelocityChange, maxVelocityChange);
    velocityChange.z = Mathf.Clamp(velocityChange.z, -maxVelocityChange, maxVelocityChange);
    velocityChange.y = 0;
    rb.AddForce(velocityChange, ForceMode.VelocityChange);
}
于 2021-12-11T15:22:05.773 回答
0

所以伙计们,我在上面发布的人的帮助下找到了解决方案。

问题是我的玩家速度在代码中太高了,速度在浮动 10 上,但我在 Unity Inspector of Player 中将速度更改为浮动 50。

所以我解决问题的第一步是将速度设置为浮动10,但我仍然想以50f的速度移动......

此问题的解决方案是在 Unity 2020.3.24f1 及更高版本(可能更低)中,您可以转到编辑>项目设置>物理并将“默认最大穿透速度”设置为您希望对象停止而不通过的速度。在我的情况下,我想以speed = 50f移动,所以我需要将Default Max Depenetration Velocity更改为50

我希望我将来可以帮助某人回答这个问题!

最好的祝愿 Max G。

于 2021-12-11T19:35:14.303 回答