【问题标题】:Unity3d Circle Collider: How to rotate Game Object but don't rotate colliderUnity3d Circle Collider:如何旋转游戏对象但不旋转对撞机
【发布时间】:2015-03-05 23:46:18
【问题描述】:

我有一个 GameObject 并附有 CircleCollider2D。当Collider 碰到另一个Collider 时,游戏对象开始移动和旋转(它附有Rigidbody2d)。我不需要旋转这个 GameObject,而是旋转另一个 GameObject,其作用力与击中后计算的 collider&rigidbody 完全相同。

【问题讨论】:

  • 我有一些想法,但首先,我还没有做过 2D 游戏,所以你能告诉我对撞机在哪个维度旋转吗?它是保持平坦(并且只是旋转),还是滚动(并脱离其平面)?
  • @piojo 附加了ColliderGameObject 仅在Z 维度上旋转。它开始在 X 和 Y 维度上移动。所以在与另一个Collider 击中后,GameObject 开始移动和旋转(Rigidbody 的拖动和速度属性)
  • 我不确定我是否理解这个问题,你能不能把CircleCollider2D放在一个空的游戏对象上,然后把你的游戏对象(带有rigidbody)作为它的孩子?
  • @AdamH 听起来他希望对撞机/刚体将旋转传递给游戏对象,而不是自身旋转。我的回答试图让游戏对象从物理对象“窃取”旋转/位置,然后重置物理对象的旋转。 (虽然我不知道他为什么不希望物理对象旋转,因为它无论如何都不可见。)
  • @George 既然我提到了,为什么你想让对撞机不旋转?圆具有旋转对称性,而且对撞机甚至不可见。是否有一些算法需求,还是我们都误解了?

标签: unity3d


【解决方案1】:

这个 hack 行得通吗?:将碰撞器放在一个子对象上(不可见)。然后LateUpdate()中的每一帧(所以会迟到,但在渲染之前),做切换:将父对象移动到子对象移动到的位置(包括旋转),然后重置子对象:把它的本地位置为零,并将其世界旋转设置为与刚才相同的位置。

像这样:

void LateUpdate()
{
    Transform child = transform.GetChild(0);
    Quaternion oldRotation = transform.rotation;
    // Take the collider object's position/rotation
    transform.rotation = child.rotation;
    transform.position = child.position;
    // Restore the child's position to be at the same place as the parent
    child.localPosition = Vector3.zero;
    // Leave the child's rotation what it originally was:
    child.rotation = oldRotation;
}

我现在看到的一个问题是,这可能会做一些有趣的事情。我不确定。我不知道像这样移动/旋转物理对象的效果。您可能想尝试使用Rigidbody.position=Rigidbody.rotation= 来更新孩子的状态(在您为父母窃取它之后)。

【讨论】:

    猜你喜欢
    • 2018-06-14
    • 2014-08-05
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    相关资源
    最近更新 更多