【如何用Unity做一款STG】(一)敌机飞行轨迹设计


从这节课开始,我会把我这个项目是怎么做的跟大家讲解一下。因为时间有限,我就不带大家一行一行的敲代码。我只讲重点和里面一些技术要点。需要大家有一定的Unity基础,学习Unity至少有半年以上。首先,我这个教程分为5个部分,分别是:敌机飞行轨迹的设计、用TimeLine设计关卡、Wwise在Unity中的运用、子弹反射器的设计、最后是项目框架的设计。


今天要讲的是敌机飞行轨迹的设计。大家可以看到,我最后做出来的效果是这样子的。敌机有一条曲线轨迹,可以随意增加和删除关键点。对,就跟DoTween的曲线动画一样。此外,它在场景视图中可以随时预览飞机在游戏运行时的状态。并且曲线的颜色还会根据飞行速度进行变化,深色代表快,浅色代码慢。


好,让我们一步一步来。首先是曲线,说到Unity中的曲线,大家第一个想到的是什么?贝塞尔曲线?贝塞尔曲线是不错,但是Unity自带的绘制贝塞尔曲线API不够强大,需要我们另外写代码。所以我用了另外一种相对来说简单一点的方法,就是运用Unity自带的AnimationCurve。AnimationCurve应该大部分人都用过,只是不知道它叫这名字。没用过的同学新建一个MonoBehaviour脚本,定义一个public AnimaionCurve就能在Inspector面板上看到了。AnimationCurve只有一个纵轴一个横轴,显然不符合我们的要求。我们这个是三维的坐标,所以我们需要三条这种曲线。我们让横轴表示路程,纵轴表示坐标。

OK,那么曲线的核心类就可以写出来了,无非是把AnimationCurve自带的API封装一下,让它变成三维的。比如AddKey(),Evaluate(),RemoveKey()......


当然,把这个类写出来后还不够,我们还需要能看到它并且能编辑它。这时我们需要再写一个类叫作AnchorPath,这里我写了一个抽象父类,大家如果嫌麻烦可以不写。这个AnchorPath需要基础MonoBehaviour,然后你就可以把它挂在游戏物体上了。

好,接下来是重点中的重点,需要另外写一个类基础自Editor类,然后写上这个特性[CustomEditor( typeof( AnchorPath ) )]告诉Unity这个脚本是用来编辑哪个类的。然后重写OnSceneGUI类,然后使用Handle.DrawLine()绘制多条短直线最终连成一条曲线。至于每隔多少距离绘制一条直线就自己定义了,我这边定义的是0.05,需要注意的是这个距离不能比场景中的圆形Handle大。


接下来我们干嘛呢?哦对,接下来我们要让它不仅能看到,还要能编辑。编辑的话有几个要点,一个是使用Event.current判断当前按下的按键。第二个是使用Handles.Button判断当前是否按下Handle。第三个是使用Handles.FreeMoveHandle让场景中的圆形Handle可以自由移动。最后调用MarkAllSceneDirty记录操作。


最后我们还需要在场景视图中能够预览它的飞行动画。首先在场景视图中绘制Button,这个和在Inspector面板上绘制差不多,调用GUILayout相关API。关键是怎么让它动起来。首先想想在运行时怎么让它动起来。我们现在已经有曲线了,只有有横坐标(路程)就能得到它的纵坐标(XYZ轴的位置)。路程等于什么?速度乘以时间。速度可以自己定义,时间就是Time.deltaTime的累加对不对?但是编辑器用Time.deltaTime并不合适,编辑器模式下的Time.deltaTime和运行模式下是完全不一样的。我们需要用EditorApplication.timeSinceStartup的差代替Time.deltaTime。
至于曲线颜色就比较简单了,增加一个AnimationCurve表示速度,调用Handles.color改变颜色就完事了。
那么好的,这节课的大概内容就是这些。视频https://www.bilibili.com/video/av22451187

阅读更多
文章标签: Unity STG
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭