🔥

【UE4】Unity歴5年の僕がUE4のディレクトリ構成で気を付けているたった1つのこと

2021/01/04に公開

はじめに

こんにちは、
Unity歴5年の僕がUnreal Engineをこれから学びたい人向けの記事を書く
の著者のイワケンです。

この記事の通り、僕は最近Unrealを仕事で触り始めたのですが、最初Unrealのディレクトリ構成をどうするべきか悩んでいました。

この答えを出すために、色んな人に聞き、調べ、様々なプロジェクトを経験して、

どのプロジェクトでもディレクトリ構成で意識していること を書きたいと思います。

目次

  • 結論
  • 理由
  • 例外
  • 謝辞

結論

僕が必ず意識していることは、
Content/{Project Name}以下に自分たちのディレクトリを展開する、です。

※ UnrealのContentフォルダは、UnityのAssetsフォルダ的存在

{Project Name}は{Project Code}と捉えていただいても大丈夫です。

例えば、
HoloLensTestというプロジェクト名/プロジェクトコードだったら、

Content/HoloLensTest

というディレクトリを作り、その下に

Content/HoloLensTest
└ BluePrints
└ Maps

のようにディレクトリを作ります。

{Project Name}以下のディレクトリ構成はプロジェクトごとにカスタマイズして良い方針にしています。
また、私は個人プロジェクトでも必ずこの構成にしています。

間違っても
Content/Maps
のような、Content直下にディレクトリを作ることは基本的にはありません。

理由

理由は

  • 他プロジェクトにMigrate (移行)したときに、データが混ざらないようにするため
  • Unityと比べて圧倒的に、ディレクトリ構造の変更コストが高い

からです。

Unrealで他プロジェクトにデータ移行する場合、UnityでいうunitypackageのようなデータのExport/Importの仕組みがないため、Migrateという(実質コピー&ペースト)機能で移行します。

もし

Content/Maps

のようなディレクトリ構造だったら、他のプロジェクトに移行したときに、どのプロジェクトのMapsフォルダかわからなくなります。

なので、Content/{Project Name}と、プロジェクトごとにディレクトリがわかれるようにします。

しかし、Unityユーザはこう思ったでしょう。

「でもあとから、ディレクトリ構造変えればいいんじゃない?」

そんなあなたは痛い目にあいます。

詳しくはこの記事の「アセットの参照:Unityはmetaファイルのguid, UE4はContent以下の相対パス」を見てほしいです。

https://zenn.dev/iwaken71/articles/fddbed402d0658#アセットの参照%2F移行

Unrealでは、Content以下の相対パスで参照を持つため、Content以下のディレクトリ構造を変更するということは、すべての参照パスを更新する必要があります。

そのため、その参照パスの数が多ければ多いほど、時間がかかります。

また、しっかり行ったつもりでも、参照が外れていることがあります。

また、Redirectorが生成され、fixしないといけないかもしれません。その際にチームの皆に確認する必要がでてくるかもしれません。

このように、Unityの感覚で行うと地獄が始まるのです。

なので、UnrealはUnity以上にディレクトリ構造の設計に気を配り、できるだけ事前に決めておく必要があるのです。(チーム開発の場合、Unityでもディレクトリ構造の設計は重要だと思っています)

例外

とはいえ、いくつか例外もあります。

  • MarketPlaceのAssetsで元からフォルダ分けされているディレクトリ
  • Moviesフォルダ

※ UnrealのMarketPlaceはUnityでのAssetStore的存在

MarketPlaceのAssetsで元からフォルダ分けされているディレクトリ

MarketPlaceのAsset群をプロジェクトに展開すると

  • Content
    • HoloLensTest
    • MarketPlaceAssets

のようになっているケースがあります。

これを無理やり

  • Content
    • HoloLensTest
      • MarketPlaceAssets

のような構造にしようとすると、MarketPlaceAssetsのデータが大きい場合、UE4がクラッシュする可能性があります。

なので、作った人が違うという意味でも、

  • Content
    • HoloLensTest
    • MarketPlaceAssets

のように、Content以下で分ける運用が良いかと思います。

Moviesフォルダなどの特殊フォルダ

Unrealの中でMoviesフォルダは特殊なフォルダです。
Content直下にMoviesという名前で置き、mp4などの動画データを置くと、Unreal内で動画dataをロードすることができます。

https://docs.unrealengine.com/ja/WorkingWithMedia/MediaFramework/HowTo/FileMediaSource/index.html

Unityでいう、StreamingAssetsフォルダに近いテンションでしょうか?
フォルダの位置と名前が指定されています。

謝辞

この考えに至るまでに

https://historia.co.jp/archives/13406/

の記事を参考にし、様々な人と議論させていただきました。感謝いたします。

Discussion