Transform父子关系

本文介绍了Unity中关于Transform组件的父子关系管理,包括如何获取和设置父对象,解除父子关系,查找子对象,以及对子对象的各种操作。内容涵盖设置父对象时保留世界坐标的选项,遍历和获取子对象的方法,以及对子对象位置的调整等实践练习。

1、获取和设置父对象

// 获取父对象

this.transform.parent // 得到父对象的Transform

this.transform.parent.name // 得到父对象的名字

// 设置父对象

this.transform.parent = null; // 断绝父子关系

this.transform.parent = GameObject.Find(父名字).transform; // 认爸爸

// 通过API进行父子关系的设置

// 参数一:父亲关系对象

// 参数二:是否保留世界坐标的位置、角度、缩放(bool类型),常用于动态创建UI对象给一个父对象

// true:会保留世界坐标系下的状态,和父对象进行计算得到本地坐标系的信息

// false:不会保留,会直接把世界坐标系下的transform值直接赋值到本地坐标系下,设置新的父对象后子对象Inpector界面中的Transform列表值不变化,再取消两者之间的父子关系,子对象的Transform列表值变为新的值

可以这么理解,true的时候子物体预设原来在什么位置,设立父对象后也还在原来的位置,但其Inspector界面的信息会改变;false 的时候会根据父对象的位置进行偏移,即相对父对象的位置,缩放比例也是同样,但此时其Inspector界面的信息不会改变。

this.transform.SetParent(null);

this.transform.SetParent(GameObject.Find(父名字).transform);

2、抛妻弃子

// 让父对象和自己的所有的儿子断绝关系,但不影响儿子和孙子之间的关系

this.transform.DetachChildren();

3、获取子对象

// 按名字查找儿子,找到其Transform信息

// 不同于GameObject的查找,该方法可以找到失活的对象

// 只能找到儿子,不能找到孙子

Transform obj = this.transform.Find(子对象名字);

// 效率比GameObject的效率较高,因为确定了范围

// 遍历儿子

// 如何得到有多少个儿子,失活的对象也会算上,不会算上孙子

this.transform.childCount;

// 通过索引号得到对应的儿子,返回儿子的Transform信息,如果编号超出范围会报错

for(int i = 0; i < this.transform.childCount; ++i) {

    Transform child = this.transform.GetChild(i);

}

4、儿子的操作

// 判断自己的爸爸是谁

this.transform.IsChildOf(Transform parent)

// 得到自己作为儿子的编号

this.transform.GetSiblingIndex()

// 把自己设置为第一个儿子

this.transform.SetAsFirstSibling();

// 把自己设置为最后一个儿子

this.transform.SetAsLastSibling();

// 把自己设定为指定编号的儿子,如果超出范围(负数或者更大的数)直接设置为最后一个

this.transform.SetSiblingIndex(编号);

练习:

(1)将子对象按名字长短进行排序

(2)传入名字查找子对象,即使是子对象的子对象也可以找到

两者都用扩展方法解决:

public static class TransformExtend {
    public static void SortChild(this Transform trans) {
        List<Transform> childs = new List<Transform>();
        
        for (int i = 0; i < trans.childCount; ++i) {
            childs.Add(trans.GetChild(i));
        }

        childs.Sort((x, y) => {
            return x.name.Length < y.name.Length ? -1 : 1;
        });

        for (int i = 0; i < childs.Count; ++i) {
            childs[i].SetSiblingIndex(i);
        }
    }

    public static void FindAllChildByName(this Transform trans, string name, ref int count) {
        for(int i = 0; i < trans.childCount; ++i) {
            Transform child = trans.GetChild(i);
            if (child.name == name) {
                ++count;
            }
            if (child.childCount > 0) {
            //    FindAllChildByName(child, name, ref count);
                child.FindAllChildByName(name, ref count);
            }
        }
    }
}
### Unity3D中对象的父子关系及其使用方法 在Unity3D中,对象的父子关系是一种层次化的结构设计方式,用于管理和组织场景中的游戏对象(GameObject)。这种关系通过将一个对象设置为另一个对象的子对象来实现,从而形成树状结构。这种设计模式不仅简化了复杂场景的管理,还提供了许多实用的功能。 #### 父子关系的基本概念 当一个对象被设置为另一个对象的子对象时,子对象的位置、旋转和缩放等变换属性会相对于父对象进行计算[^3]。这意味着,如果父对象发生位置、旋转或缩放的变化,所有子对象都会随之变化。例如,如果父对象移动到场景中的新位置,则所有子对象也会跟随移动到相应的新位置。 #### 设置父子关系的方法 在Unity3D中,可以通过以下几种方式设置对象的父子关系: 1. **通过Inspector面板**:选中需要成为子对象的游戏对象,在Inspector面板中找到“Parent”字段,从下拉菜单中选择其父对象。 2. **通过拖拽操作**:在Hierarchy视图中,直接将一个游戏对象拖拽到另一个游戏对象上,即可建立父子关系。 3. **通过脚本代码**:可以使用`transform.SetParent()`方法动态设置父子关系。以下是一个简单的示例代码: ```csharp using UnityEngine; public class ParentChildExample : MonoBehaviour { public GameObject parentObject; public GameObject childObject; void Start() { // 将childObject设置为parentObject的子对象 if (childObject != null && parentObject != null) { childObject.transform.SetParent(parentObject.transform, false); } } } ``` 上述代码中,`SetParent()`方法的第二个参数`false`表示在设置父子关系时不重置子对象的局部变换。如果将其设置为`true`,则子对象的局部变换会被重置为默认值。 #### 父子关系的应用场景 父子关系在实际开发中有多种应用场景,包括但不限于以下几种: 1. **模型组件化管理**:对于复杂的3D模型,通常会将其拆分为多个部分,并通过空对象(Empty GameObject)作为父对象来管理这些部分。这样可以在不修改模型本身的情况下调整各个部分的位置或添加组件[^3]。 2. **相机跟随目标**:在游戏中,经常需要让相机跟随某个角色或物体移动。通过将相机设置为目标对象的子对象,可以轻松实现这一效果。 3. **动画控制**:在动画制作中,父子关系可以帮助实现复杂的运动效果。例如,一个机械手臂的各关节可以通过父子关系连接,从而实现连贯的动作。 4. **UI层级管理**:在用户界面设计中,父子关系可用于组织不同层级的UI元素,确保它们在屏幕上的正确显示顺序。 #### 注意事项 - 当调整父对象的变换属性时,所有子对象都会受到影响。因此,在设计场景时需谨慎考虑父子关系的层级结构。 - 如果需要临时解除父子关系,可以使用`transform.parent = null;`将子对象从当前父对象中移除。 ```csharp childObject.transform.parent = null; ``` ### 总结 Unity3D中的父子关系是一种强大的工具,能够帮助开发者更高效地管理场景中的游戏对象。无论是模型组件化管理还是动画控制,父子关系都扮演着重要角色[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值