纳金网

标题: Flash 和untiy3D集成[附网上找的Demo] [打印本页]

作者: tianhett    时间: 2015-4-23 12:50
标题: Flash 和untiy3D集成[附网上找的Demo]
将Unity生成的flash内容集成到大型flash项目中
embeddingapi.swc(反正我的是UnityShared.swc)
如果你想将Unity生成的flash内容集成到大型flash项目中,你可以通过embeddingapi.swc,这个SWC提供了加载Unity生成的flash,以及和flash交互的方法,在这个文件中,有两个类和接口,当你的Unity-flash工程被编译,这个文件回合swf一起生成,你能够将这个当做一个swc使用,SWC怎么用就不多说了。
Stage3D的限制
当将Unity生成的flash对象集成到Flash项目中是,必须懂得flash显示模式,所有的stage3D内容是显示在Flash stage后面的,也就是也就是说所有Flash显示内容都将显示在你的3D内容前面,具体你还是看看Stage3D的说明文档吧,starling里面也有介绍。
IUnityContent接口
         IUnityContent 是被Unity3D生成的swf执行的接口,这个接口是你如何和Unity的flash交互,以及如何修改它等。
方法:


允许获取纹理,在论坛里能找到一个很大的例子工程。


这个方法用户调用Unity内容中的某个对象的某个方法


为Unity内容设置主程(必须实现IUnityContentHost)这个接口),这个主持能够监听Unity的内容是否被加载或者开始。


修改Unity3D的大小


设置Unity3D在主程中的位置


启动Unity的内容


停止Unity的内容


强制卸载
IUnityContentHost
任何Unity内容的载体都必须实现这个接口
方法:


当Unity引擎启动完、第一层内容被加载时调用。


当Unity内容被加载以及Uinity 引擎启动

UnityContentLoader
这是个能够加载解析Unity生成的flash内容的类,它继承自Loader类,作为标准的AS3 loader实例,你当然可以通过它的contentLoaderInfo 监听加载进度和是否完成
构造函数:


         contentURL: swf加载路径.
         contentHost: 内容载体,必须实现IUnityContentHost.接口.
         params: 如果想改写某些参数,用它吧,少年.
autoLoad: 如果设置为true,这个对象一旦创建,那么就开始加载,但是你的监听事件可能没有加,那就不知道进度和是否加载完了,所以设置为false,添加好监听事件之后,在调用loadUnity()
属性: unityContent : IUnityContent;
一旦内容完成加载,你能够通过这个接口发送消息,上面有介绍
方法: loadUnity() : void;
根据构造是传入的参数,开始加载Unity内容
forceUnload() : void;
强制从载体上卸载
unload() : void;
重写as3 的loader类,会调用forceUnload方法
unloadAndStop(gc:Boolean = true):void
卸载Unity内容,然后再调用接口unloadAndStop(gc)

UnityLoaderParams
该对象支持UnityContentLoader 创建时提供加载配置数据



scaleToStage: Unity3D内容大小为固定或者父flash窗口变化.
width: Unity内容宽度.
height: Unity内容高度.
usePreloader:是否显示Unity的加载条.
autoInit: 暂时没有用上
catchGlobalErrors: 是否捕获错误,同时显示在左上角的红色窗中。
例子


flash传递数据给Unity
如果你希望从flash传递数据给Unity,那么该数据必须是支持的类型,当然,你也可以创建类去代替数据,通过和C#或者Javascript匹配的实现方式
首先,创建一个ActionScript文件夹在你的工程下,在创建一个AS3对象,放到刚刚说的文件夹下面


好了,你也要创建一个和AS3相匹配的C#或者javascript类,这个和以前AS3跟java,C++的通信没两样
这个NotRenamed属性用来防止影响构造函数,方法,域或者属性
NotConverted属性用户指令编译管道不要讲类型或者成员变成目标平台,一般情况下,如果你不标注,你的所有C#或者javascript脚本都将被编译成Actionscript脚本,如果在加了这个属性,那么就允许编译成自己希望的as脚本了,你提供的伪C#或者javascript 允许Unity知道每个类的统一标示,比如说那个类应该被调用,然后你的as文件提供了这些功能的实现,当然这些Actionscript只有在你编译成flash的时候才生效,在编辑器或者其他平台时中是不生效的。
C#


JavaScript


现在我们需要一个方法来获取这个对象


这样我们就能够获取这个对象,并且获取该对象的数据


Unity通过不同的方式调用AS3的方法
下面的例子主要讲如何从Unity通过不同的方式调用AS3的方法,这个时候我们将会遇到3种脚本语言。
一个叫做ExampleClass.as是包含不同方法的例子,这个必须放在工程中一个叫做ActionScript的文件夹下面一个C#/JavaScript的类(ExampleClass.cs/js)将模仿AS3的实现,当然,你只要二选一就好了,当编译成Flash的时候,这个AS3的类就会被使用了,如果只是在编辑器里面或者编译别的平台应用时,那就调用C#或Javascript啦,
通过创建一个AS3版本的类,这将使用你在变成flash player时能够使用原生态的AS3库,这个玩意对你想和.net的库交互,但是又不支持flash player输出的工做来说,真的是件好事
ExampleClass.as


你也可以创建C#和JavaScript的伪类,他们实现非常详细,给两个例子
C# Implementation (ExampleClass.cs)


JavaScript Implementation (ExampleClass.js)




调用方式
还是那句话,我们下面来介绍下Unity生成的flash中是如何调用ActionScript类的,当然只允许在导出是flash的工程时哦,别的情况将会继续调用C#和JavaSript


这个例子将告诉兄弟里浏览器AS3如何和JavaScript交互,说实话,这个貌似和Unity没有关系,不过既然Unity要调用javascript(在Flash Player中),那么就说说吧,当运行的时候,BrowserCommunicator.TestCommunication()方法将注册一个回调函数,当as调用到js时,将弹出一个警告窗口,然后再通过注册的回调函数交互
下面是js部分,需要放swf所在的html里面,这个你懂的


BrowserCommunicator.as (and matching C# class)


C#的伪实现类


你也可以在C#和JS中访问Flash的stage

下面是个例子,告诉老兄你C#如何输出flash的一些参数

Demo下载:
http://bbs.9ria.com/forum.php?mod=attachment&aid=OTA0NDV8NWM0YzUyYTl8MTQyOTc2NDk1Nnw2NDA0Mjd8MTYxNTI1&ck=fd4df12b


作者: rvan    时间: 2015-5-27 14:58
感谢分享
作者: LeftPlumage    时间: 2015-5-27 17:00
感谢分享··




欢迎光临 纳金网 (http://go.narkii.com/club/) Powered by Discuz! X2.5