根据场景物体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 }

 

posted @ 2019-10-30 14:17  方是源  阅读(183)  评论(0编辑  收藏  举报
回顶部