在JSB+Bridge工程中你可以同时维护Cs版本和Js版本的游戏。

框架代码:简称framework,表示那些不进行热更的代码。注意,这包括你自己写的代码,也包括引用的Dll,比如UnityEngine.dll,或者是其他第3方Dll,都算是框架代码。

逻辑代码:简称logic,表示那些可进行热更的代码。逻辑代码将会变成Js代码。

1. 在Cs工程中,将代码明确划分为框架和逻辑。框架代码放在 Assets/Scripts/GameFramework(有源代码,或者Dll也放这个目录下吧),逻辑代码放在 Assets/Scripts/GameLogic。游戏运行过程中,框架代码跑的是C#,逻辑代码跑的也是C#。

2. 在Js工程中,框架代码也是在 Assets/Scripts/GameFramework 下,这个目录是从Cs工程映射过来的,修改任意一边的内容,另外一边就会自动变化。逻辑代码则是放在 Assets/StreamingAssets/JavaScript/Gen2.javascript 中的。Gen2是Cs工程下的逻辑代码编译生成的Js代码。在游戏运行过程中,框架代码跑的是C#,逻辑代码跑的是Js。

3. 在BridgeProj工程中,把 Cs工程下 Assets/Scripts/GameLogic 整个目录映射过来。他的目标是把这些逻辑代码编译生成Js代码给Js工程使用。这里会有个问题,逻辑代码是可以依赖框架代码的,如果只是把逻辑代码映射到BridgeProj工程中,是不可能编译得过的。这个问题是通过csw.cs解决的。

csw.cs详解

假设逻辑代码里使用了 Debug.Log() 函数,鼠标定位在Log函数上,按F12进行跳转

在Cs工程中,Log函数会跳转到

很显然,这个Log函数就来自于UnityEngine.dll。

如果是BridgeProj工程中,对Log函数跳转,则会跳转到csw.cs中:

为什么是这样的呢?

1. 首先,在csw.cs中的类都会被打上这个标签:

[Bridge.FileName("csw")]

表示这个类生成Js代码后,文件名叫csw.js。

2. 另外,BridgeProj工程下的 bridge.json 里有这么一句:

"outputBy": "Project",

表示,所有逻辑代码都会被生成到{工程名}.js文件中,我们的工程叫 BridgeProj,所以所有逻辑代码都会生成到BridgeProj.js中。

顺便说一下,为什么我们要生成到同一个文件中去。在Bridge中,Js加载时,都是通过Bridge.define这个函数来定义一个类的(打开 BridgeProj.js 就会看见了)。Bridge.define有个要求是,父类必须在前面定义,否则加载Js时报错,说父类找不到。生成到同一个文件中去的话,是由Bridge来保证这个定义顺序。如果生成到多个文件中去,我们自己在加载的时候,无法确定加载顺序是什么。

注意:Bridge.FileName 标签优先级较高,所以csw.cs还是生成到csw.js中。可参考Bridge文档:http://bridge.net/docs/global-configuration/

3. 在BridgeProj成功编译后,我们会返回Js工程中点击菜单:JSB | Update JavaScript。这个菜单做啥事呢?其实很简单,就是把BridgeProj生成的 BridgeProj.js 拷贝到 Js工程下的 Assets/StreamingAssets/JavaScript/Gen2.javascript。

这里注意,csw.js 被抛弃了。

4. 打开 Gen2.javascript,查找 Debug.Log 对应的那一行Js代码,是长这样的:

UnityEngine.Debug.Log("123");

那么在Js中,UnityEngine.Debug.Log在哪里定义的呢?答:是在 Gen1.javascript 中定义的,可以在 Gen1 中搜索 "UnityEngine.Debug"(包括引号)中可查到 Debug 类的定义。

5. Gen1 是什么时候生成的?答:是在点击菜单 JSB | Gen Bindings 时(此步骤称为“导出”)生成的。也就是说,跟 csw.cs 是同时生成的。Gen1这个Js文件很重要,他负责对接逻辑代码(即Js代码)与框架代码(即C#代码)。在Js中,任何需要调用到C#功能的,都会经过Gen1。

6. 结论:csw.cs 在BridgeProj中的作用之一是让他可以编译通过。

csw.cs实际上就是导出的那些类(*)。他生成 csw.js。

而导出的类,生成的Js代码是 Gen1。

因此,csw.js 与 Gen1 是一一对应的,只不过只有在Gen1 中函数才有实现。所以我们不会把 csw.js 拷贝到 Js 工程中。

(*):注意:实际上,csw.cs比导出的那些类还要“多一点东西”。 举个例子,框架代码里有类A和类B,假设类A长这样:

class A
{
public void Hi(B b){}
}

我可以选择只导出类A,可以吗?可以的。但是,有个问题,如果B不出现在 csw.cs 中,那么,csw编译不过,因为找不到B。

所以,csw.cs比导出的那些类,多出来的东西就是。。。为了能够编译通过所需要的任何东西。在上面的例子中,我们发现A的Hi函数里有个参数是B类型的,那么B的定义也得出现在csw.cs中;如果B的函数里又出现了C,那么C也得出现在 csw.cs中……如果推进下去。

返回:JSBinding+Bridge.NET:Unity游戏热更新方案

JSBinding+Bridge.Net:框架代码与逻辑代码的关系的更多相关文章

  1. JSBInding+Bridge.NET:把C#编译为Js

    编译步骤: 1. 用 VS 2015 打开 BridgeProj/BridgeProj.sln ,编译 2. 将生成 BridgeProj/Bridge/output/bridge.js,对应于 Br ...

  2. JSBinding+Bridge.NET:生成绑定(导出)

    将框架代码导出到 JavaScript.就可以在 JavaScript 中调用 框架代码 的功能. 注意,这个功能是在 Js工程中做的,Cs工程没有这回事. 如何导出? 1. 将需要导出的类添加到 J ...

  3. JSBinding+Bridge.NET:Unity游戏热更新方案

    老版本链接如下:http://www.cnblogs.com/answerwinner/p/4469021.html 新用户不要再使用老版本了. 新版本 JSBinding 将抛弃 SharpKit ...

  4. JSBinding+Bridge:逻辑代码中操作二进制数据

    以这2个函数为例 class File { public static byte[] ReadAllBytes(string path); public static void WriteAllByt ...

  5. 由浅入深吃透MVC框架,驯服烂代码

    MVC 已经成为客户端的主流编程框架,相信客户端工程师对它并不陌生,甚至在开发过程中,不通过思考都会自动使用 MVC 框架编程.但在工作过程中,发现许多小伙伴也只是使用 MVC,对于为什么这样使用并不 ...

  6. k.tt 研究下生成的逻辑代码:从壹开始前后端分离 [.netCore 填坑 ] 三十二║ 四种方法快速实现项目的半自动化搭建

    更新 1.更新小伙伴 @大龄Giser 提出好点子:试试VS的插件扩展:VSIX.ItemProject等,将T4模板给制作插件,这里先记下,有懂的小伙伴可以自己先试试,我会在以后更新. 2.感谢小伙 ...

  7. Atitit.提升 升级类库框架后的api代码兼容性设计指南

    Atitit.提升 升级类库框架后的api代码兼容性设计指南 1. 增加api直接增加,版本号在注释上面增加1 2. 废弃api,使用主见@dep1 3. 修改api,1 4. 修改依赖import, ...

  8. Spring框架的反序列化远程代码执行漏洞分析(转)

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  9. java集合框架之java HashMap代码解析

     java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/arti ...

随机推荐

  1. Linux网络编程的一般步骤(1)

    一.套接字的地址结构. IPV4套接字地址结构通常也称为"网际套接字地址结构",它以sockaddr_in 命名;POSIX定义如下: #include <stdio.h&g ...

  2. Thinkphp 带查询条件数据分页

    //查询条件中如果有中文 $keyword= urldecode(I("request.keyword")); if ($keyword!=""){ $Mode ...

  3. Read Excel file from C#

    Common way is: var fileName = string.Format("{0}\\fileNameHere", Directory.GetCurrentDirec ...

  4. python-phpbb3 (可以用python3 操作 phpbb3 论坛的模块)

    python-phpbb3 2016年8月30日 04:50:48 codegay phpbb3是PHP写的开源的论坛,python-phpbb3这个项目是用python3实现很多对phpbb3论坛操 ...

  5. C语言程序设计第9堂作业

    一.本次课主要内容: 本章将散布在前五章中的数据类型和表达式等内容做了归纳性的汇总,本次课需要掌握以下两个方面: (1)本次课通过从数据在计算机内的存储格式入手,介绍整型.字符型.单精度和双精度实型四 ...

  6. docker 源码分析 六(基于1.8.2版本),Docker run启动过程

    上一篇大致了解了docker 容器的创建过程,其实主要还是从文件系统的视角分析了创建一个容器时需要得建立 RootFS,建立volumes等步骤:本章来分析一下建立好一个容器后,将这个容器运行起来的过 ...

  7. 【Python】一、除法问题及基本操作(逻辑与,if替代switch)及支持中文打印

    1.查看版本 C:\Users\XXX>python -V Python 2.7.1 2.除法问题(不要整除) from __future__ import division tmp=0x3ec ...

  8. 写简单游戏,学编程语言-python篇:大鱼吃小鱼

    很常见的游戏之一,实现原理并不复杂,并且参考了几个相关的代码.这边主要还是以学习编程语言和学习编程思路为重点记录一下吧.最近时间有点吃紧,只能匆忙记录一下.用pygame做的大鱼吃小鱼的游戏截图如下: ...

  9. Eclipse Java class修改后的即时编译

    通常情况下,修改了java文件,需要重启eclipse.但是myeclipse可以不用. 其实即时编译早就有了,通过简单配置javaRebel配置,可以达到修改java文件后不重启eclipse. 注 ...

  10. UVA 820 --- POJ 1273 最大流

    找了好久这两个的区别...UVA820 WA了 好多次.不过以后就做模板了,可以求任意两点之间的最大流. UVA 是无向图,因此可能有重边,POJ 1273是有向图,而且是单源点求最大流,因此改模板的 ...