【发布时间】:2016-01-16 09:35:06
【问题描述】:
我有一个很简单的案例:一个平面上有2个立方体,玩家可以通过鼠标输入移动一个立方体。
每个立方体都有一个碰撞体和刚体,以及一个反弹为零的高摩擦材料。
我想要实现的是:如果一个立方体要与另一个接触,我想阻止两个立方体相互推动或进入另一个 - 我希望它们充当彼此的墙。
我得到的是这样的:
我尝试的是在拖动立方体时打开立方体的 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; }
感谢任何帮助。谢谢。
【问题讨论】:
-
你试过锁定刚体上的位置吗?您可以在检查器中执行此操作:)
-
感谢您的意见,@Tom。是的,我确实尝试将 X 和 Z 添加到检查器中的刚体冻结位置约束,但是这样做,我用鼠标移动立方体的脚本将无法正常工作。 :(
-
@JoeBlow - 很抱歉不清楚。我将尝试更好地解释:用户开始用鼠标拖动白色立方体。白色立方体与红色立方体碰撞。红色立方体保持静止。用户继续拖动白色立方体。用户仍在拖动白色立方体,它可以沿着平面的表面移动,但不能沿红色立方体的方向移动(因为红色立方体应该是牢固接地的)。用户停止拖动。如果用户开始拖动红色立方体,则会出现相同的行为。