一、创建一个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. 项目服务端的创建(丛林战争项目)

    1.项目的目录结构图 2.BaseController代码 using System; using System.Collections.Generic; using System.Linq; usi ...

  2. 丛林战争项目十之数据库查询

    1.点击MySqlOperation,点击鼠标右键,设置为启动项目 2.查询一条记录 代码: using System; using System.Collections.Generic; using ...

  3. 服务器端分层架构(丛林战争项目)

    1.Server:用来创建TCP的socket,监听客户端的连接 2.ConnHelper:工具类,用来连接数据库,建立MySQL Connection 3.Controller:用来处理客户端的请求 ...

  4. 开发登陆按钮(丛林战争项目)

    1.在canvas下面创建一个Text,并重命名为LoginButton,设置大小.位置.字体.颜色(白色加透明).对齐方式 2.添加点击时颜色渐变的效果,并设置移动到上面.高亮和点击时候的颜色 3. ...

  5. 丛林战争项目八之Workbench创建数据库和表

    一.数据库连接准备 1.数据库版本MySQL5.7 确保数据库的服务已经启动 2.引入MySql.Data.dll 3.使用c#连接MySQL数据库 4.对数据库进行增删改查 二.在workbench ...

  6. 解决sql注入问题(丛林战争项目)

    一.正常的代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...

  7. 游戏开发-丛林战争制作2

    20.如何解析我们客户端的信息并且交给ControllerManager来进行处理 首先是Message类,参数分别是数据的长度和一个回掉的函数委托,用来重复解析数据,这里的话前四个是数据长度,后面4 ...

  8. Spring+SpringMVC+Mybatis框架集成搭建教程

    一.背景 最近有很多同学由于没有过SSM(Spring+SpringMvc+Mybatis , 以下简称SSM)框架的搭建的经历,所以在自己搭建SSM框架集成的时候,出现了这样或者那样的问题,很是苦恼 ...

  9. unity网络实战开发(丛林战争)-正式开发阶段(014-游戏客户端与服务器端连接搭建)

    使用工具:VS2017,unity3d 使用语言:c# 作者:Gemini_xujian 参考:siki老师-<丛林战争>视频教程 上一篇文章中,我已经把服务器端的框架进行了搭建,接下来, ...

最新文章

  1. HDU5934(强连通分量)
  2. BZOJ2584 : [Wc2012]memory
  3. linux 系统监控脚本
  4. Rootkit Hunter系统检测工具
  5. 四叶草社交平台——十天冲刺(7)
  6. 【Linux 应用编程】进程管理 - 进程、线程和程序
  7. 兄弟j220怎么清零_兄弟j220怎么清零_兄弟Brother全系列打印机清零大全
  8. secoclient 主机检查失败_SecoClient在win10系统中连接失败解决方案
  9. plc控制电机实验报告_PLC控制步进电机实验报告
  10. ARBITRAR: User-Guided API Misuse Detection
  11. 短视频平台还能这样赚钱?无需拍视频,每天能赚200多详细流程
  12. 专访王博,国内资深游戏3D角色美术大神
  13. maven私服搭建,sonatype nexus
  14. cad在线转换_超强在线转换工具,打开就能转换
  15. GRE 写作经常用到的修辞手法
  16. python中sorted函数的用法及字典如何根据键或值进行排序
  17. python职位应聘_我去面试Python岗位了
  18. C Primer Plus 第4章(字符串和格式化输入输出)
  19. 对象、类及从属关系举例
  20. 老友记台词学习笔记 SE01EP05(一)

热门文章

  1. 嵌入式linux usb wifi驱动移植
  2. 检索大写字母 c语言,c语言梦工厂梅丽题目含答案.docx
  3. 推荐一本初学C++的书
  4. (转载)图灵测试,测的到底是什么?
  5. SVN客户端安装配置和使用(windows)
  6. 献给年轻人少走弯路的10大忠告
  7. 如何找到spring的官方文档位置
  8. 回归预测 | MATLAB实现GWO-BiLSTM灰狼算法优化双向长短期记忆神经网络多输入单输出回归预测
  9. Linux安装Mycat1.6.7.6实现Mysql数据库读写分离
  10. 啸叫抑制原理简介和软件SDK解决办法