在运行时从脚本迭代所有GameObject子级的简单方法

问题描述 投票:0回答:3

在我的Unity3D项目中,我得到了卡车的复杂GameObject,其层次结构如下所示。

+ Truck
   +FrontPivotPoint
      +LeftWheel
        Tire
        Rim
        Hindge
      +RightWheel
        Tire
        Rim
        Hindge
    +CenterPivotPoint
      +Body
        Arm
        Screw
        Pin  

[基本上发生的是,我有很多复杂的育儿方法,我想通过每个孩子并给他添加RigidBody。我认为这应该是嵌套的,但我没有想到。任何帮助,将不胜感激!

unity3d gameobject
3个回答
1
投票

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
       }
    }
  }
}

1
投票

据我所知,游戏对象的结构就像树数据结构。卡车作为其父/根节点,其他作为其子节点。因此,您必须使用树遍历算法遍历结构中的所有对象/节点,据我所知,最好是深度优先搜索(DFS)算法。

DFS像嵌套循环一样工作,主要算法是:

  1. 从根节点开始
  2. 查找其节点子节点
  3. 拜访孩子
  4. 返回步骤2,直到所有孩子都被拜访为止

该算法可以在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


0
投票

如果我没记错的话,并且忍受我,因为我使用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

我希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.