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

扫一扫,访问微社区

教程分享

关注:715

当前位置:游戏蛮牛 技术专区 教程分享

查看: 1722|回复: 1

[基础知识] Unity热更新之C#反射加载程序集

[复制链接]  [移动端链接]
7日久生情
4317/5000
排名
2397
昨日变化
1

1646

主题

1657

帖子

4317

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
132510
好友
17
蛮牛币
66956
威望
0
注册时间
2015-12-24
在线时间
352 小时
最后登录
2017-6-20
发表于 2016-9-7 14:23:31 | 显示全部楼层 |阅读模式

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

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

x
  用C#反射加载程序集的方式可以动态的从assetBundle资源包或其他资源包里加载脚本到工程中,即便是原工程中不存在的脚本。

  我这里就用加载本地assetBundle的方式来进行讲解了,加载网络上的与之类似。

  第一步,加载assetBundle资源,assetBundle名称为Test:

  [csharp] view plain copy 在CODE上查看代码片派生到我的代码片

  //将本地文件转为字节

  FileStream fs = new FileStream(Application.dataPath + "/Test", FileMode.Open, FileAccess.Read);

  byte[] buffur = new byte[fs.Length];

  fs.Read(buffur, 0, (int)fs.Length);

  fs.Close();

  第二步,加载程序集及获取指定类型

  [csharp] view plain copy 在CODE上查看代码片派生到我的代码片

  public GameObject _gameObjectRoot;

  public TextAsset _script;

  public GameObject _gameobject;

  StartCoroutine(BeginGetAsset(buffur));

  IEnumerator BeginGetAsset(byte[] bytes)

  {

  //从内存中获取资源

  AssetBundleCreateRequest acr = AssetBundle.CreateFromMemory(bytes);

  yield return acr;

  _assetBundle = acr.assetBundle;

  //加载资源中的预设

  _gameObjectRoot = (GameObject)_assetBundle.LoadAsset("GameObjectRoot.prefab");

  //将预设创建在场景内

  yield return _gameobject = Instantiate(_gameObjectRoot);

  //获取到assetBundle中的test.DLL

  _script = (TextAsset)_assetBundle.LoadAsset("test", typeof(TextAsset));

  //C#反射取出程序集

  System.Reflection.Assembly assembly = System.Reflection.Assembly.Load(_script.bytes);

  //加载程序集中的脚本Mytest.cs

  _gameobject.AddComponent(assembly.GetType("Mytest"));

  }

QQ截图20160907142258.png

[发帖际遇]: BobbyKim 发帖时在路边捡到 2 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复

使用道具 举报

5熟悉之中
759/1000
排名
8012
昨日变化
2

2

主题

516

帖子

759

积分

Rank: 5Rank: 5

UID
220880
好友
7
蛮牛币
766
威望
0
注册时间
2017-5-6
在线时间
123 小时
最后登录
2017-11-3
发表于 2017-9-5 11:17:57 | 显示全部楼层
谢谢分享

回复

使用道具 举报

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

本版积分规则

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