unity 获取子数据

Posted

技术标签:

【中文标题】unity 获取子数据【英文标题】:unity get child data 【发布时间】:2019-06-24 02:08:19 【问题描述】:

我正在尝试在 Unity 中创建程序创建的地下城。 我用它来创建地牢,并在每个预制件上附加一个脚本,用于构成墙壁、地板等。每个预制件都连接到一个父级,以便于删除和重建整个地牢。该脚本包含详细信息:

 public class WallPrefab
 
     public bool use;
     private int roomId;
     public WallTypes type; //enum = torch, switch, item etc
     public WallDirections direction; //direction wall is facing
     public GameObject myPrefab; //nested
 

预制件还包含一个空的游戏对象,用作手电筒、开关等的安装点。

 myPrefab
      prefab //prefab for the actual 3d object
      wallmount //empty game object to store location and rotation details
      ....

我的问题: 1.如何获取墙体类型?

    int childs = transform.childCount;
    for (var i = childs - 1; i >= 0; i--)
    
        c = transform.GetChild(i).gameObject;
        Debug.Log("child:" + c.name);
        //WallTypes g = c.GetComponentInChildren<WallPrefab>().type;
        WallTypes g = c.transform.GetComponentInChildren<WallSettings>().type;

(已编辑为我的这部分问题插入有效的解决方案!) 此代码不起作用,因为 Unity 抱怨:

ArgumentException: GetComponent 要求请求的组件 'WallPrefab' 派生自 MonoBehaviour 或 Component 或者是 界面。

    如何获得挂载点的变换?

一旦我获得了挂载点,我就知​​道如何获取位置和旋转,但我如何实际获取挂载点?

【问题讨论】:

您遇到的错误是不言自明的,它是一个标准的 c# 类,不是从 monobehavior 派生的,因此不能是统一对象上的组件。在public class WallPrefab 之后放: MonoBehavior WallTypes WallType = c.transform.GetComponentInChildren().type;有效! 如果您将 WallPrefab(这是一个奇怪的类名)设置为 MonoBehavior,您将能够获得所有孩子的变换。 【参考方案1】:

问题 1 似乎很容易解释。

问题 2 看起来更有趣。

如果我对您的理解正确,您有一个脚本,可以在指定的安装点上“创建”手电筒。假设这些挂载点是空的游戏对象,并且您不想将火把直接添加到预制件中(如果我们在这里能更详细地了解您的地牢+挂载点是如何生成的,那就太好了),我会添加一个脚本到预制件,添加一个 GameObject 实例变量并使用检查器将安装点拖到脚本上。然后我会使用“gameobjectVariable.transform.position”来获取位置。

类似:

public class prefabClassWithMountPoints
    GameObject mountpoint; //drag mount point from inspector
    GameObject torchGameObject; //drag torch prefab here

    public void createTorch()
        GameObject torchObject = Instantiate(torchGameObject, mountpoint.transform.position, Quaternion.identity);
        //...
    
    //rest of code

这是假设安装点不是在预制件内随机生成的。

【讨论】:

不,挂载点被添加到父预制件中。它们只是一个添加的空游戏对象,在设计时添加到父预制件中。父预制件是通过脚本生成的。它被放置在游戏中,并且已经有了挂载点,它应该在正确的位置,以便能够从空的游戏对象中获取位置和旋转。我知道如何从预制件中获得它。我遇到的问题是将空的游戏对象放入预制件中? 所以挂载点是通过脚本添加到通过脚本生成的父级的? 不,它们不是通过脚本添加的。它们在设计时添加到预制件中,而不是在运行时! 哦,我的错。在这种情况下,您可以完全按照我在那里描述的方式进行操作。在设计时,使用检查器将它们添加到相应的脚本中。 我需要的是一种方法来获取指向预制件内安装点的指针

以上是关于unity 获取子数据的主要内容,如果未能解决你的问题,请参考以下文章

unity3d UGUI怎么获取ScrollRect到组件

安装unity组件怎么改安装路径?

unity中GetComponent获取组件中的材质的颜色,用C#写

C#扩展函数&Unity子对象组件的定向获取

unity中怎样获取全部子物体的组件

unity获取游戏物体