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

原创 2018年04月15日 23:56:04


从这节课开始,我会把我这个项目是怎么做的跟大家讲解一下。因为时间有限,我就不带大家一行一行的敲代码。我只讲重点和里面一些技术要点。需要大家有一定的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改变颜色就完事了。
那么好的,这节课的大概内容就是这些。具体代码怎么写大家参考我的项目就行了,我之后会放在github上。那么我们下期再见。

Unity-飞行射击实例的代码

花了一天的时间,照着官方的说明将spaceshoot这个DEMO撸了一遍,实现了一个简单飞行射击游戏应有的小功能,本想着用Unet这个组件把这个游戏做成一个联网的,无奈只能实现飞机运动之间的同步,其余...
  • Hnubama
  • Hnubama
  • 2016-03-04 23:42:42
  • 1226

unity学习之飞机大战制作 关键点(四) 设置敌机和奖励物品的生成和随机

特别说明,因为敌机和奖励物品的代码方式差不多,我就放在一个代码里面写了。 3.1添加敌机以及敌机的移动 依旧是把图片拉到Hierarchy里面生成对象,添加代码,然后拖回scenes文件夹,就可以...
  • qq_39227270
  • qq_39227270
  • 2017-07-07 10:21:38
  • 526

Cocos2d-x《雷电大战》(6) 智能敌机AI来袭--飞行路径算法设计与实现(下)

此文接上文Cocos2d-x《雷电大战》(6) 智能敌机AI来袭--飞行路径算法设计与实现(上) ,还是对游戏中的敌机路径进行一个设计和实现。这里笔者又实现了两种敌机路线。分别如下: (1)敌机朝着英...
  • Evankaka
  • Evankaka
  • 2015-05-01 18:03:37
  • 5355

Unity3D模拟导弹轨迹的简单方法

真实的导弹的轨迹是一个开口向下的抛物线,并且导弹是以速度越来越快的匀加速运动到目标点。要做仿真的话,确实需要这样的去实现。然而有些类型的游戏,要求没那么高。只要做到运动到起点和目标点之间的最高点,然后...
  • wuming2016
  • wuming2016
  • 2017-03-15 15:32:44
  • 2067

如何用Unity和Cardboard做一款VR游戏

http://58kaifa.com/article/440 【Gamelook专稿,转载请注明出处】 Gamelook报道/随着Oculus宣布1月6日开启预售,2016年很...
  • hcud024
  • hcud024
  • 2016-07-05 20:26:40
  • 859

【Unity3D】游戏常用点整理-飞机射击类游戏

1)飞机控制 在有限的范围内上下左右移动 public class Boundary { public float xMin = -6.5f; public float xMax =...
  • TW_345
  • TW_345
  • 2015-08-05 17:50:04
  • 1910

unity3d 抛物线(炮弹轨迹)

using UnityEngine; using System.Collections; public class ProjectileTest : MonoBehaviour { publ...
  • fzhlee
  • fzhlee
  • 2013-03-13 16:43:27
  • 8967

threejs 绘制地球、飞机、轨迹

threejs官网:https://threejs.org/ 首先我们来看下要实现的效果 这个缩小后的图片,下面我们来看下近距离的动态效果。。 效果比较简陋,需要后期再处理。。。 下面...
  • kingmax54212008
  • kingmax54212008
  • 2017-10-11 10:03:51
  • 437

Android 游戏雷电

  • 2012年10月09日 16:16
  • 291KB
  • 下载

Unity 3d让物体成弧线运动(可以制作炮弹发射的轨迹)

using UnityEngine; using System.Collections; public class MoveCurve : MonoBehaviour { public G...
  • cen616899547
  • cen616899547
  • 2014-12-16 10:02:07
  • 19726
收藏助手
不良信息举报
您举报文章:【如何用Unity做一款STG】(一)敌机飞行轨迹设计
举报原因:
原因补充:

(最多只允许输入30个字)