原标题:[专栏作家]基于ILRuntime的完整C#热更方案
好久不见。最近一段时间公司二次创业,实在是忙的脚打后脑勺,有段时间没来跟大家分享心得了,昨天终于有了一个初步的完结,也终于有时间和精力跟大家分享一下最近的收获了。
公司二次创业的方向是幼儿教育,由于公司是做游戏出身,除了Unity别的不会(汗),所以为了快速出原型出去骗钱(雾),我们还是拿Unity来做开发的,这样有一个严峻的问题就摆在了我们面前, 之前做游戏,iOS不热更还能忍,毕竟我们也不是经常加新功能,有新功能了或者有什么重大bug提交苹果审核那几天也不是完全不能忍受。但换到教育领域就不一样了,课件热更简直就成了生死关口,我们设想中的课件还不是简单的几张图,几张ppt,几场动画,而是孩子可以动手操作,老师还可以远端演示,甚至辅助的。
于是经过一个月左右的潜心探索,比较和研究,对比了某某lua们、IronPython,PythonNet和ILRuntime等多个热更方案,最终还是选择了能原汁原味(少许限制)使用C#进行开发然后进行热更的ILRuntime方案。
先简单说说lua和python的各个方案,lua的方案其实成熟度还是比较高的,已经有很多成功项目在用,但是作为一个C/C++出身,热爱C#的新时代静态语言爱好者,直接切换到一门动态语言还是有点儿困难的,所以暂时调通,然后搁置备用;Python的两个方案都是经过了一周左右的奋战,最终都倒在了iOS的IL2CPP编译上,始终无法正常跑起来,所以无奈放弃了。
最后看到从xLua和L#相关的一些帖子里看到了ILRuntime,看简介如果能正常跑起来的话,做东西应该是最快最爽的, 所以尝试了一下,经过一段时间的踩坑,最终用不到一周的时间完成了十几个功能不是很复杂, 但是形式各种各样的课件的制作,并且经过测试效率以及效果都很不错。
废话说了这么多,先把项目地址发给大家,大家有兴趣的可以试用一下。
https://github.com/yukuyoulei/ILRuntime_HotGames
用法还是挺简单的,Unity项目的Plugins中就是ILRuntime,没有特殊情况可以不用动这里,s/Enter类是入口类,项目中打AssetBundle包的工具类我也放好了大家可以直接用。
注意,我们将只会在Unity主工程中添加资源和预设,不会修改Github主工程中一行代码,所有的代码都将在AHotGames热更项目中添加和实现。
那么好,如果大家现在还没有将Github上的项目check下来,我可以给大家一些时间将项目下载下来。
好,相信大家现在已经把项目check下来了,现在一起打开2017及以上版本的Unity,我也打开我的Unity2018,大家现在看到Unity的启动界面,需要登录的就登录,不需要登录的就显示Loading,然后出现了你之前打开过的项目的列表,点击右上角的Open按钮,打开下载下来的项目中的UHotGames项目。
这个项目中现在什么都没有,只有三个没什么卵用的Scene,以及一大堆莫名其妙的代码,所以加载起来应该是很快的,我打这些字的同时大家的项目应该就已经加载好了。
好,现在项目打开了,在Project视图中,找到Scene文件夹,双击里面的Main场景。
单击Main Camera,双击右边Inspector视图中的Enter脚本(右边被一个小框框住的Enter),那么现在你的VS2017将被调起,如果没有的话,请关闭本页面。
VS2017启动起来后,你可以看到Start方法里有一群排成“人”字拖(划掉)的代码,这里就是下载并调用ILRuntime来加载我们的热更代码的部分了,这里我们将永远不会修改它们,请大家截图保存现有的代码,欢迎大家的监督。
好,接下来是一个匪夷所思的操作,请大家跟我一起按一下F6或者Ctrl+B,让VS左下角显示“已启动生成”然后显示“生成成功”。别问我为什么,问我我就会告诉你。
下面回到我们可爱的黑色或者白色的Unity,我们将建立一个小小的UI界面,然后在这个小UI界面上完成一些伟大的事情。
在GameObject/UI菜单栏里,点击Text,添加一个Text,左边的Hierarchy视图将会变成下图这样:
▷Main Camera
▽Canvas
Text
假装上面是一张图片吧啊,那个向下的三角还挺不好找……
把那个Canvas选中,然后拖放到的Project视图的RemoteResources里面去,这样我们就得到了一个叫Canvas的预设,如果你觉得Canvas这个预设名字不吉利,可以给他改成FirstUI这么一个好听的名字,不建议把预设名字命名为中文,因为毕竟老外的软件,有的时候真的是会出现一些神级bug。
删除掉Hierarchy视图中没用了的Canvas,保持里面只有一个Main Camera。
好了,现在我们的第一个用户界面(FirstUI)就有了,备用。
接下来到了最激动人心的写代码的环节。
双击打开AHotGames目录里的AHotGames.sln解决方案,如果这时没有弹出VS2017,你知道你需要怎么做。
打开以后,解决方案管理器视图中,最下面的utils目录中是一些辅助工具类,有需要的时候会用到,大家有什么好的工具类也可以扔这里。
上面的games目录中就是我们的游戏类了,games目录下的aempty目录是AGameBase这个基类的所在地,这个基类没有特殊情况也不需要动它,AEmptyGame类是一个模版类,我一般新加一个游戏类时,就将它复制出这个aempty目录到games目录下(选中它按住Ctrl别撒手,然后拖它到games目录上可以完成这个操作),然后把复制出来的这个类的文件名和类名改成新的游戏类的名字就可以开始写功能了,这里我们将它重命名为FirstUI(不强行要求和预设名字一致,建议一致,原因是互相好对应,出问题了好找)。
单击打开这个类,现在里面只有股孤单的那的一个InitComponents方法,没错,这里我们开天辟地的地方,接下来是最最激动人心的环节了!
var Text = FindWidget("Text");
Text.text = "Hello ILRuntime and FS";
将上面两行代码复制到这个方法里。
然后,最最最激动人心的环节!到!来!了!
把AEntrance类的InitComponents中的所有代码全部删掉,替换成下面这段代码:
LoadAnotherClass("FirstUI", "FirstUI.prefab");
好,F6或者Ctrl+B,编译这个项目,左下角显示“生成成功”后,切回Unity
由于我已经加入了生成事件,VS会将生成到Unity项目的RemoteResources/Dll目录下的dll的扩展名修改为bytes,所以Unity只会将它作为文本文件load一下,并不会进行编译。
接下来,见证奇迹的时!刻!
点击运行Unity,咦,好像什么都没发生?? 别着急,因为要去我的美国小水管云服务器下载资源列表进行比对,所以有些慢。
好了,屏幕正中央打印出了一行大字!
PS:编辑器模式下会加载本地目录下的dll及预设,方便测试,打包出来用的话,需要运行MyTools/打包工具 中 “Build AssetBundles”命令,将RemoteResources目录下的所有资源打包成ab,上传至服务器,项目中的Config.txt也要上传到你自己的服务器,修改里面resources=后面指向的路径,修改Unity工程的Enter类中的ConfigURL指向服务器上的Config.txt的路径即可。 返回搜狐,查看更多
责任编辑: