Unity 3.5 の Flash 出力関係見てました。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
SWF 出力時に使われるツールやライブラリはデフォルトインストールで
C:\Program Files\Unity\Editor\Data\PlaybackEngines\flashsupport\ に入ってます。
中の構成は、
-------------------------------------------------------------------- /BuildTools /AS3API /UnityEngine 大量の .as // UnityEngine パッケージのソースコード // UnityPlayerNative.swc に入ってます。 /UnityEngineInternal TypeInferenceRules.as // UnityEngineInternal パッケージのソースコード // UnityPlayerNative.swc に入ってます。 UnityEngineClassIndex.as // UnityEngineClassIndex クラスのソースコード // UnityPlayerNative.swc に入ってます。 /cil2as cil2as.exe ICSharpCode.Decompiler.dll ICSharpCode.NRefactory.dll Mono.Cecil.dll Mono.Cecil.Mdb.dll /flex // Flex 4.5.1.21328 のフォルダ /UserBuild_AS3 UnityApp.as // ユーザが作ったプロジェクトデータを保持するクラス // プロジェクトデータとはシリアライズされたコンテンツデータ index.html // Flash 再生用 html のテンプレート swfobject.js // Flash 再生用 js UnityShared.swc // Flash 出力時に一緒に出力される。 // 生成された .swf を自分で .as で読み込むときに使用。 // ( ただ、他のクラスも全部入ってる UnityPlayerNative.swc があるので使わないかも) SwfPostProcessor.exe /Managed UnityEngine.dll /Resources unity default resources // デフォルトのリソース // シェーダーコード( ちょっと変わった AGAL )といくらかのバイナリデータUnityPlayerNative.swc // Unity の ActionScript 向けライブラリ // UnityShared.swc のクラス以外も全部含んでいます。 // 一部のソースコードは \BuildTools\AS3API\ の中で見れます。 -------------------------------------------------------------------- このうち実際の作業で関係あるのは UnityPlayerNative.swc で、
後は UnityEngine パッケージのソースを見ることがあるかもしれないぐらいです。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
フォーラムから
UnityShared.swc; Communicating between Unity Flash Content and AS3. http://forum.unity3d.com/threads/116650-UnityShared.swc-Communicating-between-Unity-Flash-Content-and-AS3. AS3Communication_unity_project.zip
AS3Communication_as3_src.zip
Unity のデータと ActionScript のソースです。
このサンプルには
・ActionScript で Unity の出力した .swf を読み込む。
・ローディング画面
・ActionScript と Unity 間のメッセージの投げ方
が書いてあります。
実行してボタンを押すとデバッグウィンドウにメッセージが出ます。
メッセージのやり取りは AKABANE さんのサイトでも書かれています。
AKABANEさん Unity と Flashの連携 http://akabana.info/2011/12/24/unity-flash-messaging/ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
最近全然コード載せてないので、AIR じゃない通常の ActionScript での読込コードを。
とは言え、上のサンプルからローディング画面周りやメッセージのやりとり省いて
ほぼ .swf 読込だけに絞ってあるソースです。
---------------------------------------------------------------------------------
プロジェクト設定
Unity の出力した .swf と UnityPlayerNative.swc コピー
UnityPlayerNative.swc 右クリックで "ライブラリに追加"
--------------------------------------------------------------------------------- package { import Boo.Lang.Builtins; import com.unity.IUnityContentHost; import com.unity.UnityContentLoader; import com.unity.UnityLoaderParams; import flash.display.DisplayObject; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import flash.events.ProgressEvent; [SWF(width='720', height='400', backgroundColor='#FFFFFF', frameRate='60')] public class Main extends Sprite implements IUnityContentHost { // Unity content private const UNITYAPP_SWF:String = "test000.swf"; private var unityContentLoader:UnityContentLoader; //////////////////////////////////////////////////////////////// // constructor public function Main():void { if (stage) init(); else addEventListener( Event.ADDED_TO_STAGE, init ); } //////////////////////////////////////////////////////////////// // init private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; /////////////////////////////////////////////////////////////// // load unity content var params:UnityLoaderParams = new UnityLoaderParams( false, stage.stageWidth, stage.stageHeight, false ); unityContentLoader = new UnityContentLoader( UNITYAPP_SWF, this, params, false ); unityContentLoader.contentLoaderInfo.addEventListener( ProgressEvent.PROGRESS, onUnityContentLoaderProgress ); unityContentLoader.contentLoaderInfo.addEventListener( Event.COMPLETE, onUnityContentLoaderComplete ); unityContentLoader.loadUnity(); } //////////////////////////////////////////////////////////////// // Loading UnityContent private function onUnityContentLoaderProgress( event:ProgressEvent ):void { // create original progress bar var p:Number = event.bytesLoaded / event.bytesTotal; trace( p * 100 ); } //////////////////////////////////////////////////////////////// // Load complete UnityContent private function onUnityContentLoaderComplete(event:Event):void { addChild( unityContentLoader ); unityContentLoader.unityContent.setContentHost( this ); } //////////////////////////////////////////////////////////////// // init Unity start. public function unityInitStart () : void { // This is called when the content is loaded and the initialization of the unity engine is started. // Unity 初期化始まり } //////////////////////////////////////////////////////////////// // init Unity complete. public function unityInitComplete () : void { // This is called when the unity engine is done initializing and the first level is loaded. // Unity 初期化終わり } } } --------------------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
その他メモ
---------------------------------------------------------------------------------
ActionScript 側で何の仕事するべきなのかがまだ分かりません。
ゲームオブジェクトの制御は Unity で組んどけば済むことですし。
Unity で出来なくて ActionScript で出来ることを勉強しなきゃです。
---------------------------------------------------------------------------------
Unity が使ってる Stage3D を取得して何かしてみたかったんですが。
unityContentLoader.unityContent の持ってる stage3D は private でした。
どこか他からでもいいので欲しいです。
---------------------------------------------------------------------------------
出力される .swf のサイズが結構大きかったので、箱とカメラ、ライトだけのシーンでテスト。
やっぱり 15 MBぐらいになっちゃいました。
しょうがないかなと思ってたんですが、
上のほうで書いたサンプルの .swf は 2.5 MB 程でした。
// 再掲
//
UnityShared.swc; Communicating between Unity Flash Content and AS3. //
http://forum.unity3d.com/threads/116650-UnityShared.swc-Communicating-between-Unity-Flash-Content-and-AS3. // AS3Communication_unity_project.zip
// AS3Communication_as3_src.zip
15 MB もあると FC2 や、借りてるサクラのスペースだと作ったサンプルとかが上げられないので
何か設定あるのか調べないと。
---------------------------------------------------------------------------------
.swf 読み込みじゃなくて、Unity の作った .as から自分でコンパイル出来るかなと思って試してみました。
// ただ、これが出来てもメリットはほぼ無いです。ほとんどのクラスは UnityPlayerNative.swc の中なのでデバッガも使えません。
// そして結果を先に書きますと出来ませんでした。
Unity のフォルダから
UnityPlayerNative.swc
UnityApp.as
ビルドして出来るフォルダ Temp から
ConvertedDotNetCodeClassIndex.as
ProjectSerializedFileContainer.as
( 小さいプロジェクトで global. は無し )
FlashDevelop でコンパイル
(ドキュメントクラスは UnityApp.as )
無事にビルドは通りましたが、起動すると Unity のロゴの後は真っ黒
コンソールにはコンテンツがロードされて無いっぽいエラーが。
UnityApp からデータをデシリアライズする方法や
UnityContentInternal.setStage3DSize() の実行時エラーが
直せなかったのであきらめました。
素直に UnityContentLoader で .swf ロードします。
---------------------------------------------------------------------------------
Temp フォルダの消えるタイミングは Unity 終了時
---------------------------------------------------------------------------------
自分で作ったプロジェクトは
C:\Documents and Settings\USER_NAME\My Documents\PROJECT_NAME
---------------------------------------------------------------------------------
SwfPostProcessor.exe をとりあえずコマンドラインから叩いて Usage だけ見ておきます。
Usage : -upp [inputfile] -o [outputfile] -c[zlib/lzma/none]
---------------------------------------------------------------------------------
cil2as.exe も
System.ArgumentException: Usage:
cil2as [assemblies]
[--libid:LibId] [--types:type1,type2] [--with-class-index] [--filter-by-attribute:AttributeTypeName] [- -auto] [--blacklist:/path/to/blacklist] [--cpp-output-dir:/path/where/to/generate/cpp/files] [--disable-transforms:, ] [--cherry-pick:Foo.Bar(System.Int32) --cherry-pick:Foo.Bar(Baz) at cil2as.ConversionOptions.Parse(String[] args) at cil2as.Program.Main(String[] args) --------------------------------------------------------------------------------- Unity やるなら、プログラムよりリソース作りの速度が大事かなと思うので 正月休みは Blender2.6 を勉強したいです。 (またしても Blender やるやる詐欺) --------------------------------------------------------------------------------- Unity はフォーラムが凄い活発 Unity Community http://forum.unity3d.com/index.php ---------------------------------------------------------------------------------関連記事
2011/12/26(月) 01:52:30 |
ActionScript
| トラックバック:0
| コメント:0