openFrameworksからのUnity入門

僕は普段、なにか表示系のものを作るときはopenFrameworksを使っているのだけど、今回3Dでグリグリや!という案件があったのでUnityを利用した。ということでoF経験者がUnityに入門する時のノウハウをまとめておく。Unityのバージョンは5.6.1f1、oFはv0.9.8。

Unityの強みと弱み

Unityはゲームエンジンで、ゲームエンジンなので状態や遷移の管理に優れており、3Dオブジェクトの扱いが簡単、強力なGUIによってパラメータの変更がラク、標準で物理演算エンジンが組み込まれているが、一方でテクスチャになにかを描いたりする機能はない。oFとの比較で強みと弱みをまとめると以下のような感じだ。

強み

  • シーン、アニメーションなどの状態管理が優れている
    • ゲームエンジンなのでそのへんのサポートが豊富
    • 特にアニメーションはコード無しでかなり高度なことが出来て大変助かった
  • 強力なエディタのGUI
    • コードに書いたパラメータをごく僅かな手間でGUIのエディタ側から調整可能(oFで言うならofxGUIが簡単に使える感覚だと思う)
  • 強力なGUIライブラリ
    • ゲーム内で使うGUIの方ですね。これもまた強力
  • シェーダーの扱いがoFよりも簡単
    • 使って当たり前のUnity、微妙に手間なoFって感じ
  • 3Dオブジェクトとカメラの扱い
    • 各種3DCGソフトからデータを持ってきて扱うのが簡単
    • カメラもGUIで簡単に扱える
  • 標準で組み込まれた物理演算エンジン
    • ほぼなにも考えずに物理演算を実現できる
  • C#による楽ちんな開発
    • C++、大変なんです
  • 完全なオブジェクト指向
    • コードはそれぞれのオブジェクトに紐付ける形で実装していくため完全なオブジェクト指向になる
    • 紐付けたオブジェクトの管理はUnity側。oFで同様のことをしようとするちょっと手間
  • パーティクルが便利
    • オブジェクトに対するエフェクトはパーティクルを使うことでほぼGUIのみでいい感じに実装出来た
  • 充実したリファレンス
    • しかも使いやすい

弱み

  • プロジェクトが壊れてエディタが起動できなくなることがしばしば起きる
    • まぁoFでも起こるけど、頻度はUnityのほうが多い印象
    • git管理は必須
  • エディタがよく落ちる
    • 諦めてこまめにセーブした
  • GUIで簡単にいじれる故にプロジェクトを開くと何某かを変更してたりする
  • テクスチャに描画するのは弱いというかほぼ想定外
    • 豊富なメソッドがあるoFと比較すると貧弱というか無い
    • 簡単な図形もペイントソフトなどで制作する必要があるのはちょっと手間
    • テクスチャの描画に関しては他のソフトに任してテクスチャを投げよう
  • メッシュをいじるのもoFのほうがやりやすい印象
  • OSCがちょっとむずい
    • これについては後述する
  • macでマルチディスプレイ時に主ディスプレイ以外のマウスイベント取得が不可能
    • 他アプリでマウスイベントを取得 -> OSC -> UnityのイベントシステムのInputModuleをいじって実現。別記事で紹介する

OSCの罠

UnityOSCを使うわけだけど、その辺に転がってるコード使うと罠にはまる。参考になるのはこのQiitaの記事だけ。oFとの罠も書いてある。OSC使うときはまず、ここを参考にコードを書こう。
UnityOSCではまる - Qiita

書籍

f:id:miso_engine:20170710150440j:plain
Unity自体の書籍としては、入門書は『Unity5の教科書』を利用した。この入門書で一通りの3Dゲームが作れるようになり、Unityの主要な機能を知ることが出来た。『Unity ゲームエフェクト入門』ではパーティクルを利用したゲームエフェクトの作り方がレシピ集として載っており、とても便利だった。

Tips

  • 回転をTransform.eulerAnglesに代入してやろうとすると360度以上の回転は失敗という罠がある
    • そもそもリファレンスにTransform.Rotateを使えとは書いてあるのでごめんなさいだけど
    • 角度でやるよりも4元数(=Quaternion)使うほうが定石感あった
  • 滑らかな移動や回転をしたいときにMathfやVector3にいい感じのメソッドが用意されている
  • RaycastHitが他のオブジェクトから0.51以上離さないとTexcoordがVector2.zero
  • UIのButtonはイケるイケナイの状態が3つある
    • ゲームオブジェクトのActiveSelf、Button自体のenableとinteractableの3つ

実際Unityどうよ

今回のプロジェクト3Dをグリグリ、物理演算使って動かしたいだったのでUnityピッタリだった。oFだけでやるよりも工数削減出来たと思う。目論見外のメリットとしてはアニメーションの実装と管理が圧倒的に楽というのがあった。今後派手なヤツはすべてUnityで実装すると思う。テクスチャの生成に関してはoFと組み合わせて使ったのでまぁ適材適所感が強い。oFとUnityの連携は今回はファイルでファイルのパスを投げるだけの簡易的なものにしたが、もっと高度なやり方もあるので、今後探っていきたい。