Unity2Dで放置ゲームを一から作る|終末世界を舞台にした個人開発の企画・設計

ゲーム制作

こんにちは、とまです。

今回から、Unity2Dを使ってスマートフォン向けの放置ゲームを一から作っていきます。

ゲームを作るときに重要になってくる、設計。
かなり奥が深く、ゲームが完成するかどうかはその設計によるところが大きいです。
実際に自分自身も何本かゲームを完成させたことがありますが、
やはり始める前の設計が肝になってくると実感しました。

今回作るゲームのテーマは、

「終わった世界に、もう一度人が暮らせる場所を作る」

です。

ちなみに、まだタイトルは決まっていません。
おしゃれなタイトルにするか、シンプルなタイトルにするか…
これはまた別の会で決めようと思っています

ひとまず、この記事では、実際にUnityで開発を始める前に、

を整理していきます。


  1. 今回作るゲーム
  2. なぜ放置ゲームを作るのか
  3. ゲームのコンセプト
  4. 見下ろし型の拠点にする
  5. なぜキャラクターを歩かせないのか
  6. 基本的なゲームループ
  7. 資源を集める
    1. 食料
    2. 木材
    3. 金属
  8. 施設を建設・強化する
  9. 施設を強化すると生産量が増える
  10. 拠点そのものも成長する
  11. 放置ゲームなので「時間」が重要
  12. ゲームを閉じていても資源が増える
  13. オフライン報酬には上限を設定する
  14. 探索システム
  15. 探索によって世界が広がる
  16. 生存者も増えていく
  17. 最終目標は「最後の安全都市」
  18. 最後の安全都市を完成させる
  19. 「世界を救う」ゲームにはしない
  20. 本編クリア後のエンドコンテンツ
    1. 追加探索
    2. 都市のさらなる発展
    3. 防衛
    4. プレステージ
  21. Unity2Dではどう設計するのか
  22. UnityのScene構成
  23. 施設はPrefabとして管理する
  24. スクリプトも役割ごとに分ける
  25. なぜスクリプトを分けるのか
  26. データと表示も分離する
    1. FacilityData
    2. FacilityState
    3. FacilityView
  27. ScriptableObjectも利用する
  28. セーブ・ロード
  29. 最初から全部作らない
  30. 最初の完成版
  31. 最初は作らないもの
  32. 開発ロードマップ
    1. Phase 1:ゲーム基盤
    2. Phase 2:資源
    3. Phase 3:時間
    4. Phase 4:施設
    5. Phase 5:自動生産
    6. Phase 6:アップグレード
    7. Phase 7:セーブ
    8. Phase 8:オフライン報酬
    9. Phase 9:探索
    10. Phase 10:生存者
    11. Phase 11:拠点発展
    12. Phase 12:本編クリア
    13. Phase 13:エンドコンテンツ
  33. このゲームを作りながらUnityを学ぶ
  34. 今回のゲームで目指すもの
  35. 「終わった世界に、もう一度人が暮らせる場所を作る。」

今回作るゲーム

今回作るのは、

終末世界を舞台にした拠点発展型の放置ゲーム

です。

プレイヤーは、文明が崩壊した世界に残された小さな避難所を管理します。

最初は何もありません。

小さな建物と、わずかな資源だけ。

そこから時間をかけて資源を集め、

  • 食料を作る
  • 木材を集める
  • 金属を集める
  • 施設を建設する
  • 施設を強化する
  • 生存者を増やす
  • 周辺地域を探索する

といったことを行い、少しずつ拠点を発展させていきます!!

そして最終的には、

「最後の安全都市」を完成させる

ことを目指します!


なぜ放置ゲームを作るのか

今回、放置ゲームを作ろうと思った理由の一つは、

ゲームとしてシンプルに始められる一方で、Unityのさまざまな機能を使えるからです。

放置ゲームといっても、実際にはかなり多くのシステムが必要になります。

例えば、

  • 時間管理
  • 資源管理
  • 自動生産
  • 施設管理
  • アップグレード
  • セーブ・ロード
  • オフライン報酬
  • UI
  • データ管理
  • 探索
  • ゲーム進行
  • スマートフォン向けのタッチ操作

などです。

つまり、一つのゲームを作りながら、Unityで必要になるさまざまな技術を実際に使ってみることができるということが大きな魅力です!


ゲームのコンセプト

今回のゲームで一番大切にしたいのは、

「何もない場所が、少しずつ人の暮らせる場所になっていく」

という感覚です。

ゲーム開始時は、小さな避難所しかありません。

しかし、ゲームを続けることで、

小さな避難所
↓
生活できる場所
↓
小さな集落
↓
町
↓
都市
↓
最後の安全都市

と発展していきます。

単純に数字が増えていくだけではなく、拠点そのものが発展していくことを視覚的にも感じられるゲームを目指します。


見下ろし型の拠点にする

ゲーム画面は、見下ろし型の2Dマップを基本にします。

ただし、プレイヤーキャラクターを操作して拠点内を歩き回るゲームにはしません。

基本的には、

「拠点を見る」→「施設をタップする」→「強化する」

という操作にします。

例えば、ゲームを起動すると、

のような画面を想定しています。
これはCanvaで作成した、ちょっと荒い感じの画像ですが、
設計だし、大体でオッケーです!

施設をタップすると、その施設の詳細を確認できます。

例えば、

農場 Lv.5

食料生産
+15 / 分

次のレベル

木材 500
金属 100

[強化する]

といった画面です。


なぜキャラクターを歩かせないのか

「終末世界の見下ろしゲーム」と聞くと、キャラクターを操作して拠点内を歩き回るゲームを想像するかもしれません。

しかし、今回はあえてそれをやりません。

キャラクターを歩かせるようにすると、

  • プレイヤー移動
  • アニメーション
  • 衝突判定
  • カメラ
  • タッチ操作
  • NPC AI
  • 経路探索

など、必要になるシステムが一気に増えてしまいます。

今回の目的は、まず放置ゲームとして完成させることです。

そのため、

ゲーム性はUIと拠点の成長で作る

という方針にします。


基本的なゲームループ

ゲームの基本的な流れは非常にシンプルです。

資源が時間経過で増える
        ↓
資源を確認する
        ↓
施設を強化する
        ↓
生産量が増える
        ↓
さらに資源が増える
        ↓
探索する
        ↓
新しい資源や施設を獲得する
        ↓
拠点が発展する
        ↓
さらに施設を強化する
        ↓
都市へ発展する

このループを繰り返していきます。


資源を集める

最初のバージョンでは、資源を増やしすぎない予定です。

まずは、

  • 食料
  • 木材
  • 金属

の3種類程度から始めます。

例えば、

食料

生存者の維持や施設の建設などに使用します。

木材

建物の建設や施設の強化に使用します。

金属

発電施設や防衛施設など、より高度な施設に使用します。

ゲームが完成してから、必要に応じて、

  • 電力
  • 水
  • 医薬品
  • 部品
  • 希少資源

などを追加する予定です。


施設を建設・強化する

資源を集めたら、施設を建設します。

例えば、

  • 農場
  • 製材所
  • 採掘場
  • 発電所
  • 住宅
  • 工房
  • 医療施設
  • 防衛施設
  • 探索施設

などです。

それぞれに役割を持たせます。

例えば、

農場 → 食料を生産

製材所 → 木材を生産

採掘場 → 金属を生産

というような形です。


施設を強化すると生産量が増える

施設にはレベルを設定します。

例えば、

農場 Lv.1
食料 +1 / 秒

↓

農場 Lv.2
食料 +2 / 秒

↓

農場 Lv.3
食料 +4 / 秒

↓

農場 Lv.4
食料 +7 / 秒

のように、強化するほど生産効率が上がります。

これによって、

資源を集める
↓
施設を強化する
↓
生産量が増える
↓
さらに資源を集めやすくなる

という成長ループを作ります。


拠点そのものも成長する

施設単体だけではなく、拠点全体にもレベルを設定します。

例えば、

Lv.1
小さな避難所

↓

Lv.2
小さな集落

↓

Lv.3
集落

↓

Lv.4
町

↓

Lv.5
都市

↓

Lv.6
最後の安全都市

というようにします。

拠点レベルが上がることで、

  • 新しい施設
  • 新しい探索地域
  • 新しい機能

などが解放されるようにします。


放置ゲームなので「時間」が重要

今回のゲームでは、時間を重要なゲームシステムとして扱います。

例えば、

農場
食料 +10 / 分

製材所
木材 +5 / 分

採掘場
金属 +2 / 分

といった生産を時間経過によって行います。

プレイヤーが何も操作しなくても、拠点は少しずつ成長していきます。


ゲームを閉じていても資源が増える

放置ゲームで重要なのが、

オフライン報酬

です。

例えば、

20時にゲームを閉じる。

↓

翌日の8時にゲームを開く。

↓

12時間経過している。

↓

その12時間分の生産量を計算する。

↓

食料 +1,200
木材 +800
金属 +300

といった報酬を受け取る。

という仕組みです。

これによって、

「ゲームを閉じている間も、拠点では人々が生活している」

という感覚を作りたいと考えています。


オフライン報酬には上限を設定する

オフライン報酬を無制限にすると、ゲームバランスが崩れてしまいます。

そのため、最初は例えば、

最大12時間分まで

といった上限を設定する予定です。

将来的には施設やアップグレードによって、

12時間
↓
24時間
↓
48時間

のように上限を増やせるようにすることも考えています。


探索システム

拠点を発展させるだけではなく、外の世界へ探索に出られるようにします。

例えば、

  • 廃墟
  • 廃駅
  • 病院
  • 工場
  • 発電所
  • 研究施設

などです。

探索には一定時間が必要です。

例えば、

廃工場

探索時間:30分

報酬:

木材 +200
金属 +80
部品 +5

というような仕組みです。


探索によって世界が広がる

最初からすべての地域へ行けるわけではありません。

拠点が発展することで、

周辺の廃墟
↓
旧市街
↓
工業地帯
↓
研究施設
↓
さらに遠い地域

というように探索範囲を広げていきます。

これによって、

拠点を発展させることが、そのまま世界を広げることにつながる

ようにしたいと考えています。


生存者も増えていく

ゲームが進むと、生存者も増えていきます。

最初は、

生存者 2 / 5

だったものが、

住宅を増やすことで、

生存者 5 / 10

となるような仕組みです。

最初のバージョンでは複雑にしすぎず、

生存者が増えるほど拠点の生産力が上がる

程度から始める予定です。

将来的には、

  • 農業担当
  • 技術者
  • 探索員
  • 医療担当
  • 防衛担当

など、役割を持たせることもできます。


最終目標は「最後の安全都市」

このゲームには、明確な本編のゴールを設定します。

それが、

最後の安全都市を完成させる

ことです。

単純に「レベル100にする」といった数字だけの目標にはしません。

ゲームの流れとして、

小さな避難所
↓
生活基盤の確立
↓
小さな集落
↓
町
↓
都市
↓
最後の安全都市

という成長を描きます。


「世界を救う」ゲームにはしない

今回のゲームでは、

魔王を倒して世界を救う

というようなストーリーにはしません。

すでに世界は終わってしまっています。

だからこそ、

世界を元に戻すのではなく、終わった世界に新しい世界を作る。

という方向にします。

この考え方をゲーム全体のテーマにしたいと思っています。


本編クリア後のエンドコンテンツ

「最後の安全都市」が完成したら、本編は一度エンディングを迎えます。

しかし、そこで完全にゲームを終了するわけではありません。

本編クリア後には、簡単なエンドコンテンツを追加する予定です。

候補として考えているのは、

追加探索

さらに遠くの地域を探索できるようにする。

都市のさらなる発展

安全都市完成後も、都市レベルを上げられるようにする。

防衛

一定時間ごとに敵が拠点を襲撃し、防衛力によって結果が変化する。

プレステージ

都市を完成させた後、一部の恒久的なボーナスを引き継いで新しい周回を始める。

などです。

ただし、これらは最初からすべて実装するのではなく、まず本編を完成させることを優先します。


Unity2Dではどう設計するのか

ゲームの規模が大きくなってくると、1つのスクリプトにすべての処理を書くのは難しくなります。

そこで今回は、最初から役割を分けて設計します。

基本的には、

時間
資源
生産
施設
アップグレード
探索
生存者
セーブ
オフライン報酬
UI
ゲーム進行

をそれぞれ独立したシステムとして扱います。


UnityのScene構成

最初はSceneを増やしすぎず、基本的に1つのMainSceneを中心にします。

MainScene
├── GameRoot
│   ├── GameBootstrap
│   ├── TimeSystem
│   ├── ResourceSystem
│   ├── ProductionSystem
│   ├── FacilitySystem
│   ├── UpgradeSystem
│   ├── ExplorationSystem
│   ├── SurvivorSystem
│   ├── SaveSystem
│   └── OfflineRewardSystem
│
├── World
│   ├── BaseMap
│   ├── Buildings
│   └── Decoration
│
└── Canvas
    ├── TopUI
    ├── MainUI
    ├── FacilityUI
    ├── ExplorationUI
    ├── SurvivorUI
    └── BottomNavigation

ゲームの規模が大きくなった場合は、必要に応じてSceneを分割します。


施設はPrefabとして管理する

施設はそれぞれPrefab化します。

例えば、

Farm.prefab
LumberMill.prefab
Mine.prefab
PowerPlant.prefab
House.prefab
Workshop.prefab
Hospital.prefab
Defense.prefab

などです。

施設をタップすると、施設情報を表示します。


スクリプトも役割ごとに分ける

基本的な構成は以下を予定しています。

Scripts/
├── Core/
│   ├── GameBootstrap.cs
│   └── GameState.cs
│
├── Time/
│   └── TimeManager.cs
│
├── Resource/
│   ├── ResourceManager.cs
│   └── ResourceData.cs
│
├── Production/
│   ├── ProductionManager.cs
│   └── ProductionCalculator.cs
│
├── Facility/
│   ├── FacilityManager.cs
│   ├── FacilityData.cs
│   ├── FacilityState.cs
│   └── FacilityView.cs
│
├── Upgrade/
│   ├── UpgradeManager.cs
│   └── UpgradeCalculator.cs
│
├── Exploration/
│   ├── ExplorationManager.cs
│   ├── ExplorationData.cs
│   └── ExplorationState.cs
│
├── Survivor/
│   └── SurvivorManager.cs
│
├── Save/
│   ├── SaveManager.cs
│   └── SaveData.cs
│
├── Offline/
│   └── OfflineRewardManager.cs
│
└── UI/
    ├── ResourceUI.cs
    ├── FacilityUI.cs
    ├── ExplorationUI.cs
    ├── OfflineRewardUI.cs
    └── BottomNavigationUI.cs

なぜスクリプトを分けるのか

例えば、資源の処理を担当するResourceManagerに、

  • セーブ
  • UI
  • 施設強化
  • 探索
  • 時間管理

まで書いてしまうと、後から変更するのが大変になります。

そこで、

「1つのスクリプトは、できるだけ1つの責任を持つ」

という考え方で設計します。

例えば、

TimeManager
↓
時間だけ

ResourceManager
↓
資源だけ

SaveManager
↓
セーブだけ

FacilityManager
↓
施設だけ

という形です。


データと表示も分離する

施設を例にすると、

FacilityData

「農場とは何か?」

を定義します。

施設ID
表示名
アイコン
Prefab
基本生産量
建設コスト
アップグレードコスト
最大レベル
解放条件

FacilityState

「プレイヤーの農場は現在どうなっているか?」

を管理します。

施設ID
レベル
建設済みか
配置位置

FacilityView

「画面上で農場をどう表示するか?」

を担当します。

この3つを分けることで、後から施設を追加しやすくします。


ScriptableObjectも利用する

ゲーム内で変更する可能性が高いデータは、ScriptableObjectを利用する予定です。

例えば、

FarmData.asset
LumberMillData.asset
MineData.asset
PowerPlantData.asset
HouseData.asset

といった形です。

これによって、

「農場の基本生産量を5から10に変更したい」

という場合でも、コードを書き換えずに調整できるようにします。


セーブ・ロード

放置ゲームでは、セーブが非常に重要です。

保存するデータは、

  • 資源
  • 施設レベル
  • 建設状態
  • 施設配置
  • 拠点レベル
  • 生存者
  • 探索状態
  • 解放済み地域
  • ゲーム進行状況
  • 最終保存時刻

などを予定しています。

保存形式は、まずJSONを候補にします。


最初から全部作らない

今回の開発では、

最初から完成版を作ろうとしない

ことを重要な方針にします。

まずは、

資源が増える
↓
施設を強化する
↓
さらに資源が増える

という最小ループを完成させます。

この段階で「ゲームとして成立している」状態を作ります。


最初の完成版

最初の完成版では、以下を目標にします。

  • 拠点画面
  • 施設配置
  • 施設タップ
  • 資源3種類
  • 自動生産
  • 施設アップグレード
  • 建設
  • ゲーム内時間
  • セーブ・ロード
  • オフライン報酬
  • 基本UI
  • 拠点レベル
  • 簡単な探索
  • 本編クリア条件
  • エンディング

ここまで完成すれば、まず一つのゲームとして成立します。


最初は作らないもの

逆に、以下は後回しにします。

  • プレイヤーキャラクターの移動
  • 複雑なNPC AI
  • 本格的な戦闘
  • ガチャ
  • オンラインランキング
  • マルチプレイ
  • 大量の施設
  • 大量の資源
  • 複雑なストーリー
  • 複雑なアニメーション
  • 大規模なイベント
  • 本格的なエンドコンテンツ

まずはゲームを完成させることを優先します。


開発ロードマップ

今後は、おおむね以下の順番で作っていく予定です。

Phase 1:ゲーム基盤

UnityプロジェクトとMainSceneを作成。

↓

Phase 2:資源

食料・木材・金属を管理するシステムを作る。

↓

Phase 3:時間

ゲーム内時間と経過時間を実装。

↓

Phase 4:施設

施設を配置・タップできるようにする。

↓

Phase 5:自動生産

時間経過によって資源が増えるようにする。

↓

Phase 6:アップグレード

施設を強化できるようにする。

↓

Phase 7:セーブ

ゲームデータを保存・ロードできるようにする。

↓

Phase 8:オフライン報酬

ゲームを閉じている間の資源を計算する。

↓

Phase 9:探索

外の世界を探索できるようにする。

↓

Phase 10:生存者

生存者を増やし、拠点の生産力に影響させる。

↓

Phase 11:拠点発展

拠点レベルを上げ、新しい施設や地域を解放する。

↓

Phase 12:本編クリア

最後の安全都市を完成させる。

↓

Phase 13:エンドコンテンツ

本編完成後に追加する。


このゲームを作りながらUnityを学ぶ

今回のゲーム制作では、単純にゲームを完成させるだけではなく、

「なぜこの設計にしたのか」

も記録していきたいと思っています。

例えば、

  • Unityで放置ゲームを作るにはどうするのか
  • ゲーム内時間をどう管理するのか
  • オフライン報酬をどう計算するのか
  • ScriptableObjectをどう使うのか
  • JSONでゲームデータをどう保存するのか
  • Managerをどう分割するのか
  • UIとゲームロジックをどう分離するのか

などです。

実際に作っていく中で発生した問題や失敗も、できるだけ記録していく予定です。


今回のゲームで目指すもの

このゲームで一番大切にしたいのは、

「世界を救う」のではなく、「終わった世界に新しい世界を作る」

という体験です。

最初は何もない。

資源もない。

人もいない。

ただ、小さな避難所だけが残されている。

そこから少しずつ、

🏚️ 避難所
↓
🏠 集落
↓
🏘️ 町
↓
🏙️ 都市
↓
🌆 最後の安全都市

へと成長させていきます。

ゲームを閉じている間にも人々は生活し、時間が経つと資源が集まり、次にゲームを開いたときには昨日より少しだけ拠点が大きくなっている。

そんな、

「少しずつ世界を再建していく感覚」

を楽しめるゲームを目指します。


まとめ

今回は、これからUnity2Dで制作していく放置ゲームの企画と、基本的な設計についてまとめました。

ゲームのコンセプトは、

「終わった世界に、もう一度人が暮らせる場所を作る。」

です。

ゲーム開始時は小さな避難所しかありません。

そこから、

  • 資源を集める
  • 施設を建設する
  • 施設を強化する
  • 生存者を増やす
  • 外の世界を探索する
  • 拠点を発展させる

ことで、最終的に「最後の安全都市」を完成させます。

本編をクリアした後には、追加探索や都市発展、防衛などのエンドコンテンツも追加していく予定です。

そして、ゲームを作るだけではなく、このゲームが完成するまでの過程そのものをブログに記録していきます。

Unity2Dでゲームを作ったことがない方にも分かるように、設計から実装、問題解決まで順番に記事にしていく予定です。

次回から、いよいよ実際のUnityプロジェクトを作り始めます。

まずは大きなゲームをいきなり作るのではなく、

「資源が時間経過で増える」

という、放置ゲームの最も基本的な部分から作っていきたいと思います。

これからどんなゲームになっていくのか、自分自身も楽しみながら制作していきます!!

今回はここまでです!
それでは、またお会いしましょう~


コメント

タイトルとURLをコピーしました