Unity热更新之C#反射动态获取类属性及方法
如果我们要为发布出去的游戏更新一些功能,但又不想让用户重新下载整个游戏包,只让他下载我们更新的资源包,用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
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#反射动态获取类属性及方法的更多相关文章
- python装饰器、继承、元类、mixin,四种給类动态添加类属性和方法的方式(一)
介绍装饰器.继承.元类.mixin,四种給类动态添加类属性和方法的方式 有时候需要給类添加额外的东西,有些东西很频繁,每个类都需要,如果不想反复的复制粘贴到每个类,可以动态添加. # coding=u ...
- Unity热更新之C#反射加载程序集
用C#反射加载程序集的方式可以动态的从assetBundle资源包或其他资源包里加载脚本到工程中,即便是原工程中不存在的脚本. 我这里就用加载本地assetBundle的方式来进行讲解了,加载网络上的 ...
- unity热更新方案对比
Unity应用的iOS热更新 • 什么是热更新 • 为何要热更新 • 怎样在iOS 上对Unity 应用进行热更新 • 支持Unity iOS 热更新的各种Lua 插件的对照 什么是热更新 • ...
- 另类Unity热更新大法:代码注入式补丁热更新
对老项目进行热更新 项目用纯C#开发的? 眼看Unity引擎热火朝天,无数程序猿加入到了Unity开发的大本营. 一些老项目,在当时ulua/slua还不如今天那样的成熟,因此他们选择了全c#开发:也 ...
- Unity热更新对比
https://www.jianshu.com/p/f9d90edf4a7c Unity 热更新为啥用Lua 详解 ILRuntime的优势 同市面上的其他热更方案相比,ILRuntime主要有以下优 ...
- C# 利用反射动态调用类成员
用反射动态调用类成员,需要Type类的一个方法:InvokeMember.对该方法的声明如下(摘抄于MSDN): publicobject InvokeMember( string name, ...
- C#使用反射机制获取类信息[转]
http://www.cnblogs.com/zhoufoxcn/archive/2006/10/31/2515873.html 1.用反射动态创建类实例,并调用其公有成员函数. //新建一个类库项目 ...
- C#使用反射机制获取类信息
1.用反射动态创建类实例,并调用其公有成员函数. //新建一个类库项目,增加一个GetSum方法. using System; namespace ClassLibrary1 { publi ...
- java 通过反射获取类属性结构,类方法,类父类及其泛型,类,接口和包
首先自定义三个类 package reflection1; public interface MtInterface { void info(); } package reflection1; imp ...
随机推荐
- Python能做些什么?
前言 网上搜集到的一些python能做什么的资料,利用python能做很多事情,我们可以在多门课程中都使用Python作为我们的教学语言.比如,计算机网络.数据结构.人工智能.图像处理.软件分析与测试 ...
- 拟将博客迁移到github
其实博客园网站速度挺快的, 但是markdown的显示没有github美观. 尤其是代码高亮这一块. 近日发现github pages + vue + github api + stackedit 能 ...
- webpack dev server 和 sublime text 配合时需要注意的地方
参考:https://webpack.js.org/guides/development/ Adjusting Your Text Editor Some text editors have a &q ...
- Switch控件详解
Switch控件详解 原生效果 5.x 4.x 布局 <Switch android:id="@+id/setting_switch" android:layout_widt ...
- OpenCV:Mat元素访问方法、性能、代码复杂度以及安全性分析
欢迎转载,尊重原创,所以转载请注明出处: http://blog.csdn.net/bendanban/article/details/30527785 本文讲述了OpenCV中几种访问矩阵元素的方法 ...
- 【Hadoop 10周年】我与Hadoop不得不说的故事
什么是Hadoop 今年是2016年,是hadoop十岁的生日,穿越时间和空间,跟她说一声生日快乐,二千零八年一月二十八号,是一个特别的日子,hadoop带着第一声啼哭,来到了这个世界, ...
- FFmpeg源代码简单分析:日志输出系统(av_log()等)
===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...
- Java Math的 floor,round和ceil
floor 返回不大于的最大整数 round 则是4舍5入的计算,入的时候是到大于它的整数 round方法,它表示"四舍五入",算法为Math.floor(x+0.5),即将原来的 ...
- Android文本框-android学习之旅(十七 )
文本框简介 文本框属于基本的andoid控件,TextView继承了View是最基本的文本框,它的子类包括EditView和Button等,TextView的大部分方法,它的子类也可以使用. Text ...
- Centos中git的安装
CentOS的yum源中没有git,只能自己编译安装,现在记录下编译安装的内容,留给自己备忘. 确保已安装了依赖的包 yum install curl yum install curl-deve ...