点击蓝字关注我们吧!
目录 |
1 创建一排立方体 1.1 预制体 1.2 视图组件 1.3 实例化组件 1.4 代码循环 1.5 简化语法 1.6 改变域 1.7 把向量挪出循环 1.8 用X来定义Y 2 创建更多的立方体 2.1 定义分辨率 2.2 变量实例化 2.3 设置父节点 3 给视图上色 3.1 创建自定义Shader 3.2 基于世界坐标来上色 4 给视图配置动画 4.1 保持追踪点 4.2 更新点 4.3 显示正弦波 |
本篇内容概括:
1、创建一个prefab
2、实例化一排立方体
3、展示一个数学方法
4、创建一个自定义的Shader
5、让视图动起来
在本章教程中,我们将使用游戏对象来构建一个图形,这样我们就可以把数学公式用图像展示出来。然后再把函数和时间关联起来,从而产生一个运动的图像。
本教程假设您已经完成了“游戏对象和脚本”相关教程,对Unity有了基础的了解,并且Unity的版本至少要在2017.1。
(使用一排立方体来展示 正弦 波)
1 创建一排立方体
在编程的时候,充分地理解数学是非常非常有必要的事情。
从最基础的层次理解,数学就是操作一堆表示数字的符号。比如,解一个方程可以理解为重写一组符号,这样它就变成了另一组符号集(一般来说会比原始的简单)。而数学的规则决定了如何对它们进行重写。
比如我们有一个函数 f(x)=x+1 ,我们可以用一个数字来代替x,比如说3。这就会产生f(3)=3+1=4的结果。
我们提供了3作为输入,并在最后以4作为输出。我们可以说函数映射了 3到4,写这个的一个更短的方法是把它们作为一个输入-输出对,比如(3,4)。我们可以创建许多对形式(x,f(X))。例如(5,6)和(8,9)和(1,2)和(6,7)等等。但是,当我们按输入编号排序对时,会更容易理解该函数,例如:(1,2)和(2,3)和(3,4)等。
函数f(X)=x+1f(X)=x+1很容易理解。但
就比较难了。当然可以和之前一样写下一些输入-输出对,但这样的方式不能让我们很好地掌握它所代表的映射究竟是什么。如果要做到轻松的理解,就需要非常非常多的点,紧密排列在一起,但这无疑会导致巨量的数据,不但难以列举还难以分析。
相反,我们可以将对解释为形式[x,f(X)]的二维坐标。这是一个2D向量,上面的数字代表水平坐标,在X轴上,底部的数字代表Y轴上的垂直坐标。换句话说,y=f(X)。然后在一个坐标轴的表面上画出这些点。只要有足够多的点,就会得到一条线。这个结果是一个视图(graph)。
(用视图表示 x在(-2,2)的区间)
查看一个视图可以让我们快速了解一个函数是如何工作的。既然这么方便的话,那么我们就看下如何在Unity里创建吧。
通过File / New Scene启动一个新场景,或者使用新项目的默认场景。
1.1 预制体
视图是通过在适当的坐标处放置点来创建的。
要做到这一点的话,就需要把每个点的变成三维可视化的。我们将简单地使用Unity默认立方体的游戏对象。
在场景中添加一个立方体,并移除其碰撞组件,因为这个示例中不会使用到物理。
我们会使用脚本来创建这个立方体的诸多实例并正确定位它们。要做到这一点的话,就需要把这些立方图做成模板。把立方体从层次结构窗口(hierarchy window)拖到项目窗口(project window)中。
这会创建一个新的Asset,一个具有蓝色立方体图标,我们称为预制体。它是一个预先制作好的游戏对象,存在于项目中,但不在场景中。
(一个立方体的预制件)
预制体(Prefabs )是配置游戏对象的一种方便的方法。如果你更改了预置体资源,那么它在任何场景中的所有实例都会以相同的方式进行变更。例如,更改预制体的Scale会改变仍然在场景中的立方体的Scale。
但是要注意的是,每个实例只会使用自己的位置和旋转。也就是说,预制体不会统一修改场景示例对象的位置和旋转。此外,游戏对象也可以修改相关属性,并覆盖预置值。而如果进行了很大的更改,比如添加或删除了组件,则Prefab和实例之间的关系将被打破,需要重新保存或者应用修改。
这个章节,我们会使用脚本来创建预制体的实例,因此我们不再需要当前场景中的立方体实例。所以可以删除它了。
1.2 视图组件
我们需要一个C#脚本来生成我们的视图,所以创建一个并将其命名为Graph。从一个简单的扩展MonoBehaviour的类开始,这样它就可以成为game objects对象的组件。给它设置一个公共字段来保存预置体文件的引用,以便一会用来创建视图上的“点”,命名为pointPrefab。由于我们需要访问Transform组件来定位这些点,所以要使其成为字段的类型。
将一个空的游戏对象添加到场景中,通过GameObject/Create Empty,并将其放置在原点,命名为Graph。通拖动或通过其Add Component按钮将Graph组件添加到此对象。然后将预置体文件拖到Graph的PointPrefab字段上。现在它保存了对预置Transform组件的引用。
(视图对象和引用的Prefab)
1.3 实例化组件
实例化游戏对象是通过Instantiate方法完成的。
这是Unity Object类型的一个可公开使用的方法,它通过扩展MonoBehaviour间接继承。Instantiate方法会克隆作为参数提供的任何Unity类型的Object。在针对预制体的时候,它会实例一个对象并添加到当前场景中。我们就在Graph组件Awake时,去实例化。
(实例化的Prefab)
点击Play之后,会将在原点生成一个立方体,不过,前提是预置体的原始位置设置的就为零。要将这一点放到其他地方,就需要调整实例后的位置。
实例化方法为我们提供了对它创建的任何内容的引用。因此,我们给它创建一个 Transform 组件的临时变量来持有函数的返回值。
现在我们可以通过给它分配3D向量来调整点的位置。如我们在上一篇教程中中调整时钟指针的Local rotation 一样,但这次我