Search Unity

【アーティストワークフロー編】Unity 2020 LTS で生産性を上げるための 70 のヒント +α 日本語訳

  • アーティスト向け

<このページで学べる内容>

Unityは2020年夏に、Unity 2020 LTSのワークフローを加速させるための70以上の時間節約のヒント(Tips)を集めたeブックを公開しました。 https://create.unity3d.com/ebook-improve-workflow こちらのeブックは英語版ですが、Unity for Proではこれの日本語訳を作成しました。第2弾の本記事では、アーティストワークフローに関する部分を紹介します。 本記事の一部TipsはすでにUnity Blogでも日本語で公開していますので、そちらもご覧ください。 https://blog.unity.com/ja/technology/speed-up-your-artist-workflows

アーティストワークフロー

このセクションでは、Unity 2020 LTSに搭載されたアーティスト向け機能の改良に焦点を当てます。アーティスト向け機能はより使いやす く、直感的なものになりました。待ち時間が短くなり、より効率的にコンテキストに照らした修正を繰り返し行えるようになったことで、2D アーティスト、3D アーティスト、テクニカルアーティスト、アニメーター、レベルデザイナーなどの職種の方にとっては、仕事がやりやすくなりました。

ここで紹介する2D関連のヒントと改良点の多くが、Unityがネイティブに備えている2Dツールとグラフィックス技術を披露するために作られたサンプルプロジェクト『Dragon Crashers』で使われています。このプロジェクトのゲーム部分は、サイドスクロール放置型RPGの バーティカルスライスになっています。サンプルプロジェクトはアセットストアで入手できます。

『Dragon Crashers』のスクリーンショット

スプライトアトラス

2Dプロジェクトではビジュアルを構築するためにスプライトが使われます。そのため、テクスチャーアセットの数が増え、ド ローコールも多数要求される可能性があります。リソースを最適化するために、スプライトやテクスチャを個別に描画するのではなく、スプライトアトラス(Asset > Create > Sprite Atlas)を使うようにしましょう。

スプライトアトラスは複数のスプライトを結合して、1つのスプライトにまとめたもの。

スプライトアトラス(ファイル拡張子 .spriteatlas)がAssetsフォルダー内に表示されます。

Objects for Packing リストにスプライトを追加し、include in buildを有効にしてプロジェクトにスプライトを含めるようにします。Packingオプションを使ってアトラス内でスプライトをレイアウトする時に互いのレイアウトがどのくらい近接するか、また各スプライトを回転させてよいかを決定します。

スプライトアトラスの設定

UnityのUIシステムでは、アトラス作成とゲームオブジェクトの構造がバッチに影響する。

テクスチャーが結合されていれば、Unityはパックされたテクスチャーに1回のドローコールでアクセスすることができ、パフォーマンスのオーバーヘッドを小さくできます。

UIレイアウトを適切に構成していれば、スプライトアトラスを使うことでドロー コールを削減できます。Unityはゲームオブジェクトの階層を親から子へとスキャンし、同じテクスチャーとマテリアルを使うオブジェクトをバッチにまとめます。

Optimizing Unity UI」ベストプラクティスガイド(特にセクション4のフィルレート、キャンバス、入力に関する部分)を読み、最適な結果を得られるようにUIを構築する方法のヒントを確認してください。

SpriteAtlas APIを使えば、実行時にさらに細かい制御を行うことができます。バリアントスプライトアトラスを作ったり、スプライトアトラスをスクリプト内で遅延バインディングを使って他の方法で配布する準備をしたりすることができます。

2D ワークフローに関する 10 のヒント

Unity はネイティブの 2D ツールを進化させ、さらに素早く開発を行えるようにしました。ここで紹介するヒントを活用して時間を節約しましょう。

1 . 2D Pixel Perfect パッケージには解像度を変えてもピクセルアートをはっきり鮮明な形で表示できるPixel Perfect Cameraが含まれています。これを使えば、アートアセットのサイズを手動で変える必要はなくなります。

SouthPAW Games がはじめて制作したピクセルアートスタイルのゲーム『Skul: The Hero Slayer』で、Unity の2Dツールを2D Pixel Perfectパッケージとあわせて使い、冒険の旅を鮮やかに描き出した方法を解説したブログ記事もお読みください。

Pixel Perfect Camera

2D Pixel Perfect Camera

2. Photoshop ファイルになっているアセットを使うなら、PSDImporterパッケージを使いましょう。スプライトを小分けにしてエクスポートする手間を省き、PSB ファイルをインポートすることができます(PSB ファイルはより一般的なPSDファイルより大きな画像をサポートするもので、機能的には同等です)。これで複数のスプライトをさまざまなレイヤーからインポートすることができ、スプライトシート2Dキャラクターリグを生成することができるようになります。PSD Importerによる2Dワークフローの高速化に関するこちらのガイドもご覧ください。

2D PSD Importer はパッケージマネージャーから利用可能。

3 . 大規模なグリッドベースのワールドを作る時は、タイルマップを使いましょう。ヘックス形式や等角法のタイルマップにも対応しており、またサイズやパフォーマンスについても最適化されています。タイルマップを使って2Dゲームを最適化するヒントをこちらのガイドでさらにご紹介しています。

タイルマップを使えば、等角法などグリッドで表現された環境を描くことができる。

背景を作る『Dragon Crashers』のタイルマップ。

4 .リギング、テッセレーション、 ボーン生成と併せて、スムーズな2Dスケルトンアニメーションを作りましょう。2D Inverse Kinematics(IK)は2Dボーンが狙った位置にどのように到達するかを計算してくれるので、アニ メーションを単純化することができます。

『Dragon Crashers』のドラゴンのキャラクターをアニメーション化する。

5 .2D Lightを使ってビジュアルを強化しましょう。ライト機能はライトの色、強度、減衰、ブレンド効果など、簡単に調整できるパラメーターを備えていま す。Odd Bug StudioのMartin Reinmann氏によるこちらの記事をご覧いただけば、2Dライティングについてのヒントをさらに知ることができます。

『Dragon Crashers』のライティング設定

6.2D Sprite Shapeを使うと、リッチな自由形状の2D環境を、視覚的かつ直感的なワークフローに よって作成することができます。この機能は、スプライトをシェイプのアウトラインに沿ってタイリングし、アウトラインの向きに応じて自動的に変形と反転を行ってくれます。

最新の2Dサンプルプロジェクトにおける2D Sprite Shapeの使われ方の一例。

7.スプライトを好みの方向に沿って並び替えましょう。この機能は同じレイヤーにあり、ソート順も同じスプライトが多数ある時(たとえば、各カードが少しずつ重なり合うカードゲームを作る時など) に便利です。

ビルトインレンダーパイプラインでは、Edit > Project Settings > Graphicsを開くとこの機能を使えます。Transparency Sort Mode Custom Axisを選択します。たとえば、(0, 1, 0)をTransparency Sort Modeに設定すると、Y軸に沿って上から下に向かって並び替えます。

ユニバーサルレンダーパイプラインでは、Camera.transparencySortModeTransparencySortMode.CustomAxisに設定し、Camera.transparencySortAxisを使って並び替えの軸を設定します。

Transparency Sort Modeと設定された並び替えの軸。

8. カスタムシェーダーが必要な場合は、シェーダーグラフに含まれる2D向けに設計された2つのマス ターノードを使いましょう。すなわち、Sprite LitSprite Unlitです。2Dシェーダーを作り、2Dプロジェクトのビジュアルを強化しましょう。

『Dragon Crashers』のシェーダーグラフのサンプル

9 . オーバードローを減らしてパフォーマンスを改善しましょう。インポート設定で各スプライトのMesh TypeTightに切り替えます。重複するグラフィックスは可能な限り1つのスプライトにまとめ、ゲームで使わない背景レイ ヤーに入る可能性があるスプライトは極力無効化します。こうすることで、オーバードローされる領域が減り、隣り合うスプライト同士が重複する可能性を減らせます。

スプライト間のオーバードローを減らす。

10 .2Dスプライトエディターを使って、各スプライトの周りにカスタムのアウトラインを定義し、未使用の領域を最小化することも検討しましょう。

スプライトエディターでカスタムのアウトラインを設定しているところ

プレハブワークフロー

プレハブは設定が完了したゲームオブジェクトをプロジェクト内で保存して、再利 用できるようにしたものです。プレハブを現在のワークフローに取り入れること で、シーンを柔軟かつ効率的に組み立てることができます。

『Dragon Crashers』では、各ユニットはベースとなるユニットをオーバーライドする形で作られている。

Overrides ドロップダウンにはいま見ているプレハブとオリジナルとの相違点が表示される。

プレハブをプロジェクトのアセットとして作成し、Prefab モードで独立に編集できます。プレハブごとに独立して作業することで、意図しないオーバーライドを適用することを防げます。背景がグレーアウトされた状態であれば、安心して変更を加 えることができます。

コンテキスト内、独立した環境のどちらでも個別のプレハブを編集できる。

コンテキスト内で編集するモードでは、シーン内の他のオブジェクトとプレハブを比べて見ることができる。

プレハブモードではプレハブを独立して扱い、意図しないオーバーライドが発生しないようにできる。小さなプレハブが入れ子状のプレハブを構成していることに注目しよう。

入れ子状のプレハブを使えば、プレハブをプレハブの親にすることができます。建物のような大きなプレハブに、部屋や家具などの小さなプレハブを組み合わせて作ることができるようになりました。これにより、アセットの開発を複数のアーティストや開発者のチームに分け、それぞれがコンテンツの別の部分を同時に作業し て、効率を上げることができます。

プレハブバリアントは、オブジェクト指向プログラミングの継承のように、他のプレハブからプレハブを派生させることができます。特定の部分を上書きしてバリアントを変更しても、オリジナルには影響を与えることはありません。また、いつでも変更した部分をすべて削除して、ベースのプレハブに戻すことができます。

また、ベースとなるプレハブ自体に直接変更すれば、すべてのバリアントを一度に変更することができます。

Unity の新しい 2D デモ「Dragon Crashers」のプレハブバリアント。それぞれ異なる武器と能力を持たせている。

Unityでのプレハブの扱いについては、プレハブワークフローの改善のページをご覧ください。

Apply All to Base を使ってベースのオブジェクトに変更を反映させたり、Revert All を使ってオーバーライドを元に戻したりすることができる。

TextMeshPro

TextMeshPro は Unity の UI Text と従来の Text Mesh を置き換えるものです。カスタムシェーダーと高度なテキストレンダリング技術を用いて、柔軟なテキストスタイリングとテクスチャリングを実現しています。

TextMeshPro を使用すると、文字、単語、行、段落のスペーシング、カーニング、テキストの両端揃え、リンク、30 種類以上のリッチテキストタグ、マルチフォントとスプライトのサポート、カスタムスタイルなどの機能を利用できます。

『Dragon Crashers』でのTextMeshProの使用例。

スナップ

グリッドを使って作業することで、プレハブを当て推量ではなく、より一貫性を持ってプレハブを組み立てることができます。レベルデザインの時に、ピースがグリッドの目盛りに合わせてつながるようにすると、並べ替えや再構築が容易になります。

モジュール式のアセットからシーンを構築する場合は、グリッド面を使用して ゲームオブジェクトの位置を調整してください。インスペクターに丸めた数値を手動で入力するよりも、グリッドスナップツールでより素早く正確にトランス フォームを設定することをお勧めします。

グリッドとスナップの設定

Unity には 3 種類のスナップが用意されており、シーンを素早く組み立てることができます。

  • ワールド空間のグリッドへのスナップ:移動ツールのハンドルの向きが Global に設定されていることを確認してください。Ctrl(Windows)キーまたは Cmd(macOS)キーを押したままにすると、Edit > Grid and Snap Settings で設定したワールド空間のグリッドの増分だけずらしながらオブジェクトをスナップできます。
  • 表面スナップ:Shift キーと Ctrl(Windows)キーまたは Cmd(macOS)キーを押したまますると、オブジェクトを任意のコライダーと交わる場所にスナップできます。
  • 頂点スナップ: 移動ツールをアクティブにして、V キーを押したままにします。これは、選択中のゲームオブジェクトを別のメッシュの頂点位置に移動させるものです。移動する前に、アクティブなゲームオブジェクトの1つの頂点の上にマウスを置くと、その頂点がピボットとして機能します。Shift+Vキーで頂点スナップモードのオン・オフを切り替えます。

頂点スナップと表面スナップを組み合わせると素早くオブジェクトを配置することができます。

  • 頂点スナップを使って、VキーまたはShift + Vキーを組み合わせて、ゲームオブジェクトを移動します。ピボットとなる頂点の上にカーソルを置きます。通常通り、別の頂点にスナップします。
  • ShiftキーとCtrl(Windows)キーまたはCmd(macOS)キーの組み合わせを押したまま、対象となるメッシュのサーフェスに沿ってドラッグします。
  • オブジェクトが目的の位置に来たら、マウスボタンとVキーを離します。

Grid and Snap ウィンドウは Edit > Grid and Snap Settings メニューまたは Grid Visibility ドロップダウンメニューのいずれかから開くことができます。

グリッドとスナップの設定

以下のグリッドスナップのためのショートカットはデフォルトで作成されます。

アクションデフォルトのショートカット
グリッドサイズを大きくするCtrl + ] (Windows) または Cmd + ] (macOS)
グリッドサイズを小さくするCtrl + [ (Windows) または Cmd + [ (macOS)
グリッドを少し後ろに動かすShift + [
グリッドを少し前に動かすShift + ]
選択したものをグリッドに合わせるCtrl + \ (Windows) または Cmd + \ (macOS)

もっと細かく制御する必要がある場合は ProGrids パッケージを使えば、スナップ平面やグリッド平面をさらに細かく制御できます。

ProGrids

アニメーションワークフロー

アニメーションウィンドウ(Window > Animation > Animation)を使えば、コードを 1 行も書かずに、Unity のあらゆるプロパティをアニメーション化することができます。動きの変更だけでなく、カスタムスクリプトで定義したパラメーターを変更することもできます。

このウィンドウでアニメーションクリップを作ることもできますし、お好みの サードパーティ製 DCC パッケージ(Autodesk® Maya® やBlender など)で作業することもできます。1 つのクリップを 1 つの動きの単位として考えます。

アニメーションウィンドウは、カーブやドープシートと同じアニメーションデータを表現することができる。

ウィンドウ内の AnimationClip アセットを、Dopesheet または Curve のいずれかのモードで編集します。K キーまたは C キーのショートカットをそれぞれ使用して、この 2 つを切り替えます。標準のショートカットを使って、すべてのキーフレームをフレーム化(A キー)、または選択したキーフレームをフレーム化(Fキー)することができます。

AnimatorControllerがビジュアルグラフでアニメーションクリップ同士をつなぐ。

ゲームオブジェクトに複数のアニメーションクリップを持たせると、AnimatorController はステートマシンの役割を果たし、アニメーションクリップの間にフローチャートのようなグラフを作成できます。

これにより、アーティストはプログラマーの手を借りずに高度なアニメーションを制作することができます。2D または 3D のリグを使用している場合、そのボディパーツをそれぞれ異なるロジックでアニメーションさせることができます。レイヤー機能やマスク機能を活用すると、より制御しやすくなります。ビジュアルプログラミングツールでモーションを試作し、クリップ間のトランジションやインタラクションを微調整します。

Animation Rigging パッケージを使えばさらに拡張することができます。本パッケージは、プロシージャルモーションの作成に使えるリグおよびインバースキネマティック制約のライブラリを提供します。アニメーション化されたスケルトンは、「実行時のリギング」によって環境と相互作用することができ、また、物理ベースの制約に よってダイナミックなセカンダリモーションを追加することができます。

制約により、実行時にアニメーションが修正される。

最適化のヒント

AnimatorController は便利ですが、いくつかの注意点があります。

  • アニメーターを、特に UI 要素と組み合わせて使いすぎないようにしましょう。アニメーターは、アニメーションが再生されていなくても、フレームごとに UI Canvas を再構築します。UI やシンプルなアニメーションには、可能な限り従来の Animation コンポーネントを使用してください。また、トゥイーン関数を作成したり、サードパーティ製のライブラリ(例:DOTween)を使う事も検討してください。
  • デフォルトでは、Unityはアニメーション化されたモデルをGenericリグでインポートしますが、開発者がキャラクターをアニメーション化する時はHumanoidリグに切り替えることがよくあります。ヒューマノイドリグは、使用していない時でも、フレームごとにインバースキネマティクスとアニメーションのリターゲティングの計算を行います。これらの特定の機能を必要としない場合は、Genericリグを使用してCPU時間を節約するようにします。

これらのコンポーネントの使い方については、アニメーションクリップアニメーターコントローラーのマニュアルページをご参照ください。アニメーションコンポーネントの最適化については、Unity のベストプラクティスをお読みください。こちらのプラクティスは随時更新されております。

カスタムのギズモとアイコン

ギズモは、ゲームオブジェクトに関連付けられた小さなオーバーレイグラフィックです。ビューポートをナビゲートしたり、特定のオブジェクトを探したりするのに使用します。

Select Icon メニューを使って、ゲームオブジェクトのアイコンを変更します。Other を選ぶと、独自のアイコンを定義できます。

インスペクターのドロップダウンを使って、ギズモを切り替えます。 Other . .オ. プションを使って、カスタムギズモを選択します

また、スクリプト付きのギズモを作り、インタラクティブにすることもできます。たとえば、ギズモは、カスタムコンポーネントが影響する体積や面積を定義する時に役立ちます。

この例では、スクリプトが選択内容に応じてギズモを変化させます。

シーンコントロールバーの Gizmos ダイアログを使って、特定のギズモのオン・オフを切り替えたり、すべてのギズモのオン・オフをグローバルで切り替えることができます。

使用例については、「Creating Custom Gizmos for Development」チュートリアルを参照してください。また、GizmosHandles の API もご確認ください。

プログレッシブライトマッパー

ライトマップでは、直接ライティングと間接ライティングの両方を事前に計算し、その結果をライトマップと呼ばれるテクスチャに保存して、後で使用することができます。Unity には、高品質なライティングとシャドウを生成するためのグローバルイルミネーション(GI)技術が多数用意されています。ライトマップに保存されたジオメトリは実行時のパフォーマンスが高いものの、ライトマップのベイクにはこれまでコストがかかっていました。

ライトマップを適用した最終シーン

ライトマップを使用していない同じシーン

プログレッシブライトマッパーは、計算結果を早めに出力し、時間経過とともにレンダリングを洗練させていく高速パストレーサーです。このように、最終的なベイク結果を待たずに、プロセスを中断して変更を加えることができるので、より迅速に反復修正を加えることができます。ここでは、ライトマップを高速化するためのヒントをご紹介します。

  • Prioritize View を有効にすると、プログレッシブライトマッパーが、シーンビューに表示されているテクセルを、ビュー外のものを変更する前に処理するようにします。
  • 不必要な Samples(Direct Samples と Indirect Samples)と Bounces(通常は 2 で十分です。必要な場合のみ増やしてください)を減らします。
  • ライトマップの解像度とテクセル数を、ライティングに合わせて最適化します。テクセル数は、ライトマッパーがどれだけの作業をしなければならないかを表しています。ライトマップは 2D のテクスチャなので、ライトマップの解像度を 2 倍にすると処理量が 4 倍になります。
  • 隠れた表面や小さくて薄い物体など、ライトマップの効果があまり期待できないものについてはテクセルを減らします。グローバルイルミネーションに貢献する各 MeshRenderer には、ライト
  • マップでの相対的な UV サイズを小さくする Scale in Lightmap オプションがあります。
  • Baked IndirectSubtractiveShadowMask から、適切な Lighting Mode を選択します。アートディレクションに必要でなければ、シャドウのベイクを行う必要はありません。
  • 現在のプログレッシブ CPU ライトマッパーは、実行するマシンの CPU と RAM を使用します。新しいプログレッシブ GPU ライトマッパー(プレビュー版)は、GPU と VRAM を使用するため、ベイクが大幅に高速化する可能性があります。使用するコンピューターがハードウェアおよびソフトウェアの要件を満たしていれば、ライティングのワークフローを劇的に加速させることができます(場合によっては 10 倍になります)。

ベイクされたライトマップのプレビュー

ライトプローブ

グローバルイルミネーションは、美しい間接照明を作り出しますが、これを計算してディスクに保存するにはコストがかかります。ライトマップを必要としないセットの装飾やその他の静的メッシュがある場合は、ライトマップのベイクからそれらを削除し、代わりにライトプローブを使うことを検討してください。

この例では、ライトプローブは小さなオブジェクトに対して直接光と反射光の両方を近似することができ、より高品質なライトマッピングをより目立つ場所に使えるようになります。Viking Village プロジェクトに適用されたライトマップの設定は以下のようになっています。

『Viking Village』プロジェクトに適用されたライトマップ。

ライトマップの効果が見えにくい小さなディテールに対してはライトプローブを使う

以前はダイナミックなオブジェクトのためのものでしたが、ライトプローブはスタティックなメッシュにも適用できます。MeshRenderer コンポーネントで、Receive Global Illumination のドロップダウンを探し、Lightmaps から Light Probes に切り替えます。

ライトプローブのイルミネーションは正確な UV を必要としないため、メッシュをアンラップする余分なステップを省くことができます。プローブによるライティングで使用されている球面調和基底関数は、ライトマップに比べて計算速度が速いのが特徴です。 ライトプローブとライトプローブのグループをシーン内に空間的に配置します。プローブライトは、一般的にライトマップよりも高速にベイクが行えます。

Light Probes を選ぶ

ステージ全体に配置されたライトプローブを1つのライトプローブグループにまとめる。

ライトプローブを使用してシーンオブジェクトを選択的に照明する方法については、

ライトプローブを使用した静的ライティング」を参照してください。

Unity のライティングワークフローについては、「Unity で現実のようなビジュアルを作成する」をご覧ください。

この記事はいかがでしたか?