Unity3D_06_根据Transform、GameObject和Tag获取子对象集合
导引:
因为项目中难免要多次进行获取子对象或者子对象的集合,所以写一个单独的类,用来做这些操作。然后再实际的项目中,只需要使用 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获取子对象集合的更多相关文章
- 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> ...
- 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 ...
- 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 ...
- Atitit利用反射获取子类 集合 以及继承树
Atitit利用反射获取子类 集合 以及继承树 想从父类往下找子类的确是不可能的,要知道只要类不是final的话谁都有继承它的自由不需要事前通知父类. Eclipse实现不是重父类开始找而是重子类往回 ...
- Js获取后台集合List的值和下标的方法
Js获取后台集合List的值和下标的方法 转载自:http://blog.csdn.net/XiaoKanZheShiJie/article/details/47280449 首先用的是struts2 ...
- 从值栈获取List集合
-------------------siwuxie095 从值栈获取 List 集合 1.具体步骤 (1)在 Action 中向值栈放 List 集合 (2)在 JSP 页面中从值栈获取 List ...
- 反射方式,获取出集合ArrayList类的class文件对象
/* * 定义集合类,泛型String * 要求向集合中添加Integer类型 * * 反射方式,获取出集合ArrayList类的class文件对象 * 通过class文件对象,调用add方法 * * ...
- Java分享笔记:使用entrySet方法获取Map集合中的元素
/*--------------------------------- 使用entrySet方法取出Map集合中的元素: ....该方法是将Map集合中key与value的关系存入到了Set集合中,这 ...
- 获取单列集合,双列集合,数组的Stream流对象以及简单操作
获取流对象 获取单列集合,双列集合,数组的流对象 单列集合获取流对象: 1.java.util.Collection接口中加入了default方法stream()获取流对象,因此其所有实现类均可通过此 ...
随机推荐
- Python模块——HashLib(摘要算法)与base64
摘要算法(hashlib) Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度 ...
- 积性函数&线性筛&欧拉函数&莫比乌斯函数&因数个数&约数个数和
只会搬运YL巨巨的博客 积性函数 定义 积性函数:对于任意互质的整数a和b有性质f(ab)=f(a)f(b)的数论函数. 完全积性函数:对于任意整数a和b有性质f(ab)=f(a)f(b)的数论函数 ...
- Entity Framework 6.0 入门系列 第一篇
Entity Framework 6.0 入门系列 第一篇 好几年前接触过一些ef感觉不是很好用,废弃.但是 Entity Framework 6.0是经过几个版本优化过的产物,性能和功能不断完善,开 ...
- maven学习(1)下载和安装和初步使用(手动构建项目和自动构建项目)
1:背景 关于项目的搭建,有些人使用开发工具搭建项目,然后将项目所依赖第三方jar 复制到类路径下面,上述搭建方式没有第三方类库的依赖关系,在导入一个jar包的时候,这个jar包还可能依赖其他jar包 ...
- windows+appium自动化,Desired Capabilities参数填写,查看界面信息
前言: 安装JDK并配置环境变量. 安装sdk并配置对应环境变量. 安装appium客户端. 手机打开开发者模式,并启用调试模式. 1.打开Appium客户端,点击Start Server V1.9. ...
- SpringCould-------使用Hystrix 实现断路器进行服务容错保护
消费: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.or ...
- odoo视图中常用widget
widget="statusbar" 头部状态条标签 widget="email" 电子邮件地址标签 widget="selection" ...
- python学习——字典和集合
一.字典 1)字典介绍 字典是一种通过名字或者关键字引用的得数据结构,其键可以是数字.字符串.元组,这种不可变的结构类型也称之为映射.字典类型是Python中唯一內建的映射类型. 1)字典操作 &qu ...
- JavaScript中几种常见的兼容问题及解决方案
在js中好用的东西一般都存在兼容问题,以下,我整理了一些常用的兼容处理方法,自己用的时候可以把他们放在一个JS文件中,需要用到时候直接引入,会比较方便. 一.获取非行内样式 function getS ...
- Leetcode之深度优先搜索&回溯专题-980. 不同路径 III(Unique Paths III)
Leetcode之深度优先搜索&回溯专题-980. 不同路径 III(Unique Paths III) 深度优先搜索的解题详细介绍,点击 在二维网格 grid 上,有 4 种类型的方格: 1 ...