JSBinding+Bridge.NET:Inspector拖变量支持
之前的文档说了,JSB的设计是不允许gameObject上挂逻辑脚本的。原因很简单,在Js工程中根本就不存在C#形式的逻辑脚本,如果在Cs工程中挂上了,到了Js工程这边,直接Missing。
实际在使用的过程发现如果Prefab无法静态“关联”逻辑脚本,则必须在某个地方动态地确定需要挂什么脚本上去。这样子的确是有点麻烦。
首先要记住,ScriptAgent只是用于“逻辑脚本”,也就是需要更新的脚本。对于框架脚本,是直接挂就可以的。
解决如何对一个gameObject静态指定一个逻辑脚本。
gameObject上挂一个框架脚本ScriptAgent,ScriptAgent上有一个ScriptName表示脚本名字(例如LoginUI),可在Inspector中输入。
public class ScriptAgent : MonoBehaviour
{
public string ScriptName;
void Awake()
{
#if JS
var jsCom= AddComponent<JSComponent>();
jsCom.jsClassName = ScriptName;
//...
#else
Type type = FindTypeByName(ScriptName);
AddComponent(type);
#endif // Destroy self
Destroy(this);
}
}
如上所示,运行时,
1. 如果是Js版本,则挂上去JSComponent对象,并初始化Js对象。
2. 如果是C#版本,则根据名字查找类型,找到后,调用 AddComponent(type)。
3. 把自己干掉
接下来的问题是要想办法在 ScriptAgent 支持一些 public 变量的拖放,以减少写查找gameObject的代码。
假设有一个脚本LoginUI,上面有一个public变量,如下
public class LoginUI : MonoBehaviour
{
// 登录按钮的gameObject
public GameObject goLogin;
}
目前的使用步骤是,首先挂上 ScriptAgent,输入脚本名(全名,包括namespace):

然后点击 Update 按钮:

会发现,出现了LoginUI那个public变量!此时可以赋值了。
在 ScriptAgent 的 Awake 中,会把这些 public 变量,赋值给具体的逻辑脚本对象。
1. 如果是Js版本,则赋值给Js对象
2. 如果是Cs版本,则使用反射赋值给C#对象
赋值的操作是很容易的,不需要深入讨论。
这里的难点是 Update 按钮的实现。在Js工程中,LoginUI这个脚本实际不是以C#形式存在的。只在BridgeProj才是以C#形式存在的。
1. 在Js工程中,Update按钮的实现原理是:使用 Cecil 加载 BridgeProj/bin/Debug/BridgeProj.dll,查找 LoginUI 这个类型里的 public 变量,返回回来;
2. 在Cs工程中,Update按钮的实现原理是:使用 Cecil 加载 Cs工程/Library/ScriptAssemblies/Assembly-CSharp.dll,查找 LoginUI 这个类型里的 public 变量,返回回来;
ScriptAgent理论上是可以支持所有Unity可序列化类型的(包括嵌套,如结构体套数组,再套结构体),实现起来也不难。不过,考虑到项目中很少使用过于复杂的序列化类型,目前只添加了int,string,bool,gameObject 4种类型。
另外,这个方法有一个明显的限制,那就是,如果在 LoginUI.Awake 中去取 goLogin 对象的值,是会为 null 的。原因是,ScriptAgent 在 AddComponent(typeof(LoginUI)) 的同时,LoginUI.Awake 已经调用了,之后才有机会处理序列化数据。
所以我们项目中,规定:对于逻辑脚本,一律不准使用 Awake 函数,而改用 OnAwake(必须是public,无参)。ScriptAgent 在处理完序列化数据后,会主动调用 OnAwake。
返回:JSBinding+Bridge.NET:Unity游戏热更新方案
JSBinding+Bridge.NET:Inspector拖变量支持的更多相关文章
- JSBinding + SharpKit / 需要注意及不支持的列表
1) 序列化不支持 public List<T>,其余都支持(JSBinding+Bridge无此功能) 2015年11月5日 补充:序列化只处理 Field.目前发现 Animation ...
- JSBinding+Bridge.NET限制
限制: 框架代码不可以访问逻辑代码.这是最基本的. 框架里的函数 f 带数组参数时,逻辑代码调用 f 的话,数组只能做为输入,也就是说,如果在框架函数 f 里修改了数组的内容,那么逻辑代码是无法取得新 ...
- JSBinding+Bridge.NET:Unity游戏热更新方案
老版本链接如下:http://www.cnblogs.com/answerwinner/p/4469021.html 新用户不要再使用老版本了. 新版本 JSBinding 将抛弃 SharpKit ...
- WPF.UIShell UIFramework之自定义窗口的深度技术 - 模态闪动(Blink)、窗口四边拖拽支持(WmNCHitTest)、自定义最大化位置和大小(WmGetMinMaxInfo)
无论是在工作和学习中使用WPF时,我们通常都会接触到CustomControl,今天我们就CustomWindow之后的一些边角技术进行探讨和剖析. 窗口(对话框)模态闪动(Blink) 自定义窗口的 ...
- JSBInding+Bridge.NET:把C#编译为Js
编译步骤: 1. 用 VS 2015 打开 BridgeProj/BridgeProj.sln ,编译 2. 将生成 BridgeProj/Bridge/output/bridge.js,对应于 Br ...
- JSBinding+Bridge.NET:生成绑定(导出)
将框架代码导出到 JavaScript.就可以在 JavaScript 中调用 框架代码 的功能. 注意,这个功能是在 Js工程中做的,Cs工程没有这回事. 如何导出? 1. 将需要导出的类添加到 J ...
- JSBinding+Bridge.Net:框架代码与逻辑代码的关系
在JSB+Bridge工程中你可以同时维护Cs版本和Js版本的游戏. 框架代码:简称framework,表示那些不进行热更的代码.注意,这包括你自己写的代码,也包括引用的Dll,比如UnityEngi ...
- JSBinding+Bridge:逻辑代码中操作二进制数据
以这2个函数为例 class File { public static byte[] ReadAllBytes(string path); public static void WriteAllByt ...
- ASP .NET CORE 根据环境变量支持多个 appsettings.json
0.背景 在开发项目的过程当中,生产环境与调试环境的配置肯定是不一样的.拿个最简单的例子来说,比如连接字符串这种东西,调试环境肯定是不能连接生产数据库的.在之前的话,这种情况只能说是你 COPY 两个 ...
随机推荐
- 基于神念TGAM的脑波小车(1)
作者声明:此博客是作者的毕设心得,拿来分享. 拿到模块,在网上查了一圈,发现基本没什么有用的资料,有也是一些废话,经过我几个月的攻克,现在已初步搞定,分享给大家. 废话不多说,直接步入正题. 这是通过 ...
- 获取apk的签名信息
在接入第三方功能时,经常要注册提交apk的签名信息 (sha1签名)?,下面列出相关步骤. 获取apk签名信息的步骤: 1)修改apk后缀名为zip,解压得到其中的META-INF文件夹; 2)把ME ...
- Linux内核分析第四周总结
用户态,内核态和中断处理过程 库函数将系统调用封装起来 用户态和内核态的差别: 在内核态时,cs和eip的值可以是任意地址,但在用户态时只能访问0x00000000 - 0xbfffffff,0x00 ...
- 第二个Sprint冲刺总结
第二个Sprint冲刺总结 ( 1)团队Github: https://github.com/ouqifeng/EasyGoOperation.git ( 2 ) 团队贡献分: 廖焯燊:22 何武鹏: ...
- Log4Net使用指南之用log4net记录日志到数据库(含有自定义属性)------附Demo例子源代码
Log4NET简介 log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具. 前提 最近做项目 ...
- ElasticSearch搜索实例含高亮显示及搜索的特殊字符过滤
应用说明见代码注解. 1.简单搜索实例展示: public void search() throws IOException { // 自定义集群结点名称 String clusterName = & ...
- C语言入门:02.第一个C语言程序
一.开发工具的选择(1)可以用来写代码的工具:记事本.UltraEdit.Vim.Xcode等(2)选择Xcode的原因:苹果官方提供的开发利器.简化开发过程.有高亮显示功能 (3)使用Xcode新建 ...
- Linux命令(二十四) 磁盘管理命令(二) mkfs,mount
一.格式化文件系统 mkfs 当完成硬盘分区以后要进行硬盘的格式化,mkfs系列对应的命令用于将硬盘格式化为指定格式的文件系统.mkfs 本身并不执行建立文件系统的工作,而是去调用相关的程序来执行.例 ...
- POWERSHELL 计划任务的创建,收集DC中失败的登录信息并邮件通知
(注:本文参考以下前辈文章修改而来,源文章连接:http://itadmindev.blogspot.hk/2011/07/powershell-ad-dc-failed-logins-report. ...
- kafka 数据一致性-leader,follower机制与zookeeper的区别;
我写了另一篇zookeeper选举机制的,可以参考:zookeeper 负载均衡 核心机制 包含ZAB协议(滴滴,阿里面试) 一.zookeeper 与kafka保持数据一致性的不同点: (1)zoo ...