现在我在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脚本来识别我的对撞机?
答案 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;
}