根据场景物体Tag和名称,查找并填入泛型集合
根据场景物体Tag和名称,查找并填入泛型集合,代码如下:
代码视图
1 void AddToList<T>(string tagName, string name,out List<T> list) 2 { 3 list = new List<T>(); 4 if (GameObject.FindGameObjectWithTag(tagName)) 5 { 6 Transform parTrans = (GameObject.FindGameObjectWithTag(tagName).transform.Find(name)); 7 if (parTrans) 8 { 9 foreach (Transform v in parTrans) 10 { 11 if (v.GetComponent<T>() != null) 12 { 13 list.Add(v.GetComponent<T>()); 14 } 15 } 16 } 17 else 18 { 19 Debug.LogError("查找不到Name名为 " + name + " 的物体"); 20 } 21 } 22 else 23 { 24 Debug.LogError("查找不到Tag名为 " + tagName + " 的物体"); 25 } 26 }
顺带复习一下,ref 和 out 关键字
这里如果不用out,在方法外定义的List无论在这个方法里怎么执行,在这个方法外调用时都将会一直是Null.
在我们使用函数时,out关键字的变量可以不被初始化,即使我们初始化了,使用的值也是在函数中定义的值,而不是初始化的值(函数内部值不受外部赋值影响)。
而ref的区别是:
对所调用方法中的参数进行的任何更改都反映在调用方法中,即集合在添加元素时时,方法内使用的是在外界就已经被赋值了好了的集合,所以ref侧重于 修改 函数内部参数,并返回内部函数处理后的参数的值.
代码举例:
void RefTest(ref int a,ref int b) { a = a + b; b = a - b; } void OutTest(out int a, out int b) { //a,b 必须赋值,否则报错 ,外界调用函数时赋的值不会被函数使用 a = 3; b = 2; a = a + b; b = a - b; }
使用
1 void Start () 2 { 3 int m = 5; 4 int n = 2; 5 RefTest(ref m, ref n); 6 print("a=" + m + "," + "b=" + n); //a=7,b=5 7 OutTest(out m, out n); 8 print("a=" + m + "," + "b=" + n); //a=5,b=3 9 }