Menu
CoddyTech

对象列表

本课属于 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 而停止。

challenge icon

挑战

中等

每次点击都会向列表中添加一个盒子。

  1. 添加 using System.Collections.Generic; 和字段 List<GameObject> boxes = new List<GameObject>();。
  2. 点击时,在 transform.position + new Vector3(boxes.Count * 1.5f, 0, 0) 处生成 boxPrefab,不进行旋转,然后将它添加到 boxes。
  3. 记录 "Boxes: " + boxes.Count。

按下 运行,然后点击三次:三个盒子会排成一行。然后点击检查。

亲手试试

using UnityEngine;

public class BoxStacker : MonoBehaviour
{
    public GameObject boxPrefab;
    // boxes:一个私有的 List<GameObject>

    void Update()
    {
        // 点击:生成一个盒子。列表中每有一个盒子,新盒子就向右多移动 1.5。将它加入列表,并记录盒子数量。
    }
}

Unity 脚本基础中的所有课

自己练习: Unity 在线编辑器