如何在运行时在Unity中实例化Oculus可抓取对象?

时间:2018-07-24 15:58:10

标签: c# unity3d scripting window oculus

现在我在Unity中有一个obj文件。我有一个脚本,该脚本向对象添加了Collider组件,Rigidbody组件,最后是OVRGrabbable组件。我需要在运行时添加这些组件,因为最终我将在运行时在脚本中生成过程网格,并且我需要这些过程网格才能被抓取。

我的问题是,在运行时添加对撞机时,OVRGrabbable脚本无法将添加的对撞机识别为抓取点。我认为在我的脚本中的OVRGrabbable之前添加对撞机就足够了,但是没有骰子。我尝试将对撞机附加到Awake函数中,然后将OVRGrabbable附加到Start函数中,但是那也不起作用。另外,我无法在脚本中添加它,因为grabPoints数组是只读的。这是我的代码:

     public class AddVRComponents : MonoBehaviour {
     void Start () {
         public bool freeMoving = false;
         public bool useGravity = false;

         collide = gameObject.AddComponent<BoxCollider>();

         Rigidbody rB = gameObject.AddComponent<Rigidbody>();
         if (!freeMoving)
         {
             rB.drag = Mathf.Infinity;
             rB.angularDrag = Mathf.Infinity;
         }
         if (!useGravity)
         {
             rB.useGravity = false;
         }

         OVRGrabbable grab = gameObject.AddComponent<OVRGrabbable>();
         Collider[] newGrabPoints = new Collider[1];
         newGrabPoints[0] = collide;
         grab.enabled = true;
         grab.grabPoints = newGrabPoints;
     }
 }

这显然不起作用,因为最后一行会产生错误,即grab.grabPoints是只读的。

我知道这是可以做到的,因为如果我运行程序,然后在编辑器中手动将对撞机拖动到OVRGrabbable组件的抓取点字段中,则可以抓取对象。

如何获取OVRGrabbable脚本来识别我的对撞机?

1 个答案:

答案 0 :(得分:1)

只读属性是只能通过包含它们的脚本来分配的属性。这意味着您只能从OVRGrabbable.cs脚本内部更改grabPoints的值。

最好的方法是在OVRGrabbable.cs文件中添加一个自定义函数,以便您可以访问和设置只读变量。

我使用了这个,所以我还可以设置snapPosition和snapOrientation字段以及grabPoints。

public void Initialize(bool snapPosition, bool snapOrientation, Collider[] grabPoints)
{
    m_snapPosition = snapPosition;
    m_snapOrientation = snapOrientation;
    m_grabPoints = grabPoints;
}

只需添加并调用以下内容,您就足够了:

public void Initialize(Collider[] grabPoints)
{
    m_grabPoints = grabPoints;
}