在我的Unity3D
项目中,我得到了卡车的复杂GameObject
,其层次结构如下所示。
+ Truck
+FrontPivotPoint
+LeftWheel
Tire
Rim
Hindge
+RightWheel
Tire
Rim
Hindge
+CenterPivotPoint
+Body
Arm
Screw
Pin
[基本上发生的是,我有很多复杂的育儿方法,我想通过每个孩子并给他添加RigidBody
。我认为这应该是嵌套的,但我没有想到。任何帮助,将不胜感激!
Unity3d使您可以轻松地自动执行每个例程。您可以考虑添加自定义菜单项。
public class MakeRigidBodies : EditorWindow
{
[MenuItem ("Make rigid bodies %&r")]
private static void Execute()
{
var selectedObject = UnityEditor.Selection.activeObject;
if( selectedObject && selectedObject is GameObject )
{
// for all children of selectedObject
{
// add rigid body
}
}
}
}
据我所知,游戏对象的结构就像树数据结构。卡车作为其父/根节点,其他作为其子节点。因此,您必须使用树遍历算法遍历结构中的所有对象/节点,据我所知,最好是深度优先搜索(DFS)算法。
DFS像嵌套循环一样工作,主要算法是:
该算法可以在Unity3d中实现,因为GameObject
将其子信息存储在变换属性中(请参见http://answers.unity3d.com/questions/416730/get-the-child-gameobject-of-a-parent-and-not-the-t.html)。最后,我们可以使用RigidBody
方法将GameObject
添加到AddComponent()
(请参阅http://answers.unity3d.com/questions/19466/how-do-i-add-a-rigidbody-in-script.html)。
这是我的脚本来回答您的问题:
using UnityEngine;
using System.Collections;
public class AddRigidBody : MonoBehaviour {
private void addRigidBody(GameObject gameObject)
{
Rigidbody rigidBody = gameObject.AddComponent<Rigidbody>();
foreach(Transform t in gameObject.transform)
{
addRigidBody(t.gameObject);
}
}
void Start () {
addRigidBody (this.gameObject);
}
}
此脚本附加到父/根GameObject
。当此脚本启动时,将调用AddRigidBody()
方法(如Start()
方法中一样),并且该方法将遍历所有子级并在其中添加一个RigidBody
。
如果我没记错的话,并且忍受我,因为我使用Unity3D已经有一段时间了,这可以解决它:
* Drag your model onto the stage
* Your entire model should now be selected; parent and its underlying children
* Select the option to add a rigidbody and it should add it to all selected objects.
* Make a prefab of the model and you should be done.
再次,请不要对此表示信任。已经有一段时间了,由于我现在无法访问Unity3D,所以我自己无法检查此方法。
如果这是您想要的代码方法,请尝试以下操作(C#,Boo或Java的方法可能有所不同:]
[生孩子:http://forum.unity3d.com/threads/get-child-c.83512/(请参阅第二个答复)添加刚体:http://answers.unity3d.com/questions/19466/how-do-i-add-a-rigidbody-in-script.html
我希望这会有所帮助。