Unity3D与Flash交互方法研究
2012-10-16陈坚翀
陈坚翀
(福州大学 物理与信息工程学院,福建 福州 350108)
Unity3D与Flash交互方法研究
陈坚翀
(福州大学 物理与信息工程学院,福建 福州 350108)
本论文对Unity3D与Flash进行交互的方法进行了研究,首先描述了在Unity3D调用Flash中的脚本函数的方法,其次是在Flash中调用Unity3D中的脚本函数,最后以此为依据设计并开发了一个基于Web3D的陶瓷展示系统进行实验验证,实验结果表明该方法有很强的可行性.
Unity3D;Flash;交互;Web3D
Unity3D[1]是一款创新思维的图形化操作界面3D游戏引擎.使用unity3D开发3D图形软件能够让程序员专注于开发软件,而不是为各种素材元素,例如脚本语言、3D模型、声音文件或者Shader的管理和使用而费劲脑汁.由Unity3D开发的3D图形软件拥有非常高的执行效率,因为其采用了一项最新的渲染技术—几何体的批量渲染和遮挡剔除.Unity3D在高效执行的同时能够获得非常高的渲染质量,这种高质量的渲染效果甚至是在浏览器中也能够得到[2][3].
Flash[4]被称为“最为灵活的前台”,其独特的时间片段分割(TimeLine)和重组(Mc嵌套)技术,结合Actionscript的对象和流程控制,使灵活的界面设计和动画设计成为可能.作为最小巧的前台,Flash具有跨平台的特性,即无论处于何种平台,只要安装有支持的Flash播放器,就能保证它们的最终显示效果一致,而不必像在网页设计中那样,为不同浏览器设计不同的版本.如同Java,在小型网络中和小型设备中,Flash具有很高的可移植性.
Unity3D和Flash在3D渲染和前台两个方面由各自的优缺点,本文充分利用各自的优点构建三维展示系统,研究Unity3D和Flash间的交互方法.
1 Unity3D与Flash交互方法
在Web3D应用系统中,Unity3D程序和Flash程序均嵌入到Web页面中,它们之间可以通过网页文件的JavaScript脚本来实现.
1.1 Unity3D调用Flash的脚本函数
首先,Unity3D通过执行Application.ExternalCall()来调用HTML网页里定义的JavaScript函数,ExternalCall()函数可以传递参数给JavaScript函数,这里的参数可以是字符串、整型、浮点型、字符型等,或者由它们组成的数组.其它数据类型可以转换成字符串来传递.该函数是通过无阻塞调用的,即调用之后立即返回而不是等到函数执行完毕.ExternalCall()有以下几种重载方式:
(1)调用网页中MyFunction1函数,没有传递参数.
(2)调用网页中MyFunction2函数,传递一个字符串作为参数.
(3)调用网页中MyFunction3函数,传递多个不同类型的参数.
上述被调用的函数在HTML文件中采用标准的语法进行声明,例如:
其次,HTML文件JavaScript脚本通过执行callFlash函数把参数传递到Flash程序中,在Flash脚本中,通过调用ExternalInterface.addCallback()函数设置接收函数,例如:ExternalInterface.addCallback("callFlash",ReceiveMessage);这里ReceiveMessage为接收函数,其函数原型如下:ReceiveMessage(msg:String),这里的msg为从Unity3D传递过来的参数.
1.2 Flash调用Unity3D的脚本函数
首先,Flash通过执行ExternalInterface.call()来调用HTML网页里定义的JavaScript函数,其函数原型为:public static call(methodName:String,[parameter1:Object]):Object,其中参数:methodName:String-要在容器中调用的函数的名称.如果该函数接受参数,则这些参数必须显示在method-Name参数后面.parameter1:Object[可选]-要传递到该函数的任何参数.您可以指定零个或多个参数,参数之间用逗号分隔.此参数可以是任何ActionScript数据类型.当调用JavaScript函数时,ActionScript类型自动封装到JavaScript类型中.当调用某个其它ActiveX容器时,将在请求消息中对参数进行编码.函数返回Object-从容器接收的响应.如果调用失败(例如,当容器中没有这种函数时、接口不可用时、发生递归时,或出现安全问题时),则返回null.
其次,HTML文件JavaScript脚本通过执行uniObj.msg()函数把参数传递到Unity3D中.在Unity3D中,通过ReceiveMessage(msg:String)来接收从Flash传递过来的参数.
2 陶瓷展示系统的设计与实现
陶瓷展示系统以三维的表现形式,能够全方位的展示陶瓷产品,具有二维平面图像不可比拟的优势.陶瓷企业将他们的产品发布成网上三维的形式,能够展现出产品外形的方方面面,并可以通过互动操作,演示产品的功能特性和使用操作,充分利用互联网高速迅捷的传播优势来推广公司的产品.
2.1 系统的工作流程
陶瓷展示系统工作首先要制作展示模型,模型可以通过三维造型软件进行造型,或者直接用三维激光扫描仪直接把陶瓷产品扫描成数字化模型,然后通过网页、Flash前端界面、Unity3D展示模块呈现给用户.整体流程如图1所示.
2.2 Unity3D展示模块
Unity3D展示模块主要是利用Unity3D提供的场景编辑软件,对准备好的三维数字化模型在三维场景中进行适当的布置和安排,确定场景内静态物体的摆放位置、旋转角度和缩放比例,并给动态物体设定初始位置.场景的搭建主要依赖平移、旋转、缩放三个工具:在Unity3D里面,3D场景内任何事物都是一个GameObject,GameObject拥有transform变量拥有存储和设置这个物体的位置、转角和缩放比例.而平移、旋转、缩放正是通过改变transform里的内容从而达到3D场景布置的目的.而transform的作用远不止如此,开发人员还可以通过脚本对GameObject的transform进行控制,从而达到动态设置场景内物体位置、转角和缩放比例的目的.
2.3 Flash前端模块
最基础的Flash开发可以但村的使用Flash Builder完成任务,Flash与生俱来的是它的事件驱动(event-driven)的特点.也就是说Flash可以使用它的标签做到任何事情.因此开发一个Flash应用程序最简单、基础的方法就是使用标签.在陶瓷展示系统中,利用Flash做前端设计,主要做好以下几方面的工作:
首先,布局算法选择:用户可以根据需要选择不同的布局算法,从而可以从不同的拓扑结构和网络形态上多角度的考察网络数据.框架实现了当今流行的多种布局算法,其中 包 括 CircleLayout、DirectPlacementLayout、CitationLayout、ForceDirectedLayout、HierarchicalLayout等算法. 在布局算法的设计和实现上,遵循统一的编程接口,用户课根据需要自行实现布局算法.
其次,用户图形界面:Flash可以使用输入框、按钮、滚动条、下拉菜单、单选框、复选框等常规的控件,设置陶瓷展示的参数.
最后,数据库访问:用ADO.NET中的DataSet把从数据源中抽取的离散数据保存在缓存中,在Flash也有将数据保存在缓存中的方法DataSet,Flash以组件的形式提供DataSet使用机制.通过使用两个组件即可以实现把服务器端的XML文件的数据保存在Flash Player的缓存中.这两个组件分别是XMLConnector组件和DataSet组件.Flash利用XMLConnector组件读取服务器上的XML文件数据,再将数据以绑定的形式传递给DataSet组件.数据绑定可将一个组件的属性映射到另一个组件.绑定其实就是一个语句,如当组件A的属性X更改时,将新值复制到组件B的属性Y.
2.4 实验结果分析
实验环境:服务器操作系统为Windows Server 2008,浏览器端的的操作系统为Windows 7,Unity Editor的版本为3.4.0,陶瓷展示系统的界面如下:
图2 陶瓷展示系统界面示意图
3 结论
本文对Unity3D与Flash之间的交互方法进行研究,并设计和实现了基于Web3D的陶瓷虚拟展示系统.本文研究的方法对于产品展示、产品实时编辑等将具有一定的实用价值.
〔1〕UNITY:Game Development Tool,http://unity3d.com/.
〔2〕郭海新.Unity3D与HTML交互机理的研究.煤炭技术,2011,30(9):228-229.
〔3〕倪乐波,戚鹏,遇丽娜,等.Unity3d产品虚拟展示技术的研究与应用.数字技术与应用,2010(10):54-55.
〔4〕Adobe Flash Builderfamily.http://www.adobe.com/products/flash-builder-family.html.
〔5〕黄燕.基于Flash的多媒体地图信息系统设计与实现[硕士学位论文].上海:华东师范大学,2011.
TP393
A
1673-260X(2012)04-0019-02