(三)中主要完成了服务器端的基础功能开发,本篇博客主要针对客户端进行功能开发。

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后才能继续。}

(上)部分主要梳理了客户端的整体架构以及客户端收发消息的处理,(下)部分将会对客户端进行完善,完善之后会上传游戏工程的代码。

网络游戏《丛林战争》开发与学习之(四):游戏客户器端的功能开发(上)相关推荐

  1. esp8266舵机驱动_arduino开发ESP8266学习笔记四—–舵机

    arduino开发ESP8266学习笔记四-–舵机 使用时发现会有ESP8266掉电的情况,应该是板上的稳压芯片的限流导致的,观测波形,发现当舵机运转时,电源线3.3V不再是稳定的3.3V,大概是在3 ...

  2. 【转载】salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解...

    salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解 建立好的数据表在数据库中查看有很多方式,本人目前采用以下两种方式查看数据表. 1.采用schema ...

  3. 华清远见fs4412开发板学习笔记(四)

    fs4412开发板学习笔记(四) 今天的课程安排 1.复习 1.1 VIM 编辑器 [1] vim + filename 打开 [2] 工作模式 命令模式 编辑模式 底行模式 [3] 模式切换 命令- ...

  4. 从零开始安卓端相机功能开发(一)了解用什么去开发以及流程

    目前已有章节大家可以去学习也可以参考一下 1.从零开始安卓端相机功能开发(一)了解用什么去开发以及流程 2.从零开始安卓端相机功能开发(二)让我们来开发一个相机 3.从零开始开发Android相机ap ...

  5. 从零开始安卓端相机功能开发(二)让我们来开发一个相机

    目前已有章节大家可以去学习也可以参考一下 1.从零开始安卓端相机功能开发(一)了解用什么去开发以及流程 2.从零开始安卓端相机功能开发(二)让我们来开发一个相机 3.从零开始开发Android相机ap ...

  6. 移动端GIS功能开发

    1.概述 去年自己参与了一款含有GIS核心功能的App开发,开发结束后自己在笔记软件做了项目总结,今天特意想起来,就将其搬到博客这里来,并进行一定的修改优化.庆幸自己一直有做完项目即时做总结的习惯,否 ...

  7. 详细记录基于vue+nodejs+mongodb构建的商城学习(四)基于项目的node.js开发后端的学习与梳理总结...

    前置: 本系列文章是一个本人边学习边梳理的学习笔记,俗话说好脑袋不如烂笔头,再好的记忆力时间长了也会有细节忘记,本项目选择的前端框架是vue,后端开发使用是node.js,数据库使用的是mongodb ...

  8. Asp.net控件开发学习笔记(四)---Asp.net服务端状态管理

    Asp.net请求处理构架 当一个客户端浏览器对IIS发起访问请求资源时(比如一个.aspx文件),Asp.net会初始化并维护一个包含了多个Response和Request的Http Session ...

  9. 微信小程序开发(四)入门之打卡功能开发

    相关文章 微信小程序开发(一)微信开发者工具以及小程序框架介绍 微信小程序开发(二)开发之日历打卡小程序发现页 微信小程序开发(三)入门之创建打卡活动 前言 本篇文章将介绍打卡小程序打卡页面相关功能的 ...

最新文章

  1. spring boot异常——java.net.BindException: Address already in use: bind
  2. ES6 Generator async
  3. C语言的int, float,double相互转化 (从本质上理解可能的问题)
  4. linux ftp日志_linux学习笔记(一)——Linux分区和目录结构
  5. SpringMVC 返回json的两种方式
  6. python比较两个数据库表_mysql如何比对两个数据库表结构的方法
  7. 在arm上运行x86动态库_用 qemu-user 在arm linux机器上运行amd64/x86程序
  8. mysql 等于_mysql 不等于 符号写法
  9. 执行webpack发生了什么?
  10. python中颜色表_python 颜色表
  11. VMware虚拟机怎么安装win7系统【图文】
  12. 视频捕获增加color space converter + Transform Filter
  13. 趣挨踢 | 只有挨踢人才能读懂的西游记
  14. IDEA(或Android Studio)切换Git分支时弹出Git Checkout Problem
  15. 调用Kinect 2.0摄像头
  16. 解决运行zebra时“Multiple command installs to node 4 of command”的问题
  17. 英语语法基础01(句子结构)
  18. 微信公众号内,实现下载 PDF 文件。
  19. 飞象星球落地重庆云阳86所学校,县乡4万学生迎来素质课堂
  20. 2015CDAS中国数据分析师行业峰会:R语言量化投资数据分析应用

热门文章

  1. 用Python制作掷硬币工具
  2. 卡尔曼滤波原理及其在RSSI测距中的应用
  3. 【矩阵求导】对于复向量l1-norm 1范数的求导
  4. 建筑施工扣件式钢管模板支架技术规程
  5. 通信原理及系统系列14—— 相干解调
  6. 苹果应用商店app_切勿更新!IOS最新观影APP上架苹果商店
  7. 广州市番禺区2021-2022学年七年级第一学期期末考试英语试题
  8. 2021-2022学年广州市广大附中七年级第一学期期中考试英语试题
  9. OpenJDK源码下载
  10. 访问非法内存区和内存泄漏