本期我们继续为大家进行小型太空射击游戏的后续教程
本期教学重点
控制相机
物理学入门
小型太空射击游戏教程篇幅较长,分为四篇,本篇为第三篇,有小伙伴没有看小型太空射击游戏(一)和(二)可以先去看一下
Unity基础案例讲解:创建小型太空射击游戏(一)
Unity基础案例讲解:创建小型太空射击游戏(二)
如果宇宙飞船不能移动,它并不是真正有用的东西。在本部分中,您将让玩家控制飞船。
为此,您需要处理两件事:相机和物理系统。不用担心,您今天不需要学习亚原子粒子物理学!
首先,您需要设置飞船:
1:在“层次结构”窗口中选择 Spaceship
2:使用Inspector 窗口将其位置设置为(X:10.66,Y:1.99,Z:10)。
3:将Rotation设置为(X:270,Y:0,Z:0)。
“检查器”窗口中的值将与下面显示的值匹配。
那么我是如何得出这些价值观的呢?它们实际上是相当随机的。
在开发游戏时,我将对象放置在这些起始位置。如果您制作了游戏,则可能选择了不同的位置。
在“游戏”视图中,您可以看到飞船离相机太近了。
有两种方法可以解决此问题。您可以将飞船再移回去,也可以重新配置摄像机。准备成为相机助手!
在层次结构中选择“Main Camera ”。您将在“检查器”中看到“ Camera component”组件。这里有很多选择,但是现在忽略Projection和Field。
您可以为投影字段选择“Perspective ”或“ Orthographic ”。这个选择决定了游戏的最终外观。
透视投影的行为与您的眼睛非常相似。物体离您的眼睛越近,它出现的越大。正射投影会丢弃深度信息。距离您最近的物体(在本例中为照相机)的大小将与距离较远的对象相同。
(左侧的两个多维数据集以“透视”投影显示,而右侧的多维数据集为“正交”)
一般来说,3D游戏应使用透视投影。没有深度的游戏(如2D游戏)应使用正交投影。
虽然您的游戏具有3D元素,但游戏玩法本质上是2D。在Projection字段中,选择Orthographic。接下来,将size设置为18.85。您的“Game”视图应如下所示:
宇宙飞船应该会飞吗?为此,您必须用C#编写一些代码才能逐帧移动飞船。为了节省您的工作,示例文件包含一个现成的脚本。问题是,如何将其添加到船上?
脚本仅仅是组件的另一种类型,并且有很多方法可以将组件添加到GameObjects。在本教程中,您将尝试一些方法。
现在,从“层次结构”中选择“Spaceship ”。然后从菜单栏中选择“ Component ”选项。在底部,您将看到一个名为Scripts的选项,带有可用脚本的弹出菜单。选择“ Ship Controller”脚本。
现在,您应该看到该Ship Controller脚本已作为“Script”组件添加到 Inspector window.中的Spaceship GameObject中。
与其他组件一样,您可以在脚本中定义可在编辑器中访问的字段。这使您能够在玩游戏时更改脚本的属性。
将组件的“ Move Speed ” 设置为22并将“ Rotation Speed”设置为2。
移动速度决定了船舶的速度,而旋转速度决定了船舶的旋转速度。点击Unity界面中央顶部的“Play”按钮。这开始游戏。使用箭头键移动您的船。
不幸的是,您的飞船将飞离屏幕,飞向半人马座阿尔法(Alpha Centauri)及以后。您需要解决该问题。
像以前一样使用菜单栏将“ Screen Wrap ”脚本添加到飞船中。
您会注意到,该组件具有一个名为Renderers的字段,该字段采用一系列Skinned Mesh Renderers。这是创建模型的几何。
如果渲染器不在屏幕上,则根据其运动方向和当前位置将GameObject传送到屏幕上的另一个位置。
展开“ Spaceship ”节点,直到找到主体 GameObject,然后将主体拖到“ Renderers”字段中。
现在运行您的游戏,超越无限!
您还记得保存工作吗?
只有一个主要问题。在飞船时,您违反了物理定律之一。不,不是牛顿物理定律-Unity物理最佳实践定律。
Unity使用物理学进行碰撞检测。如果GameObject没有RigidBody组件,则将其视为static collider.
这意味着Unity假定GameObject将保持静止,从而在碰撞检测方面进行了巨大的优化。但是,无论如何,当您开始移动这些静态对象时,Unity必须重新计算这些优化。这会为您的游戏增加不必要的CPU时间。
为了避免不必要的CPU开销,您需要通过添加Rigidbody组件来选择加入物理引擎。您已经直接从菜单栏中添加了组件。这次,在仍在“层次结构”中选择了太空飞船的情况下,单击“ Inspector.”中的“Add Component”按钮。
您会看到出现一个组件菜单。单击“ Physics”,然后单击“ Rigidbody.”
这个组件有很多选择。“ Kinematic”是您感兴趣的产品。
设置此选项意味着您要手动移动GameObject,但仍希望该对象注册碰撞。当您通过脚本(如此处所做的)或通过动画移动项目时,此功能很有用。
勾选Kinematic复选框。由于您在此游戏中没有使用重力,因此请取消选中 “ Use Gravity ”复选框,如下所示:
这个游戏的目的是飞来飞去,射击各种类型的碎片。自然,处理碰撞将在此类游戏中扮演重要角色。您需要知道玩家何时发射小行星或何时坠毁。
碰撞器可让您聆听并响应碰撞。基本形状可以使用多种类型的对撞机,例如Sphere Collider和Box Collider。
甚至还有基于3D模型的网格碰撞器。碰撞器以绿线显示在“场景”视图中。
(如果您使用的是视网膜显示器,则绿线非常细。Unity正在研究可定制性或使编辑器dpi敏感以改善此问题)
在本教程中,您将使事情变得简单,并使用Sphere Collider。
在“Hierarchy ”窗口中选择“ Spaceship ”,然后在“检查器”窗口中单击“ Add Component”按钮。单击Physics / Sphere Collider,您将在飞船后面看到一个绿色圆圈。
嗯,等等-为什么飞船背后的对撞机?这是因为当您较早更改其位置时,飞船的实际模型已从其父级偏移。
1:在“Hierarchy”中选择“ Spaceship ”后,在“ Inspector.”中找到您的Sphere Collider。
2:将Center设置为(X:0,Y:4.09,Z:-0.72)
3:将Radius设置为3.144 选中是 Trigger复选框。运动学游戏对象无法注册正常的碰撞,但可以侦听其他运动学对象的触发事件。
您的Sphere Collider组件应如下所示:
对撞机还应将飞船封闭起来,如下所示:
本期教程就到这里,下期我们将对武装大炮、将碎片放入太空碎片等继续讲解