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
但需要小心,因为这可能会吞噬性能,需要小心处理。你可以用它做一些试验,看看你的问题是否可以改善。
希望对您有所帮助
我的物理有问题。我是第一次做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
但需要小心,因为这可能会吞噬性能,需要小心处理。你可以用它做一些试验,看看你的问题是否可以改善。
希望对您有所帮助