mcpField
U
unity-2d

unity-2d

github.com/nice-wolf-studio開発4079 回インストール6 週間前に更新
リポジトリ

unity-2d について

unity-2dは、Unityで2Dプロジェクトを開発するためのリファレンススキルです。スプライト、タイルマップ、2D物理、URPのライティング、描画順序、関連するスクリプトAPIを扱います。

主な機能

  1. 012Dプロジェクトの設定とパッケージ
  2. 02スプライトの編集、描画、アトラス
  3. 03タイルマップの作成とスクリプト操作
  4. 042D物理コンポーネントとクエリ
  5. 05URPの2Dライトとソート

活用シーン

  1. 01Unityの2Dプロジェクトを設定する
  2. 02スプライトを使ったレベルを作成して描画する
  3. 032Dの衝突と移動を実装する
  4. 04URPの2Dライティングを設定する

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/nice-wolf-studio/unity-claude-skills --skill unity-2d

インストール後、Claude Code で/unity-2dを入力して読み込まれたか確認します。

同梱ファイルreferences/sprites-and-atlas.mdreferences/tilemaps.md

詳細

Unity 2D 開発

2D プロジェクトのセットアップ

Unity では、専用の 2D プロジェクトを作成できます。2D プロジェクトを開始する場合:

  • 新しいプロジェクトの作成時に 2D テンプレート(または 2D ライティングをサポートする 2D (URP))を選択します
  • 2D テンプレートでは、必要なパッケージである 2D Sprite、2D Tilemap Editor、2D Animation が自動でインストールされます
  • シーンビューはデフォルトで正投影(上から見た XY 平面)になります
  • カメラはデフォルトで正投影に設定されます
  • インポートした画像のテクスチャタイプは、デフォルトで Sprite (2D and UI) になります

ドキュメントに記載されている主な 2D サブシステム:

  • Sprites:「2D グラフィックオブジェクト」――2D ゲームの基盤です
  • Tilemaps:「タイルとグリッドオーバーレイを使って、2D レベルをすばやく作成できる GameObject」です
  • 2D Physics:2D に最適化されたコンポーネントを備えた専用の物理システムです
  • 2D Rendering in URP:2D ライト、ライティング効果、ピクセル化されたビジュアルスタイルを提供します

出典:https://docs.unity3d.com/6000.3/Documentation/Manual/Unity2D.html

スプライトと SpriteRenderer

スプライトアセット

スプライトは「Unity プロジェクトで使用できる 2D アセットの一種」です。専用のインポート機能と管理機能を備えた 2D グラフィックオブジェクトとして機能します。2D Sprite パッケージをインストールする必要があります(2D テンプレートに含まれています)。

スプライトの主な機能:

  • テクスチャからスプライトまたはスプライトシートをインポートする
  • Sprite Editor を使って、テクスチャからスプライトを切り出す(スライス)
  • 透明な領域を取り除くためにトリミングする
  • スプライトの物理演算用のコリジョンジオメトリを作成する
  • さまざまなサイズでスプライトを再利用するための 9-slicing
  • スプライトまたはスプライトのグループの一部を隠したり表示したりする マスキング

出典:https://docs.unity3d.com/6000.3/Documentation/Manual/sprite/sprite-landing.html

SpriteRenderer コンポーネント

SpriteRenderer コンポーネントは、シーン内でのスプライトの表示方法を制御します。主なプロパティ:

プロパティ説明
sprite描画する Sprite アセット
colorスプライトに適用する色(デフォルト:白=色を適用しない)
flipX / flipYTransform を動かさずに、軸に沿ってスプライトを反転します
drawModeSimple、Sliced、または Tiled
sizeSliced または Tiled の描画モードを使用する場合の寸法
sortingLayerNameレンダラーのソーティングレイヤー名
sortingOrderソーティングレイヤー内での優先順位(小さい値ほど先に描画されます)
maskInteractionNone、Visible Inside Mask、または Visible Outside Mask
spriteSortPointCenter または Pivot――カメラからの距離によるソート方法を決定します

描画モード:

  • Simple(デフォルト):スプライト全体を均等に拡大縮小します
  • Sliced:9-sliced スプライト向けです。Width/Height を使い、9-slice 領域に応じて拡大縮小します
  • Tiled:9-sliced スプライト向けです。中央部分をタイル状に並べます。Tile Mode のオプションには、Continuous(均等にタイル化)と Adaptive(しきい値までは伸縮し、その後タイル化)があります

デフォルトのマテリアル:Sprite-Lit-Default(Material ピッカーからカスタマイズできます)

// SpriteRenderer basic usage
SpriteRenderer sr = GetComponent<SpriteRenderer>();
sr.sprite = newSprite;
sr.color = Color.red;
sr.flipX = true;
sr.flipY = true;
sr.sortingLayerName = "Foreground";
sr.sortingOrder = 5;

描画モードの例、スプライトのマスキング、変更コールバックについては、references/sprites-and-atlas.md を参照してください。

出典:https://docs.unity3d.com/6000.3/Documentation/ScriptReference/SpriteRenderer.html

Sprite Atlas

Sprite Atlas は「複数のスプライトテクスチャを、アトラスと呼ばれる単一のテクスチャ内に隙間なくまとめるユーティリティ」です。これによりドローコールが削減されます。Unity はスプライトごとに個別のドローコールを行う代わりに、アトラスに対して 1 回のドローコールを行います。

作成:Assets > Create > 2D > Sprite Atlas(.spriteatlas ファイルが生成されます)

スプライトアトラスのプロパティ
プロパティ説明
タイプマスター(デフォルト)またはバリアント
ビルドに含める現在のビルドに含めます(デフォルト:有効)
回転を許可密度を最大化するため、パッキング時にスプライトを回転します(デフォルト:有効)。Canvas UI では無効にしてください
タイトパッキングより高密度にパッキングするため、四角形ではなくスプライトの輪郭を使用します(デフォルト:有効)
パディングスプライト間の余白(デフォルト:4 ピクセル)
読み取り/書き込みを有効化スクリプトからテクスチャデータにアクセスできるようにします(メモリ使用量が2倍になります)
ミップマップを生成アトラスのミップマップを有効にします
フィルターモードテクスチャのフィルタリングを制御し、個々のスプライト設定を上書きします
パッキング対象オブジェクトアトラスにパッキングするスプライト/フォルダーのリスト

ランタイム API:「Sprite Atlas API を使用すると、プロジェクトの実行時に Sprite Atlas の読み込みを制御できます。」

// Load a sprite from a SpriteAtlas at runtime
using UnityEngine;
using UnityEngine.U2D;

public class AtlasLoader : MonoBehaviour
{
    [SerializeField] private SpriteAtlas atlas;
    private SpriteRenderer spriteRenderer;

    void Start()
    {
        spriteRenderer = GetComponent<SpriteRenderer>();
        Sprite sprite = atlas.GetSprite("player_idle");
        spriteRenderer.sprite = sprite;
    }
}

遅延バインディング:SpriteAtlasManager.atlasRequested をサブスクライブして、必要に応じてアトラスを読み込みます(Addressables/AssetBundle のワークフロー向け)。遅延バインディングの完全な例については、references/sprites-and-atlas.md を参照してください。

出典:https://docs.unity3d.com/6000.3/Documentation/Manual/sprite/atlas/atlas-landing.html

タイルマップシステム

タイルマップを使用すると、タイルとグリッドオーバーレイによって2Dレベルをすばやく作成できます。Tilemap コンポーネントは「Tile アセットを保存および管理」し、「その上に配置されたタイルから必要な情報を、Tilemap Renderer や Tilemap Collider 2D などの関連コンポーネントに転送します」。

Tilemap コンポーネントのプロパティ
プロパティ説明
アニメーションフレームレートタイルアニメーションの再生速度の倍率
カラーすべてのタイルに適用する色合い(デフォルト:白)
タイルアンカータイルアンカー位置のオフセット(セル単位)
向きXY、XZ、YX、YZ、ZX、ZY、またはカスタム
TilemapRenderer のモード
モード説明
チャンクバッチ処理のため、位置/テクスチャごとにタイルをまとめます。レンダリング性能が最も高くなります
個別各タイルを個別にレンダリングします。他のレンダラーとのインタラクションや、カスタムソートが可能です
SRP バッチURP 15+ に対応しています。順次バッチ処理によってタイルをまとめます

TilemapRenderer のその他のプロパティ:

  • ソート順序:レンダリング時にタイルをソートする方向
  • チャンクカリング境界を検出:自動または手動(スプライトのクリッピングを防止)
  • マテリアル:スプライトテクスチャのレンダリングに使用するマテリアル
  • マスクとの相互作用:なし、マスク内で表示、またはマスク外で表示
  • ソーティングレイヤー/レイヤー内の順序:レンダリングの優先度を制御します
Tilemap スクリプティング API
using UnityEngine;
using UnityEngine.Tilemaps;

Tilemap tilemap = GetComponent<Tilemap>();

// Single tile operations
tilemap.SetTile(new Vector3Int(x, y, 0), tile);      // Place tile
tilemap.SetTile(new Vector3Int(x, y, 0), null);       // Remove tile
TileBase t = tilemap.GetTile(new Vector3Int(x, y, 0)); // Read tile

// Batch operations (faster than individual SetTile in loops)
tilemap.SetTiles(positionsArray, tilesArray);
tilemap.BoxFill(pos, tile, startX, endX, startY, endY);
tilemap.FloodFill(pos, tile);
tilemap.SwapTile(oldTile, newTile);

// Coordinate conversion
Vector3 worldPos = tilemap.CellToWorld(cellPos);
Vector3Int cellPos = tilemap.WorldToCell(worldPosition);

// Bounds management -- ALWAYS call after procedural generation
tilemap.CompressBounds();
BoundsInt bounds = tilemap.cellBounds;

// Clear
tilemap.ClearAllTiles();
tilemap.RefreshAllTiles();

主なプロパティ:cellBounds、localBounds、size、origin、animationFrameRate 主なイベント:tilemapTileChanged、tilemapPositionsChanged、loopEndedForTileAnimation

プロシージャル生成の例、Rule Tiles、TilemapCollider2D の設定については、references/tilemaps.md を参照してください。

出典:https://docs.unity3d.com/6000.3/Documentation/ScriptReference/Tilemaps.Tilemap.html

2D 物理の概要

Unity の2D物理システムは、2Dインタラクションに最適化されたコンポーネントを提供します。「Unity の物理システムを使用すると、2Dで利用可能な最適化を活用して、2D物理を処理できます。」

コアコンポーネント
コンポーネント説明
Rigidbody2D「GameObject がシミュレートされた重力やその他の力の影響を受けるようにするコンポーネント」
Collider2D「オブジェクトの物理的な衝突を処理するために使用する、目に見えない形状」
Physics Material 2D衝突する2D物理オブジェクト間の摩擦と反発を制御します
Constant Force 2DRigidbody を持つ GameObject に一定の力またはトルクを加えます
Effectors 2DGameObject のコライダーが接触しているときの力を制御します
2D JointsRigidbody コンポーネント間の動的な接続です。動きを制約できます
Rigidbody2D の主なプロパティ
プロパティ説明
bodyTypeDynamic、Kinematic、または Static
linearVelocity位置の変化率(ワールド単位/秒)
angularVelocity回転速度(度/秒)
massRigidbody の質量
gravityScale重力の影響度
linearDamping直線速度に対する抵抗
angularDamping角速度に対する抵抗
constraints軸ごとの位置/回転の固定
collisionDetectionModeDiscrete または Continuous
interpolationNone、Interpolate、または Extrapolate
Rigidbody2D の主なメソッド
Rigidbody2D rb = GetComponent<Rigidbody2D>();

// Apply forces
rb.AddForce(Vector2.up * 10f);
rb.AddForce(Vector2.right * 5f, ForceMode2D.Impulse);
rb.AddForceAtPosition(force, position);
rb.AddTorque(15f);

// Move (use in FixedUpdate for physics-safe movement)
rb.MovePosition(rb.position + velocity * Time.fixedDeltaTime);
rb.MoveRotation(rb.rotation + rotationSpeed * Time.fixedDeltaTime);

// Query
rb.Cast(direction, results, distance);
rb.ClosestPoint(worldPoint);
rb.Distance(otherCollider);
rb.GetContacts(contacts);
rb.IsAwake();
rb.IsSleeping();
Physics2D の静的メソッド(クエリ)
// Raycast
RaycastHit2D hit = Physics2D.Raycast(origin, direction, distance, layerMask);
RaycastHit2D[] hits = Physics2D.RaycastAll(origin, direction);

// Shape casts
RaycastHit2D boxHit = Physics2D.BoxCast(origin, size, angle, direction, distance);
RaycastHit2D circleHit = Physics2D.CircleCast(origin, radius, direction, distance);

// Overlap detection
Collider2D col = Physics2D.OverlapCircle(point, radius, layerMask);
Collider2D[] cols = Physics2D.OverlapCircleAll(point, radius);
Collider2D boxCol = Physics2D.OverlapBox(point, size, angle, layerMask);
Collider2D pointCol = Physics2D.OverlapPoint(point, layerMask);

// Utilities
float dist = Physics2D.Distance(colliderA, colliderB).distance;
bool touching = Physics2D.IsTouching(colliderA, colliderB);
// 2D platformer: ground check + jump + horizontal movement
Rigidbody2D rb = GetComponent<Rigidbody2D>();

// In Update: ground check and jump
bool isGrounded = Physics2D.OverlapCircle(groundCheck.position, 0.2f, groundLayer);
// Note: Uses legacy Input Manager for simplicity. See unity-input for the new Input System.
if (Input.GetButtonDown("Jump") && isGrounded)
    rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);

// In FixedUpdate: horizontal movement (preserves vertical velocity)
float move = Input.GetAxisRaw("Horizontal");
rb.linearVelocity = new Vector2(move * moveSpeed, rb.linearVelocity.y);

参照元:https://docs.unity3d.com/6000.3/Documentation/ScriptReference/Rigidbody2D.html 参照元:https://docs.unity3d.com/6000.3/Documentation/ScriptReference/Physics2D.html

2D ライティング(URP)

2D ライティングには、2D Renderer を備えた Universal Render Pipeline(URP) が必要です。2D(URP)テンプレートを使用するか、URP を手動で設定してください。

Light 2D の種類
種類説明
Global対象のソートレイヤー上にあるすべてのオブジェクトを照らします。ノーマルマップは使用できません
Freeform編集可能な頂点で定義された、任意の形状のライトです
Spriteスプライトテクスチャを使用してライトの形状を定義します
Spot方向と角度を指定できる円錐形のライトです
Pointある点から全方向に光を放ちます
Light 2D のプロパティ
プロパティ説明
Colorライトの色
Intensity明るさの倍率(1 を超えるとスプライトをさらに明るくできます)
Light Orderレンダリングキュー内の位置(値が小さいほど先にレンダリングされます)
Overlap Operation加算(ピクセル値を加算)または Alpha Blend
Target Sorting Layers選択したソートレイヤー上のスプライトだけを照らします
Distanceライトとサーフェス間の知覚される距離
Volume Opacityボリュームライトの可視性(0~1)
Shadow IntensityShadow Caster 2D がライトを遮る度合い(0~1)
Normal MapsGlobal 以外のライトタイプでサポートされます
using UnityEngine;
using UnityEngine.Rendering.Universal;

public class DayNightCycle : MonoBehaviour
{
    [SerializeField] private Light2D globalLight;
    [SerializeField] private Color dayColor = Color.white;
    [SerializeField] private Color nightColor = new Color(0.1f, 0.1f, 0.3f);
    [SerializeField] private float cycleDuration = 60f;

    void Update()
    {
        float t = Mathf.PingPong(Time.time / cycleDuration, 1f);
        globalLight.color = Color.Lerp(dayColor, nightColor, t);
        globalLight.intensity = Mathf.Lerp(1f, 0.3f, t);
    }
}

参照元:https://docs.unity3d.com/6000.3/Documentation/Manual/urp/2d-light-properties-explained.html

ソートレイヤーと順序

「Sorting Group を使うと、Sprite Renderer を持つ GameObject をグループ化し、スプライトのレンダリング順序を制御できます。」Unity は、同じ Sorting Group 内のすべての Sprite Renderer を、ひとつのレンダリング単位として扱います。

ソートレイヤーシステム

ソートレイヤーは、大まかなレンダリング順序を定義します。各レイヤー内では、Order in Layer(整数)によって具体的な優先順位を設定します。数値が小さいものほど先にレンダリングされます(数値が大きいものの背後に表示されます)。

Sorting Group コンポーネント

Sorting Group コンポーネントは、子レンダラーをひとつのソート可能な単位にまとめます。使用例:

  • 複雑な複数スプライトのキャラクター(身体の各部位を個別のスプライトとして扱う)
  • 環境に対してまとめてソートする必要がある、関連オブジェクトのグループ

プロパティ:

  • Sorting Layer:グループをソートレイヤーに割り当てます
  • Order in Layer:ソートレイヤー内での優先順位

ネストした Sorting Group もサポートされています。まず内部グループ内でソートされ、その後、外部グループがひとつの単位として他のレンダラーとソートされます。

// Y-sort for top-down games (attach to entities)
void LateUpdate()
{
    int order = Mathf.RoundToInt(-transform.position.y * 100);
    GetComponent<SpriteRenderer>().sortingOrder = order;
}

// Set sorting layer and order via script
SpriteRenderer sr = GetComponent<SpriteRenderer>();
sr.sortingLayerName = "Characters";
sr.sortingOrder = 10;
sr.sortingLayerID = SortingLayer.NameToID("Characters"); // faster

参照元:https://docs.unity3d.com/6000.3/Documentation/Manual/sprite/sorting-group/sorting-group-landing.html

よく使われるパターン(C#)

トップダウン移動(Rigidbody2D、重力なし)
public class TopDownMovement : MonoBehaviour
{
    [SerializeField] private float moveSpeed = 5f;
    private Rigidbody2D rb;
    private Vector2 moveInput;

    void Awake() { rb = GetComponent<Rigidbody2D>(); rb.gravityScale = 0f; }
    void Update() // legacy Input; see unity-input
    {
        moveInput = new Vector2(Input.GetAxisRaw("Horizontal"),
            Input.GetAxisRaw("Vertical")).normalized;
    }
    void FixedUpdate()
    {
        rb.MovePosition(rb.position + moveInput * moveSpeed * Time.fixedDeltaTime);
    }
}
スプライトの向きの反転/カメラ追従/Tilemap のクリック
// Flip sprite based on movement direction (legacy Input; see unity-input)
float h = Input.GetAxisRaw("Horizontal");
if (h != 0) spriteRenderer.flipX = h < 0;

// Simple 2D camera follow (attach to Camera, set offset.z = -10)
void LateUpdate()
{
    Vector3 desired = target.position + offset;
    transform.position = Vector3.Lerp(transform.position, desired, smoothSpeed * Time.deltaTime);
}

// Place tile at mouse click
Vector3 worldPos = cam.ScreenToWorldPoint(Input.mousePosition);
Vector3Int cellPos = tilemap.WorldToCell(worldPos);
tilemap.SetTile(cellPos, tileToPlace);

アンチパターン

  1. 2D ゲームに 3D 物理を使用する:必ず Rigidbody2D と Collider2D を使用し、Rigidbody/BoxCollider は使用しないでください。2D 物理エンジンは独立しており、2D 用に最適化されています。

  2. Transform を使って Rigidbody2D を移動する:物理オブジェクトの移動に transform.position は使用しないでください。FixedUpdate 内で Rigidbody2D.MovePosition() を使用するか、AddForce() を使ってください。Transform を直接操作すると物理シミュレーションを迂回し、衝突検出が機能しなくなります。

  3. 実行時に Transform.localScale でスプライトを拡大縮小する:代わりに、スライス/タイル描画モードと SpriteRenderer.size を使用してください。Transform のスケールはコライダーに問題を引き起こし、パフォーマンスも低下します。

  4. プロシージャル Tilemap で CompressBounds() の呼び出しを忘れる:タイルをプロシージャルに生成した後、tilemap.CompressBounds() を呼び出して境界を再計算してください。呼び出さないと、cellBounds の反復処理に空の領域が含まれます。

  5. スプライトごとに描画コールを発生させる(アトラス化しない):関連するスプライトを Sprite Atlas にまとめてください。アトラス化しないと、固有のテクスチャごとに個別の描画コールが発生します。

  6. Sprite Atlas で Read/Write を不必要に有効にする:メモリ使用量が倍増します。Texture2D.SetPixels を使ったスクリプトからのアクセスが必要な場合にのみ有効にしてください。

  7. UI スプライトで Allow Rotation を使用する:Canvas UI で使用するスプライトをまとめる場合は、Sprite Atlas の設定で Allow Rotation を無効にしてください。回転すると UI レイアウトが崩れます。

  8. TilemapRenderer のモードを適切に設定しない:静的なタイルマップでは Chunk モードを使用してください(最高のパフォーマンスが得られます)。Individual モードは、タイルが他のレンダラーと相互作用する必要がある場合や、カスタムの描画順が必要な場合にのみ使用してください。

  9. あらゆる場所で連続衝突検出を使用する:高速で移動するオブジェクトにのみ、collisionDetectionMode を Continuous に設定してください。Discrete は処理負荷が低く、ほとんどの 2D オブジェクトには十分です。

  10. Sorting Layers を無視する:Order in Layer のみに頼ると、マジックナンバーが増えてしまいます。意味のある Sorting Layers(Background、Midground、Characters、Foreground、UI)を定義し、各レイヤー内の細かな調整には Order in Layer を使用してください。

主要 API クイックリファレンス

クラス主なメンバー
SpriteRenderer.sprite、.color、.flipX、.flipY、.drawMode、.size、.sortingLayerName、.sortingOrder
SpriteAtlas.GetSprite(name)、.GetSprites(sprites[])、SpriteAtlasManager.atlasRequested
Tilemap.SetTile()、.GetTile()、.SetTiles()、.ClearAllTiles()、.BoxFill()、.FloodFill()、.SwapTile()、.WorldToCell()、.CellToWorld()、.CompressBounds()、.cellBounds
Rigidbody2D.linearVelocity、.angularVelocity、.AddForce()、.MovePosition()、.MoveRotation()、.Cast()、.bodyType、.gravityScale、.mass
Physics2D.Raycast()、.BoxCast()、.CircleCast()、.OverlapCircle()、.OverlapBox()、.OverlapPoint()、.IsTouching()
Light2D.color、.intensity、.lightType(UnityEngine.Rendering.Universal が必要)
SortingGroup.sortingLayerName、.sortingOrder

関連スキル

  • unity-foundations -- GameObject、コンポーネント、Transform、Prefab、ScriptableObject
  • unity-physics -- 3D/2D 物理、ジョイント、レイキャスト、物理マテリアルの詳細
  • unity-graphics -- レンダリングパイプライン、マテリアル、シェーダー、ポストプロセス
  • unity-lighting-vfx -- URP ライティングの設定、ビジュアルエフェクト、パーティクルシステム

Additional Resources

コメント