「Unity ゲーム作り方」で検索するといきなり深い沼が見えるんですよね。
わたしも最初はそうでした。
情報が多い=選択肢が多い=着手が遅れる。
この記事はQiita向けに、正確さは守りつつ“つぶやき感”を少し混ぜて、わたしが最短で1本完成させたときの手順と注意点、そして2D/3D/スマホを比較した判断基準をまとめます。
対象は「Unityゲーム 作り方 初心者」の方から、軽く1本作って次に進みたい人。
無理に全部やらなくてOK。
各章は独立して読めます。
ゴール設定と作るもの:小さく作って確実に出す
まず“完成”の定義を決めます。
ここでは「タイトル画面→ゲーム→リトライ」の流れが成立していることをゴールにします。
Unityゲーム作成は自由度が高く、気を抜くとチュートリアルコレクターになります。
わたしは最初、機能を盛り込みすぎて半年かかった経験があるので、今回は「2Dのミニゲーム(5〜10分で遊べる)→3Dの玉転がし→スマホビルド」の順に、段階的に“出荷”できる形にします。
これで達成感の積み上げが起き、次の一歩が軽くなります。
また、キーワードの観点では「Unityゲーム 作り方 簡単」な2Dから入るのが正解です。
2Dは当たり判定や描画負荷の見通しが良く、物理も2D専用APIで扱いやすい。
3Dは学びが多いぶん作業も増えるので、基礎の反復には不向きです。
スマホ対応は最後にまとめて。
最初からモバイルを狙うと「解像度」「入力」「ビルド環境」で足が止まりがち。
順番が大事です。
作る題材は、2Dならブロック崩し風、3Dなら玉転がしを提案します。
どちらも「入力→物理→スコア→再開」というゲームの基本回路が学べるから。
わたしは毎回この2本を“儀式”として最初に作ります。
完成時間の目安が読めるので、タスク管理もしやすいです。
準備:Unity Hub・LTS版・テンプレの選び方(2D/3D)
インストールはUnity Hub経由を推奨します。
理由は複数バージョンの共存管理とモジュールの後付けが楽だから。
初学者は安定したLTS(長期サポート)版を選びます。
機能の最新さよりも教材資産の多さが勝ち。
Hubの「Installs」でLTSを入れ、「Add modules」で“Windows Build Support”“Android Build Support(SDK/NDK/Java含む)”“iOS Build Support(macのみ)”をチェックしておくと、あとでビルド待ちが起きません。
プロジェクトテンプレは2D/3Dのどちらか。
2Dテンプレはデフォルトのカメラ・ライト・物理(2D)設定が良い初期値になっています。
3DテンプレはURP(軽量レンダーパイプライン)を選ぶとモバイルでも軽量に動かせます。
わたしは学習用は2D(Core)、3DはURP(Core)で分けています。
テンプレは“雰囲気”ではなく、目的のプラットフォームと演出の重さで選ぶのがコツです。
入力方式は「新Input System」に統一するのがおすすめ。
マルチプラットフォーム対応が自然にでき、同じアクションをキーボード/タッチ/パッドにバインドできます。
Player SettingsでActive Input Handlingを“Input System Package(New)”に。
旧方式と併用(Both)は便利そうでトラブル源でした。
わたしの失敗メモ:BothにしていたせいでUIのナビゲーションが2重入力になり、ボタンが2回押される怪現象が発生……。
2Dミニゲームを作る(ブロック崩し風):Rigidbody2DとCollider2Dの最短レシピ
ここは「Unity 簡単 な ゲーム 2d」を探している人にも効く、最短構成でいきます。
Sceneは3要素:Paddle(プレイヤー)、Ball(物理)、Blocks(壊れる壁)。
最初にHierarchy→Create→2D Object→SpriteでRectを3つ作成し、それぞれ名前を付けます。
PaddleにはBoxCollider2DとRigidbody2D(Kinematic)を、BallにはCircleCollider2DとRigidbody2D(Dynamic)を付与。
BlocksはTilemapでもいいですが、学習用はPrefab化した“Block”を複製で十分です。
パドルの左右移動は「スクリーン座標→ワールド座標」変換でマウス/タッチ対応にします。
壁抜け防止でClampも入れる。
物理はFixedUpdateでいじりたくなりますが、Kinematic+TranslateならUpdate側でもOK。
BallはStart時にランダム方向へ力を与え、速度は一定に保つ(ノーマライズ×一定速度)と“詰み”が減ります。
以下は最少スクリプト例。
using UnityEngine;
public class Paddle : MonoBehaviour
{
public float left = -8.0f, right = 8.0f, y = -4.0f;
void Update()
{
var pos = Input.mousePosition;
var world = Camera.main.ScreenToWorldPoint(new Vector3(pos.x, pos.y, -Camera.main.transform.position.z));
var clampedX = Mathf.Clamp(world.x, left, right);
transform.position = new Vector3(clampedX, y, 0f);
}
}
Ball側は、初速・反射・ブロック破壊の責務をまとめます。
Rigidbody2Dの“Bounce(Physics Material 2D)”で反発係数を0.9〜1.0にしておくと、計算負荷の少ない気持ちいい跳ね返りに。
速度が落ちたら適宜再加速。
ブロックはOnCollisionEnter2Dでタグ一致ならDestroy。
using UnityEngine;
public class Ball : MonoBehaviour
{
public float speed = 8f;
Rigidbody2D rb;
void Awake(){ rb = GetComponent<Rigidbody2D>(); }
void Start(){ rb.velocity = new Vector2(Random.Range(-1f,1f), 1f).normalized * speed; }
void FixedUpdate()
{
rb.velocity = rb.velocity.normalized * speed; // 速度を一定に保つ
}
void OnCollisionEnter2D(Collision2D col)
{
if (col.gameObject.CompareTag("Block"))
{
Destroy(col.gameObject);
}
}
}
注意点は3つ。
①物理は“スケール1.0”を基本に。
巨大なTransformスケールは衝突の誤差を増やします。
②ブロック大量配置時はPrefab+Static指定で描画負荷を抑える。
③UIはCanvasの“Screen Space - Camera”にし、Reference Resolutionを固定しておく(スマホ移植が楽)。
この2Dの型ができると、得点やライフ、ステージ遷移を足して“ゲームの骨格”が完成します。
3Dへ拡張(玉転がし):Rigidbody+カメラ追従の基本
3Dは「Unityゲーム 作り方 3D」の最小カリキュラムとして玉転がしが最強。
地形(Plane)、玉(Sphere+Rigidbody)、穴や段差(Cubeのスケール変更)、そして追従カメラの4点で構成します。
URPテンプレならライト1本でも見栄えが出ます。
マテリアルで玉にメタリック感を足すだけでテンションが上がるのも良い。
移動入力は物理に優しく“AddForce”で。
Rigidbodyの“Interpolate: Interpolate”“Collision Detection: Continuous”を有効にすると、振動や衝突抜けが減ります。
地形の摩擦はPhysic Materialで制御。
止まりにくければDynamic Frictionを下げ、転がりやすさを演出します。
using UnityEngine;
public class Roller : MonoBehaviour
{
public float force = 12f;
Rigidbody rb;
void Awake(){ rb = GetComponent<Rigidbody>(); }
void FixedUpdate()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
var dir = new Vector3(h, 0, v);
rb.AddForce(dir * force, ForceMode.Acceleration);
}
}
カメラの追従は“Lerpでなめらか”が定番。
Cinemachineを使うのも手ですが、学習用は自作で十分。
障害物で被写体が隠れるならRaycastで距離を詰める処理を入れます。
using UnityEngine;
public class FollowCamera : MonoBehaviour
{
public Transform target;
public Vector3 offset = new Vector3(0, 6, -8);
public float smooth = 8f;
void LateUpdate()
{
var desired = target.position + offset;
transform.position = Vector3.Lerp(transform.position, desired, Time.deltaTime * smooth);
transform.LookAt(target);
}
}
注意点は①スケールを1m基準に揃える(重力の体感が安定)。
②地形の面を分割しすぎない(コリジョン過多→CPU負荷)。
③カメラはLateUpdateに集約してタイムラインの競合を避ける。
ここまでで“3Dの最小ゲームループ”を体得できます。
スマホ対応(Android/iOS):解像度・入力・ビルド設定の実務
「Unity ゲーム 作り方 スマホ」でつまずきがちなのが解像度と入力。
まずCanvas Scalerは“Scale With Screen Size”にし、Reference Resolutionを例えば1080×1920に。
Matchは0.5で縦横バランスを取ります。
カメラはSafe Areaを意識してUIをアンカーで留める。
iPhoneのノッチでボタンが隠れる事故、何回も見ました……。
入力は新Input SystemのActionアセットで“Move/Fire/Pause”等を定義し、Bindingで“Stick / WASD / Touch Joystick / Tap”を割り当てます。
タッチだけサッと試すなら、スクリーン左右タップで左右移動という割り切りも良い。
以下は“画面左/右タップでパドル移動”の最小例。
using UnityEngine;
public class TouchMove : MonoBehaviour
{
public float speed = 10f, left = -8, right = 8;
void Update()
{
float dir = 0f;
for (int i = 0; i < Input.touchCount; i++)
{
var t = Input.GetTouch(i);
if (t.phase == TouchPhase.Began || t.phase == TouchPhase.Stationary || t.phase == TouchPhase.Moved)
{
dir += (t.position.x < Screen.width * 0.5f) ? -1f : 1f;
}
}
var next = transform.position + new Vector3(dir * speed * Time.deltaTime, 0, 0);
next.x = Mathf.Clamp(next.x, left, right);
transform.position = next;
}
}
ビルド設定の要点は3つ。
①AndroidはJDK/SDK/NDKをHubが入れてくれる組合せに揃える(外部導入は地雷)。
②iOSはXcodeプロジェクトを出してから端末で検証(Metal前提、IL2CPP+.NET Standard)。
③開発中はDevelopment Build+Script Debuggingで“ログを見ながら”進める。
Release前にIL2CPP/Managed Stripping設定を上げてサイズ削減、は定番の流れです。
2D/3D/スマホの比較:難易度・工数・落とし穴
わたしの肌感で比較表を作っておきます。
数値は相対指標(★が多いほど負荷が高い)。
比較はあくまで“最小構成”を前提にしています。
- 学習コスト:2D★☆☆ / 3D★★☆ / スマホ★★☆(環境依存が増える)
- 実装工数:2D★☆☆ / 3D★★☆ / スマホ★★☆(UIと入出力調整)
- デバッグ難度:2D★☆☆ / 3D★★★ / スマホ★★★(端末差・解像度)
- 見栄えの伸びしろ:2D★★☆ / 3D★★★ / スマホ★★★(持ち歩ける価値)
2Dの強みは“結果が出るのが早いこと”。
3Dの強みは“空間把握と演出の幅”。
スマホの強みは“配布の即時性”。
一方で、3Dとスマホは“カメラ・光・ポストプロセス・解像度・入力”のパラメータ爆発が起きやすい。
そこで方針は「2Dでゲームループを完成→3Dで空間とカメラ→スマホで入出力と解像度」に分解する。
分割統治が効きます。
教材選びの比較も一言。
書籍(Unityゲーム 作り方 本)は体系的にまとまっている反面、バージョン差異のフォローが弱いことがある。
無料チュートリアルやブログ(Unityゲーム 作り方 無料)は断片的だが最新に強い。
わたしは「本で地図を作り、Webで道の凹凸を埋める」のハイブリッドが好きです。
よくある落とし穴とデバッグ時短テク(わたしの失敗録付き)
Prefab地獄:Scene上で直接いじった値(Overrides)をApplyし忘れて再生で消える、あるあるです。
運用ルールを作りましょう。
①Prefabは“Atomic”に(1役1責務)。
②Variantでスキン違いを量産。
③Scene直編集は禁止し、必ずPrefabを開いて編集。
これだけでだいぶ事故が減ります。
物理の不安定:Fixed Timestepをデフォルト0.02からむやみに変えない。
Rigidbodyに直接positionを代入しない(テレポートはMovePosition/MoveRotation)。
コライダーは凸(Convex)とメッシュの使い分けを意識。
わたしは昔、巨大なMeshColliderに動的オブジェクトをぶつけて“すり抜け”を量産しました。
Continuousにするだけで解決するケースが多いです。
パッケージ衝突:Input System、Cinemachine、URP、TextMeshProなどはメジャーですが、サードパーティを多用すると依存地獄になります。
学習中は“1ジャンル1パッケージ”に絞り、更新頻度の低いものは避ける。
もし壊れたらPackages/manifest.jsonをGitで巻き戻せるように。
わたしの運用は「毎セクションの終わりでコミット&タグ付け」。
ログの可視化:Debug.Logは便利ですが、量が増えると有害です。
最低限、カテゴリ([Game],[UI],[Net])でPrefixし、警告とエラーは色分け。
さらに“開発時のみ”出すならConditional属性が有効。
using System.Diagnostics;
using UnityEngine;
public static class Logx
{
[Conditional("DEVELOPMENT_BUILD")]
public static void D(string tag, string msg)
{
Debug.Log($"[{tag}] {msg}");
}
}
「わたしはこうやりました」:1日の学習スケジュール見本
最後に、実際にわたしが“週末1日”で2D→3D→スマホまで触るときの進め方を置いておきます。
タイムボックスを切るのがコツ。
完璧主義を封印して、動く最小を出すのが目的。
- 午前(2.5h):2Dブロック崩し骨格(Paddle/Ball/Blocks、リトライとスコアの最低限)
- 昼(1h):UI(タイトル→ゲーム→リザルト)の遷移だけ作る(中身スカでもOK)
- 午後前半(2h):3D玉転がし骨格(Rigidbody/Follow Camera/簡単なコース)
- 午後後半(1h):スマホ化の最低ライン(Canvas Scaler、簡易タッチ入力、Android開発ビルド)
- 夕方(0.5h):READMEに操作方法を書く&ビルドをZip化してバックアップ
この配分なら、必ず“1日の終わりに動く何か”が残ります。
次の週末は、2Dにパーティクルを足す、3Dでチェックポイントを入れる、スマホで解像度表現を整える、のように伸ばせます。
まとめ:順番が9割。2D→3D→スマホで“完成体験”を積む
この記事では「Unityゲーム 作り方 初心者」向けに、2D→3D→スマホの順で最小構成を仕上げるやり方をまとめました。
要点は、(1)LTS+新Input Systemで安定土台を作る、(2)2Dでゲームループをまず完成、(3)3Dで物理とカメラを学ぶ、(4)最後にスマホで解像度と入力を整える、(5)Prefab・物理・パッケージの落とし穴を避ける。
わたしの感覚では、この順序で小さく勝つのがいちばん早い近道です。
次の一歩に迷ったら、この記事のコードをそのままベースに「UI遷移」「スコア保存(PlayerPrefs)」「サウンド(AudioSource)」を足すのがおすすめ。
完成までの距離が短く、気持ちよく学習を継続できます。
もしアセットや教材をうまく使って時短したいなら、ショップで学習向けのテンプレや素材を探すのもアリです。
Unity入門の森ショップ