思考并回答以下问题:
通过前面两章的学习,读者应该对Socket编程有了一定的了解。那么,开发网络游戏还会涉及哪些概念?怎样将Socket编程和实际游戏项目结合起来?
本章将通过完整实例介绍开发网络游戏的过程,以及其中会涉及的概念。尽管它并不完美,没有避开深藏其中的“坑”,但它展示了网络模块的设计思路,以及网络消息的处理方法。
什么是大乱斗游戏
大乱斗是一种常见的游戏模式,所有角色会进入同一个场景,玩家可以控制它们移动,也可以让角色攻击敌人,如图3-1所示。
游戏说明:
1)打开客户端即视为进入游戏,在随机出生点刷出角色。
2)使用鼠标左键点击场景,角色会自动走到指定位置。
3)在站立状态下,点击鼠标右键可使角色发起攻击,角色会向鼠标指向的方向进攻。
4)每个角色默认有100滴血(hp),受到攻击会掉血,死亡后从场景消失,提示“game over”。
5)若玩家掉线,视为死亡,从场景中消失。
以下是游戏开发的步骤,随后将根据这些步骤来介绍这个游戏的开发过程。
·搭建场景。
·编写角色类代码,这一步会介绍角色类的继承结构。
·编写客户端网络模块,这一步会介绍“协议”“消息队列”等几个概念,是本章的重点。
·编写服务端程序,这一步会介绍一种常用的服务端处理网络消息的方法。
·各个协议的处理,包括进入游戏协议、移动协议等。3.2 搭建场景
大乱斗游戏需要两个素材:一个平面场景、一个带动作的人物模型。Unity自带的Standard Assets包含了这个示例需要的大部分素材,读者可以导入Standard Assets的Characters和Environment两个库,以获取素材(右击Assets面板,选择Import Package,再分别选择Characters和Environment,如图3-2所示)。
图3-2 导入Standard Assets素材
导入素材后,可以使用Terrain搭建场景,再在地表上画出好看的纹理,如图3-3所示。为方便后续的制作,可将Terrain的中心点放到原点的位置,再调整摄像机的角度,45°俯视角对准原点,如图3-4所示。
场景搭建完成,接下来开始编写代码吧!
角色类Human
类结构设计
大乱斗游戏的核心要素之一是玩家所控制的角色,它可以行走,还可以攻击其他角色。玩家可以操控一个角色,又能够看到其他玩家操控的角色,可想而知,这两种角色应有不同的表现。玩家操控的角色是由玩家驱动的(下称“操控角色”),它接受鼠标的控制;其他玩家操控的角色(下称“同步角色”)是由网络数据驱动的,由服务端转发角色的状态信息。这两种角色有很多共同点,比如都可以行走、都可以表现攻击动作等。
可以设计图3-8所示的类结构,其基类BaseHuman是基础的角色类,它处理“操控角色”和“同步角色”的一些共有功能;CtrlHuman类代表“操控角色”,它在BaseHuman类的基础上处理鼠标操控功能;SyncHuman类是“同步角色”类,它也继承自BaseHuman,并处理网络同步(如果有必要)。