@废话在前

Curvy是一个非常强大的第三方插件,用于在unity中快速生成游戏轨道,关于此插件的教程网上几乎找不到,官方的视频教程是一个讲法式英语的人讲的,不但视频模糊让人听的简直爆炸,我反正听了一半差点砸电脑了,最后主要还是靠折腾demo结合视频把主要的用法弄明白了。这里结合官方demo中的几个介绍这个插件的用法,其实很简单,学会后可以轻松拖出一条甚至多条复杂的轨迹,然后可以让物体沿着轨迹运动,更强大的是可以在轨迹上动态生成相应的赛道和轨道,可以控制刚体在轨道上自由运动。

Unity资源商店的curvy插件链接(有视频教程和相应论坛):https://www.assetstore.unity3d.com/cn/#!/content/7038

先上几张官方demo炫酷效果的高清截图:

unity xCharts 设置 unity curves_curvy

unity xCharts 设置 unity curves_竞速游戏_02

unity xCharts 设置 unity curves_轨道生成_03

(1) 第一张图是官方demo的第一个SplineController.sence,展示了飞行器扰简单的圆轨迹循环运动;

(2) 第二张图展示了生成轨迹并声称轨迹对应的轨道,飞行器沿轨迹在轨道内穿梭;

(3) 第三张图展示了生成轨迹轨道,并控制一个刚体在轨道上自由滚动;

一、导入插件

在工程中选择custom package,导入curvy插件,我这里有个v2.0.2版本的curvy插件供下载,这是个付费插件,还挺贵的,免费送大家:

https://pan.baidu.com/s/1i4SYJHV 如果下载不了请回复邮箱地址我发给您。

unity xCharts 设置 unity curves_curvy_04

导入插件后可看到一个packages的文件夹里面有以下内容,其中有很多demo场景:

unity xCharts 设置 unity curves_curvy_05

可以运行demo看一下可以实现那些效果,还是很炫酷的。

二、制作Spline运动轨迹

1.新建一个场景,会发现导入插件后工程中的场景scene窗口出现一些操作按钮:

unity xCharts 设置 unity curves_unity_06

2.生成轨迹

最快的方法就是直接点击scene场景中上面按钮的最后一个Draw Spline按钮,然后选择轨迹的方向,一般选择第二个y轴朝上。选择后会有提示

通过按住control键然后在scene场景中添加控制点,可以添加多个控制点,可以拖动控制点改变生成轨迹的形状,与此同时会发现project面板中已经生成了相应的元素:轨迹和轨迹下的控制点;

unity xCharts 设置 unity curves_轨道生成_07

控制点之间的插值有三种选择,linear线性插值就是控制点之间用直线链接,另外还有两种曲线插值必入塞北尔曲线,根据需要进行选择;

控制点生成的曲线轨迹可以选择闭合或不闭合;

unity xCharts 设置 unity curves_竞速游戏_08

3.添加沿轨迹运动的游戏物体

轨迹制作好后现在添加沿轨迹运动的游戏物体,比如最简单的添加一个圆球。插件demo中提供了一个绑定物体和spline轨迹对象的脚本,在project面板搜索splinecontroller脚本,拖动到圆球物体上,然后将上面制作好的curvy spline拖动赋给splinecontroller中的变量进行绑定,同时设置一下运动速度speed,默认是0看不到效果,然后运行一下就可以看到圆球沿着轨迹开始移动了。当然这个脚本的功能是可以自定义的,继承自curvycontroller脚本。

unity xCharts 设置 unity curves_unity xCharts 设置_09

三、根据Spline轨迹生成封闭运动轨道(重点来了,generator的使用!)

上面只是利用spline轨迹控制物体运动,但实际上有了这条轨迹数据,我们可以生成相应的跑道,赛道等等,甚至可以利用这条轨迹数据生成任何想要的轨迹形状的物体场景。

轨道的生成此插件提供了一个generator编辑器,在spline轨迹提供形状数据的基础上,添加材质数据模块,轨道横截面编辑模块来自由控制赛道的形状状态和材质。

1.新建generator组件

首先右键(最好就在curvy spline下新建作为子物体了) -->curvy --> generaotr新建一个generaotr对象,当然也可以点击sence窗口中的按钮新建,此时generator下是空的,鼠标选中generator后,会发现sense窗口出现了edit按钮,点击edit打开generaotr编辑窗口;

unity xCharts 设置 unity curves_curvy_10

由于generator还是空的,所以编辑窗口空空如也,此时右键添加一个基本的shape extrusion模板,会发现编辑窗口出现了五个逻辑连接的小窗口,同时会到hierarchy窗口会发现generator对象下出现了相应的子物体,现在就可以进行编辑轨道了;

unity xCharts 设置 unity curves_unity_11

2.轨道的轨迹形状绑定

新建模板后会发现从input spline path链接出来的窗口标题是红色的,那是因为后面的三个窗口都用到了第一个窗口的path轨迹数据来生成轨道,由于还没有绑定轨迹所以红色警告。将之前做好的spline轨迹对象拖到input spline path面板对应的引用上即可,

unity xCharts 设置 unity curves_竞速游戏_12

也可以在hierarchy窗口拖入绑定,两边可以相互结合对应来设置调整;

3.轨道横截面设置

有了轨迹数据后便有了制作轨道的轨迹形状,现在通过input spline shape来制作轨道的横截面。横截面的制作方法和spline的轨迹类似,可以是闭合的中空曲线截面,也可以是开放的。横截面可以选择已有的规则形状,比如:圆形,矩形等等,设置相应的控制点个数,半径大小等等,也可以选中freedom来通过多个控制点来制作自由曲线横截面;

unity xCharts 设置 unity curves_轨道生成_13

通过移动横截面控制点的位置来调整横截面的形状,控制点可以通过contrl+d来复制添加,横截面是一个平面图形,所以一般在2d模式下设置,

unity xCharts 设置 unity curves_unity_14

编辑时最好在show gizmos打勾显示横截面形状方便编辑:

unity xCharts 设置 unity curves_curvy_15

  

unity xCharts 设置 unity curves_unity_16

注意:横截面曲线只有它的形状对轨迹起作用,其位置在哪里无任何影响。

4.轨道材质设置

轨道的材质通过volme mesh对象来设置,可以添加多个材质,选中mat0,更改材质即可:

unity xCharts 设置 unity curves_竞速游戏_17

      

unity xCharts 设置 unity curves_轨道生成_18

注意:上面的设置改变后不会立刻看到效果,需要运行工程或者轻微调整spline轨迹的控制点来出发轨道的更新显示。

如下图是一个横截面闭合的简单管道型的中空轨道:

unity xCharts 设置 unity curves_unity_19

@扩展:实际上可以利用一条spline轨迹,在同一个generator下添加其下的多个模板组建,通过多个横截面组合更复杂的轨道横截面形状。

四、生成开放轨道和自由运动的刚体

这里只做一个开放的轨道,并制作一个可以自由运动的刚体在开放轨道上自由活动,也就是文章开始截图三足球在轨道上滚动的效果,插件中rigidbody demo提供了展示。

这时需要将横截面做成一个凹槽状,从而只做一个凹槽轨道,另外可以通过还没有用过的其他两个面板来调整轨道的形态,而不是宽度始终一致粗细均匀,可以让轨道岁曲线粗细变化显得更自然。然后添加一个自由运动的刚体测试轨道。

unity xCharts 设置 unity curves_轨道生成_03

五.实时计算物体与spline轨迹最近的点坐标

插件提供函数用来计算场景中spline轨迹上离某个物体最近的点,通过这个点可以计算物体偏离轨道的程度。比如竞速游戏可以实现实时计算赛车偏离轨道的距离,还可以通过轨道上最近的点坐标对赛车进行复位,使其回到轨道上。此功能插件的NearestPoint的demo中有展示。

实时获取最近点的方法如下:

public CurvySpline Spline; // spline轨迹对象
public transform target; //计算偏离的物体,比如赛车

if (Spline && Spline.IsInitialized && target) //保证spline和target存在
{

	// 将target的坐标转换到spline所在的本地坐标系
	var targetPos = Spline.transform.InverseTransformPoint(target.position);
	// 获得target在spline上的最近点的TF值
	float nearestTF=Spline.GetNearestPointTF(targetPos);
	// 转换到世界坐标系的spline上最近点的坐标值
	var nearestPos = Spline.transform.TransformPoint(Spline.Interpolate(nearestTF));
}

记得在脚本中添加curvy的namespace。