zoukankan      html  css  js  c++  java
  • 关于获取所有子物件的一些描述

    之前做工具时需要获取Gameobject下所有子物件,删除除了某个子物件之外其他子物件上的除了tranform的组件

    关于代码片段

    View Code
     1                //获取所有子物体
     2                 foreach (Transform t in go.transform)
     3                 {
     4                     if (!t.name.Equals("Quality"))
     5                     {
     6                         UnityEngine.Object.DestroyImmediate(t.renderer, true);
     7                         MeshFilter mf = t.GetComponent<MeshFilter>();
     8                         if (mf) { UnityEngine.Object.DestroyImmediate(mf, true); }
     9                     }
    10                 }

    那么,为什么可以直接通过foreach (Transform t in go.transform)就可以获取到所有子物件呢?

    反编译unity3d的dll。可以看到Transform类  

    View Code
     1 public sealed class Transform : Component, IEnumerable
     2 
     3 {
     4 
     5   ...
     6 
     7   public IEnumerator GetEnumerator()
     8      {
     9            return new Enumerator(this);
    10      }
    11 
    12    
    13 
    14       //实现了接口
    15        private sealed class Enumerator : IEnumerator
    16         {
    17             private int currentIndex = -1;
    18             private Transform outer;
    19 
    20             internal Enumerator(Transform outer)
    21             {
    22                 this.outer = outer;
    23             }
    24 
    25             public bool MoveNext()
    26             {
    27                 int childCount = this.outer.childCount;
    28                 return (++this.currentIndex < childCount);
    29             }
    30 
    31             public void Reset()
    32             {
    33                 this.currentIndex = -1;
    34             }
    35 
    36             public object Current
    37             {
    38                 get
    39                 {
    40                     return this.outer.GetChild(this.currentIndex);
    41                 }
    42             }
    43         }
    44 }

    查阅csdn.com相关资料。

    在c#只要函数返回IEnumerable<T>,就能实现用foreach对元素进行遍历,代码如下

    View Code
        public class ReturnIEnumerable  
        {  
        public IEnumerable<int> GetEnum() // 返回IEnumerable<T>的方法  
        {  
           for(int i=0;i<100;i++)  
           {  
            yield return i+1000; // 使用 yield return 返回  
           }  
           yield break; // 使用 yield break 退出便利  
        }  
        }  
        public static void RunSnippet()  
        {  
           ReturnIEnumerable re = new ReturnIEnumerable();  
           foreach(int i in re.GetEnum()) // 在这里调用返回了IEnumerable<T>的方法  
           {  
            System.Console.WriteLine(i);  
           }  
        }  

    各种使用的场景

    1.如果你返回的集合是只用于遍历,不可修改的,则返回IEnumerable<T>

    2.如果返回的集合需要修改,如添加和删除元素,用ICollection<T>

    3.如果返回的集合需要支持排序,索引等,用IList<T>

    4.如果返回的集合要支持索引,但不能添加,删除元素,用ReadOnlyCollection<T>

  • 相关阅读:
    linux学习之linux的hostname修改详解《转》
    不想作死系列--win7远程linux桌面之vncserver
    不想作死系列---virtualbox最小化安装centos6.5
    基于支持向量机的车牌识别-- opencv2.4.7+vs2012环境搭建
    python文件的中文处理以及个人思路
    haskell学习笔记<1>--基本语法
    提醒
    C语言矩阵传递给函数的方法
    0x01数据结构——C语言实现(二叉查找树)
    0x01数据结构——C语言实现(二叉树)
  • 原文地址:https://www.cnblogs.com/oldman/p/2600745.html
Copyright © 2011-2022 走看看