【问题标题】:Adding "force field" to object in Unity to avoid collider clipping?向 Unity 中的对象添加“力场”以避免对撞机剪裁?
【发布时间】:2017-03-30 20:02:53
【问题描述】:

我正在 Unity 和 C# 中使用虚拟现实制作弓箭游戏。我想让箭在你射击之前停在弓把上。现在我的手柄上有一个盒子碰撞器,箭头上有另一个碰撞器。它工作正常,直到您将箭头推过手柄。它会出现一秒钟的故障,然后它就会通过(就像没有剪辑一样)。

在我的 VR 课程中,我们了解到您可以向对象添加法向力或“推回力”,以防止其他对象通过它。我不希望这会从字面上推回箭头(这会消除现实主义)。有没有办法给物体添加力场?哪里有其他物体在任何时候都被非常轻微地击退而不是一次爆发的力量?

这是我已经尝试过的代码,它有一点帮助,但没有多大帮助。这是附在弓上的脚本:

private void OnCollisionEnter(Collision collision) {

    if (collision.gameObject.tag == "Arrow") {
        Rigidbody arrowBody = collision.gameObject.GetComponent<Rigidbody>();
        arrowBody.AddForce(this.transform.TransformDirection(Vector3.left) * 100f);
    }

}

我应该补充一点,箭是用固定关节握在“手中”的,所以在弓把上添加第二个固定关节不是一种选择(手的关节最终失效,箭头掉到地上没有被任何一个关节持有)。

【问题讨论】:

  • 考虑在对象周围添加一个触发对撞机 - 当其他对象进入触发对撞机时,对这些对象施加与它们与对撞机中心的距离成比例的力。如果他们离开触发对撞机,请停止对他们施加力。
  • 添加任何大小的力仍然允许推进

标签: c# unity3d game-physics virtual-reality


【解决方案1】:

我最终在碰撞时将箭头的父变换更改为弓,然后让它从控制器的固定关节离开。现在完美绑定了。

提供的代码不多:

private void OnCollisionEnter(Collision col)
{
    if (col.gameObject.tag == "Bow")
    {
            this.transform.parent = col.gameObject.transform;
            GameObject.Find("Controller").GetComponent<FixedJoint>().connectedBody = null;      
    }
}

【讨论】:

    【解决方案2】:

    除非有特定原因,否则我不会为此使用物理学。

    你可以通过脚本改变箭头的方向,让它指向正确的方向。

    例如,您可以在弓上添加一个空子 Transform,表示箭头“接触”弓的点。

    然后您可以向箭头添加一个脚本,将其向后移动到手所在的位置并将其方向更改为look at 表示Transform

    【讨论】:

      猜你喜欢
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      • 1970-01-01
      • 2021-10-20
      相关资源
      最近更新 更多