unity-2d について
unity-2dは、Unityで2Dプロジェクトを開発するためのリファレンススキルです。スプライト、タイルマップ、2D物理、URPのライティング、描画順序、関連するスクリプトAPIを扱います。
主な機能
- 012Dプロジェクトの設定とパッケージ
- 02スプライトの編集、描画、アトラス
- 03タイルマップの作成とスクリプト操作
- 042D物理コンポーネントとクエリ
- 05URPの2Dライトとソート
活用シーン
- 01Unityの2Dプロジェクトを設定する
- 02スプライトを使ったレベルを作成して描画する
- 032Dの衝突と移動を実装する
- 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 / flipY | Transform を動かさずに、軸に沿ってスプライトを反転します |
drawMode | Simple、Sliced、または Tiled |
size | Sliced または Tiled の描画モードを使用する場合の寸法 |
sortingLayerName | レンダラーのソーティングレイヤー名 |
sortingOrder | ソーティングレイヤー内での優先順位(小さい値ほど先に描画されます) |
maskInteraction | None、Visible Inside Mask、または Visible Outside Mask |
spriteSortPoint | Center または 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 2D | Rigidbody を持つ GameObject に一定の力またはトルクを加えます |
| Effectors 2D | GameObject のコライダーが接触しているときの力を制御します |
| 2D Joints | Rigidbody コンポーネント間の動的な接続です。動きを制約できます |
Rigidbody2D の主なプロパティ
| プロパティ | 説明 |
|---|---|
bodyType | Dynamic、Kinematic、または Static |
linearVelocity | 位置の変化率(ワールド単位/秒) |
angularVelocity | 回転速度(度/秒) |
mass | Rigidbody の質量 |
gravityScale | 重力の影響度 |
linearDamping | 直線速度に対する抵抗 |
angularDamping | 角速度に対する抵抗 |
constraints | 軸ごとの位置/回転の固定 |
collisionDetectionMode | Discrete または Continuous |
interpolation | None、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 Intensity | Shadow Caster 2D がライトを遮る度合い(0~1) |
| Normal Maps | Global 以外のライトタイプでサポートされます |
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);
アンチパターン
-
2D ゲームに 3D 物理を使用する:必ず Rigidbody2D と Collider2D を使用し、Rigidbody/BoxCollider は使用しないでください。2D 物理エンジンは独立しており、2D 用に最適化されています。
-
Transform を使って Rigidbody2D を移動する:物理オブジェクトの移動に
transform.positionは使用しないでください。FixedUpdate 内でRigidbody2D.MovePosition()を使用するか、AddForce()を使ってください。Transform を直接操作すると物理シミュレーションを迂回し、衝突検出が機能しなくなります。 -
実行時に Transform.localScale でスプライトを拡大縮小する:代わりに、スライス/タイル描画モードと
SpriteRenderer.sizeを使用してください。Transform のスケールはコライダーに問題を引き起こし、パフォーマンスも低下します。 -
プロシージャル Tilemap で CompressBounds() の呼び出しを忘れる:タイルをプロシージャルに生成した後、
tilemap.CompressBounds()を呼び出して境界を再計算してください。呼び出さないと、cellBoundsの反復処理に空の領域が含まれます。 -
スプライトごとに描画コールを発生させる(アトラス化しない):関連するスプライトを Sprite Atlas にまとめてください。アトラス化しないと、固有のテクスチャごとに個別の描画コールが発生します。
-
Sprite Atlas で Read/Write を不必要に有効にする:メモリ使用量が倍増します。
Texture2D.SetPixelsを使ったスクリプトからのアクセスが必要な場合にのみ有効にしてください。 -
UI スプライトで Allow Rotation を使用する:Canvas UI で使用するスプライトをまとめる場合は、Sprite Atlas の設定で Allow Rotation を無効にしてください。回転すると UI レイアウトが崩れます。
-
TilemapRenderer のモードを適切に設定しない:静的なタイルマップでは Chunk モードを使用してください(最高のパフォーマンスが得られます)。Individual モードは、タイルが他のレンダラーと相互作用する必要がある場合や、カスタムの描画順が必要な場合にのみ使用してください。
-
あらゆる場所で連続衝突検出を使用する:高速で移動するオブジェクトにのみ、
collisionDetectionModeを Continuous に設定してください。Discrete は処理負荷が低く、ほとんどの 2D オブジェクトには十分です。 -
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 ライティングの設定、ビジュアルエフェクト、パーティクルシステム