「ゲームを作るならゲームエンジン(Unity)?それともネイティブ(Xcode)?」——iPhone向けの2Dゲームなら、実はどちらでも作れます。そこで今回は、落ちてくる玉をタップして得点する全く同じミニゲームを、Unity(C#)とXcode(Swift/SpriteKit)の両方で作り、見た目・操作感・アプリの軽さ・開発の手間を比べてみました。

🎮 この記事でわかること
・同じ2Dゲームを Unity と Xcode で作る手順とコードの違い
・両者の見た目・動きを並べて比較
アプリサイズ・起動・開発の手間の違い(驚きの差!)
ゲームエンジンとネイティブの使い分けの結論

作るゲーム:タップキャッチ

スポンサーリンク

題材は「タップキャッチ」。シンプルですが、ゲームらしい要素が一通り入っています。

  • 上から色つきの玉が落ちてくる(だんだん速く・多くなる)
  • 玉をタップすると消えて+1点+弾けるアニメ
  • 20秒の制限時間、スコアと残り時間を表示
  • スタート画面 → ゲーム → リザルト画面、ハイスコア保存

両環境で全く同じ仕様・同じ見た目を目指して作りました。

今回の環境

環境言語 / 技術バージョン
Unity(ゲームエンジン)C# / 2D(uGUI)Unity 6000.4.5f1
Xcode(ネイティブ)Swift / SpriteKitXcode 26.5(iOS 18 SDK)

※ 動作確認は両方とも iPhone 17 Pro シミュレータ。Bundle ID は com.eight.tapcatch / com.eight.tapcatchswift。

① Unityでの作り方

Unityは「2D」テンプレートで新規プロジェクトを作り、エディタ上にゲームを組み立てます。今回は落下する玉やスコア表示などをC#スクリプトでまとめて生成し、メニューから配置する形にしました。玉の落下・タップ判定・スコアはすべてC#で書きます。

// 落下&当たり判定(イメージ)
void Update() {
  timeLeft -= Time.deltaTime;
  foreach (var t in targets)
    t.anchoredPosition += Vector2.down * speed * Time.deltaTime;
}
// 玉をタップ → 加点
btn.onClick.AddListener(() => { score++; Destroy(target); });

Unityの強みはエディタで見た目を確認しながら作れること、そして物理・アニメ・エフェクトなどゲーム機能が最初から豊富なことです。

Unity スタート
Unity:スタート画面
Unity プレイ
Unity:プレイ中

Unity特有の設定(iPhone向けに出すとき)

UnityでiPhone(シミュレータ)向けに動かすには、いくつかUnity独自の設定が必要です。ビルドプロファイルでプラットフォームをiOSに切り替えプレイヤー設定でシミュレータ向け(Simulator SDK/アーキテクチャ ARM64)を指定します。下が実際の設定画面です。

Unity ビルドプロファイル
プラットフォームをiOSに(ビルドプロファイル)
Unity iOSプレイヤー設定
ターゲットSDK=Simulator SDK/ARM64

ポイントは「ターゲットSDK」を Simulator SDK に、「Simulator Architecture」を ARM64すること。Apple Silicon搭載Macのシミュレータはこの組み合わせで動きます(ここを実機用のままにすると、シミュレータで起動できません)。あわせて入力処理は「入力システムパッケージ(新)」バンドル識別子も忘れず設定します。

② Xcodeでの作り方

Xcodeでは、Appleの2Dゲーム用フレームワークSpriteKitを使います。SKSceneのゲームループ(update)で玉を動かし、touchesBeganでタップを判定します。SwiftUIのSpriteViewに載せるだけでアプリになります。

// SpriteKitのゲームループ
override func update(_ t: TimeInterval) {
  timeLeft -= dt
  for n in targets { n.position.y -= speed * dt }
}
// タップした位置の玉を判定して加点
override func touchesBegan(_ touches: Set<UITouch>, with e: UIEvent?) {
  for n in nodes(at: loc) where n.name == "target" { score += 1; n.removeFromParent() }
}

SpriteKitはiOS純正なので、アプリがとても軽く・起動が速いのが特徴。2Dゲームに必要な機能はひと通り揃っています。

Xcode スタート
Xcode:スタート画面
Xcode プレイ
Xcode:プレイ中

Xcode特有の設定(プロジェクトと署名)

Xcodeでは、プロジェクトの「General」タブ表示名・バンドルID・対応OS(最低iOS 15.0)・画面の向きなどをまとめて指定します。Unityのプレイヤー設定にあたる部分です。

Xcode General設定
Xcode:General(表示名・Bundle ID・最低iOS・向き)

もうひとつXcodeらしいのが「Signing & Capabilities(署名)」です。実機に入れるにはApple開発者アカウント(チーム)の署名が必要ですが、シミュレータで動かすだけなら署名なし(チーム=None)でもOK。下の画面では「実機にはチームが必要」という警告(⚠️)が出ていますが、シミュレータ確認はこのまま進められます。

Xcode 署名設定
Xcode:Signing & Capabilities(シミュレータなら署名なしで可)

③ 見た目・大きさを揃えるコツ

「同じゲーム」を名乗るなら、玉や文字の大きさ・落ちる速さもそろえたいところ。実はここに、エンジンとネイティブの“座標の基準”の違いという落とし穴があります。最初に作ったときは、Xcodeのほうが玉が大きく・速く見えてしまいました。

原因は、サイズを測る「ものさし」が違うこと。Unityは基準解像度(参照解像度)を決めて、その中の数値でサイズを指定します。今回は横1080を基準にしました。設定はCanvasの「Canvas Scaler」で行います。

Unity Canvas Scaler
Unity:Canvas Scaler(参照解像度 1080×1920・マッチ0.5)

一方Xcode(SpriteKit)は、何もしないと端末の論理ポイント(iPhoneで約390)が基準になります。Unity(1080基準)と同じ数値「55」を指定しても、ものさしが約2.7倍ちがうので、実機では大きさも速さもズレてしまうわけです。

解決はシンプルで、SpriteKit側のシーンもUnityと同じ「横1080基準」で作ること。コードでGameScene(size: CGSize(width: 1080, ...))のようにシーンの幅を1080に固定し、玉の半径・文字サイズ・落下速度をUnityと同じ数値にすれば、両者の見た目・動きがピタリと一致しました。

💡 揃えるコツまとめ
エンジンとネイティブを比べるときは、まず「サイズの基準(ものさし)」を合わせるのが鉄則。Unityは参照解像度(今回は横1080)、SpriteKitはシーンの幅を同じ1080に固定。基準さえそろえれば、あとは同じ数値を入れるだけで見た目も動きも一致します。

見た目・動きを並べて比較

同じ仕様で作ったので、見た目はほぼそっくりに仕上がりました。左がUnity、右がXcodeです。

Unityスタート
Unity
Xcodeスタート
Xcode
Unityリザルト
Unity:リザルト
Xcodeリザルト
Xcode:リザルト

プレイ感(玉の落下・タップの反応・画面遷移)も、どちらも実用上じゅうぶん滑らかでした。単純な2Dゲームでは、完成した画面だけ見るとほとんど区別がつきません。違いは「中身」に出ます。

実機の動きを並べて

同じ「玉が落ちてくる」プレイの様子です。左がUnity、右がXcode。動き・反応はどちらも自然で、見た目だけでは違いがほとんど分かりません。

比較表:ここが違う

観点Unity(エンジン)Xcode(ネイティブ)
アプリサイズ約164MB約240KB
起動の速さスプラッシュ+初期化ありほぼ一瞬
CPU負荷(プレイ中)約11%約6%
CPU負荷(待機画面)約8%約1%
言語・技術C# / Unity 2DSwift / SpriteKit
作りやすさエディタで見ながら(GUI)コード中心(軽快)
ゲーム機能の豊富さ◎ 物理・アニメ・3Dも○ 2Dは十分
マルチ展開◎ Android等にも出せるiOS/Apple中心
ネイティブUIとの親和△ ランタイム経由◎ 純正
📝 アプリサイズの注意(正直な補足)
今回の164MB vs 240KBは、シミュレータ向けのデバッグビルド(未最適化)の数値です。Unityはゲームエンジンのランタイム(実行に必要な土台)をアプリに同梱するため大きくなります。実機向けに最適化・圧縮すればUnityも小さくなりますが、「ネイティブの方が軽い」という傾向は変わりません。単純な2Dゲームほど、この“土台のぶん”の差が目立ちます。

動作中のCPU負荷も測ってみた

せっかくなので、動かしている間のCPU負荷も計測してみました。同じMac上のシミュレータで、同じゲームを動かしたときの数値です。

状態Unity(C#)Xcode(Swift/SpriteKit)
待機画面(玉が動かない静止状態)約8%約1%
プレイ中(玉が次々落ちてくる)約11%約6%

はっきり差が出たのは待機画面です。SpriteKit(ネイティブ)は「画面に動きがなければ描画を止める」ため、止まっている間はCPUをほとんど使いません(約1%)。一方Unityは動きの有無にかかわらず毎フレーム描き続けるので、止まっていても約8%かかります。プレイ中もネイティブの方が軽め(約6% vs 約11%)でした。軽さ=省電力=バッテリー持ちに直結するので、シンプルなアプリほどネイティブが有利です。

📝 数値の前提
上のCPU値は実機ではなくMac上のシミュレータで測ったものです。実機とは絶対値が異なりますが、両方を同じ環境で測った相対比較なので、傾向(ネイティブの方が軽い/待機時の差が大きい)はそのまま参考になります。

結論:どっちで作る?

  • 演出やゲーム性を重視/いずれAndroidにも出したい → Unity。物理・アニメ・エフェクトが最初から揃い、1つ作れば複数プラットフォームに展開できます。
  • とにかく軽く・起動を速く/iPhoneに専念・ネイティブUIと組み合わせたい → Xcode(ネイティブ)。SpriteKitなら2Dゲームは十分作れて、アプリは驚くほど軽量です。

今回いちばん驚いたのはアプリサイズの差でした。同じ見た目・同じ遊びでも、中身(土台)の大きさはまるで違う——これがエンジンとネイティブの本質的な違いだと実感しました。簡単な2Dなら気軽にネイティブ、本格的なゲームや複数展開ならUnity、と覚えておくと選びやすいです。

2Dは互角。でも3Dになると話が変わる

今回のようなシンプルな2Dアプリでは、UnityでもXcodeでも“ほぼ同じように”作れました。見た目も操作感もそっくりで、難易度の差もそれほど感じません。

ところが3D、とくにリッチな表現(リアルな光・影・反射、大量のパーティクル、物理演算、滑らかなアニメ)になると、難易度の差は一気に開きます。Unityはこうした機能を最初から備えていて部品を置くだけで形になりますが、ネイティブ(Xcode)で同じ画を出そうとすると、3Dの土台づくりから自分で組む必要があり、作業量・専門知識ともに跳ね上がります。「2Dなら互角、3D(特にリッチ表現)はUnityが圧倒的にラク」——これが今回の率直な実感です。

それぞれの「しかできない・できない」を整理

ゲームやアプリ作りで迷ったとき用に、4つの観点でまとめておきます(あくまで“一般的な傾向”で、工夫すれば例外もあります)。

✅ Unityにしかできない(が得意)
  • 本格的な3D・物理・パーティクルなどリッチな表現を手軽に
  • 1つ作ればiPhone・Android・PC・ゲーム機・Webへ展開
  • 豊富なアセットストアで素材や機能を追加
⚠️ Unityには苦手(できにくい)
  • アプリを極限まで軽く・速くするのは不利(土台を同梱)
  • iOSの最新機能・純正UIへの即対応は弱め(ランタイム経由)
  • OSの新機能が出た直後の追随がやや遅れがち
✅ Xcode(ネイティブ)にしかできない(が得意)
  • iOSの全機能・最新APIを即日フル活用(カメラ・センサー・課金等)
  • 最小・最速・最も省電力なアプリ(今回のサイズ・CPU差の通り)
  • Apple純正UIや他アプリ連携と完全に馴染む
⚠️ Xcodeには苦手(できにくい)
  • Androidなど他機種に出せない(iPhone・Apple専用)
  • リッチな3D表現は土台から自作で、作業量・難易度が大
  • ゲームを量産する生産性は専用エンジンに劣る

ざっくり言うと、「いろんな機種に出したい・派手な3Dを作りたい」ならUnity「iPhoneに専念して、とにかく軽く・OSの機能をフルに使いたい」ならXcode(ネイティブ)。作りたいものに合わせて選べば失敗しにくいです。

それでは、今回はここまで。最後までありがとうございました😊