网络游戏《丛林战争》开发与学习之(四):游戏客户器端的功能开发(上)
(三)中主要完成了服务器端的基础功能开发,本篇博客主要针对客户端进行功能开发。
0.客户端的基础准备工作
客户端的开发在Unity的场景中进行,首先导入UI框架和游戏环境的unitypackage包,
下载地址:https://download.csdn.net/download/s1314_jhc/10566458
并在Asset下创建一个Resources文件夹,用以存放资源素材。并建立一个UIPanel文件夹以存放所有的UI面板,如下图
打开Map文件夹下的Scene,导入场景,可以看到场景的环境效果还是十分不错的。
1.基本客户端框架
客户端的大致架构如下(其中GameFacade负责对整体脚本进行管理):
根据上图创建出所需的脚本文件
首先创建BaseManage,对于这个脚本,不需要继承自MonoBehavior,因为不需要作为组件存在,
继承自MonoBehavior的优点和缺点:https://blog.csdn.net/flyfish0113/article/details/50565217
代码如下(主要是控制初始化)
public class BaseManage {protected GameFacade facade; //提供一个对GameFacade的引用,当一个Manage想调用另一个Manage中的方法时,需要以GameFacade为中介,限定为protected方便子类调用public BaseManage(GameFacade facade){this.facade = facade;}public virtual void OnInit() { }public virtual void OnDestroy() { }
}
对于UIManage中,我们让它继承自BaseManage,并取消原有的单例模式,如下。
public class UIManager:BaseManage {public UIManager(GameFacade facade):base(facade){} //继承父类的构造方法
}
同理所有的Manage都继承自BaseManage,并在GameFacade下统一管理。
public class GameFacade : MonoBehaviour {private UIManager uiMng;private AudioManage audioMng;private CameraManage cameraMng;private PlayerManage playerMng;private RequestManage requestMng;private ClientManage clientMng;// Use this for initializationvoid Start () {InitMng();} void InitMng(){uiMng = new UIManager(this); //别的Manage初始化的销毁方法类似,不赘述}private void DestroyMng(){uiMng.OnDestroy(); }
}void OnDestroy() //监听Destroy事件{DestroyMng();}
以上就完成了客户端的基本框架搭建,接下来处理网络模块,即RequestManage和ClientManage,这两个功能完善后才能处理UIManage(控制登陆,需要借助服务器端访问数据库)
2.ClientManage与服务器端的连接
由于服务端与客户端收发消息的方法类似,因此服务端中Message类中的代码可以作为参考,在Scripts>Net中新建一个Message类,将代码进行拷贝。由于Message类中包含服务器端的一个Common共享类,我们将Common编译生成,并将dll复制到Unity目录下(dll包含对RequestCode和ActionCode的定义)。
在ClientManage中添加一个方法,负责数据的发送
public void SendRequest(RequestCode requestCode, ActionCode actionCode, string data){byte[] bytes = Message.PackData(requestCode, actionCode, data);clientSocket.Send(bytes);}
其中Message.PackData()方法对原有服务器端的方法进行了修改,添加了ActionCode的一个参数,代码如下
这里注意:服务器端向客户端发送数据时,需要数据长度+RequestCode+数据三个部分。相反,客户端向服务器端发送数据则需要数据长度数据长度+RequestCode+ActionCode+数据四个部分。参考(三)中1.4中的图 https://blog.csdn.net/s1314_jhc/article/details/81152269
public static byte[] PackData(RequestCode requestData,ActionCode actionCode, string data){byte[] requestCodeByte = BitConverter.GetBytes((int)requestData); //获取个部分的数据长度并进行拼接byte[] actionCodeByte = BitConverter.GetBytes((int)actionCode); byte[] dataBytes = Encoding.UTF8.GetBytes(data);int dataAmount = requestCodeByte.Length + actionCodeByte.Length + dataBytes.Length;byte[] dataAmountBytes = BitConverter.GetBytes(dataAmount);return dataAmountBytes.Concat(requestCodeByte).ToArray<byte>() //从前往后进行拼接.Concat(actionCodeByte).ToArray<byte>().Concat(dataBytes).ToArray<byte>();}
至此,客户端向服务器端发送数据的功能就实现了。
对于服务器端发送的消息,客户端解析方法如下,在ClientManage加入代码
private Message msg = new Message();
public override void OnInit(){base.OnInit();clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);try //考虑到连接可能会失败,进行异常捕捉{clientSocket.Connect(IP, PORT);StartListen(); //开始监听}catch(Exception e){Debug.LogWarning("warning:无法连接到服务器端,请检查网络!" + e);}}public void StartListen(){clientSocket.BeginReceive(msg.Data,msg.GetStartIdx,msg.RemainSize, SocketFlags.None, ReceiveCallBack, null);}private void ReceiveCallBack(IAsyncResult ar){try{int count = clientSocket.EndReceive(ar); //接收到的数据msg.ReadMsg(count, OnProcessDataCallBack);}catch (Exception e){Debug.Log("消息接收出现异常:"+e);}}private void OnProcessDataCallBack(RequestCode requestCode,string data){//todo:该函数负责解析服务器端传递的数据,需要完善RequestCode后才能继续。}
(上)部分主要梳理了客户端的整体架构以及客户端收发消息的处理,(下)部分将会对客户端进行完善,完善之后会上传游戏工程的代码。
网络游戏《丛林战争》开发与学习之(四):游戏客户器端的功能开发(上)相关推荐
- esp8266舵机驱动_arduino开发ESP8266学习笔记四—–舵机
arduino开发ESP8266学习笔记四-–舵机 使用时发现会有ESP8266掉电的情况,应该是板上的稳压芯片的限流导致的,观测波形,发现当舵机运转时,电源线3.3V不再是稳定的3.3V,大概是在3 ...
- 【转载】salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解...
salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解 建立好的数据表在数据库中查看有很多方式,本人目前采用以下两种方式查看数据表. 1.采用schema ...
- 华清远见fs4412开发板学习笔记(四)
fs4412开发板学习笔记(四) 今天的课程安排 1.复习 1.1 VIM 编辑器 [1] vim + filename 打开 [2] 工作模式 命令模式 编辑模式 底行模式 [3] 模式切换 命令- ...
- 从零开始安卓端相机功能开发(一)了解用什么去开发以及流程
目前已有章节大家可以去学习也可以参考一下 1.从零开始安卓端相机功能开发(一)了解用什么去开发以及流程 2.从零开始安卓端相机功能开发(二)让我们来开发一个相机 3.从零开始开发Android相机ap ...
- 从零开始安卓端相机功能开发(二)让我们来开发一个相机
目前已有章节大家可以去学习也可以参考一下 1.从零开始安卓端相机功能开发(一)了解用什么去开发以及流程 2.从零开始安卓端相机功能开发(二)让我们来开发一个相机 3.从零开始开发Android相机ap ...
- 移动端GIS功能开发
1.概述 去年自己参与了一款含有GIS核心功能的App开发,开发结束后自己在笔记软件做了项目总结,今天特意想起来,就将其搬到博客这里来,并进行一定的修改优化.庆幸自己一直有做完项目即时做总结的习惯,否 ...
- 详细记录基于vue+nodejs+mongodb构建的商城学习(四)基于项目的node.js开发后端的学习与梳理总结...
前置: 本系列文章是一个本人边学习边梳理的学习笔记,俗话说好脑袋不如烂笔头,再好的记忆力时间长了也会有细节忘记,本项目选择的前端框架是vue,后端开发使用是node.js,数据库使用的是mongodb ...
- Asp.net控件开发学习笔记(四)---Asp.net服务端状态管理
Asp.net请求处理构架 当一个客户端浏览器对IIS发起访问请求资源时(比如一个.aspx文件),Asp.net会初始化并维护一个包含了多个Response和Request的Http Session ...
- 微信小程序开发(四)入门之打卡功能开发
相关文章 微信小程序开发(一)微信开发者工具以及小程序框架介绍 微信小程序开发(二)开发之日历打卡小程序发现页 微信小程序开发(三)入门之创建打卡活动 前言 本篇文章将介绍打卡小程序打卡页面相关功能的 ...
最新文章
- spring boot异常——java.net.BindException: Address already in use: bind
- ES6 Generator async
- C语言的int, float,double相互转化 (从本质上理解可能的问题)
- linux ftp日志_linux学习笔记(一)——Linux分区和目录结构
- SpringMVC 返回json的两种方式
- python比较两个数据库表_mysql如何比对两个数据库表结构的方法
- 在arm上运行x86动态库_用 qemu-user 在arm linux机器上运行amd64/x86程序
- mysql 等于_mysql 不等于 符号写法
- 执行webpack发生了什么?
- python中颜色表_python 颜色表
- VMware虚拟机怎么安装win7系统【图文】
- 视频捕获增加color space converter + Transform Filter
- 趣挨踢 | 只有挨踢人才能读懂的西游记
- IDEA(或Android Studio)切换Git分支时弹出Git Checkout Problem
- 调用Kinect 2.0摄像头
- 解决运行zebra时“Multiple command installs to node 4 of command”的问题
- 英语语法基础01(句子结构)
- 微信公众号内,实现下载 PDF 文件。
- 飞象星球落地重庆云阳86所学校,县乡4万学生迎来素质课堂
- 2015CDAS中国数据分析师行业峰会:R语言量化投资数据分析应用