unity 3D OnMouseDrag碰撞
Unity 3D OnMouseDrag collision
我正在尝试制作一款游戏,您可以在其中拖动不同类型的球体并将它们放在一起形成一个图形(没有任何重力)。为了拖动对象,我使用了这个脚本:
using UnityEngine;
using System.Collections;
public class Test : MonoBehaviour {
void OnMouseDrag()
{
float distance_to_screen = Camera.main.WorldToScreenPoint(gameObject.transform.position).z;
transform.position = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, distance_to_screen ));
}
}
当我将两个球体拖到彼此时,它们会穿过彼此。我给物体添加了一个刚体,用它尝试了很多不同的东西,但似乎没有任何效果。它们似乎总是相互反弹,或者根本不碰撞。对此有什么解决办法吗?想象一下,这就像一个人 运行 撞到墙上。这个人并没有从墙上弹开,他只是停止了移动。
您出现一些奇怪行为(对象相互剪裁 through/ignoring)的原因是您直接设置 transform.position
,而不是操纵 Rigidbody
组件物体。使用 Rigidbody.MovePosition()
在定位对象时也考虑物理因素。
现在,看到物体相互反弹并不是异常的物理行为 - 这是因为当物体相互夹在一起时(就像它们经常对您的代码所做的那样),它们会相互施加排斥力(a有点像牛顿第三定律)。如果您想在它们碰撞时立即冻结它们,请尝试在 OnCollisionEnter()
事件中设置 Rigidbody.isKinematic = true
。
将所有这些放在一起,您的 class 可能看起来像:
public class Test : MonoBehaviour {
Rigidbody rb;
void Start()
{
// Store reference to attached Rigidbody
rb = GetComponent<Rigidbody>();
}
void OnMouseDrag()
{
float distance_to_screen = Camera.main.WorldToScreenPoint(gameObject.transform.position).z;
// Move by Rigidbody rather than transform directly
rb.MovePosition(Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, distance_to_screen )));
}
void OnCollisionEnter(Collision col)
{
// Freeze on collision
rb.isKinematic = true;
}
}
希望对您有所帮助!如果您有任何问题,请告诉我。
当直接以非递增方式给出位置变量坐标时,对象"phasing"在下一个位置存在,从而欺骗了碰撞系统。
您必须通过让某种其他系统以增量方式移动对象来对其进行编码:
而不是像这样直接移动对象:
位置=
position = lerp(oldPosition,new position,Time.deltaTime)
我正在尝试制作一款游戏,您可以在其中拖动不同类型的球体并将它们放在一起形成一个图形(没有任何重力)。为了拖动对象,我使用了这个脚本:
using UnityEngine;
using System.Collections;
public class Test : MonoBehaviour {
void OnMouseDrag()
{
float distance_to_screen = Camera.main.WorldToScreenPoint(gameObject.transform.position).z;
transform.position = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, distance_to_screen ));
}
}
当我将两个球体拖到彼此时,它们会穿过彼此。我给物体添加了一个刚体,用它尝试了很多不同的东西,但似乎没有任何效果。它们似乎总是相互反弹,或者根本不碰撞。对此有什么解决办法吗?想象一下,这就像一个人 运行 撞到墙上。这个人并没有从墙上弹开,他只是停止了移动。
您出现一些奇怪行为(对象相互剪裁 through/ignoring)的原因是您直接设置 transform.position
,而不是操纵 Rigidbody
组件物体。使用 Rigidbody.MovePosition()
在定位对象时也考虑物理因素。
现在,看到物体相互反弹并不是异常的物理行为 - 这是因为当物体相互夹在一起时(就像它们经常对您的代码所做的那样),它们会相互施加排斥力(a有点像牛顿第三定律)。如果您想在它们碰撞时立即冻结它们,请尝试在 OnCollisionEnter()
事件中设置 Rigidbody.isKinematic = true
。
将所有这些放在一起,您的 class 可能看起来像:
public class Test : MonoBehaviour {
Rigidbody rb;
void Start()
{
// Store reference to attached Rigidbody
rb = GetComponent<Rigidbody>();
}
void OnMouseDrag()
{
float distance_to_screen = Camera.main.WorldToScreenPoint(gameObject.transform.position).z;
// Move by Rigidbody rather than transform directly
rb.MovePosition(Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, distance_to_screen )));
}
void OnCollisionEnter(Collision col)
{
// Freeze on collision
rb.isKinematic = true;
}
}
希望对您有所帮助!如果您有任何问题,请告诉我。
当直接以非递增方式给出位置变量坐标时,对象"phasing"在下一个位置存在,从而欺骗了碰撞系统。
您必须通过让某种其他系统以增量方式移动对象来对其进行编码:
而不是像这样直接移动对象:
位置=
position = lerp(oldPosition,new position,Time.deltaTime)