点击蓝字关注我们吧!
目录 |
1 不同函数之间的切换 1.1 函数方法 1.2 第二个函数 1.3 在编辑器里选择函数 1.4 静态方法 1.5 委托 1.6 委托数组 1.7枚举 2 添加另一个维度 2.1 调整函数 2.2 创建点网格 2.3 双循环 2.4 纳入Z维度 2.5 创建连漪 3 摆脱网格 3.1 3D函数 3.2 创建圆柱体 3.3 创建球体 3.4 创建一个环面 |
本文要点:
支持多函数方法
使用委托和枚举。
用网格显示2D函数。
定义三维空间中的表面。
本教程是上一篇 构建视图 的延续,将会展示更多更复杂的函数和功能。
本篇教程使用的Unity版本最低为2017.1。
(将几个波浪组合在一起,形成复杂的形状)
1 不同函数之间的切换
在完成前面的教程之后,我们有一个基于线条的视图,并在游戏模式下显示一个正弦波动画。当然还可以通过修改代码来显示其他数学函数。甚至可以在Unity编辑器处于播放模式时执行修改操作。如果这样的话,Unity会暂停执行,保存当前的游戏状态,然后重新编译脚本,最后重新加载游戏状态并恢复播放。
然而在播放模式下,并不是所有的东西都能通过重新编译的,但我们这次的教程就可以。它将会切换到新的动画,好像什么都没有发生过。
虽然在播放模式中修改代码很方便,但在多个函数之间来回切换却并不方便。我们其实可以简单地更改图形的配置选项来完成我们想要的效果。
下面就看看怎么做吧。
1.1 函数方法
如果要让视图同时支持多个函数,那就需要先把所有的函数写出来。但是,循环遍历视图点的相关代码并不关心会使用哪个函数。所以,其实不需要对每个单独的函数重复循环的代码。而只要提取数学相关的部分,并将其放在自己的方法中即可。
向 Graph 中添加一种新的方法,来包含正弦函数的代码。就像建 “Awake” 和 “Update” 方法一样,但我们将其命名为SineFunction。
我们想让这个函数表示我们的数学公式f(x,t)=sin(π(x+t))。要实现这个目的,就必须要得到一个结果输出,因为它是一个浮点数.所以,函数的类型也必须是浮点数,而不是void。
该函数还需要参数,而现在它是一个空参数的函数。若要添加x参数,需要把其放在方法名称后面的括号内。就像这个函数本身一样,它的参数也必须在它们前面定义好类型。
因为函数是用浮点数计算,并且返回浮点数,所以参数也必须是浮点数。
同样要添加t参数,以及它的类型。参数声明必须用逗号分隔。
现在参数有了,就可以使用它的x和t参数将计算相关的代码放在函数里了。
最后一步是需要显式地返回该方法计算的结果。因为这是一个计算浮点类型的方法,所以它必须在完成时返回一个浮点数。
通过显式的return关键字,返回计算后的结果,这是所谓的数学计算了。
现在可以在Update中调用此方法了,使用position.x和Time.time作为函数的参数。和直接计算得到的结果一样,它返回的结果可以用来设置点的Y坐标。
注意,因为每次循环中调用时,Time.time都是相同的。所以可以优化一下,用在循环之前用变量存储起来这样只需要检索一次值就可以了。
1.2 第二个函数
现在已经创建了一个函数方法,下面可以再创建一个。这一次,将使用多个正弦来做一个稍微复杂一些的函数。
复制SineFunction方法开始,并将新方法重命名为MultiSineFunction。
第二个函数会保留我们已经拥有的正弦函数,但是在计算中添加一些额外的东西。为了简化理解,在返回之前,将当前的计算结果赋值给临时变量y。
要增加正弦波的复杂性,最简单的方法是增加另一个频率加倍的正弦波。如果我们要把变化速度变为原来的两倍,只需要将正弦函数的参数乘以2就可以。同时,我们还可以把这个函数的结果减半。最后得到的正弦波的形状保持不变,但只有先前的一半大小。
这个给定的函数我们也可以用公式来表达 。
当正弦函数的正极值和负极值均为1和?1时,这个新函数的最大值和最小值将分别为1.5和?1.5。为了保证我们保持在?1-1的范围内,我们应该把整件事除以1.5,这相当于乘以2/3 。
用这个函数代替Update里的SineFunction,看看它是什么样子的。
(多正弦效果)
你可以看做是一个较小的正弦波正在跟随一个更大的正弦波。或者我们可以让它变成一个较小波动的逐步向较大的波动过渡的效果,只需要加倍一下时间因素。它不仅会随着时间的推移而滑动,还会改变它的形状。因为正弦波重复,它每隔两秒钟就会返回相同的形状。
1.3 在编辑器里选择函数
接下来我们要实现的就是如果通过编辑器里的视图参数来控制函数调用。而实现方式可以用滑块,就像视图的分辨率一样。由于我们有两个函数可供选择,我们需要一个范围为0-1的公共整数字段。
(函数滑块)
我们可以在Update中使用if-else块来控制调用哪个函数。如果滑块设置为0,我们将使用SineFunction。否则,我们将使用MultiSineFunction。
这样我们就可以通过视图的检查器面板来控制函数调用,即使是在运行模式也可以。
1.4 静态方法
虽然SineFunction和MultiSineFunction是Graph的一部分,但它们实际上是自给自足的.因为它们只依靠传递参数和数学来完成自己的工作(它们需要依赖Mathf,可以把它简单地看作是数学)。此外,他们不需要访问Graph里任何其他方法或字段。这意味着我们如果把它们放到另一个类或结构中,它们仍然可以正常工作。
因此,我们可以为函数方法创建一个单独的类,并将它们全部放在那里。然而,由于Graph是使用这些方法的唯一地方,所以好像也没有足够的理由去这么干。
默认情况下,方法和字段与类或结构类型的特定对象或值实例相关联。