朋友们,《猫捉老鼠》将是你上线的第一款游戏,为了让《猫捉老鼠》更完整,本节将为其丰富场景、添加界面、完善功能,让它可以称得上是一款简单的游戏。
好了,说干就干,一起实践吧!
在上面的实践中,一直用球体代替猫的模型,显然这个临时球体早晚要被换掉。
现在,真正的主角就要闪亮登场了。
先向工程中导入一只可爱的猫,如图1-26所示。这只猫是Unity商店中一个免费的模型,包含了5个动画片段:站立、行走、攻击、吃东西和发声。
图1-26 猫的导入
图1-26 猫的导入(续)
图1-26所示是向Unity里导入资源的步骤,无论什么资源,只要是Unity商店中有的,均可以按照图中所示的步骤将其导入工程。这里需要说明一下,Unity商店中的所有资源均是共享的,所有人都能用,因此,要上线一款游戏,独立制作的美术资源是必不可少的。
接下来,用猫的模型替换小球。
01在工程面板中找到模型cat_Idle,这是一只附有站立动画的猫,把它拖入结构面板,并在工程面板中新建一个文件夹prefabs。
02 把结构面板中的模型cat_Idle拖到工程面板的Assets>prefabs文件夹中,这样一来,便在文件夹prefabs中创建了一个预制体cat_Idle,结构面板中的cat_Idle成了该预制体的复制体,如图1-27所示。
细致观察可以发现,结构面板中的模型cat_Idle的图标变成了蓝色,这是因为模型cat_Idle从物体变成了预制体。
图1-27 猫的设置
到这里,你或许会对预制体有些疑惑:预制体是什么?预制体有什么作用?为什么要用预制体?
首先,看一个关卡游戏《宾果消消消》,在这款消除类游戏中,一个关卡有很多相同的方块,比如圆圈、爱心和石头等,如图1-28所示。
图1-28《宾果消消消》
有一天,制作人觉得爱心方块不好看,让美术人员重新设计了一个方块模型。拿到新模型之后,程序员们就开始做替换工作。
替换工作的逻辑很简单,就是把模型从一个心形模型替换成圆形模型。可难的是,游戏里很多地方都用到了旧的爱心模型,难道要逐一替换吗?
这样逐一替换的效率太低了。
假设有这样一个方案:有一个母体,所有爱心方块都是从这个母体上复制出来的,只要修改了母体,所有的爱心方块都会随之改变,这该多好啊。
Unity就提供了一个这样的母体机制。预制体是Unity提供的用以实现母体机制的一个预定义物体。一个模型只要被拖进了工程面板就会变成一个预制体,这个预制体被拖进结构面板,就会产生一个它的复制体。预制体决定了它的所有复制体,一旦修改预制体,它的所有复制体将自动同步被修改。在Unity中,这个母体机制通常被称为预制体机制。
到这里,预制体的讲解就告一段落了。
我们来继续替换游戏主角的模型。
03 把球体的3个组件——碰撞体、刚体、脚本复制到物体cat_Idle上。这里的复制和粘贴操作和Word文档中的操作一样,选中球体的组件,按快捷键Ctrl+C复制,在cat_Idle的监视器面板上按快捷键Ctrl+V粘贴。
需要说明的是,物体cat_Idle是一个复制体,现在复制体被修改了,但它的预制体还是之前的版本,这造成了复制体和预制体的版本不同步,显然不正确。
那么,该如何把复制体的修改同步到预制体呢?
在结构面板中,选中复制体cat_Idle,在其监视器面板的右上角单击Overrides,在弹出的下拉列表框中列出了复制体的修改信息,单击Apply All按钮,保存修改。这样一来,复制体的新版本覆盖了预制体的旧版本,预制体和复制体便同步了,如图1-29所示。
图1-29 同步复制体和预制体
到这里,就完成了本小节的主线任务,即替换了主角猫的模型。对于球体,删除即可。
前面已经替换了猫的模型,可是猫的模型和球体不同,还需要重新设置猫的各个组件,如图1-30所示。
01位置组件Transform:把猫的位置Position设置为(0,0,0),让猫在地面的中心。
02 碰撞体组件Sphere Collider:把其中心点Center设置为(0,0.5,0),让碰撞体正好在地面之上0.5米处,防止猫掉下地面。
03 刚体组件Rigidbody:把猫的旋转冻结Freeze Rotation的3个轴全勾选上,让猫不能旋转,只能平移。
图1-30 猫的组件设置
在游戏中,猫可以自由地行走,但是地面的大小有限,当猫走到地面边缘的时候有可能会掉下去。解决方案是,当猫掉下去之后,程序将猫复位。下面为复位操作添加代码。
打开脚本MaoController,如图1-31所示。If语句判定猫的高度position.y为负数时,认为猫掉下了地面,此时重新设置猫的位置position为new Vector3(0,0,0),当猫掉下地面之后又会重新出现在地面上。
图1-31 添加复位逻辑
保存场景,运行测试,效果如图1-32所示。
现在游戏的主角终于是一只有各种动画的猫了,而且再也不用担心猫会掉下地面了。
图1-32 运行测试
在这款游戏中,地面相当于游戏背景,因此地面需要匹配整个游戏的美术风格,也要有合适的尺寸。
因为游戏的屏幕比例是16∶9,所以地面的尺寸也需要设为16∶9。选中地面,在其监视器面板中,设置地面的尺寸大小Scale为(2.24,1,1.26),如图1-33所示。
图1-33 设置地面尺寸
另外,地面的颜色也需要修改,具体操作如图1-34所示。
在工程面板中,先新建一个文件夹Assets>Materials,用来存放材质球;然后在文件夹中新建一个材质球Floor,并把该材质球指定给地面;最后通过修改材质球的颜色来改变地面的颜色。
图1-34 修改地面颜色
前面讲了如何在商店中找到猫的模型,并将其导入场景中使用,老鼠模型资源的导入方法也一样。DogKnight是导入老鼠模型后创建的资源文件夹。把DogKnight>Prefab>DogPBR模型拖进结构面板,然后删除物体Target,如图1-35所示。
图1-35 老鼠模型替换
替换老鼠的模型之后,猫的捕捉目标需要重新指定,步骤如图1-36所示。
图1-36 替换捕捉目标
到这里,丰富场景的实践就完成了。
运行游戏,效果如图1-37所示,是不是感觉高级多了。
图1-37 运行成功
要进一步提高可玩性,还需要为《猫捉老鼠》游戏增加计分功能。为计分功能设计如下计分规则。
①玩家控制猫捉到老鼠1次,奖励金币1个。
②玩家控制猫自由移动,如果掉下地面,扣掉所有金币,金币重新计数。
计分功能是一个独立模块,涉及界面制作和代码编写两部分。在开发游戏时,大多数程序员习惯先制作界面后编写代码,这个习惯来源于实践。对于计分功能,本书将按照先制作界面后编写代码的顺序来实现。
依据计分规则,计分界面包含两个组件:一个是金币图标,一个是金币数量。
面板是一个包含各种界面组件的桌面,有了这个桌面,开发者能更方便地调整界面的位置。在结构面板中,右击结构面板,在弹出的快捷菜单中,选择UI>Panel,即可创建一个面板,创建过程如图1-38所示。
图1-38 创建面板
大多数游戏的计分界面是2D界面的,《猫捉老鼠》的计分界面也是一样的。为了方便制作界面,下面把开发模式从3D切换到2D,切换操作如图1-39所示。
图1-39 切换为2D开发模式
一般情况下,计分界面会放在游戏界面的右上角,下面调整Panel的位置到右上角。
固定面板: 选中结构面板中的Panel,在其监视器面板中的第1个组件是矩形组件Rect Transform,如图1-40所示,选择了右上布局,这表示Panel会固定在右上角。具体来说,无论界面的尺寸和位置如何变化,Panel的位置会一直在右上角。
图1-40 固定面板
另外,锚点Anchor负责固定Panel,如果调整Panel的宽高尺寸,不难发现Panel的宽度和高度均以锚点为中心变化。
尺寸设置: 把界面的宽高尺寸设置为(1000,300),中心点Pivot设置为(1,1),如图1-41所示。
图1-41 尺寸设置
选中Panel,其监视器面板中有一个图片组件Image,用来设置图片组件的属性,比如背景图片的颜色和尺寸,此处设置Panel的背景色为紫色,如图1-42所示,以便调整Panel的尺寸。
图1-42 更改Panel的颜色
在结构面板中,选中Panel,右击Panel,在快捷菜单中选择UI>Image,创建一个图标,如图1-43所示。
图1-43 创建图标
创建完成以后,将其命名为Image_coin。随后把提前准备好的金币图片拖入图标的Image组件的源文件参数Source Image中,如图1-44所示,调整其大小。
图1-44 创建金币
在结构面板中,先选中Panel,再右击Panel,在快捷菜单中选择UI>Text,创建一个文本组件Text,对文本组件进行设置,如图1-45所示。
完成上述操作后,选中Panel,把其颜色修改为全透明。图1-46所示是最终的计分界面,尽管这个计分界面还有些粗糙,但它已经可以用来计分了。
图1-45 文本设置
图1-46 最终的计分界面
前面提到,功能开发的顺序是先制作界面后编写代码,既然计分界面已经制作完成了,接下来便要写代码了。
打开脚本MaoController,把计分逻辑写到这个脚本里。本章所有代码都写到脚本MaoController里,这样的安排有利于线性地梳理代码逻辑,避免精力分散。
增加两个公共变量textCoin和coinNum,如图1-47所示,它们分别表示金币文本和金币数量。
图1-47 增加变量
using引用库
通常情况,C#脚本的开头都会有一个using引用列表,用来表示在本脚本中引用的方法或函数来自哪一个库,这是C#语言用来引用库的基本语法。
当猫捉到老鼠时,玩家的金币数量会加1,同时金币数量会更新到金币文本上,如图1-48所示。
这样一来,猫一旦捉到老鼠,计分界面的金币数量马上就会发生变化。
图1-48 金币数量增加
代码写完后还需要为脚本关联物体,因为脚本中新增了一个文本变量,所以要为这个文本变量关联上金币数量文本Text_coin,关联操作如图1-49所示。
图1-49 关联脚本
如此一来,代码中的金币数量coinNum会实时地显示在金币数量文本Text_coin上。
计分功能到这里就全部完成了,如图1-50所示,运行看看效果吧!
图1-50 计分功能
为什么会有本小节试运行?
在软件和游戏公司里,有一个职位叫测试工程师,他们的工作职责是测试软件或游戏的新增功能,比如游戏的新版本有没有缺少功能点,新增功能有没有错误等。
有几句题外话,大家权当是笔者对游戏行业的一些个人观点,为大家客观看待游戏行业提供一个视角。测试这份工作不像程序员,尽管没什么功劳,但十分重要。因为一款线上游戏如果在更新版本时有严重的错误,那么一定会招来玩家们的差评,甚至还会失去玩家,为了补偿玩家,发福利丢钱都是再小不过的事了,最重要的是,辛辛苦苦树立的口碑一旦失去将很难挽回。
因此,既然决定开发一款游戏,那一定要认真测试。
带着责任来测试我们的第一款游戏吧。
首先,检查一下新增了哪些功能。第一,替换了猫和老鼠的模型;第二,增加了计分功能。一共有两个,没有缺失。
其次,运行测试。第一,看角色模型有没有替换成功;第二,看猫捉到老鼠后金币有没有增加;第三,看猫掉下地面之后有没有在地面中心重生,金币有没有归零。
经过测试,如果功能没有缺失也没有错误,那么恭喜,通过测试!但是,如果你的测试没有通过,一定要回到上文检查,更正后再继续,不要着急,一步步来。
图1-51所示是《猫捉老鼠》的试运行截图。
图1-51 试运行截图