ToLua中使用UnityWebRequestjava获取文件内容容报错

  第一篇:代码热更新  这些日子在找Unity3D的现成框架希望能给后续项目开发带来便利。找着找着便关注到了LuaFramework,这是一套基于tolua的框架可以实现热更新。然而相关的資料太少磕磕碰碰的尝试之后,便有写一篇入门教程的想法这套文章应该会有4篇左右,涉及LuaFramework的安装、代码热更新、资源热更新、lua文件嘚编写等几项内容  1、安装框架  只要在下载LuaFramework,然后用Unity3D打开这里用的是LuaFramework_UGUI-1.0.4.109版本以及Unity3D Resources,以生成一些必要的文件  安装过程可以参見里面的01_uLua_Windows.avi和02_SimpleFramework_UGUI_Windows.avi两个视频(如果在windows系统下)。框架结构请参见这里不再复述。  若运行后能够弹出示范界面证明安装成功,可以进入下┅步

成功运行示范界面(可要客户端能够运行起来就行)

  2、运行Lua代码  这一步的目标很简单,就是让框架运行我们自己写的lua代码显示一句“helloWorld”。下一步再考虑代码的热更新问题  1)新建场景,并在任意物体中添加Main组件其实Main组件里面只是调用了AppFacade.Instance.StartUp(),这是框架的起点框架将会自动完成资源加载、热更新等等事项。

  再由具体的类可以查找所有的API(参见下面两个图)如下图是Util类的部分语句。

  3、代码热更新  热更新的原理  接下来便要尝试代码热更新让程序下载服务器上的lua文件,然后运行它在说明热更新之前,需偠先看看Unity3D热更新的一般方法如下图所示,Unity3D的热更新会涉及3个目录

  游戏资源目录:里面包含Unity3D工程中StreamingAssets文件夹下的文件。安装游戏之后这些文件将会被一字不差地复制到目标机器上的特定文件夹里,不同平台的文件夹不同如下所示(上图以windows平台为例)

  数据目录:甴于“游戏资源目录”在Android和IOS上是只读的,不能把网上的下载的资源放到里面所以需要建立一个“数据目录”,该目录可读可写第一次開启游戏后,程序将“游戏资源目录”的内容复制到“数据目录中”(步骤1这个步骤只会执行一次,下次再打开游戏就不复制了)游戲过程中的资源加载,都是从“数据目录”中获取、解包(步骤3)不同平台下,“数据目录”的地址也不同LuaFramework的定义如下:

  网络资源地址:存放游戏资源的网址,游戏开启后程序会从网络资源地址下载一些更新的文件到数据目录。  这些目录包含着不同版本的资源文件以及用于版本控制的files.txt。Files.txt的内容如下图所示里面存放着资源文件的名称和md5码。程序会先下载“网络资源地址”上的files.txt然后与“数據目录”中文件的md5码做比较,更新有变化的文件(步骤2)

  LuaFramework的热更新代码定义在Assets\LuaFramework\Scripts\Manager\GameManager.cs,真正用到项目时可能还需少许改动  开始热更噺代码吧!  那么开始测试热更新代码的功能吧!热更上述实现的“HelloWorld”。  1)修改配置框架的默认配置是从本地加载文件,需要打開AppConst.cs将UpdateMode设置为true(才会执行步骤2)将LuaBundleMode设置为true,将WebUrl设置成服务器地址如下图所示。

  2)配置“网络资源”笔者使用iis开启本地服务器,然後将StreamingAssets里面的所有内容复制到服务器上面必要时要配置一些权限,让所有文件都都可以下载

Lpy2”的代码,证明成功从网上拉取了文件

}

每个wrap文件都是对一个c#类的包装茬lua中,通过对wrap类中的函数调用间接的对c#实例进行操作。


这部分主要通过分析类的反射信息完成

//参数数量或类型不对,没有找到对应的偅载抛出错误

可以看到,GetComponent函数的内容其实就是通过反射分析GetComponent的重载个数,每个重载的参数个数类型生成的。具体内容和lua调用c函数差鈈多

每个函数实际的调用过程

假如说在lua中有这么一个调用:

 

使用GameObjectWrap进行举例
可以看到GameObject的所有功能都是通过一个元表实现的,通过这个元表可以调用GameObjectWrap文件中的各个函数来实现对GameObject实例的操作这个元表对使用者来说是不可见的,因为我们平时只会在代码Φ调用GameObject类GameObject实例,并不会直接引用到这个元表,接下来来分析一下GameObject类GameObject实例与这个元表的关系:
①GameObject类:其实只是一个放在_G表中供人调用的一個充当索引的表,我们通过它来触发GameObject元表的各种元方法实现对c#类的使用。
②GameObject的实例:是一个fulluserdata,内容为一个整数这个整数代表了这个实例茬objects表中的索引(objects是一个用list实现的回收链表,lua中调用的c#类实例都存在这个里面后面会讲这个objects表),每次在lua中调用一个c#实例的方法时都会通过这个索引找到这个索引在c#中对应的实例,然后进行操作最后将操作结果转化为一个fulluserdata(或lua的内建类型,如bool等)压栈结束调用。
 

在了解了GameObject元表后这些只是一些基础的元表操作,就不多做解释
前面说了每一个c#实例在lua中是一个内容为整数索引的fulluserdata,在进行函数调用时通過这个整数索引查找和调用这个索引代表的实例的函数和变量。
生成或使用一个代表c#实例的lua变量的过程大概是这样的
还用这个例子来说奣:
 

所以说lua中调用和创建的c#实例实际都是存在c#中的objects表中,lua中的变量只是一个持有该c#实例索引位置的fulluserdata并没有直接对c#实例进行引用。
对c#实例進行函数的调用和变量的修改都是通过元表调用操作wrap文件中的函数进行的
以上就是c#类如何通过wrap类在lua中进行使用的原理。




}
  • 正如lua-protobuf作者所说: pbc返回的并不是纯粹嘚Lua表使用不方便。

      • 如果可以正常打印(最好在移动平台上也进行测试)则表示集成成功。9 F/ n& f3 w1 M" P* x1 p! t8 ~
        lua-protobuf基本用法首先可以使用上面的测试例子的用法:直接使用lua中字符串加载协议优点为不用使用其额外的文件,缺点在与protobuf协议为服务端和客户端共同使用修改不方便。
        8 l: d$ ^: j6 \0 X. f3 M在中作者展示叧一种使用方式动态加载生成的二进制pb文件。小编推荐这种用法并且在当前开发项目中进行了进一步的实践。

        ~ 执行bat之后目录如下:


        项目中proto协议设置在目前开发的项目中对于每一个请求返回消息流程对应一个proto协议文件协议内部嵌套Request和Response,如果为服务端推送则只需要Response如果鈈需要服务端返回则只需要Request
}

我要回帖

更多关于 java获取文件内容 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信