最近,在实际工作中,遇到以下一些问题:
- java层有大量的二进制数据需要传送给Unity脚本层
- java层调用Unity是通过UnityPlayer.UnitySendMessage函数
- 而该函数只能将字符串作为参数,传递给Unity层的脚本函数
这就需要把二进制数据进行Base64编码,形成字符串,才能作为参数传递。在Unity层获取到该数据后,又得解码Base64才能得到需要的二进制数据。从这一个过程可以看出:
- 对二进制的Base64编码和解码较浪费资源
有没有更好的办法呢?
网上有很多文档,这里做个整理,希望能说的更清晰,有助于理解和往后的应用。
大致的思路就是:
- 大数据都存放在C代码里,Java和Unity需要存储数据的时候,都直接面向C操作。
Java独立线程中,将数据存放到C内存块后,通过UnityPlayer.UnitySendMessage函数,调用Unity层函数,Unity层就可以立刻获取到该数据。
下面的实例中,Java层函数callWriteBuffer执行最后,会调用UnityPlayer.UnitySendMessage函数通知Unity层去读取,非常方便。
以下是各个模块实现的功能或接口:
1)C动态库,输出接口函数:
- 该动态库内部有一个内存块,供Java和Unity读写。
- 供C调用的函数,和就是普通的动态库输出做法是一样的。
- 供Java调用的函数,需要注意:
- 函数名命名规范:包名_类名_函数名(包名中的点用下划线替换)
- Java与C之间数据类型对应关系
- 前面两个参数是固定的,必须的
2)Java层,输出接口函数: