导引:

因为项目中难免要多次进行获取子对象或者子对象的集合,所以写一个单独的类,用来做这些操作。然后再实际的项目中,只需要使用 transform 或者 gameobject 调用这些方法就可以快速的得到这些数据,而并不需要自己在每个单独的类里面都写上一遍。

代码如下:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine; public static partial class ExtentionMethod
{
/// <summary>
/// 获取子对象变换集合
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static List<Transform> GetChildCollection(this Transform obj)
{
List<Transform> list = new List<Transform>();
for (int i = ; i < obj.childCount; i++)
{
list.Add(obj.GetChild(i));
}
return list;
} /// <summary>
/// 获取子对象集合
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static List<GameObject> GetChildCollection(this GameObject obj)
{
var list = obj.transform.GetChildCollection();
return list.ConvertAll(T => T.gameObject);
} public static Transform GetRootParent(this Transform obj)
{
Transform Root = obj.parent;
while(Root.parent != null)
{
//Root = Root.root; //transform.root,方法可以直接获取最上父节点。
Root = Root.parent;
}
return Root;
} /// <summary>
/// 把源对象身上的所有组件,添加到目标对象身上
/// </summary>
/// <param name="origin">源对象</param>
/// <param name="target">目标对象</param>
public static void CopyComponent(GameObject origin, GameObject target)
{
var originComs = origin.GetComponents<Component>();
foreach (var item in originComs)
{
target.AddComponent(item.GetType());
}
} /// <summary>
/// 改变游戏脚本
/// </summary>
/// <param name="origin"></param>
/// <param name="target"></param>
public static void ChangeScriptTo(this MonoBehaviour origin, MonoBehaviour target)
{
target.enabled = true;
origin.enabled = false;
} /// <summary>
/// 从当前对象的子对象中查找,返回一个用tag做标识的活动的游戏物体的链表.如果没有找到则为空.
/// </summary>
/// <param name="obj">对象Transform</param>
/// <param name="tag">标签</param>
/// <param name="transList">结果Transform集合</param> // 对一个父对象进行递归遍历,如果有子对象的tag和给定tag相符合时,则把该子对象存到 链表数组中
public static void FindGameObjectsWithTagRecursive(this Transform obj, string tag, ref List<Transform> transList)
{
foreach (var item in obj.transform.GetChildCollection())
{
// 如果子对象还有子对象,则再对子对象的子对象进行递归遍历
if (item.childCount > )
{
item.FindGameObjectsWithTagRecursive(tag, ref transList);
} if (item.tag == tag)
{
transList.Add(item);
}
}
} public static void FindGameObjectsWithTagRecursive(this GameObject obj, string tag, ref List<GameObject> objList)
{
List<Transform> list = new List<Transform>();
obj.transform.FindGameObjectsWithTagRecursive(tag, ref list); objList.AddRange(list.ConvertAll(T => T.gameObject));
} /// <summary>
/// 从父对象中查找组件
/// </summary>
/// <typeparam name="T">组件类型</typeparam>
/// <param name="com">物体组件</param>
/// <param name="parentLevel">向上查找的级别,使用 1 表示与本对象最近的一个级别</param>
/// <param name="searchDepth">查找深度</param>
/// <returns>查找成功返回相应组件对象,否则返回null</returns>
public static T GetComponentInParent<T>(this Component com, int parentLevel = , int searchDepth = int.MaxValue) where T : Component
{
searchDepth--; if (com != null && searchDepth > )
{
var component = com.transform.parent.GetComponent<T>();
if (component != null)
{
parentLevel--;
if (parentLevel == )
{
return component;
}
} return com.transform.parent.GetComponentInParent<T>(parentLevel, searchDepth);
} return null;
}
}

补充:Unity中三种调用其他脚本函数的方法

第一种:被调用脚本函数为static类型,调用时直接用 脚本名.函数名()。很不实用~

第二种:GameObject.Find(“脚本所在物体名”).SendMessage(“函数名”); 此种方法可以调用public和private类型函数

第三种:GameObject.Find(“脚本所在物体名”).GetComponent<脚本名>().函数名();此种方法只可以调用public类型函数

Unity3D_06_根据Transform、GameObject和Tag获取子对象集合的更多相关文章

  1. NX二次开发-UFUN由工程图视图tag获取图纸页tag UF_DRAW_ask_drawing_of_view

    #include <uf.h> #include <uf_draw.h> #include <uf_drf.h> #include <uf_obj.h> ...

  2. NX二次开发-UFUN输入特征TAG,获取特征所有表达式TAG和个数UF_MODL_ask_exps_of_feature

    NX9+VS2012 #include <uf.h> #include <uf_modl.h> UF_initialize(); //创建块 UF_FEATURE_SIGN S ...

  3. NX二次开发-UFUN输入Part的TAG,获取整个部件表达式的TAG和表达式个数UF_MODL_ask_exps_of_part

    NX9+VS2012 #include <uf.h> #include <uf_modl.h> #include <uf_part.h> UF_initialize ...

  4. Atitit利用反射获取子类 集合 以及继承树

    Atitit利用反射获取子类 集合 以及继承树 想从父类往下找子类的确是不可能的,要知道只要类不是final的话谁都有继承它的自由不需要事前通知父类. Eclipse实现不是重父类开始找而是重子类往回 ...

  5. Js获取后台集合List的值和下标的方法

    Js获取后台集合List的值和下标的方法 转载自:http://blog.csdn.net/XiaoKanZheShiJie/article/details/47280449 首先用的是struts2 ...

  6. 从值栈获取List集合

    -------------------siwuxie095 从值栈获取 List 集合 1.具体步骤 (1)在 Action 中向值栈放 List 集合 (2)在 JSP 页面中从值栈获取 List ...

  7. 反射方式,获取出集合ArrayList类的class文件对象

    /* * 定义集合类,泛型String * 要求向集合中添加Integer类型 * * 反射方式,获取出集合ArrayList类的class文件对象 * 通过class文件对象,调用add方法 * * ...

  8. Java分享笔记:使用entrySet方法获取Map集合中的元素

    /*--------------------------------- 使用entrySet方法取出Map集合中的元素: ....该方法是将Map集合中key与value的关系存入到了Set集合中,这 ...

  9. 获取单列集合,双列集合,数组的Stream流对象以及简单操作

    获取流对象 获取单列集合,双列集合,数组的流对象 单列集合获取流对象: 1.java.util.Collection接口中加入了default方法stream()获取流对象,因此其所有实现类均可通过此 ...

随机推荐

  1. DT-06 For Homekit

    一. 配置DT-06上网 连接此热点,会自动弹出wifi配置页面. 输入选中的路由密码,点 Join加入,如果路由没有出现在列表中,点 Other手工输入(仅支持2.4g路由配置) 二.配置dt-06 ...

  2. Appium+python自动化(三十)- 实现代码与数据分离 - 数据配置-yaml(超详解)

    简介 本篇文章主要介绍了python中yaml配置文件模块的使用让其完成数据和代码的分离,宏哥觉得挺不错的,于是就义无反顾地分享给大家,也给大家做个参考.一起跟随宏哥过来看看吧. 思考问题 前面我们配 ...

  3. 存储型XSS的发现经历和一点绕过思路

    再次骚扰 某SRC提现额度竟然最低是两千,而已经有750的我不甘心呐,这不得把这2000拿出来嘛. 之后我就疯狂的挖这个站,偶然发现了一个之前没挖出来的点,还有个存储型XSS! 刚开始来到这个之前挖过 ...

  4. python 26 反射

    目录 1. 类的反射 1.1 实例对象 1.2 类 1.3 其他模块 -- 其他.py文件 1.4 本模块 -- 当前.py文件 2. 函数与方法的区别 2.1区别的方法: 2.2 总结 3. 特殊的 ...

  5. 设计模式(C#)——03建造者模式

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321       当一个复杂对象由一些子对象构成,并且子对象的变化会导致复杂对象的修改.这时我们需要提供一种"封装机制&qu ...

  6. Windows Server - SVN 服务器搭建与项目配置、客户端安装与配置

    本教程以Windows Server 2012 R12 为例搭建SVN服务器,安装部署完成后,客户端可通过SVN客户端访问SVN服务器上的项目,也可以访问网上其他SVN服务器上的项目. 一.首先准备三 ...

  7. html基础——下拉式菜单

    一个网站能否让用户容易使用该网站往往是由菜单栏体现出来,因为它为网页的大多数页面提供功能入口.一个轻轻的点击以后,即可显示出菜单项,将网站的大部分页面和功能显示出来让用户清楚了解从而用户节约一定的时间 ...

  8. 微擎 人人商城 对接京东vop 对接京东商品,同步商品 地址,库存,价格,上下架等。(二) 设置后台管理界面

    昨天提到了,由于vop商品池未开通,故对接工作只能暂缓,现在要做一个专门针对vop商品的后台管理, 老规矩,先上设计链路图 因为后台本来就是有比较完善的商品管理系统, 所以我们只是针对vop 进行简单 ...

  9. 本地搭建持续集成(AzureDevops)

    下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/ 首先你需要SQL2017以上版本 ,不支持以下版本 完成下载之后进行安装(可选中文 ...

  10. [python]python列表、元组

    1. 列表和元组简介 列表:用中括号[]包裹,元素的个数及元素的值可以改变. 元组:用小括号()包裹,不可用更改. 通过切片运算[]和[:]可以得到子集. 2.列表 示例: List = [1, 2, ...