Unity 3D - 碰撞

Unity 3D - Collisions

我的物理有问题。我是第一次做3D,所以可能只是初学者的错误。

我只是想创建一个简单的播放器控制器并使其无法通过立方体。 问题是当直接进入立方体时,玩家的一部分在立方体中。当停止移动时,它推动我,所以它们不相交(这是有道理的)。

我尝试使用 .Transalte、.MovePosition 并通过改变刚体本身的速度来移动玩家。 None 它改变了任何东西。玩家可以随时将他的一部分移动到立方体中。

有什么解决办法吗?

我的播放器控制器: (在 Move() 中注释掉的两行只是移动玩家的其他方式。)

using UnityEngine;

public class PlayerController : MonoBehaviour
{
   [SerializeField]
   private float movementSpeed;

   private Vector3 input;

   private void Update()
   {
      GetInput();
   }

   private void FixedUpdate()
   {
      Move();
   }

   private void GetInput()
   {
      float inputHorizontal = Input.GetAxisRaw("Horizontal");
      float intputVertical = Input.GetAxisRaw("Vertical");
      input = Vector3.ClampMagnitude(new Vector3(inputHorizontal, 0, intputVertical), 1);
   }

   private void Move()
   {
      GetComponent<Rigidbody>().velocity += input * movementSpeed;
      //GetComponent<Rigidbody>().MovePosition(GetComponent<Rigidbody>().position + input * movementSpeed * Time.deltaTime);
      //transform.Translate(input * movementSpeed * Time.deltaTime, Space.World);
   }
}

Player is standing still

Player is moving towards cube

Settings of the Game Objects itself

您可以通过附加到它的 Collider 组件增加玩家的 Collider 的规模。您可以从编辑器场景视图中查看对撞机有多大。

编辑:问题可能是您的移动或碰撞代码是在 Update 而不是 FixedUpdate 中调用的。使用刚体时,您想在 FixedUpdate.

中调用物理计算

从立方体中移除刚体,您可以点击编辑器右上角的'Gizmos',并确保碰撞器位于对象的边缘。

现在我想我明白你的问题了。

对撞机是一个几何形状,它会被检查,但直到碰撞实际发生后才会产生结果,这意味着一个几何形状在另一个几何形状内。我的意思是,您正在经历的是碰撞的正常行为。如果两个元素都是刚体,两者都会移动,你的问题不会被察觉,但如果你的立方体不是刚体或运动学的,将静止在同一位置,并且取决于另一个物体的速度,这是正常的invasion/superposition 个元素是可感知的,因为那是发生碰撞的框架,并且您的元素是否需要移回因为它已经发生碰撞。

考虑一下,如果速度足够快,一帧到另一帧的位置变化足够大,碰撞甚至可能不会发生,因为几何部分不会在帧之间干涉,因为位置变化可能会更大比对撞机本身的边界。一天结束时的碰撞检查是离散的,而不是连续的(即使您可以将其设置为连续以尽可能频繁)。

要解决或改善这个问题,您可以调整速度以避免被感知 + 调整您的碰撞器以使其在图形叠加发生之前做出反应。这意味着使胶囊或立方体对撞机比图形元素本身更大。您甚至可以计算 ,使其与您的速度 * Time.deltaTime 结果或速度 * FixedTimeStep 结果一样大,具体取决于您的安全距离需求。我认为其中之一应该是您在发生图形碰撞之前需要考虑的安全距离。

您可以做的另一件事是缩短完成物理计算的时间。

https://docs.unity3d.com/Manual/class-TimeManager.html

但需要小心,因为这可能会吞噬性能,需要小心处理。你可以用它做一些试验,看看你的问题是否可以改善。

希望对您有所帮助