Unityを用いたプロジェクトに配属され、早1年が経とうとしているエンジニアです。
Unityを1年間使ってみて、便利だ!と感じる一方で、使いにくい...と思う場面が言語化できるようになったと考えております。
本記事では、私の考えるUnityを用いる長所と短所を紹介いたします。
長所
3Dモデルの作成が得意
UnityではMeshという形式を用いることで、立体を可視化することができます。
GameObjectにMeshFilterとMeshRendererコンポーネントとMeshを生成するスクリプトをアタッチすることで、立体を画面上に表示することができます。

Unityはゲームアプリの開発に用いられることが多いですが、製造業や弊社のような建設業界向けのアプリケーション開発でも用いられています。
弊社の開発事例の一例として、Meshを組み合わせることで、Unityで動的メッシュ作成の落とし穴 - KENTEM TechBlog の記事で紹介されているような土木構造物の3D化を行うアプリケーション開発を行っております。
シーン上やインスペクター上で直感的にオブジェクトを移動、回転、拡縮させられる
Unityでは、下記写真のUnity Editorの①Hierarchy上にGameObjectというオブジェクトにUIや3Dモデルが配置されています。
これらは②SceneViewという場所でGameObjectの移動、回転、拡縮の操作ができます。
また、③Inspectorの中の④Transformコンポーネント(UIの場合はRectTransformコンポーネント)のPosition, Rotation, Scaleと記載がある場所でも移動、回転、拡縮が可能となっています。
動的に変化する機能の場合はソースコードから編集する必要があります。
しかし、どのようなフローになっても同じ見た目になる場合はシーン上やインスペクター上で変更すれば良く、直感的に動かすことができます。

エフェクトに関する機能が豊富
Unityはゲームエンジンとして有名であるため、液体、雲、炎などの流体をパーティクルシステムという機能を用いることでさまざまな効果(エフェクト)を演出することができます。
このほか、影や霧のエフェクトを付けることで奥行きと現実感のある3Dオブジェクトを表示することができます。
短所
Unityファイルのソースコードの変更箇所が多くなりやすい
Unityを用いる場合、UIや3Dオブジェクトを表示するためにHierarchy上にGameObjectを追加したり、文字列表示や自作スクリプトの実行のためにComponentを追加したりします。
Unity Editor上で1か所を変えたつもりでも多くの箇所がgitの差分として表示されてしまいます。
GameObjectが配置されていないSampleSceneに対し、1個のGameObjectを追加したとき、約30行の差分が確認されました。
HTMLを用いて階層構造を付ける場合、変更した1行(改行が含まれても2~3行)しか差分として出ないので、大きな違いだと考えております。


UnityではUnityYAMLと呼ばれる独自のyaml表記を用い、GameObject同士でどのような親子関係があるのか、各GameObjectにどのようなComponentがアタッチされていて、値が何なのか、を管理しております。
1回のプルリクエストでGameObjectやComponentを複数個所変えることが多いため、Unityファイルは膨大な差分となる傾向があります。
Unityファイルに関してファイル変更に関するルールを決めておかないと、頻繁にコンフリクトが発生してしまうため、注意が必要となります。
実行環境の管理が複雑
Unity以外でもパフォーマンス向上のためにマルチスレッドで処理を行う場合に起こりうるのですが、実行環境の管理が難しい点を取り上げます。
下記では私のプロジェクトで用いているUnityにおける実行環境の管理の難しさを記載しております。
Unityでは通常MainThreadという一つのスレッドで処理を実行しています。
MainThread内にfor文を用いた数値計算処理を組み込むと同時にUIや3Dオブジェクトを更新したいとなった場合、MainThreadの負荷が大きくなってしまい、フレームレートが低下し、処理が遅く見えてしまいます。
その問題を解決するために、await UniTask.SwitchToThreadPool(); を用いることでMainThread以外に新しくスレッドを立てることができ、パフォーマンス向上につながることがあります。
しかし、Unity提供の多くのAPIはMainThreadのみ動作するという制限があるため、MainThread以外で動かそうとすると UnityException: (APIの名前) can only be called from the main thread というエラーが出ることがあります。
学生時代のプログラミングで遭遇する機会が少なく、1年目での習得が難しいと感じております。
UIを作るのが苦手
Webページを表示する技術のCSSであれば標準で備わっている機能だけで作れても、Unity標準で扱えるuGUIだと難しくなることがあります。
例えば、ボタンのUIをデザイナーが提案したものにしたい場合を考えます。
CSSを用いた開発の場合、よほど凝ったデザインではない場合は、.htmlと.cssのファイルをローカル環境に作り、border, border-radius, background-colorなどのCSS標準プロパティだけで作れると思います。
uGUIで同じようなことをするには、カスタムメッシュの作成、シェーダーの編集、外部ライブラリの使用などのいずれかの対応方法を実施することにより可能ではありますが、いずれの方法でも一手間かかってしまいます。
また、CSSではFlexboxを用いた配置調整があり、uGUIにおいてもVertical Layout Group, Horizontal Layout Group, Layout ElementといったComponentをアタッチすることで可能ではありますが、どうしても作れない箇所は自作でスクリプトを書くことがあります。
さらに、1つ目の短所とも重なりますが、uGUIを修正する場合、ほとんどの場合Unityファイルの大量の変更は避けられません。
UnityではuGUIの代替としてUI Toolkitを用いることでCSSのようにプロパティを記述することは可能ですので、新規プロジェクトの場合は検討の余地がありそうです。
おわりに
KENTEMでは、様々な拠点でエンジニアを大募集しています! 建設×ITにご興味頂いた方は、是非下記のリンクからご応募ください。 recruit.kentem.jp career.kentem.jp