客户端框架的搭建(丛林战争项目)
一、创建一个Unity项目OnlineGameClient并导入资源包
二、项目结构
三、代码
1、Manager包下
①AudioManager
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class AudioManager : BaseManager {public AudioManager(GameFacade facade) : base(facade) { }}
②BaseManager
using System.Collections;
using System.Collections.Generic;
using UnityEngine;//不需要继承MonoBehaviour,因为不需要作为组件存在,也不需要start和update方法
public class BaseManager : MonoBehaviour {//每个类都包含一个GameFacade的引用,这样子类可以将facade作为中介调用各个managerprotected GameFacade facade;public BaseManager(GameFacade facade){this.facade = facade;}public virtual void OnInit() { }public virtual void OnDestroy() { }}
③CameraManager
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class CameraManager : BaseManager {public CameraManager(GameFacade facade) : base(facade) { }
}
④PlayerManager
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerManager : BaseManager {public PlayerManager(GameFacade facade) : base(facade) { }
}
⑤RequestManager
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class RequestManager : BaseManager {public RequestManager(GameFacade facade) : base(facade) { }
}
2、Net包下
①ClientManager
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net.Sockets;
using System;
using Common;//这个是用来管理和服务器端的socket连接
public class ClientManager : BaseManager {public const string IP = "127.0.0.1";private const int PORT = 6688;private Socket clientSocket;private Message msg = new Message();//创建clientsocket和服务端建立连接public override void OnInit(){base.OnInit();clientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);try{clientSocket.Connect(IP, PORT);}catch (Exception e){Debug.LogWarning("无法连接到服务器端,请检查您的网络!!"+e);}}//开始监听private void Start(){//开始接收clientSocket.BeginReceive(msg.Data,msg.StartIndex,msg.RemainSize,SocketFlags.None, ReceiveCallback,null);}//消息的接收private void ReceiveCallback(IAsyncResult ar){try{int count = clientSocket.EndReceive(ar);msg.ReadMessage(count, OnProcessDataCallback);}catch (Exception e){Debug.Log(e);}}private void OnProcessDataCallback(RequestCode requestCode,string data){}//发送请求public void SendRequest(RequestCode requestCode,ActionCode actionCode,string data){//进行数据的打包byte[] bytes = Message.PackData(requestCode,actionCode,data);//进行数据的发送clientSocket.Send(bytes);}public override void OnDestroy(){base.OnDestroy();try{clientSocket.Close();}catch (Exception e){Debug.LogWarning("无法关闭跟服务器端的连接!!" + e);}}}
②Message
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using Common;
using System.Text;
using System.Linq;public class Message {private byte[] data = new byte[1024]; //定义一个数组用来存取数据,数组的长度要保证可以存下所有的消息private int startIndex = 0; //表示存取了多少个字节的数据在数组里面//public void AddCount(int count) //提供一个增加数量的方法//{// startIndex += count;//}public byte[] Data //提供一个返回data数组的方法{get { return data; }}public int StartIndex{get { return startIndex; }}public int RemainSize{get { return data.Length - startIndex; } //剩余的空间}public void ReadMessage(int newDataAmount, Action<RequestCode, string> processDataCallBack) //解析数据{startIndex += newDataAmount;while (true){if (startIndex <= 4)return;int count = BitConverter.ToInt32(data, 0); //获取数据的长度,从索引为0的位置开始读取4个字节if (startIndex - 4 >= count) //前四个字节是数据的长度,如果减去长度大于数据字节长度,则表示数据可以被完整地保存{//string s = Encoding.UTF8.GetString(data,4,count);//Console.WriteLine("解析 :" + s );//Array.Copy(data, count + 4, data, 0, startIndex - 4-count );//startIndex -= (count + 4);//解析RequestCode从4的位置开始解析RequestCode requestCode = (RequestCode)BitConverter.ToInt32(data, 4);//解析ActionCode从8的位置开始解析ActionCode actionCode = (ActionCode)BitConverter.ToInt32(data, 8);//解析数据,从第12个字节开始,数据长度是count-8string s = Encoding.UTF8.GetString(data, 8, count - 4);//解析完成后调用一下回调processDataCallBack(requestCode, s);Array.Copy(data, count + 4, data, 0, startIndex - 4 - count);startIndex -= (count + 4);}else //数据不完整{break;}}}//数据的包装public static byte[] PackData(RequestCode requestCode, ActionCode actionCode,string data){//requestCode的字节数组byte[] requestCodeBytes = BitConverter.GetBytes((int)requestCode);//actionCode的字节数组byte[] actionCodeBytes = BitConverter.GetBytes((int)actionCode);//数据的字节数组byte[] dataBytes = Encoding.UTF8.GetBytes(data);//requestcode、actioncode和数据的长度int dataAmount = requestCodeBytes.Length + dataBytes.Length+ actionCodeBytes.Length;//所有长度的字节数组byte[] dataAmountBytes = BitConverter.GetBytes(dataAmount);//进行组装return dataAmountBytes.Concat(requestCodeBytes).ToArray<byte>().Concat(actionCodeBytes).ToArray<byte>().Concat(dataBytes).ToArray<byte>();}}
3、Request包下
① BaseRequest
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Common;public class BaseRequest : MonoBehaviour {private RequestCode requestCode = RequestCode.None;public virtual void Awake(){}}
4、Scripts下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class GameFacade : MonoBehaviour {private UIManager uiMng;private AudioManager audioMng;private PlayerManager playerMng;private CameraManager cameraMng;private RequestManager requestMng;private ClientManager clientMng;// Use this for initializationvoid Start () {InitManager();}// Update is called once per framevoid Update () {DestroyManager();}//创建和初始化private void InitManager(){uiMng = new UIManager(this);audioMng = new AudioManager(this);playerMng = new PlayerManager(this);cameraMng = new CameraManager(this);requestMng = new RequestManager(this);clientMng = new ClientManager();uiMng.OnInit();audioMng.OnInit();playerMng.OnInit();cameraMng.OnInit();requestMng.OnInit();clientMng.OnInit();}private void DestroyManager(){uiMng.OnDestroy();audioMng.OnDestroy();playerMng.OnDestroy();cameraMng.OnDestroy();requestMng.OnDestroy();clientMng.OnDestroy();}}
注:
游戏客户端架构
2.使用共享项目的文件
①在共享项目上点击鼠标右键“生成”
②在文件资源管理器中打开文件夹
③在目录G:\games\conglin\use socket tcp to develope games\Common\bin\Debug\netstandard1.4下可以看到Common.dll文件
④然后放到所需要引用的地方
⑤
⑥
⑦
3、错误:Plugin targets .NET 4.x and is marked as compatible with Editor,Editor can oly use assemblies targeting .NET 3.5 or lower,please unselect Editor as compatible platform.
原因:.dll版本太高了,unity只支持3.5版本之下的
解决办法:项目的类库应该选择.NET Framework,目标框架改为2.0以下再重新生成
客户端框架的搭建(丛林战争项目)相关推荐
- 项目服务端的创建(丛林战争项目)
1.项目的目录结构图 2.BaseController代码 using System; using System.Collections.Generic; using System.Linq; usi ...
- 丛林战争项目十之数据库查询
1.点击MySqlOperation,点击鼠标右键,设置为启动项目 2.查询一条记录 代码: using System; using System.Collections.Generic; using ...
- 服务器端分层架构(丛林战争项目)
1.Server:用来创建TCP的socket,监听客户端的连接 2.ConnHelper:工具类,用来连接数据库,建立MySQL Connection 3.Controller:用来处理客户端的请求 ...
- 开发登陆按钮(丛林战争项目)
1.在canvas下面创建一个Text,并重命名为LoginButton,设置大小.位置.字体.颜色(白色加透明).对齐方式 2.添加点击时颜色渐变的效果,并设置移动到上面.高亮和点击时候的颜色 3. ...
- 丛林战争项目八之Workbench创建数据库和表
一.数据库连接准备 1.数据库版本MySQL5.7 确保数据库的服务已经启动 2.引入MySql.Data.dll 3.使用c#连接MySQL数据库 4.对数据库进行增删改查 二.在workbench ...
- 解决sql注入问题(丛林战争项目)
一.正常的代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...
- 游戏开发-丛林战争制作2
20.如何解析我们客户端的信息并且交给ControllerManager来进行处理 首先是Message类,参数分别是数据的长度和一个回掉的函数委托,用来重复解析数据,这里的话前四个是数据长度,后面4 ...
- Spring+SpringMVC+Mybatis框架集成搭建教程
一.背景 最近有很多同学由于没有过SSM(Spring+SpringMvc+Mybatis , 以下简称SSM)框架的搭建的经历,所以在自己搭建SSM框架集成的时候,出现了这样或者那样的问题,很是苦恼 ...
- unity网络实战开发(丛林战争)-正式开发阶段(014-游戏客户端与服务器端连接搭建)
使用工具:VS2017,unity3d 使用语言:c# 作者:Gemini_xujian 参考:siki老师-<丛林战争>视频教程 上一篇文章中,我已经把服务器端的框架进行了搭建,接下来, ...
最新文章
- HDU5934(强连通分量)
- BZOJ2584 : [Wc2012]memory
- linux 系统监控脚本
- Rootkit Hunter系统检测工具
- 四叶草社交平台——十天冲刺(7)
- 【Linux 应用编程】进程管理 - 进程、线程和程序
- 兄弟j220怎么清零_兄弟j220怎么清零_兄弟Brother全系列打印机清零大全
- secoclient 主机检查失败_SecoClient在win10系统中连接失败解决方案
- plc控制电机实验报告_PLC控制步进电机实验报告
- ARBITRAR: User-Guided API Misuse Detection
- 短视频平台还能这样赚钱?无需拍视频,每天能赚200多详细流程
- 专访王博,国内资深游戏3D角色美术大神
- maven私服搭建,sonatype nexus
- cad在线转换_超强在线转换工具,打开就能转换
- GRE 写作经常用到的修辞手法
- python中sorted函数的用法及字典如何根据键或值进行排序
- python职位应聘_我去面试Python岗位了
- C Primer Plus 第4章(字符串和格式化输入输出)
- 对象、类及从属关系举例
- 老友记台词学习笔记 SE01EP05(一)
热门文章
- 嵌入式linux usb wifi驱动移植
- 检索大写字母 c语言,c语言梦工厂梅丽题目含答案.docx
- 推荐一本初学C++的书
- (转载)图灵测试,测的到底是什么?
- SVN客户端安装配置和使用(windows)
- 献给年轻人少走弯路的10大忠告
- 如何找到spring的官方文档位置
- 回归预测 | MATLAB实现GWO-BiLSTM灰狼算法优化双向长短期记忆神经网络多输入单输出回归预测
- Linux安装Mycat1.6.7.6实现Mysql数据库读写分离
- 啸叫抑制原理简介和软件SDK解决办法