导引:

因为项目中难免要多次进行获取子对象或者子对象的集合,所以写一个单独的类,用来做这些操作。然后再实际的项目中,只需要使用 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. golang timeoutHandler解析及kubernetes中的变种

    Golang里的http request timeout比较简单,但是稍不留心就容易出现错误,最近在kubernetes生产环境中出现了的一个问题让我有机会好好捋一捋golang中关于timeout中 ...

  2. 洛谷 P3338 [ZJOI2014]力

    题意简述 读入\(n\)个数\(q_i\) 设\(F_j = \sum\limits_{i<j}\frac{q_i\times q_j}{(i-j)^2 }-\sum\limits_{i> ...

  3. Scrum Master如何让敏捷团队正常运转?

    官方<Scrum指南>中定义:Scrum Master在Scrum团队中属于服务型领导,负责践行和支持<Scrum指南>中定义的Scrum,要帮团队的每个人理解Scrum理论. ...

  4. 使用docker快速搭建本地环境

    在平时的开发中工作中,环境的搭建其实一直都是一个很麻烦的事情 特别是现在,系统越来越复杂,所需要连接的一些中间件也越来越多. 然而要顺利的安装好这些中间件也是一个比较费时费力的工作. 俗话说" ...

  5. FIS 插件机制

    FIS 插件机制 author: @TiffanysBear 当我们使用 FIS 插件的时候,有没有想过自己也开发一个基于 FIS 的插件,参与 FIS 打包编译的整个流程:那么问题就来了: FIS ...

  6. appium+python自动化项目实战(一):引入nose和allure框架

    本文将介绍一套比较完整的appium自动化框架,以python为编写脚本语言,是因为python有强大的库,同时易学易懂. 最终的测试框架代码,将在jenkins项目中一键构建,执行自动化测试用例,并 ...

  7. C++ 线程安全的单例模式总结

    什么是线程安全? 在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况. 如何保证线程安全? 给共享的资源加把锁,保证每 ...

  8. centos6在安装wdcp以后,导入MySQLdb报错问题

    为了方便linux的使用,会先安装好wdcp对服务器进行管理.在装好wdcp会对一些nginx,mysql等自动安装,但是mysql的安装目录会在/www/wdlinux这个目录下,跟一般的mysql ...

  9. UGUI的图集处理方式-SpriteAtlas的前世今生

    最糟糕的是人们在生活中经常受到错误志向的阻碍而不自知,真到摆脱了那些阻碍时才能明白过来. —— 歌德 说到UGUI的图集初学者可能觉得没什么难度,包括我刚开始接触的时候也是,甚至你在开发的时候只需要把 ...

  10. Leetcode之二分法专题-441. 排列硬币(Arranging Coins)

    Leetcode之二分法专题-441. 排列硬币(Arranging Coins) 你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币. 给定一个数字 n,找出可形 ...