第三篇来了~今天去参加了 Unite 2018 Berlin,感觉就是。。。。非常困。。。回来以后稍微睡了下清醒了觉得是时候认真学习下了,不过讲的很多东西都是还没有发布或者只有 Preview 的版本,按照 Unity 的习惯肯定 Bug 多到令人发指,最近不太想折腾所以就先继续写文章把。。按照惯例奉上『原文链接』
PART 1 概述
首先大概介绍一下什么是『Catlike教程』,大家自行访问一下就会发现是这位『大神』写的一个 Unity 系列教程,里面由浅至深的以一个个有趣的小课题来引导大家学习 Unity 的方方面面~回想自己毕业三年都在做 Unity 游戏开发,然而看了大神的教程以后发现自己欠缺的东西非常多~真正对引擎的掌握程度非常低只是在不停的拼 UI 写业务逻辑。做这个系列呢也是希望自己可以坚持把大神的教程学完让自己变得更厉害~就酱。。
那么言归正传我们本期节目的最终目标是实现作者配图中的看起来很屌的图形,像是这样的。。。
对比上一篇文章的函数图像,大概有以下几个关键点需要实现。
- 支持多函数叠加
- 从一条曲线变成一个曲面
- 由曲面扩展成真正的三维图形
PART 2 支持多函数叠加
首先我们的目标是可以通过一个滑杆来控制「上一篇」中的曲线显示的函数,因此先复制之前的代码改改名字比如 Graph3DController.cs 再修改类名与文件名一致。然后我们的关键是需要修改这一行
var pos = new Vector3(x, Calc(x), 0);
使其变成根据滑杆中的 int 值选择 delegate 中的某个函数,如下所示,代码中主要修改的地方用注释稍微解释了下。
// 新的 deleagate
public delegate float Function(float x, float t);
// 记得修改类名与文件名一致否则不能挂在 gameobject 上
public class Graph3DController : MonoBehaviour
{
[Range(10, 100), SerializeField] private int _resolution;
[SerializeField] private GameObject _cube;
// 添加新的滑杆
[Range(0, 1), SerializeField] private int _function;
// 一个 delegate 数组用于保存我们接下来使用的两个函数
private Function[] _functions;
...
// Use this for initialization
private void Start()
{
// 初始化 _functions
_functions = new Function[] {SineFunction, MultiSineFunction};
...
}
private void Update()
{
_startX = -1f;
for (int i = 0; i < _resolution; i++)
{
var x = _startX + i * _step;
// 此处修改调用方法
var pos = new Vector3(x, _functions[_function](x, Time.time), 0);
var point = _points[i];
point.transform.localPosition = pos;
}
}
private float SineFunction(float x, float t)
{
return Mathf.Sin(Mathf.PI * (x + t));
}
private float MultiSineFunction(float x, float t)
{
float y = Mathf.Sin(Mathf.PI * (x + t));
y += Mathf.Sin(2f * Mathf.PI * (x + 2f * t)) / 2f;
y *= 2f / 3f;
return y;
}
}
于是我们实现了如下的效果~
不过作者在原文中还添加了 Enum 然后可以不用滑杆而是改用一个下拉菜单来改变要显示的函数图像。最终效果没什么不同就不再赘述了感兴趣的同学可以自行找到『原文链接』查看更详细的步骤~