内存信息获取
PC平台内存获取我们通过C#的System.Runtime.InteropServices,通过kernel32.dll来获取内存信息
与非托管代码进行交互操作 - .NET Framework | Microsoft Learn
Profiling.Profiler - Unity 脚本 API
UnityEngine.Profiling.Profiler提供的一些函数在运行时调用是不会降低性能的。
修改PlatMsgManager,在里面添加一些函数和const变量,并修改GetLongFromPlatform函数
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566using System.Runtime.InteropServices;//... public const int UNITY_GET_LONG_AVAILABLEMEMORY = 1;//可用内存 public co ...
Unity平台接入管理
因为手机游戏需要接入的平台又多又杂,所以我们在Unity内部写一个平台管理类,方便统一调用。
Unity调用安卓Unity调用安卓一般使用AndroidJavaClass这个类,直接调用安卓中声明好的GameHelper类,并且Unity调用的一般都是GameHelper类里面的静态方法。
Unity - Scripting API: AndroidJavaClass
PlatMsgManager在Assets——Scripts——Manager文件夹内新建PlatMsgManager
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012 ...
前期准备
为了更方便地进行安卓SDK的接入,我们需要Android Studio进行Java环境的开发。
JDK1.8由于Unity本身的安卓打包就是基于Open JDK 1.8的,所以我们需要安装Java8
Java Downloads | Oracle 中国
在上面的页面找到Java SE Development Kit,并选中Windows选项卡,下载jdk-8u381-windows-x64.exe(可能版本不同,差不多即可)。下载完成后安装,选择开发工具,之后默认安装即可。
Oracle强制要求注册登录并同意协议才能下载jdk,这里贴出一个现成的jdk安装JDK 1.8.0_181 : Oracle(已上传到百度网盘)
安装完成后,会自动配置环境变量。我们在Windows任务栏图标右键——点击系统——在打开的页面点击“高级系统设置”——点击“环境变量”——在打开的页面中找到“系统变量”——双击里面的“Path”一栏——可以看到C:\Program Files (x86)\Common Files\Oracle\Java\javapath
如果有多个JDK,需要自己修改Path,详见 ...
protobuf的使用
ProtoBuf的使用有两种方式,一种是以.proto文件中转的方式,另一种是使用“protobuf-net”的方式,这里介绍第二种
获取Protobuf-netGitHub - protobuf-net/protobuf-net: Protocol Buffers library for idiomatic .NET
首先在Visual Studio里面点击“工具——NuGet包管理器——管理解决方案的NuGet程序包”。
在打开的窗口中选择“浏览”标签页。输入“protobuf-net”点击搜索。点击protobuf-net,在右侧点击项目,选择最新稳定版并安装。
此时又会弹出一个窗口,要求添加新的引用,点击确定。
注意:在Unity主工程中,可能会打不开“管理解决方案的NuGet程序包”窗口,我们可以在HotFix工程中打开此窗口并安装protobuf-net,但是要注意,安装后,我们在右侧的“解决方案资源管理器——引用”中,删除protobuf-net.dll、protobuf-net.Core.dll、System.Buffers.dll、System.Coll ...
Jenkins热更打包
在使用Jenkins打包之前,我们需要将目前的工程进行一些准备。
上传SVN将工程文件上传SVN。使用SVN——Commit。
注意:这里我们直接使用SVN——Commit,不要先使用SVN——Update,因为我们之前修改了框架内部的文件。在Commit的时候,注意将missing的文件也上传上去,并且把Assets文件夹内新添加的许多文件上传上去。
测试AB包加载上传SVN后,我们先打一个AB包,然后在主工程AssetBundle文件夹中将内部的AB包放到C盘的C:\Users\zerwa\AppData\LocalLow\DefaultCompany\ResLoadPrg\Origin文件夹,这是因为我们在安卓环境下,AB包都是从这个目录加载的。如果不是安卓环境,需要把AB包放在StreamingAssets文件夹。
然后修改ResourceManager的m_LoadFromAssetBundle为true,进行测试
Jenkins修改配置想要让Jenkins打热更包,需要修改之前的打包配置,这里以安卓打包为例,其他平台打包也是一样地修改
进入localhost:8080,点击 ...
WindowBase适配器
在ILRuntime里,使用Appdomain.Invoke方法时,最后一个传入参数的地方不能传入参数数组(params object[])。所以我们要修改UI框架的传参方式
修改框架修改UIManager123public WindowBase CreateWindow(string wndName,bool bTop = true,bool isFromResFolder = false,object param1 = null,object param2 = null,object param3 = null);public void EnableWnd(string wndName,bool bTop = true, object param1 = null, object param2 = null, object param3 = null);public void EnableWnd(WindowBase wnd,bool bTop = true, object param1 = null, object param2 = null, object param3 = nu ...
UI热更准备
UI是热更代码常应用到的地方之一。
我们在之前UIManager中将UI分离成了Panel、WindowBase、UIManager,其中的WindowBase负责了单个UI窗口的整个逻辑,是很适合热更的。
如果想要热更,我们首先要改变UI注册逻辑,在之前,我们在GameStart过程中注册了各个WindowBase
123456789/// <summary> /// 注册UI窗口 /// </summary> void RegisterUI() { UIManager.Instance.Register<MenuWnd>(ConstantStr.MENUPANEL); UIManager.Instance.Register<LoadingWnd>(ConstantStr.LOADINGPANEL); UIManager.Instance.Register<HotFixWnd>(ConstantStr.HOTFIXPANEL); }
如果想要热更, ...
ILRuntime补充
ILRuntime详尽解释https://zhuanlan.zhihu.com/p/260216935
XIL像使用Xlua一样使用ILRuntime
wuxiongbin/XIL: 使用ILRuntime实现的类似XLUA功能的Unity3D下热修复BUG的解决方案 (github.com)
zstring零GC字符串,防止使用ILRuntime创建字符串产生大量GC
GitHub - 871041532/zstring: C# string零GC补充方案
MonoBehaviour适配器
注意
尽量不要在热更工程中使用继承MonoBehavior的类,MonoBehaviour需要适配大量的方法,而有些方法可能需要其他关于Unity底层的适配,非常复杂。
本节只展示基本的和可能会常用到的MonoBehaviour方法适配,如Awake、Update等
MonoBehaviour适配器123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110using ILRuntime.CLR.Method;using ILRuntime.Runtime.Enviorment;using ILRuntime.Runtime.Intepreter;using System.Collections;using ...
协程适配器
在ILRuntime中可能会需要继承协程,所以我们需要自己写一个协程适配器。
在ILRuntime文件夹内新建一个Adaptor文件夹,并在其中新建CoroutineAdaptor
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133using ILRuntime.CLR.Method;using ILRuntime.Runtime.Enviorment;using ILRuntime.Runtime.Intepreter;using System.Collecti ...