前篇链接:Unity之C#学习笔记(5):Unity中旋转的表示——四元数 Quaternion(下)

从本节开始,我们回归C#核心内容,先从数组说起。

数组本质上就是一个能存放多个相同类型数据的容器,在存储中占用一片连续的空间。C#是一种高级的OOP语言,隐藏了指针的概念,我们在使用数组时使用下标方式[]访问数组成员即可。C#中有各种引用类型,它们同样可以是数组的元素。在Unity中,你可以联想到,我们可以用一个GameObject类的数组来存放多个同类型的游戏物体。在后面会有一个这样的例子。

在Unity中,数组的初始化有三种方式。第一种是我们最熟悉的:

public string[] names = new string[5];

回到Unity,在监察面板上,我们可以看到:

在这里插入图片描述

Tips:如果你的监察面板上没有发生变化,请点击右上角的小齿轮,选择“Reset”

OK,我们创建了一个string类型的数组引用,然后用new为它动态分配了5个空间,这些空间现在是空的。

如果我们想在初始化时就指定元素的值,可以这样做:

public string[] names = new string[] {"aa", "bb", "cc"};

效果如图
在这里插入图片描述
在Unity中,我们还有一种方式。在代码中,我们只声明一个引用,不分配空间。

public string[] names;

回到监察面板,这时数组的Size为0。我们在这里手动修改Size为3,会看到下面自动多出了3个空元素,再同上图填写这三个元素。在脚本的Start函数中,加一句:

Debug.Log(names[2]);

一般情况下, 这个语句明显会引发一个数组越界异常(IndexOutOfRangeException),因为我们根本没有在代码中为names分配空间。但是在Unity中,我们在监察面板中做的修改会被应用到程序,于是正常地打印出了第三个元素。

使用这种方式,我们可以在Unity界面中就完成一些数组的初始化,而不用特意跳转到脚本。但这样做也有一定风险:如果你的场景没有保存而Unity崩掉了,那这些修改就都将消失(而写在代码中的硬编码是不会的)。

再来举一个实际的例子。在Unity中,我们可能需要统一处理一组物体,这时就可以用一个数组来存储它们。我们在场景中创建三个物体,将它们的Tag设置为Player

在这里插入图片描述
在脚本中,我们创建一个GameObject数组players,然后用GameObject.FindGameObjectsWithTag方法获取场景中所有Tag为“Player”的物体,该方法会返回一个GameObject数组。再用一个foreach循环遍历每个物体,给它们一个随机的颜色。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Array : MonoBehaviour
{
    public GameObject[] players;
    private void Start()
    {
        players = GameObject.FindGameObjectsWithTag("Player");
        foreach(var player in players)
        {
            player.GetComponent<MeshRenderer>().material.color = new Color(Random.value, Random.value, Random.value);
        }
    }
}

效果:
在这里插入图片描述

在下一篇,我们进入类相关的内容,先来学习类的继承(Inheritance)。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐