开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:1675

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 1512|回复: 23

[东方喵] 【UnityHotUpdate】(一)利用C#的反射动态加载程序集

[复制链接]  [移动端链接]
排名
1482
昨日变化

25

主题

767

帖子

2379

积分

Rank: 9Rank: 9Rank: 9

UID
76248
好友
15
蛮牛币
15172
威望
0
注册时间
2015-2-28
在线时间
629 小时
最后登录
2017-4-27

专栏作家蛮牛译员活力之星七夕浪漫情人一掷千金

发表于 2017-4-12 15:04:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 东方喵 于 2017-4-12 15:06 编辑

利用C#的反射动态加载程序集
注意:此方案不适用于IOS,一者,2017/3/8苹果官方正式禁止使用任何热更新技术,即禁止绕过苹果审核的更新;二者,先前苹果允许使用lua/js等脚本动态更新时,这种动态加载链接库的热更新方式也是被禁止的。

——何为热更新?
热更新即为在用户不关闭程序的前提下动态的更新代码和资源。

——为何热更新?
如果不使用热更新,则每次更新时,用户都必须下载完整客户端,为了减少更新时需要下载文件的大小,我们使用热更新。

热更新方案有很多,第一篇讲一下虽不通用,但最简单的反射动态加载程序集的方案。
在此,我就用本地加载的方式模拟一下作为示例,网络下载与之类似;
首先,在Visual Studio中新建一个项目,作为类库。
000.png
然后,添加引用。
001.png
添加我们需要引用的类库。
002.png
稍微搓一
点儿测试代码。
003.png
生成dll文件,此时已经可以在Debug文件夹下找到我们生成的动态链接库dll了。
004.png
打开unity:
1.将我们的dll文件导入工程,并把文件名后缀改为“.bytes”;
2.将
.bytes文件打为AB包(注意打包目标平台),创建并将AB包放到StreamingAssets目录下,删除原“.bytes"文件;
3.
新建一个场景,创建一个UGUI的Text;
4.最后创建一个简单的加载脚本。
[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;
public class xxx : MonoBehaviour {
    byte[] bytes;
        void Start () {
        StartCoroutine(loadScript());
    }
    IEnumerator loadScript()
    {
        WWW www = new WWW("file://"+Application.streamingAssetsPath+"/test.unity3d");
        yield return www;
        AssetBundle bundle = www.assetBundle;
        TextAsset asset = bundle.LoadAsset("test", typeof(TextAsset)) as TextAsset;
        //C#反射取出程序集  
        System.Reflection.Assembly assembly = System.Reflection.Assembly.Load(asset.bytes);
        //加载程序集中的脚本test.cs  
        gameObject.AddComponent(assembly.GetType("test"));
    }
}


将此脚本挂在text上。
005.png

运行效果如下,成功在运行时将www下来的AB包解压出来,作为TextAsset,然后用反射出其程序集。
006.png

ps:在安卓上使用时也有一些注意事项:
1.不能使用Assembly.LoadFile(string path),只能使用Assembly.Load(byte[] rawAssembly);
2.我们需要动态加载的脚本不能在编辑器里挂在prefab上,会获取到奇怪的脚本,因为这个脚本在原项目和AB包中都存,并且存在于两个不同的程序集里,不会互相覆盖。
3.由于是存在于两个程序集中,调用AddComponent()时不能使用AddComponent<某>(),要用AddComponent(Type.GetType(“SomeScript”))。
4.在动态dll里使用[RequireComponent(typeof(SomeScript))]无效。

最后奉上工程:
HotUpdateTest.rar (546.02 KB, 下载次数: 53)

评分

参与人数 6鲜花 +69 收起 理由
kass0615 + 5 很给力!
goonangel + 2 很给力!
kckbkckb2 + 5 很给力!
kusu2008 + 5 很给力!
lixiaobai + 2 很给力!
朱迪 + 50 很给力!

查看全部评分


回复

使用道具 举报

5熟悉之中
578/1000
排名
3967
昨日变化
3

5

主题

90

帖子

578

积分

Rank: 5Rank: 5

UID
61625
好友
3
蛮牛币
1447
威望
0
注册时间
2014-12-16
在线时间
217 小时
最后登录
2017-4-21
发表于 2017-4-12 16:11:27 | 显示全部楼层
厉害!!!!!!!!!!!!!!

回复

使用道具 举报

5熟悉之中
576/1000
排名
5148
昨日变化
2

0

主题

281

帖子

576

积分

Rank: 5Rank: 5

UID
3796
好友
0
蛮牛币
665
威望
0
注册时间
2013-9-13
在线时间
113 小时
最后登录
2017-4-28
发表于 2017-4-12 17:07:42 | 显示全部楼层
厉害!!!

回复

使用道具 举报

5熟悉之中
925/1000
排名
4030
昨日变化
1

6

主题

532

帖子

925

积分

Rank: 5Rank: 5

UID
132417
好友
0
蛮牛币
1866
威望
0
注册时间
2015-12-23
在线时间
137 小时
最后登录
2017-4-28
发表于 2017-4-13 09:56:27 | 显示全部楼层
学习学习,谢谢楼主分享

回复 支持 反对

使用道具 举报

2初来乍到
105/150
排名
16748
昨日变化
1

0

主题

34

帖子

105

积分

Rank: 2Rank: 2

UID
102020
好友
0
蛮牛币
57
威望
0
注册时间
2015-5-21
在线时间
52 小时
最后登录
2017-4-28
发表于 2017-4-13 15:39:45 | 显示全部楼层
学到了,之前看的热更新都会提到这个,但是一直不知道怎么实现的

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1048/1500
排名
18411
昨日变化
11

1

主题

890

帖子

1048

积分

Rank: 6Rank: 6Rank: 6

UID
185807
好友
0
蛮牛币
1102
威望
0
注册时间
2016-11-22
在线时间
141 小时
最后登录
2017-4-28
发表于 2017-4-13 18:06:19 | 显示全部楼层
赞,不错,学习了,谢谢分享

回复 支持 反对

使用道具 举报

4四处流浪
405/500
排名
5892
昨日变化
1

4

主题

155

帖子

405

积分

Rank: 4

UID
187870
好友
0
蛮牛币
468
威望
0
注册时间
2016-11-29
在线时间
96 小时
最后登录
2017-4-28
发表于 2017-4-14 08:44:36 | 显示全部楼层
好人一生平安

回复

使用道具 举报

6蛮牛粉丝
1493/1500
排名
366
昨日变化

0

主题

31

帖子

1493

积分

Rank: 6Rank: 6Rank: 6

UID
9580
好友
1
蛮牛币
4061
威望
0
注册时间
2013-12-4
在线时间
218 小时
最后登录
2017-4-28
发表于 2017-4-14 08:45:49 | 显示全部楼层
超厲害的~謝謝分享

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1020/1500
排名
1361
昨日变化

1

主题

69

帖子

1020

积分

Rank: 6Rank: 6Rank: 6

UID
133503
好友
0
蛮牛币
2889
威望
0
注册时间
2016-1-5
在线时间
282 小时
最后登录
2017-4-28
QQ
发表于 2017-4-14 08:51:27 | 显示全部楼层
膜拜

回复

使用道具 举报

5熟悉之中
875/1000
排名
2371
昨日变化
13

1

主题

240

帖子

875

积分

Rank: 5Rank: 5

UID
56496
好友
0
蛮牛币
2125
威望
0
注册时间
2014-11-19
在线时间
212 小时
最后登录
2017-4-30
发表于 2017-4-14 10:10:28 | 显示全部楼层
miao  ao   很好

回复 支持 反对

使用道具 举报

2初来乍到
100/150
排名
18411
昨日变化
11

0

主题

72

帖子

100

积分

Rank: 2Rank: 2

UID
212868
好友
0
蛮牛币
162
威望
0
注册时间
2017-3-18
在线时间
12 小时
最后登录
2017-4-15
发表于 2017-4-15 22:22:12 | 显示全部楼层
给力。。。。

回复

使用道具 举报

5熟悉之中
650/1000
排名
2458
昨日变化
13

0

主题

82

帖子

650

积分

Rank: 5Rank: 5

UID
137070
好友
0
蛮牛币
1418
威望
0
注册时间
2016-2-20
在线时间
160 小时
最后登录
2017-5-1
发表于 2017-4-16 19:05:30 | 显示全部楼层
感谢楼主分享!
[发帖际遇]: kckbkckb2 乐于助人,奖励 3 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

6蛮牛粉丝
1023/1500
排名
2129
昨日变化
1

22

主题

263

帖子

1023

积分

Rank: 6Rank: 6Rank: 6

UID
89788
好友
1
蛮牛币
1447
威望
0
注册时间
2015-4-7
在线时间
264 小时
最后登录
2017-4-28
发表于 2017-4-17 14:50:03 | 显示全部楼层
可以可以
谢谢楼主

回复 支持 反对

使用道具 举报

3偶尔光临
162/300
排名
9596
昨日变化
3

0

主题

38

帖子

162

积分

Rank: 3Rank: 3Rank: 3

UID
131556
好友
0
蛮牛币
133
威望
0
注册时间
2015-12-12
在线时间
58 小时
最后登录
2017-4-27
发表于 2017-4-18 09:17:13 | 显示全部楼层
{:87:}

回复

使用道具 举报

3偶尔光临
191/300
排名
9039
昨日变化
3

0

主题

75

帖子

191

积分

Rank: 3Rank: 3Rank: 3

UID
91378
好友
1
蛮牛币
152
威望
0
注册时间
2015-4-11
在线时间
40 小时
最后登录
2017-4-24
发表于 2017-4-19 09:55:51 | 显示全部楼层
谢谢楼主分享

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表