この記事では、Unity6で2Dドット絵(ピクセルアート)ゲームを作成するために必要になる、Pixel Perfect CameraやTexture2Dの各種設定やスプライトシート画像データの取り込み方法についてまとめています。
プロジェクト作成
まずはUnityHub:プロジェクト>New project から、プロジェクトを作成します。
例ではコアテンプレートには「Universal 2D」を選択していますが、ビルトインの「2D」でも問題ありません。

プロジェクトの作成が完了し、以下のような画面が表示されていればOKです。

ドット絵画像のインポートと設定
ドット絵画像のインポートと、表示のために必要な設定を行っていきます。
今回はAssetsフォルダ直下に「Sprites」というフォルダを作成し、その中に読み込みたい画像をインポートします。
(解説用にシンプルにしているため、フォルダ名や配置などの構成は任意です)
ドット絵画像(Texture2D)のインポート
Unityでは、インポートしたい画像をフォルダへドラッグアンドドロップすればインポートが可能です。

UnityではPascalCaseを使うことが多いようですので、アセット名も「RedBall」へ変更しておきます。
アセットを選択してF2 (または右クリック→名前を変更)で、名前変更ができます

スプライトシートの読み込みとスライス
同様に、複数の画像が含まれるスプライトシートの例もインポートします。
Unityでは背景が投下されている場合、以下のようにある程度自動でスプライトを切り抜いて認識してくれますが、手動での設定方法についても確認しておきます。

スプライトシート画像を選択し、インスペクターから「スプライトエディターを開く」をクリックします。

以下のようなウィンドウが開いたら、上部にある「スライス」をクリックします
※この時点ではUnityが自動で切り抜いているため、画像ごとにサイズが違い、キャラクターのスプライトには不向きです
(アイテムのアイコンなどをまとめたスプライトシートでは、自動切り抜きが便利な場合もあります)

タイプを「自動」から「Grid By Cell Size」へ変更し、ピクセルサイズ等をスプライトシートのサイズに合うように調整後、「スライス」ボタンをクリックします。

警告メッセージが出ますが、これはすでに画像を何らかの形で使用している場合の注意のため、継続で問題ありません。

スライスが完了すると、以下のように均等な画像サイズで区切られていることが確認できます。
また、区切りを選択することで、その画像ごとに名称などのパラメータを設定することも可能です。
(今回は使用しませんが、同スプライトシートで別のアイテムやキャラを扱うときに名称設定は便利です)

最後に、スプライトエディタ上部の「適用する」をクリックし、エディタを閉じればスライスの設定は完了です。

ドット絵用のTexture2D設定
インポートしたスプライト画像(Texture2D)をシーンにドラッグアンドドロップすると、そのテクスチャが設定された2Dスプライトオブジェクトが作成・配置されます。

この時点では、配置されたドット絵の画像がかなり小さく、Unity側がデフォルトの描画を滑らかにする(Bilinear:バイリニア)フィルター処理を行ってしまい、左の画像のようにドット絵がぼやけた表示になっている状況かと思います。
以下の設定で、この状況を解決します。
インポートした画像を選択し、インスペクターからドット絵の表示のために必要な設定を行っていきます。
ポイントとなるのは以下3項目です。
- 単位毎のピクセル数(Pixel Per Unit):
設定値は任意。
Unity空間における1m に何ピクセル配置されるかの設定で、使用するタイルセットの1タイル当たりのピクセル数を基準にしておくと便利そうです。
(デフォルト値は100で、例では32に設定)
- フィルターモード(Filter Mode):
ドット絵ではポイント(フィルター無し)に設定。
他のフィルタが有効だと、ドット絵のような低解像度の画像ではぼやけた表示になってしまいます。
- 圧縮(Compression):
この設定は任意ですが、確実にドット絵を表示するため、ここでは「なし」に設定しています。
(圧縮が有効な方が処理速度の面では有利です)
設定変更後、適用を行うと、以下のように、単位毎のピクセル数(Pixel Per Unit)に対応したサイズで、ドット絵がぼやけることなく表示されます。

Pixcel Perfect Cameraの設定
次に、カメラの設定を行います。
ヒエラルキーから使用しているカメラオブジェクト(Main Cameraなど)を選択し、インスペクター下部のコンポーネントを追加から、「Pixel Perfect Camera」を追加します

追加したPixel Perfect Cameraのプロパティを以下のように設定していきます。
・AssetsPixelsPerUnit :アセットのユニットごとのピクセル数。画像インポート時に設定したものと同値に設定
・ReferenceResolution :アセット側で意図されている解像度。ゲーム画面として使用したい解像度を設定。
・CropFrame :設定したReference Resolutionに合わせた切り抜き設定。ここでは「なし」に設定。
・GridSnapping :ピクセルの表示スナップ設定。「PixelSnapping」に設定。(サブピクセル単位の移動を防止)

※上記の設定は一例です。作成するゲームの解像度や実現したい描画によってより適切なカメラ設定があるため、詳細は下記マニュアルにて一読ください
以降「動作確認:」は動作確認のためのオブジェクト実装手順のまとめで、ドット絵の取り扱い設定とは無関係です。
すでにプロジェクトデータをお持ちの方や情報として不要な方は読み飛ばしていただけますと幸いです。
動作確認用:プレイヤーキャラ作成
表示挙動を見るため、簡単な移動ができるキャラクターとタイルマップを作成します。
任意のスプライトを割り当てたオブジェクトに、Rigidbody2D、CapsuleCollider2Dを追加します。
Rigidbody2Dの回転を固定:Z を有効にし、CapsuleCollider2Dのコライダーの編集ボタンから、形状をスプライト画像に合わせて調整します。

続けて、同オブジェクトにコンポーネントを追加>New scriptから、「PlayerMovement」という名前で新規スクリプトを追加します。
インスペクターから作成したスクリプトはAssets直下に配置されるので、「Scripts」フォルダを作成して移動しておきます

スクリプトは以下のように記述します。(左右移動とスペースキーでのジャンプのみが可能な最小限の構成です)
using JetBrains.Annotations;
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public float moveSpeed = 5f;
public float jumpForce = 10f;
private Rigidbody2D rb;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
// 移動
float moveInput = Input.GetAxisRaw("Horizontal");
rb.linearVelocity = new Vector2(moveInput * moveSpeed, rb.linearVelocity.y);
// スペースキーを押したときにジャンプ
if (Input.GetKeyDown(KeyCode.Space))
{
rb.linearVelocity = new Vector2(rb.linearVelocity.x, jumpForce);
}
}
}
動作確認用:タイルマップの作成
次に、タイルマップを使用してキャラクターが設置できる地面を作成していきます。
今回は以下のようなタイル画像を使用しています。(地形の画像であればなんでもOKです。)

タイル画像の読み込みと設定
インポートしたタイル画像を選択し、インスペクターから以下設定を行います。
- 単位毎のピクセル数(Pixel Per Unit):
設定値は任意。
Unity空間における1m に何ピクセル配置されるかの設定で、使用するタイルセットの1タイル当たりのピクセル数を基準にしておくと便利そうです。
(デフォルト値は100で、例では32に設定)
- フィルターモード(Filter Mode):
ドット絵ではポイント(フィルター無し)に設定。
他のフィルタが有効だと、ドット絵のような低解像度の画像ではぼやけた表示になってしまいます。
- 圧縮(Compression):
この設定は任意ですが、確実にドット絵を表示するため、ここでは「なし」に設定しています。
(圧縮が有効な方が処理速度の面では有利です)
上記設定後、同じくインスペクターからスプライトエディタを開きます。

スプライトエディタ上部の「スライス」をクリックし、以下を設定後「スライス」ボタンで確定します。
・タイプ :Grid By Cell Size
・ピクセルサイズ:タイルサイズに合わせた値(今回の例ではx,yともに32ピクセル)

スライスの設定後は、スプライトエディタの適用する(Apply)をクリックし、閉じます

スライス設定後、インポートした画像アイコン横の「▶」ボタンをクリックすると、各タイルが分割されて認識されている様子が確認できます。

タイルパレットの作成
「ウィンドウ」>「2D」>「タイルパレット」から、タイルパレットウィンドウを開きます。
(デフォルトではインスペクターのタブに追加される形で表示されます。)
タイルパレットウィンドウから、新しいタイルパレットを作成>Create New Tile Palette を選択後、
名前やグリッド形状、セルサイズなどを設定して「作成」をクリックします。(今回は矩形/自動を選択しています)

TilePaletteの保存場所を確認されるため、任意のフォルダを指定して保存を実行します。
(例ではAssetsフォルダ直下用意した、にTilePalettesというフォルダを指定しています。)

タイルパレットを確認すると、先ほど作成したパレットで、テクスチャアセットを配置するように表示が出ているため、先ほどインポート/設定を行ったタイル画像をドラッグアンドドロップしてタイルパレットに適用します。

今度はタイルの保存場所を確認されるため、再度任意のフォルダを設定します。
(例ではAssetsフォルダ直下用意した、にTiles/TestTileというフォルダを指定しています。)

設定、保存が完了すると、プロジェクトフォルダとタイルパレットで、それぞれ指定したタイルが作成・適用されているとを確認できます。

タイルマップオブジェクトの作成とタイルの配置
実際にシーンにタイルを配置するためには、タイルマップオブジェクトが必要になります。
シーンのヒエラルキーを右クリックし、2Dオブジェクト>タイルマップ>矩形 を選択し、新規タイルマップオブジェクトを作成します。

タイルマップオブジェクトを作成すると、タイルパレットから配置したいタイルを選択し、シーン上でドラッグすることで以下のように描画を行うことができます。

タイルマップオブジェクトは、複数作成することでレイヤーのように扱うことができ、前後関係のあるタイル配置も可能です。(どのタイルマップにタイルを配置するかは、タイルパレット上部のプルダウンから選択可能です)

オブジェクトの前後関係については、以下の記事でまとめています。
タイルマップのコリジョン設定
コリジョンを追加したいタイルマップオブジェクトを選択し、インスペクター下部から、
コンポーネントを追加 >TilemapCollider 2D を追加します。
単純な形状であれば、これだけでタイルに対応したコリジョンが設定できます。
ここまでの設定が完了後、ゲームを実行してみると以下のような表示の確認ができます。

→ピクセルの描画状況がイメージと異なる場合は、主にPixel Perfect Cameraの設定を調整すると良いかと思います。
参考:
コメント