对象列表
本课属于 Coddy Unity 学习旅程的“Unity 脚本基础”单元。第 65 课,共 85 课。
数组的长度是固定的,在创建时就已确定。生成器无法提前知道自己会创建多少个对象,因此会将它们保存在 List<T> 中:这是 C# 中可以增长的数组。它位于 System.Collections.Generic 中,T 是它所保存元素的类型。这个喷泉会记住它生成的每一枚硬币:
using System.Collections.Generic;
using UnityEngine;
public class CoinFountain : MonoBehaviour
{
public GameObject coinPrefab;
List<GameObject> coins = new List<GameObject>();
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
GameObject coin = Instantiate(coinPrefab, transform.position, Quaternion.identity);
coins.Add(coin);
Debug.Log(coins.Count + " coins");
}
}
}Add 会把元素放到末尾,Count 会告诉你有多少个元素,而数组使用的是 Length。读取方式和数组相同:coins[0] 是第一枚硬币,foreach (GameObject c in coins) 会遍历所有硬币。coins.Remove(coin) 会移除该元素,coins.RemoveAt(0) 会移除第一个元素;它后面的元素会向前移动一位。
列表本身必须使用 new 创建。声明为 List<GameObject> coins; 的字段保存的是 null,第一次调用 Add 时就会因 NullReferenceException 而停止。
挑战
中等每次点击都会向列表中添加一个盒子。
- 添加
using System.Collections.Generic;和字段List<GameObject> boxes = new List<GameObject>();。 - 点击时,在
transform.position + new Vector3(boxes.Count * 1.5f, 0, 0)处生成boxPrefab,不进行旋转,然后将它添加到boxes。 - 记录
"Boxes: " + boxes.Count。
按下 运行,然后点击三次:三个盒子会排成一行。然后点击检查。
亲手试试
using UnityEngine;
public class BoxStacker : MonoBehaviour
{
public GameObject boxPrefab;
// boxes:一个私有的 List<GameObject>
void Update()
{
// 点击:生成一个盒子。列表中每有一个盒子,新盒子就向右多移动 1.5。将它加入列表,并记录盒子数量。
}
}
Unity 脚本基础中的所有课
自己练习: Unity 在线编辑器