【Unity 技术教程】如何利用 Input System 制作本地多人联机游戏

作者:MCATIN
2020-12-05
6 4 2

视频

图文

大家好,我是小鱼儿,我又来了!感谢各位对我上一期有关“时间回溯”的视频的支持,是你们让我感觉到了我这个有用。

这次的视频题材其实源于近几年来 party game 在市场上越来越多。这些 party game 基本上源于当年在街机厅的联机打斗还有后来家用机上的本地对战。往远了说有“恐龙快打”、“彩京 1945 系列”等等经典名作,往近了说也有“胡闹厨房”、“动物派对”等大量十分火爆的游戏。

恰好 Unity 在 2020 年更新了一套全新的输入系统,原生解决了很多原来需要自己手动控制的问题。所以在这我就尝试一下利用这套全新的输入系统做一个最简单的本地多人游玩的 demo,分享一下这套新系统最基础的使用方法。

这次我做的游戏玩法非常简单,就是两个人分别控制一个角色,如果把对方逼到墙角就能得分的这样一个游戏。有一点像是那种战斗陀螺吧。

【准备工作】

首先,导入图片,创建出我们需要的玩家的物体,并且给它调整一个方便识别的颜色。在这里我先导入了一个圆形的替代图片,等基本功能都做完之后再替换成更好看的美术资源。

截至视频发出的时候为止,Input System 还不会默认被集成到工程中,而需要我们自己导入到工程里。所以在这需要我们打开 Window 选项点击 package manager,输入 input 后就能找到 Input System 了,这里根据网络情况有可能需要稍等一会儿。点击 Install 进行安装之后,unity 可能会要求重启编辑器。

重新启动编辑器之后,打开 project setting 找到 Input System,创建一个设置文件,在支持设备里添加手柄和键盘。

 

【创建输入配置】

对于 InputSystem,Unity 使用了名叫 Input Action 的配置文件来记录键位的信息。所以我们需要在空白的位置,右键创键一个新的 Input action 后双击编辑。

打开后,新建一个 Action Map,然后我们需要在 Actions 里添加上需要响应的动作,并绑定上想要的键位。

这里我先创建了对应移动的动作,然后为动作类型选择了数值类型。之后绑定了手柄的左摇杆作为输入之一。

接下来再绑定键盘。在这需要选择 2D Composite。选定之后会出现对应二维矢量上下左右四个方向的键位。分别选择之后再点击 Path,然后直接点击旁边的 listen 键,再按下需要绑定的按键,Unity 就会自动帮你记录下来了。

设定之后点击保存配置,也可以选择 Auto Save 之后让 Unity 自动保存所有操作。

关闭后,给玩家添加一个 Player Input 组件,可以看到底下有一行字写着“会在设备丢失、重连等等等情况下向 GameObject 发送消息”。那么在这,我们把刚刚创建好的输入配置拖进 Actions 里。之后随意选择一个其它物体,再点回来就可以看到发送的消息里多出了 OnMove(),也就对应了我们刚刚创建的那个名为 Move 的动作。

【游戏功能】

我们把玩家移动必备的组件添加上,除了给我们自己编写的 Player Controller 代码和碰撞区之外,还需要添加一个刚体,并且把刚体的重力去掉。

然后就是写代码的时间!打开代码编辑,这里最重要的就是需要用到 OnMove()也就是刚刚我们添加输入后产生的新的函数。不要忘记使用这个函数需要添加 UnityEngine.InputSystem 的命名空间。之后就可以通过 OnMove()获取移动对应按键的值。

在能够获取这个值后就可以正式开始写移动功能了。

这个时候运行一下游戏,已经可以看见效果了。这里还可以调整一下刚体的阻力和惯性等参数让移动更自然,这里就不赘述了。

我们的规则决定了我们需要保证玩家只能在场地内活动,所以需要建立空气墙让玩家不会飞出去。另外我想要玩家在碰到碰撞体时还会往回弹一些,所以我还创建了物理材质赋给玩家。

【多人部分】

关于本地多人游戏的部分,前面提到过新的 Input System 让本地合作的实现变得很简单,只需要创建一个挂载了 player input manager 的游戏物体,再将 player 设置为预制体放入 input manager,按下不同控制器任意按钮后,就会自动生成玩家的预制体。

不过可以看到,这样会带来一个问题,生成出来的玩家无论是位置还是其它什么的初始状态都是一致的。所以这里又额外增加了一些代码,通过获取输入对应的玩家编号来区分玩家,并修改对应的状态,在这就是位置和颜色。当然这里因为只是为了在替换资源之前进行简单的区分,所以把很多的值暂时写死在了代码里,所以不要吐槽我丑陋的代码。

在玩家的部分制作完毕之后,我又添加了一个简单的 UI 提示操作,以及显示分数。对应的也添加了玩家撞到碰撞区之后会给对方加分的功能。

这就是目前运行的效果。

在确认基础功能做完之后,我又替换了玩家的形象以及场地的背景,同时针对场地的图片更改了碰撞区的形状。因为两个玩家的素材不同所以我把替换颜色的部分改成了替换玩家的图片。

并且利用玩家移动时输入的向量值计算并修改玩家朝向。

最后的成品就像开头展示的那样。这个视频里只展示了最基础的输入控制,而其实全新的 Input System 所提供的功能还有很多,希望这个视频能抛砖引玉。再次感谢你的观看,下次再见。

如果这个知识分享,解决了你一些开发上的问题,别忘了给我 B 站来个三连!

图文版及工程文件下载

本文为用户投稿,不代表 indienova 观点。

近期点赞的会员

 分享这篇文章

您可能还会对这些文章感兴趣

参与此文章的讨论

  1. DeclanHsu 2020-12-05

    最近被这个新输入系统折腾得够呛

  2. zlq32326 2020-12-06

    这种俯视角的美术资源还有更多的吗··

您需要登录或者注册后才能发表评论

登录/注册