Unity 3D-碰撞

时间:2020-05-10 20:51:27

标签: unity3d game-physics collision

我对物理学有疑问。这是我第一次使用3D,所以这可能只是一个初学者的错误。

我只是想创建一个简单的播放器控制器并使之不能通过槽形立方体。 问题在于,直接进入多维数据集时,播放器的一部分位于多维数据集本身中。停止移动时,它会推动我,因此它们不会相交(这很有意义)。

我尝试使用.Transalte,.MovePosition并通过更改刚体本身的速度来移动播放器。没有任何改变。玩家总是可以将自己的一部分移到立方体中。

有什么办法解决这个问题吗?

我的播放器控制器: (在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

3 个答案:

答案 0 :(得分:1)

现在我想我理解您的问题。

对撞机是经过检查的几何形状,但是直到碰撞真正发生之前,结果才会发生,这意味着一个几何形状位于另一个内部。我的意思是,您正在经历的是碰撞的正常行为。如果两个元素都是刚体,则两者都将移动并且您的问题将不会被察觉,但是如果您的立方体不是刚体或运动学的,则将静止不动,并取决于其他物体的速度,即元素的侵入/叠加是可以感知的,因为那是发生碰撞的框架,并且是因为元素碰撞而需要向后移动的元素。

请考虑一下,如果速度足够高,并且从一帧到另一帧的位置变化足够大,则碰撞甚至可能不会发生,因为几何部分不会干扰帧之间,因为位置变化可能会大于对撞机本身的界限。在一天结束时,碰撞检查是离散的,并且不是连续的(即使您可以将其设置为连续的也要尽可能地频繁)。

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

您可以做的另一件事是,在进行物理计算时要紧得多。

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

time settings

但是,请谨慎操作,因为这可能会破坏性能,并且需要谨慎处理。您可以对此进行一些尝试,并检查您的问题是否可以改善。

希望有帮助

答案 1 :(得分:0)

您可以从连接到其的“对撞机”组件上增加玩家对撞机的比例。您可以从编辑器场景视图中查看对撞机的大小。

编辑:问题可能是您的移动或碰撞代码在Update中而不是FixedUpdate中被调用。在使用刚体时,您希望在FixedUpdate内部调用物理计算。

答案 2 :(得分:0)

从立方体中删除刚体,您可以单击编辑器右上角的“ Gizmos”,并确保对撞器位于对象的边缘。