0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Unityで2Dゲームを作るときに、わたしが毎回やっている手順とコツまとめ

Posted at

「Unityで2Dゲームを作りたいけど、何から始めればいいの?」という相談をよくもらいます。
わたし自身も最初は「2Dテンプレートでプロジェクト作る → よく分からないまま触ってカオスになる」というのを何回かやらかしました。

この記事では、キーワードでいうところの「Unity 2dゲーム 作り方」を、わたしが普段やっている流れにそってまとめます。
マニュアルっぽい完璧な手順というより、「ここでミスりやすかった」「この設定を先にやっておくと楽だった」という体験ベース寄りです。

横スクロールアクションでも、シンプルなRPGでも、シューティングでも、最初の一歩はだいたい同じです。
プロジェクトの作り方・2D用の設定・スプライトの扱い・キャラ移動・カメラの考え方。
このあたりを押さえておくと、本や講座を使うときも迷子になりにくくなります。

これからUnityで2Dゲームを始める方、あるいは一度挫折したけどもう一回やってみたい方の、「次こそは1本完成させたい」をゴールに書いていきます。

まずはプロジェクト作成と2D設定から整える

いきなり「キャラを動かしたい!」とコードを書き始めたくなるんですが、Unityで2Dゲームを作るときに最初にやった方がいいのは「2D寄りの環境づくり」です。
ここを雑にすると、あとでカメラや物理挙動が3D寄りになっていて「なんかおかしい…」となりがちでした。

わたしは基本的にUnity Hubから新規プロジェクトを作るとき、テンプレートで2Dを選びます。
これだけで、カメラが最初からOrthographicになっていたり、2D用のメニューが前面に出てきたりするので、初心者の方は遠慮なく2Dテンプレートで始めて大丈夫です。

もし「うっかり3Dで作っちゃった」というときも、[P]Edit → Project Settings → Editor

の「Default Behavior Mode」を2Dに変えれば、以降の新しいシーンやオブジェクトは2D前提で作られるようになります。
わたしも最初の頃はこれを知らずに、3Dカメラ視点のまま2Dゲームを作ろうとして「スクロール方向がよく分からない」という状態になりました。
[/P]
合わせてやっておきたいのが、ゲームビューの解像度とアスペクト比の確認です。
スマホ向けなら16:9、PC向けならフルHD想定…など、ターゲットをなんとなく決めておくだけでも、2Dゲーム全体のレイアウトが崩れにくくなります。
ここを決めずに進めると、途中で「やっぱりスマホ用にしたい」となったとき、UIやカメラのサイズ調整が大変になります。

まとめると、「Unity 2dゲーム 作り方 初心者」的な観点では、①2Dテンプレート or 2Dモードへ切り替え、②カメラをOrthographicに、③ゲームビューの解像度を決める、この3つを最初にやっておくのがおすすめです。
ここまでできたら、やっと「絵を置いて動かす」フェーズに進みます。

スプライトの置き方と当たり判定の基本をサクッと押さえる

次にやるのが「絵を出す」「地面を作る」です。
書籍や講座だと自然にできている部分ですが、自分でゼロからやるときはここでつまずきやすかったです。
特に、インポート設定と当たり判定(Collider 2D)を忘れるパターン。

わたしは普段、PNG画像をProjectビューにドラッグ→Inspectorで「Texture Type: Sprite(2D and UI)」になっているか確認→Sprite Editorで必要ならスライス、という流れでスプライトを用意しています。
タイルマップを使うときは、「Sprite Mode: Multiple」にして1枚の画像をタイルに切ることも多いです。
ここで解像度やPixels Per Unitを揃えておくと、あとでサイズがガタガタになりません。

シーンにスプライトをドラッグして配置すると、見た目上は地面になりますが、そのままだとプレイヤーがすり抜けます。
ここで付けるのがBox Collider 2DなどのColliderコンポーネントです。
地面用のオブジェクトには「Box Collider 2D」、複雑な形なら「Polygon Collider 2D」などを使います。

わたしが最初にやらかしたのは、「Tilemapにコライダーを付け忘れていた」ケースです。
Tilemapで地形を描いたのに、プレイヤーが地面を通り抜けて落ちていく…。
原因を突き止めるまでに結構時間がかかりました。
Tilemapを使うときは、「Tilemap Collider 2D」を忘れずに追加して、必要ならComposite Collider 2DとRigidbody 2D(Static)でまとめるとパフォーマンスも改善します。

この段階で、「背景レイヤー」「地面レイヤー」「装飾レイヤー」という感じでSorting Layerを分けておくと、あとでキャラクターやUIを重ねても見やすくなります。
2Dゲームは見た目のレイヤー整理でかなり印象が変わるので、「unity 2dゲーム 作り方 簡単」を目指すなら最初に少しだけ丁寧にやっておくのがおすすめです。

キャラクターの移動とジャンプを実装する(最小セット)

地面ができたら、いよいよプレイヤーキャラの実装です。
ここは「unity 2dゲーム 作り方 移動」で検索してもいろんな書き方が出てきて迷うところですが、最初は「Rigidbody2D+AddForce or velocity」でシンプルに書いてしまってOKだと思っています。

わたしがよく使う最低限の移動+ジャンプスクリプトはこんな感じです。

using UnityEngine;

public class PlayerController : MonoBehaviour
{
public float moveSpeed = 5f;
public float jumpForce = 5f;

Rigidbody2D rb;
bool isGrounded;

void Awake()
{
    rb = GetComponent<Rigidbody2D>();
}

void Update()
{
    // 左右移動
    float x = Input.GetAxisRaw("Horizontal");
    rb.velocity = new Vector2(x * moveSpeed, rb.velocity.y);

    // ジャンプ
    if (Input.GetButtonDown("Jump") && isGrounded)
    {
        rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
    }

    // 向きの反転
    if (x != 0)
    {
        transform.localScale = new Vector3(Mathf.Sign(x), 1, 1);
    }
}

void OnCollisionEnter2D(Collision2D col)
{
    // 足元からの接触だけを「着地」とみなす簡易判定
    if (col.contacts[0].normal.y > 0.5f)
    {
        isGrounded = true;
    }
}

void OnCollisionExit2D(Collision2D col)
{
    isGrounded = false;
}

}

このスクリプトをPlayerオブジェクトにアタッチして、Rigidbody2DとBox Collider 2D(またはCapsule Collider 2D)を付けておけば、とりあえず「動いてジャンプできるキャラ」になります。
ここでよくあるミスが、Rigidbody2Dの「Gravity Scale」が0になっていて落下しない、またはConstraintsで動きがロックされているパターンです。
おかしいときはInspectorを落ち着いて眺めるとだいたい原因が見つかります。

「unity 2dゲーム 作り方 アクション」「横スクロール 作り方」系でよく出てくるのが、ジャンプの精度や操作感の話です。
いきなり完璧を目指すより、最初は「移動がカクつかない」「壁に引っかからない」「とりあえず遊べる」レベルを目指して、後からジャンプの高さや加速度を調整していく方がメンタル的にも楽でした。

わたしの失敗談としては、UpdateではなくFixedUpdateで入力を取ったり、逆に物理挙動をUpdateでいじったりして挙動が安定しなかったことがあります。
入力はUpdate、物理はFixedUpdateという基本を意識しておくと、あとでコードが増えても破綻しにくいです。

ジャンル別:アクション・RPG・シューティングで変わる設計のポイント

「Unity 2dゲーム 作り方 本」を読むと、横スクロールアクション・見下ろしRPG・シューティングなど、いろんなジャンルのサンプルが出てきます。
ただ、どれも一気に触ると情報量に負けるので、ジャンルごとの違いをざっくり理解しておくと選びやすくなります。

アクションゲームは、とにかく「プレイヤーの手触り」が大事です。
入力からキャラの反応までのレスポンス、加速・減速、ジャンプの高さ、敵やギミックとの当たり判定…。
わたしは最初にアクションから入ったのですが、プレイヤー1体だけでも調整ポイントが多くて、楽しいけど沼にはまりました。

RPG寄りの2Dゲーム(いわゆるフィールドを歩くタイプ)は、「マップの構造」と「データ管理」が肝になります。
タイルマップでマップを描きつつ、プレイヤーの移動はグリッド単位にするのか、自由移動にするのか。
敵とのエンカウントはシンボル方式かランダムか。
こういうルール設計が中心なので、「unity 2dゲーム 作り方 rpg」に興味がある人は、Excelやスプレッドシートで簡易仕様を書いてからUnityに落とすと整理しやすかったです。

シューティングゲームは、「弾の管理」と「パフォーマンス」がポイントです。
弾をInstantiate/Destroyしまくると重くなるので、Object Pooling(オブジェクトプール)を使うのが定番です。
わたしは最初、毎フレーム弾を生成していて、数分プレイするとカクカクになりました…。
あとでプール方式に変えたら、同じ見た目でも全然軽くなりました。

「unity 2dゲーム 作り方 初心者」でよく見るアドバイス通り、最初の一本は横スクロールかシンプルなトップダウンアクションが扱いやすいと思います。
RPGはどうしてもシステムが増えがちなので、2本目以降のチャレンジとしてとっておくと心が折れにくいです。

最小限のシューティング要素を足してみる(弾の発射)

アクションゲームにちょっとシューティング要素を足すだけで、一気に「ゲームっぽさ」が増します。
ここでは、わたしがよくやる「右向きに弾を撃つだけ」の超シンプル実装を書いておきます。

まず、Bullet用のPrefabを作ります。
小さいスプライトにRigidbody2DとCollider2D(IsTriggerオン)を付けて、「Bullet」というタグを付けておくと扱いやすいです。
その上で、プレイヤー側にこんなスクリプトを用意します。

using UnityEngine;

public class PlayerShoot : MonoBehaviour
{
public GameObject bulletPrefab;
public Transform muzzle;
public float bulletSpeed = 10f;

void Update()
{
    if (Input.GetButtonDown("Fire1"))
    {
        var bullet = Instantiate(bulletPrefab, muzzle.position, Quaternion.identity);
        var rb = bullet.GetComponent<Rigidbody2D>();

        // プレイヤーの向きに合わせて発射方向を変える
        float dir = Mathf.Sign(transform.localScale.x);
        rb.velocity = new Vector2(bulletSpeed * dir, 0f);
    }
}

}

ポイントは「プレイヤーの向きに応じて速度の符号を変える」くらいで、最初はこれで十分遊べます。
敵側にはOnTriggerEnter2DでBulletを検知してダメージを与え、弾は一定時間で自壊するか、画面外に出たらDestroyするようにしておきます。

本気で「unity 2dゲーム 作り方 シューティング」をやると、弾の種類・敵パターン・弾幕など、かなり奥が深い世界ですが、アクションゲームに1種類だけショットを追加するだけなら、これくらいの簡単実装から始めてもOKです。
大事なのは、「撃って当てる→フィードバックがある」のサイクルを動かしてみることだと感じています。

このあたりから、Update内にロジックを詰め込みすぎて「クラスが太りがち」問題が出てくるので、余裕が出てきたら「移動用クラス」「攻撃用クラス」「アニメーション制御クラス」などに分割していくと、あとでRPGや別ジャンルに流用しやすくなります。

書籍・講座・テンプレをどう組み合わせるか(独学ルート比較)

「unity 2dゲーム 作り方 本」で検索すると、2Dゲーム入門書がたくさん出てきます。
わたしも何冊か買って試しましたが、正直「本だけで最後までゲームを完成させる」のは、モチベーション維持の意味でけっこう大変でした。

本の良さは、「章立てがきれいで、順番どおりに進めると一通りの機能を触れる」ところです。
一方で、Unity本はどうしてもバージョン差分やUI変更の影響を受けるので、掲載スクショと自分の画面が違って不安になることも多いです。
わたしは、Unityの公式マニュアルやフォーラム、Qiitaの記事とセットで読むことで、なんとか乗り切りました。

オンライン講座や動画講座の良さは、「実際に動いている画面を見ながら進められる」点です。
とくに、2DアクションやRPGのように「動き」が重要なジャンルは、文字だけより圧倒的に理解しやすいと感じました。
逆に、動画は巻き戻しや見直しに時間がかかるので、「後から検索で探したい情報」はテキストの方が便利です。

わたしのおすすめは、「1本目は動画講座で横スクロールアクションを丸コピー → 2本目で本を読みながらオリジナル要素を足す」という組み合わせです。
最初からオリジナルRPGを作ろうとすると、仕様とスクリプトとアセット準備を同時に考えることになってしまい、頭がパンクしがちでした。

テンプレートやサンプルプロジェクトは、「unity 2dゲーム 作り方 簡単」にかなり効きますが、BlackBoxになりやすいのが難点です。
わたしはテンプレを使うとき、「1つの機能だけを借りる」「全部を理解しようとしない」というスタンスで触るようにしています。
「このカメラ追従だけ真似しよう」「この弾の管理だけ参考にしよう」という感じですね。

よくハマったポイントと、デバッグするときの考え方

ここまで書いてきたことを実際にやろうとすると、ほぼ確実に何かしらハマりポイントが出てきます。
わたしがUnity 2Dゲームづくりで何回も踏んだ地雷と、そのときどうやって抜けたかを簡単にまとめておきます。

まず多かったのが「当たり判定が反応しない」です。
OnCollisionEnter2Dが呼ばれないときは、①両方のオブジェクトにCollider2Dが付いているか、②どちらかにRigidbody2Dが付いているか(Static/ Dynamic問わず)、③Layer Collision Matrixで衝突が無効化されていないか、を順番にチェックするとだいたい原因が分かりました。

次に多いのが「画面外でプレイヤーが消える or どこかに飛んでいく」問題です。
これは、カメラのサイズと位置、Rigidbody2Dの制約(Constraints)、そしてスクリプト内で無意識にTransform.positionを直接書き換えていた、などが原因でした。
デバッグのときは、Sceneビューで実行中にオブジェクトを追いかける癖をつけると、物理挙動の変な動きに気づきやすくなります。

最後によくやったのが、「入力が効かなくなる」パターンです。
Input Systemを新旧で混ぜていたり、Project SettingsでInput Managerの設定を変えていたりすると、「Jumpボタンの名前が違う」「Fire1が存在しない」などの細かい罠が出てきます。
わたしは一度、キー設定を全部メモして、プロジェクト間で統一するようにしました。

デバッグのときに意識しているのは、「Unity側の設定で起きているのか」「C#コードのロジックで起きているのか」をまず切り分けることです。
設定っぽいときはInspectorとProject Settingsを眺め、ロジックっぽいときはDebug.Logで値を出す。
これだけでも「何を調べればよいか」がかなりクリアになります。

まとめ:まずは1本、小さくても最後まで作り切る

ここまで、Unityで2Dゲームを作るときの大まかな流れと、わたしが毎回やっていること・ハマったことをまとめました。
かなりざっくり言うと、

  • プロジェクトを2D用に整える(テンプレ+カメラ+解像度)
  • スプライトと当たり判定で「歩けるステージ」を作る
  • 移動・ジャンプ・攻撃など、プレイヤーの最小セットを作る
  • 作りたいジャンル(アクション・RPG・シューティング)に合わせて機能を足す
  • 本や講座をうまく併用しながら、デバッグしつつ完成まで持っていく

という5ステップです。
技術的にはもっと細かい話が山ほどありますが、「Unity 2dゲーム 作り方」を調べている段階なら、まずはこの流れを一周してみるのが一番早いと感じています。

わたしも最初の頃は、つい「完璧な設計」「オシャレなエフェクト」を目指して寄り道ばかりしていました。
でも、結局いちばん力になったのは「ちょっと荒いけど自分の力で最後まで作った1本」でした。
ゲームとして遊べる状態まで持っていくと、次に何を改善したいかも自然に見えてきます。

この記事が、これからUnityで2Dゲームを始める人の「最初の1本」を作るときの、ゆるい道しるべになればうれしいです。
もっと腰を据えて2DアクションやRPGを作り込みたいと思ったら、わたしも普段お世話になっているUnity入門の森ショップの講座も選択肢のひとつとしてチェックしてみてください。

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?