unity3d 模块封装_unity 事件模块封装 - CSDN
  • 介绍Socket网络连接模块: 主要分为四部分: 一、套接字管理器(SocketManager.cs) 1)、连接 2)、断开 3)、接收(线程) 4)、发送(携程) 二、消息中心:(MessageCenter.cs) 1)、游戏逻辑事件 2)、网络数据事件...

    Socket网络连接模块

    主要分为四部分:

    一、套接字管理器(SocketManager.cs)

    1)、连接



    2)、断开


    3)、接收(线程)


    4)、发送(携程)

    1.发送消息基本方法

    2.二进制方式发送

            

    3.protobuf方式发送

            


    二、消息中心:(MessageCenter.cs)

    1)游戏逻辑事件
    a.事件缓存:
    1.事件类型对应的数据缓存队列:_gameLogicDataQueue
    2.事件类型对应的执行函数:_gameLogic_EventList
    b.相关函数:
    1.添加事件监听:AddEventListener(eGameLogicEventType _eventType, Callback_GameLogic_Handle _callback)2.移除事件监听:RemoveEventListener(eGameLogicEventType _eventType, Callback_GameLogic_Handle _callback)
    3.推送、触发事件:PostEvent(eGameLogicEventType _eventType, object data = null)

    2)、网络数据事件(线程)
    a.事件缓存:
    1.事件类型对应的数据缓存队列:_netMessageDataQueue
    2.事件类型对应的执行函数:_netMessage_EventList
    b.相关函数:
    1.添加事件监听:addObsever(eProtocalType _protocalType, Callback_NetMessage_Handle _callback)
    2.移除事件监听:removeObserver(eProtocalType _protocalType, Callback_NetMessage_Handle _callback)
    3)、运行流程
    a.创建单例:MessageCenter.Instance
    b.循环检测:

    三、数据封装:

    1)网络数据缓冲器(DataBuff.cs)自动Size

    a.参数定义:



    2.添加数据到缓存中


    3.从缓存中取出一条完整数据


    2)、二进制字节流(ByteStreamBuff.cs)
    在和服务器做数据交互的时候,最终要把数据转化成byte[],传给服务器。
    如:

    要将这些数据传给服务器,怎么变成byte[]数组呢?这里就要做一个数据封装。所有数据都是可以变成byte或byte[]来表示,要做的其实就是把这些数据拼成一个byte[]。

    一般都是,顺序存,顺序取。

    如:
    写入:

    读取:


    这里已经对SendMsg做的重载,故直接传入,ByteStreamBuff或者,protobuf数据即可,SocketManager在发送前会转换为Byte[],再发送出去。

    很多对数据的二进制封装的方法都是用byte[] 来做缓存媒介,所以在没事new 的时候,都要先给这个数据封装器,定一个大小,为了省事,所以这里用Stream作用缓存媒介。还有就是在封装器中有一个flip()函数,这里要再说一下,就是系统的大小端问题,如果前端是大端系统,后端是小端系统在数据交互的时候就会出问题了。细节就不解释了,百度(系统大小端)就可以了,不难理解的。

    3)、谷歌ProtoBuffer序列化

    a.现在手游这个用的很火。方便快捷,压缩效率也要。主要就是两个函数,序列化,反序列化。这个两方法封闭在SocketManager.cs中。

    b.序列化


    c.反序列化



    四、简单流程图


    五、总结
    1.框架中只有接收数据的时候是在线程中,有高人建议我把发送数据也放到线程中,这个回头我再试试。
    2.流程还算是比较清晰,如果有不明白的地方,可留言。或(QQ:8321884)
    3.建议读者多看几遍流程书。好理解。

    希望转载的朋友连接一下本文URL!!!!!!!!!!!!!!!!!!!!!!!!


    点击下载项目工程




    展开全文
  • 之前总感觉会封装dll组件的都是大牛级别的程序员做的事情,然后供给菜鸟级别的调用。感觉为了保护自己的源码不会被他人知道,然后就封装一...首先要申明的是,unity3d支持C#语言,但只有pro版本才支持.net2.0,其他版本

    之前总感觉会封装dll组件的都是大牛级别的程序员做的事情,然后供给菜鸟级别的调用。感觉为了保护自己的源码不会被他人知道,然后就封装一个dll供人家调用,那样就觉得很牛,今天我也尝试摸索了一下,感觉也就那么回事,但只是简单的测试而已,其实会写封装的,封装的好的还是很牛的,哈哈,那让我们也来假装“牛”一次吧!

    首先要申明的是,unity3d支持C#语言,但只有pro版本才支持.net2.0,其他版本是不支持的,但也只有pc平台才支持,切记

    操作步骤:

    1.封装dll

    打开vs2010,新建项目,选择类库,然后命名(这里的命名就是你封装的dll的名字),下面我就简单的封装一个方法,只做为演示,这样你就可以封装更多更好的属于自己“私有”的方法,这里私有是有局限性的,因为有反编译工具能查看到你编译的源码的,下面我就演示一下一个神器,.net的反编译工具(.NET Reflector)。

    我先在vs中创建一个类,就一个简单的静态方法和静态类:

    namespace dingxiaowei
    {
        public static class dxw
        {
            public static string showName(string name)
            {
                return name;
            }
        }
    }
    然后进行编译,编译成的dll,名字为dingxiaowei.dll,然后我们将这个dll文件拖到反编译器,我们看一下反编译出来的是啥?

    类:,反编译能看到dxw类中的一些方法。

    点击方法,就能看到具体方法的实现:


    2.在unity中使用自定义的dll组件

    在unity中创建一个Plugins文件夹,所有的外部引用的dll组件必须要放在这个文件下,才能被using。如果是C#封装的dll,就用using的方式引用,如果是C++的dll,就DllImport["dxw.dll"]的方式来添加对dll的引用。然后我在C#脚本中用这个dll,

    运行结果:看到能够正确输出了!



    ==================== 迂者 丁小未 CSDN博客专栏=================

    MyBlog:http://blog.csdn.net/dingxiaowei2013             MyQQ:1213250243

    Unity QQ群:858550         cocos2dx QQ群:280818155

    ====================== 相互学习,共同进步 ===================

    转载请注明出处:http://blog.csdn.net/dingxiaowei2013/article/details/17126839

    欢迎关注我的微博:http://weibo.com/u/2590571922
    展开全文
  • Unity3D-HTTP网络层封装

    2015-03-10 09:17:02
    Unity3D-HTTP网络层封装。短连接的C#封装在这里做些分享。我把网络层封装成DLL在项目中使用,所以在设计时要将接口封装的很好。 我又对HTTP部分进行了改造不再使用DDL封装了(所以去除文章部分暂时用横线做标记),...

    转载出处:http://www.luzexi.com

    Unity3D-HTTP网络层封装。短连接的C#封装在这里做些分享。我把网络层封装成DLL在项目中使用,所以在设计时要将接口封装的很好。 我又对HTTP部分进行了改造不再使用DDL封装了(所以去除文章部分暂时用横线做标记),所有源码都以git的submodule形式作为项目的模块。源码会再文章的最后给出来。这次改装主要是针对程序员是否能快速理解,快速上手的方面来进行的。随着对HTTP网络层不断的理解加深,我将给出更加全面的HTTP源码模块,我还对本HTTP模块写了测试案例,你们可以看测试案例,进行使用。谢谢各位的关注,再次感谢不断得支持。

    一.首先说下网络层需要的一些接口,在游戏里需要用到的网络层都具有大部分的共同点,无论是TCP长连接还是HTTP短连接有部分区别,HTTP的网络事件要相对少一点。

    HTTP接口基本为:数据发送Send接口,网络错误事件,数据包回调执行句柄。HTTP网络层的数据包预发送接口被我去除,因为我回想,这个功能完全可以用模块外部的程序代替,而且可以针对每个界面来写,这样更加清晰,而且主要是这个功能障碍了程序员对程序的理解。

    二.说明下网络层中几个类的用途和作用。 HTTPSession类,是整个网络层的主类,承载了发送,接受,事件相应的事务。

    HTTPPacketRequest类,网络请求数据包基础类。每个请求数据包的最基础的数据,包含一个m_strAction地址变量,这个是因为每个HTTP请求的地址不同而设的变量,每个请求地址前缀都相同比如:http://luzexi.com/ ,而后缀有可能变化,比如author/regist/。所以这个变量要在你创建的时候在构建函数里进行设置。

    HTTPPacketAck类,网络回调数据包基础类。每个回调数据包的基础数据,每个数据包都含有几个基础的变量,我现在写的是code错误码 和 desc错误描述,你也可以改成其他你想要的,如果你理解整这段程序。总之,继承这个回调数据类的类中可以放置本次回调的数据,有数据回调时,系统将自动解析成这个类。

    HTTPSession类,会话类是网络层的主类,有发送接口和网络主地址,还有一个报错接口。是整个HTTP网络层的接入口。

    HttpDummySession类,我还做了虚拟会话,主要是给HTTP和单机切换用,有些游戏想做网络和单机一起兼顾,可以用HTTP虚拟类来实现,不需要改原来写好的HTTP请求,只要你对加个请求句柄处理就可以了。不过一般人不会用到。

    三.网络层最重要的是能够快速,方便使用,能够适应变化多端的需求改变。

    每个请求类(HTTPPacketRequest子类)和回调类(HTTPPacketAck子类)都是自动生成参数和自动映射回调类实例的,但千万记住,回调过来的数据和HTTPPacketAck子类里的变量名必须一致。

    四.关于HTTP的Head数据部分

    HEAD部分我已经写好了,但是一个统一的HEAD变量,在session类中你可以找到。因为head部分都是统一的参数变量,动的比较少,所以才这么做。在游戏项目里,可以用HEAD部分的数据也可以不用,因为完全可以用数据包的形式代替。

     

    最后奉上源码:Unity3D-HTTP    测试案例:Unity3D-HTTP-Test


    展开全文
  • 转载自:http://www.luzexi.com/unity3d/游戏通用模块/前端技术/2014/04/16/Unity3D之AssetBundle资源加载封装/ Unity3D之AssetBundle资源加载封装。在《临兵斗者三国志》中我使用了U3D的AssetBundle资源动态加载...

    转载自:http://www.luzexi.com/unity3d/游戏通用模块/前端技术/2014/04/16/Unity3D之AssetBundle资源加载封装/

    GitHub:https://github.com/luzexi

    Unity3D之AssetBundle资源加载封装。在《临兵斗者三国志》中我使用了U3D的AssetBundle资源动态加载机制,原因是某些画面资源太多,IO阻塞过慢会造成游戏奔溃。在开发过程中,遇到点问题:

    1.当资源更改变化时,如何能快速得反应到开发中。

    解决方案:

    我使用宏定义UNITY_EDITOR来判断是否是开发编辑状态。当处于开发编辑状态时,自动读取指定目录下U3D本身资源,而不使用AssetBundle。这样就达到了当prefb变化时能快速反应到开发编辑中。而当不是处于编辑状态时,则正常使用异步加载读取AssetBundle。这个方式唯一的毛病就是,必须让所有U3D程序员都非常清除明白,如果写错,编辑模式下会没问题,发布后会出问题,所以需要检查。

    2.当不同资源之间有重复的资源时如何将AssetBundle空间占有量最小化。

    解决方案:

    GUI资源之间有特别多的重复的问题,挑出几个重复得特别厉害的,比如ICON图集,公用图集。在打包期间把他们设为共享资源,并在加载时首先加载共享资源,这样既节省了AssetBundle空间占有量,也节省了内存。这个方式的毛病是当你将资源更改要打包某个资源时,需要将所有与共享有关的资源重新打包一遍。

    3.如何应对自动释放资源问题。

    解决方案:

    在游戏中有指定资源释放和自动释放所有AssetBundle资源以销毁内存(这里不是指销毁U3D内存,而是AssetBundle内存,U3D内存管理分图片内存,AssetBundle内存,编译程序)。销毁指定资源就按正常来没有争议。销毁所有资源就要有点措施了,因为有些资源是不能被销毁的,因为它们是共享资源,需要全程跟着游戏走,所以当自动销毁所有资源时,将共享资源排除在外。并且在销毁后调用Resources.UnloadUnusedAssets();和GC.Collect();

    4.打包AssetBundle方式。

    解决方案:

    打包AssetBundle方式有几种:1.单资源打包,也就是说一个.prefb或Texture打一个包。2.多个资源打包,将某些资源都打成一个AssetBundle,节省了几个资源包之间的共享资源也减小了多个AssetBundle引起的空间扩大问题。但并不是说所有项目都是多个资源打成一个AssetBundle是好的。《临兵斗者三国志》就是一大部分使用单一打包,而共享资源使用多个资源打成一个AssetBundle的方式。

    最后奉上本人对AssetBundle封装的源码。https://github.com/luzexi/Unity3DGameResource

    你也可以去我的github上查看找我做的一些源码插件,如果喜欢的话可以star或者fllow。

    转发请注明出自:http://www.luzexi.com


    展开全文
  •  为了更好地理解游戏的软件架构和对象模型,它获得更好的外观仅有一名Unity3D的游戏引擎和编辑器是非常有用的,它的主要原则。 Unity3D 引擎  Unity3D的是一个屡获殊荣的工具,用于创建交互式3D应用程序在多个...
  • Unity3d中提供了场景Scene的概念,Scene就是一组...Unity3d提供了一些切换场景的规则和方法(例如在切换场景时不销毁某些GameObject,同步,异步加载场景API),但是并没有提供一个通用的场景管理的模块(想要做到“通
  •  Unity3D的是一个屡获殊荣的工具,用于创建交互式3D应用程序在多个platforms.Unity3D由游戏引擎和编辑器。该引擎包含的软件组件,在游戏的研究与开发中最常见的和经常性的任务。发动机所涵盖的主题包括声音,图
  • Unity 音效模块(二)

    2020-03-16 12:00:27
    Unity3D 音效模块(二) 前言 解决了 音效模块一 的缺点(只有一个播放器audiosource) 利用有限个播放器(audiosource)管理无限个音效片段(clip) 基本思路 代码实现 注释: 从设计思路考虑 首先实现简单的...
  • 首先说一下生成dll文件的必要性:给第三方公司提供Unity插件,又不希望对方看到具体的实现过程,这时候就需要将核心代码封装编译成dll文件,供第三方调用。或是多个项目都要用到同一个模块或同样的功能,则可以把该...
  • WinForm内嵌Unity3D

    2018-08-06 13:32:22
    Unity3D可以C#脚本进行开,使用vstu2013.msi插件,可以实现在VS2013中的调试。在开发完成后,由于项目需要,需要将Unity3D嵌入到WinForm中。WinForm中的UnityWebPlayer Control可以载入Unity3D。先看效果图。   ...
  • using UnityEngine; using UnityEditor; using System.Collections;... [MenuItem("Assets/将资源导出成.unity3d文件")] static void ExportToUnity3d(){ if(Selection.objects.Length>0) { s
  •  Unity3D的是一个屡获殊荣的工具,用于创建交互式3D应用程序在多个platforms.Unity3D由游戏引擎和编辑器。该引擎包含的软件组件,在游戏的研究与开发中最常见的和经常性的任务。发动机所涵盖的主题包括
  • Unity3D】自学之路2.0

    2020-04-07 08:40:42
    一、前言 原文主要讲的是如何从零基础入门,然后一步一步进阶的文章,包括很多学习资料,学习的网址,研究方向等,内容还是比较全面的。大家多多支持一些克森大神,关注一下他的公众号。这篇文章就将原文的内容...
  • 在前面的文章中写过如何搭建SignalR服务端和客户端,也写过如何将Unity3D应用嵌入到WPF中,问题是SignalR服务端和WPF客户端实时通信很简单,SignalR服务端怎么与Unity3D应用实时传输数据呢?下面就开始讨论了。 ...
  • 体系结构 ... 为了更好地理解游戏的软件架构和对象模型,它获得更好的外观仅有一名Unity3D的游戏引擎和编辑器是非常有用的,它的主要原则。 Unity3D 引擎 Unity3D的是一个屡获殊荣的工具,...
  • 好多开发者提到,苦于很难在unity3d下实现RTMP直播推送,本次以大牛直播SDK(Github)的Windows平台RTMP推送模块(以推摄像头为例,如需推屏幕数据,设置相关参数即可)为例,介绍下unity3d的RTMP推送集成。...
  • 在游戏开发过程中,除了逻辑功能的...该游戏客户端采用Unity3D开发,那么我们这里抽取的基础组件也就是针对Unity3D引擎来的。简单的梳理之后,我发现主要有以下一些模块,可以独立抽取出来,当然各个模块之间也有一个
  • 目前,Unity3D应用范围非常广泛,从手机游戏到联网的大型游戏,从严肃游戏到电子商务,再到VR虚拟现实均可完美呈现。Unity3D是一软专业3D游戏引攀,其具备跨平台发布、离效能优化、高性价比,AAA级游戏画面演染效果...
1 2 3 4 5 ... 20
收藏数 2,015
精华内容 806
关键字:

unity3d 模块封装