泛型辅助函数
本课属于 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> 返回的数组。
挑战
中等为震荡塔的箱子和灯编写一个通用辅助函数。
- 在
Helpers.cs中,编写静态类Helpers,其中包含公共函数InRange<T>(IEnumerable<T> items, Vector3 center, float range),用于组件:返回距离不超过range的项目组成的List<T>。 - 在
Pulse中,按下空格键时,给范围内的每个 Rigidbody 一个向上的冲量,大小为lift。 - 然后对范围内的每个 Lamp 调用
TurnOn()。
按下 “开始”,然后按空格键:附近的箱子会跳起来。接着点击 “检查”。
亲手试试
using System.Collections.Generic;
using UnityEngine;
// Helpers.InRange<T>:某个点范围内的元素
Unity 游戏架构中的所有课
自己练习: Unity 在线编辑器