前言

前排说明:关于本教程目录导航以及说明:猫式教程

在本篇文章中,你将会学到:

  •  创建数学函数库
  •  使用委托和枚举类型
  •  使用网格显示 2D 函数
  •  在 3D 空间中定义曲面

这是关于学习如何使用 Unity 的基础知识的系列教程的第三个。这是基础2构建可视化图形一文的延续,因此我们并不会创建新的项目。这一次我们将实现来显示多个更加复杂的函数。

本教程使用Unity 2020.3.38f1c1编写翻译。

image-20221002205614983

函数库

在完成上一个教程后,我们创建了一个函数图,在播放模式(Play)显示正弦函数的动画图形。当然你也可以通过更改代码来实现显示其他函数图形。你甚至可以在 Unity 编辑器处于播放模式(Play)时做如此操作。执行将会暂停保存当前游戏状态,然后再次编译脚本,最后重新加载游戏状态并继续播放。这个过程称之为热重载。虽然并非所有东西都会在热重载的时候被保存,但是对于我们的函数图形来并不影响。

虽然在播放模式期间更改代码比较方便,但是在多个功能之间进行来回切换并不是一种方便的方法,如果我们通过图形配置选项来更改图形会更加方便。

创建库基类(Library Class)

虽然我们可以在Graph脚本/类中声明多个数学函数,但是如果我们仅仅让该类显示函数图形并且不确切在其中定义图形的函数方程。这就是一个典型的将功能的分离的做法。

现在来创建一个新的C#脚本命名为:FunctionLibrary并将其移动到Scripts文件夹下。将新创建的脚本预制内容清空,仅引用UnityEngin并创建对应类结构,代码示例:

using UnityEngine;
public class FunctionLibrary {}

这个类并不会将其作为组件类型来使用,同样的也不会创建其实例对象。相反的,我们使用它来提供可以被公开访问的一组数学函数方程的方法,类似于UnityMathf 方法。

为了防止这个类被用作模板对象,我们在Class之前通过关键字static将其标记为静态(static)类型。

using UnityEngine;
public static class FunctionLibrary {}

函数方法

我们第一个要声明的方法就是Graph脚本中的函数方程所展示的正弦函数。创建方法类似于创建AwakeUpdate方法,唯一不同的是我们要将这个方法命名为Wave

public static class FunctionLibrary {
    void Wave()
    {

    }
}

默认情况下,方法是实例方法,这就意味着它们会被实例对象调用。为了能够使得这些方法也能在类级别上使用,我需要将其也标记为静态,就如同FunctionLibrary类一样。

public static class FunctionLibrary {
    static void Wave()
    {

    }
}

并且使用关键字public使其可以被公开访问到。

public static class FunctionLibrary {
    public static void Wave()
    {

    }
}

因为我们这个方法的数学函数为:$f(x,t)=sin(\pi (x+t))$ ,这也就意味着其会根据输入而产生一个输出结果,这个结果必须是浮点类型(float)。因此,我们的函数返回类型应该为float而不是void(空)。

public static float Wave()
{

}

现在我们可以将正弦函数方程定义在方法中了,并使用方法的参数xt

public static float Wave(float x,float t)
{
    Mathf.Sin(Mathf.PI*(x + t));
}

最后一步是指明该方法的返回结构。使用关键字return来表示其为返回结果。

public static float Wave(float x,float t)
{
    return Mathf.Sin(Mathf.PI*(x + t));
}

现在我们可以修改Graph.Update中的相关代码,并将position.xtime作为参数传入,其返回结果作为新的 Y 坐标。这样此处函数就已经不是一个显式的函数方程了。

position.y = FunctionLibrary.Wave(position.x,time);  //计算新的位置

隐式的使用类型

我们在使用Math.PIMath.Sin等方法的时候,每次使用都需要编写一些不必要的内容。我们可以通过在脚本文件顶部添加一条语句来实现省略一些不必要提及的类型。

using UnityEngine;
using static UnityEngine.Mathf;

public static class FunctionLibrary {
    public static float Wave(float x,float t)
    {
        return Mathf.Sin(Mathf.PI*(x + t));
    }
}

现在我们可以省略类型Mathf了。

return Sin(PI*(x + t));

添加新的函数方法

考研更忙了,今天本来能翻译编写半篇的,有一些事情耽搁了,只能到这里了。

待更新..........

Q.E.D.


赤脚踩在明媚的沙滩上,我看见了你闪耀的双眼,柔软的头发,我便心有所属