最近uNETを触り始めて無限の可能性を感じたsu10です。
swfファイルをUnity用にコンバートするAssetはいくつかあるのですが、Mecanim、つまりAnimatorやらAnimationファイルやらAnimatorControllerファイルにコンバートするツールとかAssetは見当たらなかったのでどうにかできないものかと模索したメモ書きです。
正直わざわざMecanim用に作り直すよりLWFなりアセット買ったほうが安上がりですが、「独自フォーマットは嫌だ!」とかいろいろ事情がある人の参考になれば幸いです。
前提条件
- Mac使う(Windowsマシンない・・・)
- Unity上で完結する
- C#使う
後述する制限によりWindows使えるならWindows使ったほうがかなり楽になるかと思われます。
コンバートの流れ
- ライブラリを使ってswfを解析する
- (中間データ作成)
- 中間データからMecanim用のファイルを作成する
3.はリファレンス読むなりググるなりでどうにかなる部分なので省略。
ライブラリを使ってswfを解析する
swfの仕様書を読んで理解してるならライブラリを使う必要もないかもしれないですが、「nバイト取ってくる」みたいな操作にアレルギー症状が出そうな人はライブラリ使いましょう。
以下の2つが使えます。
自分は最初SwfLib使ってみたのですが、タグの解析後のタイムライン作成は自分で書かないといけなさそうだったので途中からSwf2XNAに移行しました。
UnityにSwf2XNAを導入する
自分もかなりお世話になっているUniRxの作者さんのブログのこちらの記事を見て「余裕そうだな」と思ってたら以下の理由でかなりハマりました。
- Unityで使える.NETは古い
- MacのUnityはSystem.Drawingが使えない
- namespaceの関係でエラー
- 同じクラス名が同じnamespaceに定義されていてエラー
ちなみにSwf2XNAの中で必要なのは以下の2つのディレクトリに含まれるクラス群なのでEditor以下にぶち込みましょう。
- SwfReader
- Vex
Unityで使える.NETは古い
現行のUnityの.NETのバージョンは3.5らしく、Swf2XNAをそのまま突っ込んでもエラーで動きません。
これはベータとして公開されているUnity5.5.0b9を使用することで回避できます(参考:テラシュールブログさんの記事)。
なぜかMonoDevelopをUnityと繋いでのデバッグをしようとすると応答なしになるのでデバッグはDebug.Logで・・・
MacのUnityはSystem.Drawingが使えない
Unityに付属してくるMonoDevelop.appの中にSystem.Drawing.dllが含まれているので持ってくればいいかと思いきや、" DllNotFoundException: gdiplus.dll"とかいうエラーで動きません。
よって以下のクラスを使っている箇所でエラーになるので、UnityのAPIに置き換えます。
- Bitmap
- Matrix
- Point
BitmapはTexture2Dを使って書き換え、MatrixはTransformかMatrix4x4で書き換えられると思います。
namespaceの関係でエラー
「Vex.XXX」という記述箇所でエラーになるので「DDW.Vex.XXX」という風に直します。
同じクラス名が同じnamespaceに定義されていてエラー
参照を調べて使われていないほうのクラスをコメントアウトします。
終わり
以上でSwf2XNAがUnityで使えるようになったので、解析結果をコンバートする部分を頑張って書きましょう。
思い出しながら書いたので漏れがあるかもしれないですが、やってみて動かない箇所などあれば教えてください。