Search Unity

Unity 2021の2Dゲーム向け新機能紹介

  • ゲーム開発
  • 開発者向け

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

Unity 2021の2Dゲーム向け新機能をピックアップして紹介します。

はじめに

Unityはアップデートの度にたくさんの機能が追加されており、その中には2Dゲーム向けの機能も多数含まれています。

本記事では、Unity 2021の新機能のうち、以下の2Dゲーム向けの機能をピックアップして紹介します。

  • Unity 2021.1 または Unity 2021.2で追加され、Unity 2021 LTSで利用可能なエディターの新機能
  • 最小必須Unityバージョンが、Unity 2021.1 または Unity 2021.2のUnityパッケージの新機能

Universal Render Pipelineの2D Renderer

Universal Render Pipeline(以下、URP)は、Unityにおける次のUnity標準レンダリングパイプラインです。Unity 2021 LTSではURPのバージョン12が利用可能です。URPバージョン12では2D向けに多くの機能追加・改善がされています。

2D Rendererを設定したURPでも、Visual Effect Graph(ノードベースのビジュアルエフェクトエディター)が利用可能になりました。URP バージョン12およびVisual Effect Graph バージョン12以降のバージョンで利用可能です。次のスクリーンショットは、Unity公式サンプル「2d-renderer-samples」の「01 Feature Samples/08 Visual Effect Graph」のスクリーンショットです。

section01_no001_urp_vfx.png

2D Rendererでも Renderer Featureをカスタマイズできるようになり、Passを追加できるようになりました。次のスクリーンショットは、Unity公式サンプル「2d-renderer-samples」の「01 Feature Samples/09 Renderer Features」のスクリーンショットです。Scene Viewで表示されているキャラクターと背景のSpriteは、Game ViewではBlurがかかっています。インスペクターで表示している「2D Renderer Data Blur」のRenderer Featuresに、項目が追加されていることに注目してください。このサンプルでは、プロジェクト内に定義したScriptableRendererFeature「KawaseBlur」を用いてBlurをかけるPassを追加しています。

section01_no002_urp_renderer_feature.png

Experimentalだった「2D Light」は、URPバージョン12で正式版となりました。Experimentalが外れたことにより、コンポーネントの名前空間が変わっていることに注意してください。URPバージョン12では次のLight Typeをサポートします。

なお、URPバージョン11からParametric TypeはDeprecatedになり、Point TypeはSpot Typeに名称が変更されました。

2D LightはEditorの改善もされています。Light Explorer Windowに2D Lightsタブが追加されました。次のスクリーンショットは、Unity公式サンプル「2d-renderer-samples」の「01 Feature Samples/01 Light Types」で、Light Explorer Windowを開いた状態のスクリーンショットです。2D Lightでも、シーン内のLightを素早く確認し、調整しやすくなりました。

section01_no003_urp_light_explorer_window.png

これ以外にも魅力的な機能がURPに追加されています。下記のページも参照してください。

2D Project Templateと2D Feature set

Unity Hubから新規のプロジェクトを作成する際のProject Templateにも、2D向けのアップデートがあります。新たに2D向けの「2D(URP)」テンプレートが追加されました。

section02_no001_2durp_template.png

2D(URP)テンプレートを使うことで、2D Rendererを設定したURPのプロジェクトを生成できます。次のスクリーンショットのようにRenderer AssetやPipeline Asset、Scene Templateが作成され、必要なプロジェクト設定も行われた状態でプロジェクトが生成されます。

section02_no002_2durp_project.png

次のスクリーンショットには、2D(URP)テンプレートで作成したプロジェクトの依存するパッケージが表示されています。表示されているパッケージの中には、「com.unity.2d.animation(2D Animation)」や「com.unity.2d.tilemap(2D Tilemap Editor)」などの、2D向けのパッケージがありません。一方で、「com.unity.feature.2d」というパッケージがあります。

section02_no003_2durp_packages.png

これは2D向けのpackageをまとめた2D Feature setです。「Feature set」はUnity 2021.2で追加された、複数のpackageをまとめる機能です。2D Feature set v1.0.0には、次のpackageが含まれています。

2D Feature setはPackage Managerからも導入可能です。なお、Feature setでまとめられるパッケージのバージョンは、相互に互換性があります。

section02_no004_2d_feature_set.png

Feature setは便利ですが、注意点もあります。Feature set中に使わないパッケージがある場合、そのパッケージのみを削除できません。Feature setの中でプロジェクトに導入する必要ないパッケージがある場合、Feature setを導入するのでなく、導入したいパッケージを全て個別に導入することを検討してください。

なお、「Feature setを導入するが、Feature setが指定するパッケージバージョンよりも新しいバージョンを導入する」ということは可能です。詳しくは、公式マニュアル「Removing an installed package」を参照してください。

2D Feature set以外にも、MobileARVRなどいくつかのFeature setが存在します。

2D Pixel Perfectパッケージ

2D Pixel Perfectパッケージ、およびPixelPerfectCameraのアップデートについて紹介します。

2D Pixel Perfectパッケージが提供する、PixelPerfectCameraを使うことでピクセルアートを鮮明でクリアに表現できます。ところがパッケージとして提供されている2D Pixel Perfectパッケージは、今後バグ修正を受け付けるのみとなりました。今後は、URPにあるPixelPerfectCameraをホームとし、こちらに機能追加がされていきます。2D Pixel PerfectパッケージとURP、両方にPixelPerfectCameraというクラスがあることに注意してください。(それぞれのクラスの名前空間は異なります。)

URPを利用しているプロジェクトでは、2D Pixel Perfectパッケージ内のPixelPerfectCameraコンポーネントではなくて、URP内のPixelPerfectCameraコンポーネントを利用してください。次のスクリーンショットの警告の内容通り、互換性がなく利用できません。

section03_no001_warning.png

URPのPixelPerfectCameraのEditorが改善されました。既存のPixelPerfectCameraのEditorは、「Crop FrameのX・Yチェックボックスが両方チェックされている時のみ、Stretch Fillチェックボックスが出現する」というように条件でUIが変化する仕様でした。

section03_no002_beforepng.png

改善により、チェックボックスではなく、次の画像のようにドロップダウンから選択するようになりました。

section03_no003_after.png

2D Animationパッケージ

2D Animationパッケージにも機能が追加されました。

2D Animationパッケージは、スプライトアニメーション(描画するスプライトを切り替えることによるアニメーション)ではなく、スケルタルアニメーション(スプライトのローテーションやボーンによるメッシュのデフォームによるアニメーション)に用いるパッケージ』というイメージを持つ方も多いのではないでしょうか。2D Animation バージョン6.0.0において、実行時に描画されるSpriteを切り替えることができる「Sprite Swap」機能のプレビューが外れました。これにより2D Animationパッケージをスプライトアニメーションにも、安心して活用できるようになりました。

2D AnimationパッケージSpriteLibraryコンポーネントやSpriteResolverコンポーネントを活用したスプライトアニメーションでは、複数キャラクターのアニメーションにおいて、同一のAnimatorController・AnimationClipを使い回すことが可能です。

次のGIFは、2D Animationパッケージのサンプル「5 SpriteSwap/1 Flipbook Animation Swap」を実行した様子です。Hero、Zombie1、Zombie2の計3個のGameObjectがスプライトアニメーションをしています。

それぞれのGameObjectは異なるスプライトアニメーションが表示されていますが、Animatorコンポーネントにおいて同一のAnimatorController「Scavenger」を参照し、使い回していることに注目してください。3個のGameObjectにおいてAnimatorControllerは同一のControllerを参照していますが、SpriteLibraryコンポーネントにおいて、次のスクリーンショットのように異なるSpriteLibraryAssetを参照しています。

section04_no002_sprite_library.png

このようにSpriteLibraryコンポーネントにおいて異なるSpriteLibraryAssetを参照することで、同一のAnimatorController・AnimationClipを利用し、異なるスプライトアニメーションを実現できます。

なお「Sprite Swap」は、スケルタルアニメーションと組み合わせることもできます。下記は、2D Animationパッケージのサンプルにおける「5 SpriteSwap/2 Animated Swap」のスクリーンショットです。

section04_no003_bone_animation.png

また、2D Animationバージョン7.0.0では、スケルタルアニメーション向けのSkinning Editorが改善されています。

選択したボーンが影響を与えるスプライトを確認できるSprite Influence toolが追加されました。次は2D Animationパッケージのサンプル、「5 SpriteSwap/4 Character」内のアセットを、Skinning Editorで開いた画面のスクリーンショットです。

section04_no004_bone_influence.png

ボーンの色を変更するカラーピッカーが追加されました。

section04_no005_bone_color.png

また、Skinning Editor Toolsのホバー時に、利用可能なショートカットが表示されるようになりました。

2D PSD Importerパッケージ

2D PSD Importerは、PSB (Photoshop Big) ファイルフォーマット用のScriptedImporterを提供するパッケージです。

2D PSD Importerバージョン5で、「Skeleton sharing」が追加されました。これにより、ボーンの階層構造を司るskeletonアセットを、異なるアセットで使いまわせるようになりました。下記のスクリーンショットで示すpsbアセットでは、Main Skeltonに別のアセットのskeletonを設定し、Skeleton sharingを行なっています。

section05_no001_skeleton_sharing_inspector.png

2D AnimationのUnity公式サンプルにある「5 SpriteSwap/6 Skeleton Sharing」にSkeleton sharingのサンプルがあります。下記は「5 SpriteSwap/6 Skeleton Sharing」のGIFです。

詳しくはこのサンプルと、2D PSD Importerパッケージのドキュメント「Skeleton sharing」を参照してください。

2D PSD Importerバージョン6では、レイヤーIDではなくレイヤー名にSpriteRectをマッピングする機能などを含む、PhotoshopとUnityの間のやりとりがより効率的になるようなレイヤー管理とマッピングに重点を置いた機能改善がされています。詳しくは、「2D PSD Importer 6.0 released for Unity 2021.2」を参照してください。

2D物理演算

2D物理演算にも新機能が加わりました。新たに加わったCustomCollider2DコンポーネントやPhysicsShapeGroup2D型などにより、プリミティブな形状の組み合わせによるColliderを、プログラムから生成したり編集したりできるようになりました。

次の画像は、Unity公式サンプル「PhysicsExamples2D」の「CustomCollider2D_Compound」シーンのスクリーンショットです。CustomCollider2DコンポーネントやPhysicsShapeGroup2D型を用いて、500個のプリミティブな形状(矩形、円、三角形、カプセル型)の組み合わせによるColliderが生成しています。

section06_no001_computed.png

次の画像は、同じく「PhysicsExamples2D」の「CustomCollider2D_Logo」シーンのスクリーンショットです。エッジと小さな円の組み合わせにより、プログラムから旧Unityロゴの形のColliderを生成しています。

section06_no002_logo.png

CustomCollider2Dコンポーネントは、Collider2Dコンポーネントを継承したクラスです。BoxCollider2DコンポーネントやCircleCollider2Dコンポーネントのように、GameObjectにコンポーネントとして設定し利用します。トリガーやPhysics Materialなど既存の物理演算機能は、CustomCollider2Dでも利用可能です。

CustomCollider2DコンポーネントとPhysicsShapeGroup2D型のサンプルコードです。

using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(CustomCollider2D))]
public class PhysicsExample : MonoBehaviour
{
        void Start()
        {
                var physicsShapeGroup2D = new PhysicsShapeGroup2D();

                physicsShapeGroup2D.AddBox(
                        center: new Vector2(-1.0F, 1.0F),
                        size: new Vector2(3F, 3F)
                );

                physicsShapeGroup2D.AddCircle(
                        center: new Vector2(3.0F, -1.0F),
                        radius: 2.0F
                );

                var capsuleCenter = new Vector2(-4.0F, 0.0F);
                physicsShapeGroup2D.AddCapsule(
                        vertex0: capsuleCenter + new Vector2(0.0F, 1.0F),
                        vertex1: capsuleCenter + new Vector2(0.0F, -1.0F),
                        radius: 1.0F
                );

                var polygonCenter = new Vector2(0.0F, -4.5F);
                physicsShapeGroup2D.AddPolygon(
                        vertices: new List<Vector2>
                        {
                                polygonCenter + new Vector2(0.0F, 0.0F),
                                polygonCenter + new Vector2(3.0F, 0.0F),
                                polygonCenter + new Vector2(0.0F, 3.0F),
                        }
                );

                var edgesCenter = new Vector2(-4.0F, -4.5F);
                physicsShapeGroup2D.AddEdges(
                        vertices: new List<Vector2>
                        {
                                edgesCenter + new Vector2(0.0F, 0.0F),
                                edgesCenter + new Vector2(3.0F, 3.0F),
                        }
                );

                var customCollider2D = GetComponent<CustomCollider2D>();
                customCollider2D.SetCustomShapes(physicsShapeGroup2D);
        }
}

このコードでは、次のスクリーンショットような、四角形、円、カプセル、三角形、エッジを組み合わせたColliderが生成されます。

section06_no003_script_example.png

既存の型にも新たなメソッドが追加されています。Collider2Dコンポーネントに、GetShapesというメソッドが加わりました。このメソッドを使うことでも、PhysicsShapeGroup2Dを編集できます。次のコードは、GetShapesを使って別のCollider2D型の形状を用いて、PhysicsShapeGroup2Dを編集するサンプルコードです。

[RequireComponent(typeof(CustomCollider2D))]
public class PhysicsExample : MonoBehaviour
{
        [SerializeField] Collider2D copyFrom;

        void Start()
        {
                var physicsShapeGroup2D = new PhysicsShapeGroup2D();
                copyFrom.GetShapes(physicsShapeGroup2D);

                var customCollider2D = GetComponent<CustomCollider2D>();
                customCollider2D.SetCustomShapes(physicsShapeGroup2D);
        }
}

Tilemap

2DマップエディターであるTilemapにも新機能が追加されています。

Tilemapコンポーネントのインスペクターに折り畳み要素Infoが追加されました。Infoを開くと、そのTilemapで利用しているTileアセット一覧とスプライト一覧が表示されます。

section07_no001_info.png

Tile Palette Windowのツールをカスタマイズできるようになりました。「Unity > Preference > 2D > Tile Palette」に「Deafult Tile Palette Tools」という項目が追加されました。Tile Palette Windowに回転・反転のツールを追加できるようになりました。

  • FlipXTool
  • FlipYTool
  • RotateClockWiseTool
  • RotateCounterClockwiseTool

また、ツールの順番を並び替えたり、使わないツールを非表示にしたりできます。

section07_no002_preference.png

細かい改善ですが、前回生成・保存したTileアセットのプロジェクト内のパスを記録し、次にTile Assetを生成・保存しようとする際、そのパスですぐに保存できるようになりました。


次はTilemapのパフォーマンス改善です。Tilemapに関して下記のパフォーマンスが改善されました。

  • 複数のタイルを設置する際のパフォーマンス
  • 2d-extrasのRuleTileのキャッシュパフォーマンス
  • Sprite Editorを使ってTextureをIsometric(等角投影)にスライスしたSprite。このSpriteから生成したTileの配置のパフォーマンス

Tilemapには、再利用可能なTileやBrush、型をまとめた2D Tilemap Extrasというパッケージがあります。

このパッケージがバージョン2.0.0から、Preview(Previewという名称はUnity 2020 LTSまでの名称)が外れ、Releasedパッケージとなりました。Released パッケージとなった、2D Tilemap ExtrasはUnity 2021.1とそれよりも新しいバージョンで利用可能です。それ以降もアップデートが行われ、Unity 2021 LTSで利用可能な最新バージョンは2.2.0となっています。また、テックリリース Unity 2022.1向けに、バージョン3系もリリースされています。


Tilemapに関係するAPIもいくつか追加されています。今まで「特定の位置にタイルを設置し、回転させ、色を変える」ためには、次の3つのメソッドを呼び出す必要がありました。

新たに加わったTileChangedData構造体を引数に取るSetTileメソッドのオーバーロードを使うことで、「特定の位置にタイルを設置し、回転させ、色を変える」処理を1つのメソッドで行うことができます。また、TileChangedData構造体の配列と、bool型ignoreLockFlagsを引数に取るSetTilesメソッドも追加されました。

TileをAnimationさせることも可能です。Tilemap Extrasには、「Animated Tile」というスプライトアニメーションを実現できるTileが提供されています。次は、Unity公式サンプル「2d-techdemos」で、「Animated Tile」を利用しているシーンのGIFです。

新たに加わった下記のメソッドを使うことで、アニメーションのタイミングを調整できるようになりました。これにより動的に生成したTileのアニメーションのタイミング調整も簡潔に行えるようになりました。

Tilemap型に次のメソッドが加わりました。

TileFlags列挙型にKeepGameObjectRuntimeOnlyメンバーが追加されました。TileクラスのgameObjectにプレファブを設定すると、そのプレファブからGameObjectがTileの座標に生成されます。このGameObjectは従来、Tileが置き換わったり消えたりしたタイミングで削除されました。Tileクラスのflagsプロパティーに、新たに追加されたKeepGameObjectRuntimeOnlyを含んでいる場合、Tileが置き換わったり消えたりしても、生成されたGameObjectはそのまま残り続けます。

また、Vector3Int構造体に、X座標とY座標だけ引数にとるコンストラクタが追加されました。Z座標は0になります。TilemapのVector3Intを引数に取るメソッドが、より簡潔に記述ができるようになりました。

おわりに

2D Lightや2D Animationに関しては、Unity公式 2Dプロジェクトの「Lost Crypt」と「Dragon Crashers」も参考になります。これらをUnity 2021 LTSで開けば、次のスクリーンショットのように、それぞれのプロジェクトで新しいEditor機能が利用可能です。

section08_no001_dragon_dash.png
section08_no002_lost_crypt.png

本記事では、Unity 2021の2Dゲーム向け新機能を、ピックアップして紹介しました。

現在開発中の機能や計画中の機能は、Unity公式の2Dロードマップページで確認できます。これからの新機能も非常に楽しみです。

--

筆者紹介: むろほし(@RyotaMurohoshi)

ゲーム個人趣味開発者として、小規模な2Dモバイルゲームを開発・公開。日本Androidの会 Unity部 運営メンバー。コミュニティ活動としてC#、LINQ、Tilemapを紹介・啓蒙。共著書に「Unityゲーム プログラミング・バイブル 2nd Generation(発行・発売:株式会社 ボーンデジタル)」など。Microsoft MVP for Developer Technologies 2016/10/01~。

Twitter :https://twitter.com/RyotaMurohoshi

GitHub : https://github.com/RyotaMurohoshi

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