Unity热更新之C#反射动态获取类属性及方法
2016-03-03 12:46
483 查看
如果我们要为发布出去的游戏更新一些功能,但又不想让用户重新下载整个游戏包,只让他下载我们更新的资源包,用assetBundle打包资源的方式是可以的,但其中有个最大的例外,那就是脚本。
虽然assetBundle支持直接将脚本或者DLL打包在内,但没有经过unity编译的话,assetBundle中的脚本是访问不到unity总工程中的脚本的,因为他们已经完全分离在了两个程序集,用C#加载程序集的方式导入DLL的话是可行的,但即便如此,想要在assetBundle脚本与unity总工程脚本之间进行通信也还是会出现问题的。
例如我从assetBundle打包的DLL中取出的一个类NewlyAdded.cs,把他add到场景某一物体之上后,想要获取到场景物体Player上的Control.cs脚本中的float变量Health,然后再调用他的方法MassHealing(float health)。
按照正常方式:
如果这样做的话,我的NewlyAdded.cs脚本在发布DLL的时候就无法编译通过,因为在这段代码里他找不到Control这个类,那么只有将Control.cs也放到一起打包,这样的话虽然编译通过成功发布成DLL了,但打包成assetBundle发到客户端运行的时候你会发现GetComponent<Control>()取到的是一个奇怪的类,事实上因为被分离在了两个程序集外的原因他这里所取到的是在发布NewlyAdded.cs 的DLL那个工程里的Control类,就算本地有同名类,他是不会替换的。
解决这个问题的话,可以用到C#的反射:
这样的话,在编译的时候就可以完全的通过。
虽然assetBundle支持直接将脚本或者DLL打包在内,但没有经过unity编译的话,assetBundle中的脚本是访问不到unity总工程中的脚本的,因为他们已经完全分离在了两个程序集,用C#加载程序集的方式导入DLL的话是可行的,但即便如此,想要在assetBundle脚本与unity总工程脚本之间进行通信也还是会出现问题的。
例如我从assetBundle打包的DLL中取出的一个类NewlyAdded.cs,把他add到场景某一物体之上后,想要获取到场景物体Player上的Control.cs脚本中的float变量Health,然后再调用他的方法MassHealing(float health)。
按照正常方式:
//NewlyAdded.cs GameObject _player = GameObject.Find("Player").gameObject; float _f = _player.GetComponent<Control>().Health; _player.GetComponent<Control>().MassHealing(100.0f);
如果这样做的话,我的NewlyAdded.cs脚本在发布DLL的时候就无法编译通过,因为在这段代码里他找不到Control这个类,那么只有将Control.cs也放到一起打包,这样的话虽然编译通过成功发布成DLL了,但打包成assetBundle发到客户端运行的时候你会发现GetComponent<Control>()取到的是一个奇怪的类,事实上因为被分离在了两个程序集外的原因他这里所取到的是在发布NewlyAdded.cs 的DLL那个工程里的Control类,就算本地有同名类,他是不会替换的。
解决这个问题的话,可以用到C#的反射:
//NewlyAdded.cs float _f; //取Player上的所有脚本 MonoBehaviour[] monos = GameObject.Find("Player").GetComponents<MonoBehaviour>(); for (int i = 0; i < monos.Length; i++) { //筛选出其中的Control脚本 if (monos[i].GetType().ToString().EndsWith("Control")) { //获取Health字段的值 _f = (float)monos[i].GetType().GetField("Health").GetValue(monos[i]); //执行其公有方法MassHealing monos[i].GetType().GetMethod("MassHealing", BindingFlags.Public). Invoke(null, new System.Object[] { 100.0f}); break; } }
这样的话,在编译的时候就可以完全的通过。
相关文章推荐
- Unity热更新之C#反射动态获取类属性及方法
- Cg Programming/Unity/Transparency
- unity如何播放父级的父级物体所绑定的动画功能
- 【Unity开发】通过C#读取CSV表,创建并存储到LUA table中
- wiki/Cg Programming/Unity/Cutaways
- 增强现实贺卡项目展示
- [Unity3D]Unity3D游戏开发之鼠标滚轮实现放大缩小
- Unity-编写插件
- unity音频管理
- unity5.3多线程渲染的坑
- unity3d的四元数 Quaternion
- Unity3D项目之《坦克大战》
- Unity Assets目录下的文件夹用途
- Unity中加入Android项目的Build步骤 .<unity引用Android的jar包><Android对unity做二次开发>
- [Unity3D]蓝港面试题
- Unity3d 换装Avatar系统
- 项目记录25--unity-tolua框架 View02---BasePanel.lua
- Unity3D与android交互---构建android插件
- unity3d,android平台下,高德地图定位,定位模式设定
- Unity3D 调用 Android jar 包制作方法