Menu
CoddyTech

泛型辅助函数

本课属于 Coddy Unity 学习旅程的“Unity 游戏架构”单元。第 44 课,共 64 课。

有些辅助方法适用于所有类型:获取组件,或者添加组件;从数组中随机选取一项。泛型方法可以将它们只编写一次,并将类型作为参数 T,每次调用时再确定具体类型:

public static class Helpers
{
    public static T GetOrAdd<T>(this GameObject go) where T : Component
    {
        if (!go.TryGetComponent(out T found)) found = go.AddComponent<T>();
        return found;
    }

    public static T RandomItem<T>(T[] items)
    {
        return items[Random.Range(0, items.Length)];
    }
}
Rigidbody body = crate.GetOrAdd<Rigidbody>();
Color paint = Helpers.RandomItem(colors);
GameObject enemy = Helpers.RandomItem(enemyPrefabs);

where T : Component 是对 T 的约束,它决定了方法可以对 T 执行什么操作。AddComponent 只接受组件,因此没有这个约束时,编译器会拒绝 go.AddComponent<T>();有了这个约束,任何组件都可以使用,无论是 Unity 的 Rigidbody,还是你自己编写的脚本。这个约束还让你可以访问 T 上 Component 的所有成员,例如 .transform 和 .gameObject。如果 crate 已经有 Rigidbody,就会返回已有的组件,不会添加任何内容。

RandomItem 没有约束,因为它不会操作 T:它适用于颜色、字符串和预制件。调用时你很少需要写出类型:根据 colors(一个 Color[]),编译器可以推断出 T 是 Color。与使用 T[] 的方法相比,使用 IEnumerable<T> 的方法既接受数组,也接受 List,包括 FindObjectsByType<T> 返回的数组。

challenge icon

挑战

中等

为震荡塔的箱子和灯编写一个通用辅助函数。

  1. 在 Helpers.cs 中,编写静态类 Helpers,其中包含公共函数 InRange<T>(IEnumerable<T> items, Vector3 center, float range),用于组件:返回距离不超过 range 的项目组成的 List<T>。
  2. 在 Pulse 中,按下空格键时,给范围内的每个 Rigidbody 一个向上的冲量,大小为 lift。
  3. 然后对范围内的每个 Lamp 调用 TurnOn()。

按下 “开始”,然后按空格键:附近的箱子会跳起来。接着点击 “检查”。

亲手试试

using System.Collections.Generic;
using UnityEngine;

// Helpers.InRange<T>:某个点范围内的元素

Unity 游戏架构中的所有课

自己练习: Unity 在线编辑器