我对物理学有疑问。这是我第一次使用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);
}
}
答案 0 :(得分:1)
现在我想我理解您的问题。
对撞机是经过检查的几何形状,但是直到碰撞真正发生之前,结果才会发生,这意味着一个几何形状位于另一个内部。我的意思是,您正在经历的是碰撞的正常行为。如果两个元素都是刚体,则两者都将移动并且您的问题将不会被察觉,但是如果您的立方体不是刚体或运动学的,则将静止不动,并取决于其他物体的速度,即元素的侵入/叠加是可以感知的,因为那是发生碰撞的框架,并且是因为元素碰撞而需要向后移动的元素。
请考虑一下,如果速度足够高,并且从一帧到另一帧的位置变化足够大,则碰撞甚至可能不会发生,因为几何部分不会干扰帧之间,因为位置变化可能会大于对撞机本身的界限。在一天结束时,碰撞检查是离散的,并且不是连续的(即使您可以将其设置为连续的也要尽可能地频繁)。
要解决或改善此问题,可以调整速度以避免可察觉的速度+调整对撞机以使其在图形叠加发生之前做出反应。这意味着使胶囊或立方体碰撞器大于图形元素本身。您甚至可以计算,使其与您的速度* Time.deltaTime结果或速度* FixedTimeStep结果一样大,具体取决于您的安全距离需求。我认为其中之一应该是在图形碰撞发生之前需要考虑的安全距离。
您可以做的另一件事是,在进行物理计算时要紧得多。
https://docs.unity3d.com/Manual/class-TimeManager.html
但是,请谨慎操作,因为这可能会破坏性能,并且需要谨慎处理。您可以对此进行一些尝试,并检查您的问题是否可以改善。
希望有帮助
答案 1 :(得分:0)
您可以从连接到其的“对撞机”组件上增加玩家对撞机的比例。您可以从编辑器场景视图中查看对撞机的大小。
编辑:问题可能是您的移动或碰撞代码在Update
中而不是FixedUpdate
中被调用。在使用刚体时,您希望在FixedUpdate
内部调用物理计算。
答案 2 :(得分:0)
从立方体中删除刚体,您可以单击编辑器右上角的“ Gizmos”,并确保对撞器位于对象的边缘。