我的战舰-制作游戏入门(二)射击

2021/01/13434 浏览游戏开发攻略
我的战舰-制作游戏入门(二)射击
现在我们来制作一个射击游戏,首先打开我们在教程一中做好的滚雪球的工程,并打开球的机械编辑器。首先我们来给这个球增加一把武器,点击下方的武器类零件,选择其中的“穿甲弹”并拖动到球的侧面
TapTap
TapTap
TapTap
你可以发现屏幕上多了一个白色的按钮,这是内置的射击按钮,将它拖动到屏幕右下方
TapTap
现在让我们回到地图编辑器中并进入测试,你可以点击射击按钮开火了,但是现在的问题是开火时球会不受控制的转动,这可不是我们想要的效果,
TapTap
回到球的编辑状态中,点击左上方的设置按钮,并点击弹出的面板中的“零件列表”按钮
TapTap
TapTap
在右侧可以看到编辑器中所有零件的列表
TapTap
这里我们选中“核心”,选中“非物理人形移动”选项
TapTap
可以看到出现了一个绿色的胶囊,这就是我们的虚拟人物的碰撞体,使用这个模式后雪球不再会受到物理规则限制而会一直保持这个角度,现在可以回到地图编辑器并进入测试
TapTap
可以发现射击时雪球不会不受控制的滚动了,但是我们按键盘时球也不会滚动了,针对这种人形移动模式我们需要新的移动逻辑。我们先回到地图编辑器并选中“雪球”这个机械产生器,并打开“每帧循环”事件中的自定义方法,可以看到第5行我们使用了“推力”方法让球滚动
TapTap
现在拖动上方的“当前零件”按钮到第5行后面,并选择“人形移动/人形模式移动旋转”这个方法
TapTap
我们希望按住A时人物逆时针转,所以这里“旋转”这个参数填写“-1”
TapTap
进入测试,可以发现按住“A”键后雪球可以旋转了,而之前的第5行已经没有用了,我们可以拖动代码右侧的“快捷菜单按钮”到上方删除
TapTap
同样方法,我们可以让按住D时顺时针转
TapTap
按住W时前进
TapTap
可是如果这时进入测试会发现,AD的旋转都是正常的,但一旦旋转后,按住W没有想着朝向的方向前进而是一直朝着地图的上方移动,这时因为“移动方向”这个参数是“世界空间”的朝向,而我们需要的效果是朝着人物自身的向前方向移动。这就需要将雪球这个物体的局部空间的方向转换到世界空间。这里我们可以方便的使用游戏自带的功能:拖动上方的“当前零件”按钮到第10行后面,选择“位置/局部方向到世界”方法,返回值名称叫做“方向”即可,“局部方向”这个参数我们填写0,0,-4,这代表从“核心”这个零件的视角看过去向前的方向,而这个方法的返回值就是经过转换后的世界方向了
TapTap
然后我们将第12行的“移动方向”参数改为“方向”变量,并进入测试
TapTap
现在移动和旋转都正常了,别忘了将按住S后退的逻辑也写上
TapTap
内置的射击功能虽然简单,但往往我们需要定制我们的子弹效果,比如现在我们可以增加一个扔手雷的功能。现在打开“雪球”的机械编辑器,选择“武器类”零件中的“自定义发射器”并拖动到球上
TapTap
TapTap
然后回到工程目录界面,再导入一个空的机械作为手榴弹,进入“手榴弹”的机械编辑器
TapTap
拖动“基本连接类”零件中的“连接块1”到核心上
TapTap
TapTap
缩放到合适大小,比如3倍
TapTap
回到地图编辑器,给手榴弹添加一个新的“机械产生器”,别名可以填写“手雷”,机械选择刚才的“手榴弹”机械
TapTap
为了让之前给雪球添加的“自定义发射器”可以发射这个叫做“手雷”的机械产生器产生的机械,我们需要回到“雪球”机械的机械编辑器中,选中红色的“自定义发射器”,并将其中“机械产生器别名”参数填写为“手雷”
TapTap
TapTap
同时也可以设置个合适的“初速度”,就是手雷被扔出去的速度
TapTap
回到地图编辑器,打开“雪球”机械产生器的“启动事件”中的的方法
TapTap
TapTap
要将刚才添加的机械当做手雷发射出去,我们需要生成一个按钮,拖动“功能调用”按钮到下面,选择“系统/UI/生成按钮”方法,返回值命名为“手雷按钮”
TapTap
坐标参数表示按钮在屏幕上的位置,范围是0~1,这里我们改为0.8,0.2,0,表示屏幕右下角,“标题”参数表示按钮上显示的文字,我们改为“手雷”
现在进入测试可以发现屏幕上多了一个按钮,但点击它还没有功能
TapTap
回到“雪球”机械产生器的“启动事件”中的的方法,拖动“变量功能”到下面,选择“手雷按钮”中的“点击回调”方法
TapTap
参数“方法名”,填写“发射手雷”
TapTap
退出到逻辑面板,点击上方的“自定义方法”按钮,
TapTap
将新方法命名为“发射手雷”
TapTap
拖动“全部零件”下来,选择“自定义发射器/自定义发射器_1/发射”方法
TapTap
现在进入测试,点击“手雷”按钮后,会发现雪球变大了,并且出现了报错
TapTap
这是因为发射出来的手雷机械和雪球碰撞后触发了我们在教程一种编写的触碰机械变大并删除对方的逻辑,现在我们回到雪球的机械编辑器中的“被撞击”事件中的方法
TapTap
直接点击右上角的“激活”选项,这样回到逻辑界面后可以发现这个代码变成灰色了,也就是这个代码不会再运行,这时再进入测试
TapTap
TapTap
TapTap
点击“手雷”按钮后,可以正常发射手雷了
TapTap
接下来我们给手雷增加爆炸的特效,打开手榴弹的机械编辑器,拖动“功能类”零件中的“粒子”零件到任意零件上
TapTap
TapTap
TapTap
可以看到有很多光点持续在运动的效果,粒子是个非常强大而复杂的系统,可以做非常多的特效,这里我们简单的制作一个爆炸效果,选中粒子后,看左侧的属性面板
最小速度和最大速度设置为15,20,颜色改为黄色和橙色,重力 3.0,持续喷射改为爆炸喷射,频率 100
TapTap
粒子形状改为“拉伸”,粒子发射形状改为“球型”,拉伸系数 4.0,局部空间改为“世界空间”
TapTap
然后回到地图编辑器,打开“手雷”的机械产生器,在“机械启动”事件中添加一个方法,
拖动“全部零件”下来,选择“粒子/粒子_1”的“粒子/打开”方法
TapTap
进入测试会发现手雷发射瞬间就出现了爆炸效果,为了让这个爆炸效果延迟产生,回到“手雷”的机械产生器,在“机械启动”事件的方法中拖动上面的“等待”按钮到第一行前面,选择“创建变量/小数”,参数填写1
TapTap
这表示手榴弹这个机械被扔出去1秒后才激活爆炸特效
接下来我们增加一个敌人作为靶子,回到工程目录并导入一个新的机械,取名叫做“靶子”并进入机械编辑器,选择下方“基本连接类”零件中的任意零件拼装一个简单的造型
TapTap
TapTap
现在回到地图编辑器中,将之前的别名叫做“敌人”的机械产生器的机械替换为这个新的机械
TapTap
可以看到启动后产生了多个新的敌人
TapTap
但是这里有个问题,因为这10个敌人是同时产生的,会挤在一起,我们可以打开蓝色的“逻辑方块”中的“自动事件”中的方法,在每个产生AI机械语句后添加一个等待语句,并选择“创建变量/小数”,数值填0.5即可。
TapTap
再进入测试,可以发现敌人是陆续产生的了,现在我们朝着敌人发射手雷,并没有预想的击飞效果,因为我们之前只添加了粒子特效,现在我们回到“手雷”这个别名的机械产生器,并打开“机械启动”事件中的方法1,并在“粒子.打开”语句后增加“系统调用/系统/检测/检测球形区域零件”,返回值的名字设置为“击飞列表”
TapTap
中心点参数填写手雷的位置,这里可以通过拖动上面的“当前零件”下来,并选择“坐标”方法来得到,半径填写3,“每个机械只判断一次”设置为“真”,否则当一个机械有多个零件时,会被判断多次。
TapTap
这个语句的意思是:在手雷为圆心,半径为2的球型区域查找零件(每个机械只找一个零件即可),得到的所有零件都放入一个名字叫“击飞列表”的列表,列表可以理解为多个变量排成的一个队伍,列表中的变量可以是零件、小数、文字等任意类型。最后我们还需要点击右上角的“调试信息”开关,这样我们在游戏中就可以看到代码运行的具体过程了。现在进入测试
TapTap
进入测试后,我们朝着敌人发射手雷,可以发现代码运行到第4行后,列表元素数根据离敌人的距离在变化
TapTap
接下来我们要给这个列表里面的敌人一个爆炸冲击力,回到“手雷”的启动事件的逻辑编辑器,拖动“功能调用/创建变量/小数”
TapTap
拖动“变量功能/击飞列表/数量”,返回值命名为"N"
TapTap
拖动“循环”按钮到下面,选择“小数计算/小于”,参数填写为"i"<"N"
TapTap
拖动“功能调用/小数计算/加”,参数填写为i=i+1
TapTap
拖动“变量功能/击飞列表/读取零件”,参数填写i,返回值命名为“零件”,如图
TapTap
拖动“变量功能/零件/得到坐标”
TapTap
拖动“功能调用/向量计算/减”
TapTap
拖动“零件变量/零件/推力”
TapTap
现在进入测试可以发现手雷爆炸时敌人会被炸飞了,同时屏幕上还会显示很多调试信息,我们先不用自己看,回到编辑器,我们来一步步解释刚才添加的代码
TapTap
4:得到距离手雷2米以内的零件列表
5、6、7、13这几行一起说,这几行的作用是让8-13行的逻辑循环运行N次,其中N是列表的元素个数。具体原理是:每次代码运行到第7行,都会检测i<N这个条件是否为真,为真则执行红线内的代码,否则跳过所有红线代码,当代码运行到第13行时,变量i的值增加1,因为i最开始是0,所以红线部分代码执行N次以后,第7行的i<N就变成假了,也就不会再循环,这个循环功能经常用于逐个处理列表元素。
8:因为这行是循环内部的,会执行N次,每次都会读取列表中的一个零件出来,第一次读取的是0号元素,第2次读取1号元素,第3次读取2号元素。这里可以发现列表的编号是从0而不是日常生活中的1开始的。这是因为在用代码处理列表的过程中,使用0开始会使很多计算更加简洁。
9:得到第i个元素的坐标
10:用目标零件的坐标减去手雷的坐标,得到的是一个方向向量,代表从“零件位置”出发到“位置”向量这两个位置之间的连线
11:将这个方向向量长度设为10,如果不设置它,那么距离手雷具体不同的零件的方向向量长度就不一样,会导致后面的爆炸力大小不同。
12:给零件一个冲击力,大小10,方向是手雷和零件的连线方向
理解了没一行的作用,现在让我们再回到测试,仔细观察调试输出的内容
TapTap
黄色的第一行输出表明了代码所在位置,后面的数字是输出的时间点,后面的文字每一行都以数字开头,对应的就是我们的第几行代码,你可以截图后和代码进行对比,这里每一行都显示的计算的中间过程,比如第10行,可以看到向量减法的参数和计算结果,当我们编写的逻辑越来越复杂时,如果游戏运行的结果不符合我们的期望,那么打开调试输出仔细观察代码运行的中间步骤是最有效的方法。通过查看中间计算过程,可以锻炼我们的逻辑思维和严谨的态度。
当确认我们的逻辑没问题后,别忘了回去关闭“调试输出”,太多的调试输出也会干扰我们的游戏运行。
2
3