碰撞后停止刚体移动
Stop rigidbodies from moving after colliding
我有一个很简单的案例:一个平面上有2个立方体,玩家可以通过鼠标输入来移动一个立方体。
每个立方体都有一个碰撞体和刚体,以及一个高摩擦力 material 和 0 反弹。
我想要实现的是:如果一个立方体要与另一个立方体接触,我想阻止两个立方体相互推动或进入彼此 - 我希望它们充当彼此的墙.
我得到的是:
我试过在拖动立方体时打开它们的 IsKinematic 选项,但这没有结果。
这是我的代码:
private Vector3 screenPoint;
private Vector3 offset;
private Vector3 oldPosition;
private Rigidbody rBody;
private bool dragging = false;
void Awake()
{
rBody = gameObject.GetComponent<Rigidbody>();
}
void OnMouseUp()
{
dragging = false;
rBody.isKinematic = false;
}
void FixedUpdate()
{
if(dragging)
{
Vector3 cursorPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
Vector3 cursorPosition = Camera.main.ScreenToWorldPoint(cursorPoint) + offset;
cursorPosition.y = oldPosition.y;
rBody.MovePosition(cursorPosition);
}
}
void OnMouseDown()
{
screenPoint = Camera.main.WorldToScreenPoint(rBody.position);
offset = rBody.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
oldPosition = rBody.position;
}
void OnMouseDrag()
{
dragging = true;
rBody.isKinematic = true;
}
感谢任何帮助。谢谢
您是否尝试过放置物理 material 并调整设置(尤其是摩擦设置)?
如果你这样做了,但没有达到你想要的,你可以使用 MonoBehaviour.OnCollisionExit to detect when your objects aren't in contact anymore and either set the velocity to 0 or lock the position。如果您锁定位置,您可能需要一个协程来稍后解锁它。
此解决方案以后可能会导致奇怪的错误(例如,在颠簸移动的情况下,您的对象仅在一帧内失去联系)。如果可能的话,我更愿意使用物理material。
可能不是最好的解决方案,但可以尝试在碰撞进入后破坏刚体组件,这样立方体将成为静态物体,从而变成墙。您可以稍后再次添加刚体。
我有一个很简单的案例:一个平面上有2个立方体,玩家可以通过鼠标输入来移动一个立方体。
每个立方体都有一个碰撞体和刚体,以及一个高摩擦力 material 和 0 反弹。
我想要实现的是:如果一个立方体要与另一个立方体接触,我想阻止两个立方体相互推动或进入彼此 - 我希望它们充当彼此的墙.
我得到的是:
我试过在拖动立方体时打开它们的 IsKinematic 选项,但这没有结果。
这是我的代码:
private Vector3 screenPoint; private Vector3 offset; private Vector3 oldPosition; private Rigidbody rBody; private bool dragging = false; void Awake() { rBody = gameObject.GetComponent<Rigidbody>(); } void OnMouseUp() { dragging = false; rBody.isKinematic = false; } void FixedUpdate() { if(dragging) { Vector3 cursorPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z); Vector3 cursorPosition = Camera.main.ScreenToWorldPoint(cursorPoint) + offset; cursorPosition.y = oldPosition.y; rBody.MovePosition(cursorPosition); } } void OnMouseDown() { screenPoint = Camera.main.WorldToScreenPoint(rBody.position); offset = rBody.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z)); oldPosition = rBody.position; } void OnMouseDrag() { dragging = true; rBody.isKinematic = true; }
感谢任何帮助。谢谢
您是否尝试过放置物理 material 并调整设置(尤其是摩擦设置)? 如果你这样做了,但没有达到你想要的,你可以使用 MonoBehaviour.OnCollisionExit to detect when your objects aren't in contact anymore and either set the velocity to 0 or lock the position。如果您锁定位置,您可能需要一个协程来稍后解锁它。 此解决方案以后可能会导致奇怪的错误(例如,在颠簸移动的情况下,您的对象仅在一帧内失去联系)。如果可能的话,我更愿意使用物理material。
可能不是最好的解决方案,但可以尝试在碰撞进入后破坏刚体组件,这样立方体将成为静态物体,从而变成墙。您可以稍后再次添加刚体。