unity3d获得子物体集合_unity3d获取物体下面的子物体 - CSDN
  • foreach (Transform child in transform) { Debug.Log(child.gameObject.name); }
    foreach (Transform child in transform)
    {
        Debug.Log(child.gameObject.name);
    }

    展开全文
  • using System; using System.Collections.Generic; using System.Linq; using System.Text; using UnityEngine; ...public static partial class ExtentionMethod ... /// 获取子对象变换集合 /// ///

           因为项目中难免要多次进行获取子对象或者子对象的集合,所以同事之前写了一个单独的类,用来做这些操作。然后再实际的项目中,只需要使用 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 = 0; 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 > 0)
                {
                    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 = 1, int searchDepth = int.MaxValue) where T : Component
        {
            searchDepth--;
    
            if (com != null && searchDepth > 0)
            {
                var component = com.transform.parent.GetComponent<T>();
                if (component != null)
                {
                    parentLevel--;
                    if (parentLevel == 0)
                    {
                        return component;
                    }
                }
    
                return com.transform.parent.GetComponentInParent<T>(parentLevel, searchDepth);
            }
    
            return null;
        }    
    }
    
    







    展开全文
  • 在UI模块中获取UI游戏物体已用来切换,通过遍历获取并添加到集合,省去了代码中游戏物体的定义和查找实例化.

    使用foreach循环 遍历所有子物体 遍历过程不会包含父物体, 将遍历的物体添加到集合

    private List<GameObject> _Gos = new List<GameObject>();	//定义一个存储遍历出的物体集合
    
    void Start()
    {
    	foreach	(Transform child in GameObject.transform)
    	{
    		_Gos.Add(child.gameObject);
    		Debug.Log("子物体名称:" + child.name);
    	}
    }
    
    展开全文
  • Unity3D3D物体添加点击事件

    千次阅读 2018-10-18 17:05:09
    1.相机添加脚本《ClickEvent》: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems;...public class ClickEvent : MonoBehaviour { ...

    1.相机添加脚本《ClickEvent》:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.EventSystems;
    
    public class ClickEvent : MonoBehaviour {
    
        public GameObject[] cube1; //3D物体集合
    
        private void Start()
        {
            //为相机添加3个组件
            if (this.gameObject.GetComponent<PhysicsRaycaster>() == null) {
                gameObject.AddComponent<PhysicsRaycaster>();
            }
            if (this.gameObject.GetComponent<EventSystem>() == null)
            {
                this.gameObject.AddComponent<EventSystem>();
            }
    
            if (this.gameObject.GetComponent<StandaloneInputModule>() == null)
            {
                gameObject.AddComponent<StandaloneInputModule>();
            }
            
            //为3D物体添加点击事件
            for (int i = 0; i < cube1.Length; i++)
            {
                AddObjectClickEvent(cube1[i]);
            }
        }
    
        public void AddObjectClickEvent(GameObject itemObject) {
            var box = itemObject.GetComponent<BoxCollider>();
            if (box == null)
            {
                box = itemObject.AddComponent<BoxCollider>();
            }
            
            // ThreeD_Object为3D物体挂载的脚本
            var item = itemObject.GetComponent<ThreeD_Object>();
            if (item == null)
            {
                item = itemObject.AddComponent<ThreeD_Object>();
            }
                
            EventTrigger trigger = itemObject.GetComponent<EventTrigger>();
            if (trigger == null)
            {
                trigger = itemObject.AddComponent<EventTrigger>();
            }
    
            EventTrigger.Entry entry = new EventTrigger.Entry();
            entry.eventID = EventTriggerType.PointerClick;
            UnityEngine.Events.UnityAction<BaseEventData> click = new UnityEngine.Events.UnityAction<BaseEventData>(item.OnClickCubeItem);
            entry.callback.AddListener(click);
    
            trigger.triggers.Clear();
            trigger.triggers.Add(entry);
        }
    }
    

    2.为3D物体添加脚本《Threed_Object》:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class CubeEventItemBind : MonoBehaviour {
    
    
        public void OnClickCubeItem(UnityEngine.EventSystems.BaseEventData data = null)
        {
            Debug.Log("点击了" + transform.name);
            //点击对应事件
        }
    }
    

     

    展开全文
  • unity中如何获取所有子物体的组件

    万次阅读 2015-07-02 16:20:26
    public GameObject[] obj;  void Awake()  {    for (int i = 0; i  {  for (int j = 0; j  {  print("obj[i].transform.childCount=" + E
  • Unity3D当中,想要在观察面(Aspect)中拾取物体(有碰撞属性)的方法一般如下: 1、声明一个观察的摄像机、一个从摄像机原点出发的射线Ray以及一个用于检测碰撞的RaycastHit; 2、将射线Ray定义为从摄像机原点...
  • 写这个方法纯粹是为了偷懒,在功能比较简单的时候,一个个拖物体实在太显麻烦,如果能通过子物体的名字直接绑定到脚本里,确实能够省去不少时间。 原理是先检索父体下的第一子物体中有无需要的子物体,如无,则递归...
  • Unity3D获得Sprite中的精灵

    千次阅读 2019-03-08 17:07:20
    https://feedback.unity3d.com/suggestions/allow-access-to-sprite-packer-atlas-to-retrieve-sprites-by-name 目前较新版本的已经有相关API了。 代码如下: SpriteAtlas sa = Resources.Loa...
  • 平时获取一系列的image都是通过Inspector面板拖拽或通过transform.find()来得到相关对象的&lt;少用GameObject.find(),好像是效率没这么高&gt;。心血来潮,想起之前Unity文档里面还有一种获得GameObject的...
  • Unity3D 获得GameObject组件的方法 这样通过获得组件GetComponent<>方法,能够获得一些需要的属性。 需要说明一下, GetComponent() 和 gameObject.transform 都能够获得组件的形态对象,只是写法不同罢了,...
  • Unity3D教程:手游如何使用Unity3D自带的重力感应?重力感应在手机游戏的开发中非常常见。Unity3D本身集合了重力感应的相关内容。简单的JS脚本示范一下重力感应的使用: //物体的贴图 var round : Texture2D;...
  • unity 3D 如何获取距离最近的对象

    千次阅读 2018-09-01 11:38:09
    在这里要运用数组,数列list与字典dictionary相结合。  private GameObject[] targetArr;  private List&lt;float&gt; KnifeList;  private Dictionary&lt;float, GameObject&... knifeDic...
  • 为了让开发者能够系统全面的学习Unity3D知识,CSDN特邀请了Unity3D方面的知名专家,资深程序员一起打造了Unity3D知识库,经过各位特邀编辑的层层筛选,目前已收录的核心知识点精华文章已达300多篇,包括视...
  • 加载Unity导入的场景并获取物体 export default class Test extends Laya.Script { constructor() { super(); console.log(0); //场景 Laya.Scene3D.load("res/LayaScene_Scene_Test/Conventional/Scene...
  • Unity3D - 【API】游戏物体实例化

    千次阅读 2019-01-16 14:12:39
    * identity :身份、一致性 * transform :转换、变形 * Gameplay :游戏设置、可玩性 * Gameobject :游戏物件 * instantinate :实例化 * inspector :检查员 ...*********************************************...
  • Unity3D之射线检测

    2017-08-08 17:01:35
    开发中我们经常遇到鼠标和三维物体交互的需求,要操作三维空间的物体,首先要选中这个物体,这时候就需要我们经常用到的射线检测。 一.单射线检测单个物体 代码使我们通用的射线检测代码,注释也已经标识上去了。 //...
  • 持久化数据PlayerPrefs其实说白了,就是Android里面的bundle《【Android】多个Activity之间利用bundle传递数值》...在《【Unity3D】同场景物体传值与Vector》(点击打开链接)我曾经写了Unity3D中,同一个场景的各个
  • 导引:因为项目中难免要多次进行获取子对象或者对象的集合,所以写一个单独的类,用来做这些操作。然后再实际的项目中,只需要使用 transform 或者 gameobject 调用这些方法就可以快速的得到这些数据,而并不需要...
  • 隐藏物体有两种方法,一是设置Meshrender为False,即不渲染物体。 二是设置物体为False,禁用物体,我使用的第二种。 当场景中需要隐藏的物体很多时,我们可以添加一个层来表示需要隐藏的物体。 当加载场景时,...
1 2 3 4 5 ... 20
收藏数 1,718
精华内容 687
关键字:

unity3d获得子物体集合