Menu
CoddyTech

扩展方法

本课属于 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 只会在帧结束时移除它们。

challenge icon

挑战

中等

给猫头鹰添加两个扩展方法。

  1. 在 FlatExtensions 中,添加公共静态方法 FlatDistance(this Vector3 a, Vector3 b):计算不考虑高度的距离,从 (0, 5, 0) 到 (3, 0, 4) 的距离为 5。
  2. 同样,FaceFlat(this Transform t, Vector3 target) 只让 t 绕 y 轴转动。
  3. 在 Owl 中,使用 FaceFlat 让猫头鹰面向玩家;当 FlatDistance 小于 sight 时,eyes 会亮起。

按“开始”,走到猫头鹰下方:它的眼睛会发光。然后按“检查”。

亲手试试

using UnityEngine;

public static class FlatExtensions
{
    // 在这里编写 FlatDistance(Vector3)和 FaceFlat(Transform)
}

Unity 游戏架构中的所有课

自己练习: Unity 在线编辑器