扩展方法
本课属于 Coddy Unity 学习旅程的“Unity 游戏架构”单元。第 42 课,共 64 课。
Vector3 和 Transform 属于 Unity,所以你不能给它们添加方法。扩展方法是一种静态方法,C# 允许你像调用它们自身的方法一样调用扩展方法。这两个方法能省去每个项目中都会用到的几行代码:
public static class UnityExtensions
{
public static Vector3 WithY(this Vector3 v, float y)
{
return new Vector3(v.x, y, v.z);
}
public static void DestroyChildren(this Transform parent)
{
foreach (Transform child in parent)
{
Object.Destroy(child.gameObject);
}
}
}// 在任意脚本中
transform.position = transform.position.WithY(0.5f);
inventoryPanel.DestroyChildren();扩展方法需要满足三个条件:它位于一个非嵌套、非泛型的静态类中;它是静态方法;第一个参数前有 this。这个参数就是点号左边的值,因此 transform.position.WithY(0.5f) 编译后相当于 UnityExtensions.WithY(transform.position, 0.5f)。Vector3 是结构体,因此 v 是一个副本:WithY 无法更改调用者的向量,而是会返回一个新向量。这也绕开了 transform.position.y = 0.5f; 无法通过编译的问题。
这个静态类不是 MonoBehaviour。它放在单独的 .cs 文件中,文件名任意,并且绝不会挂载到对象上。MonoBehaviour 继承的方法(例如 Destroy)需要在这里写出所属的类:Object.Destroy。在 foreach 中销毁子对象是安全的,因为 Unity 只会在帧结束时移除它们。
挑战
中等给猫头鹰添加两个扩展方法。
- 在
FlatExtensions中,添加公共静态方法FlatDistance(this Vector3 a, Vector3 b):计算不考虑高度的距离,从 (0, 5, 0) 到 (3, 0, 4) 的距离为5。 - 同样,
FaceFlat(this Transform t, Vector3 target)只让t绕 y 轴转动。 - 在
Owl中,使用 FaceFlat 让猫头鹰面向玩家;当 FlatDistance 小于sight时,eyes会亮起。
按“开始”,走到猫头鹰下方:它的眼睛会发光。然后按“检查”。
亲手试试
using UnityEngine;
public static class FlatExtensions
{
// 在这里编写 FlatDistance(Vector3)和 FaceFlat(Transform)
}
Unity 游戏架构中的所有课
自己练习: Unity 在线编辑器