ゲーム開発を始めたい人から、「最初は何を作ればいいですか」と聞かれることがあります。
プログラム自体が初めて、という人ばかりではありません。Webや業務システムなら何年も作っている。C#やC++も書けるし、Gitも普通に使える。でもゲームだけは作ったことがない。そういう人も結構います。
そういう場合でも、最初から大きなものを作ろうとはしない方がいいと伝えています。
キャラクターが動く。ジャンプできる。敵に触れたらやられる。ゴールまで行けばクリア。
最初はそれくらいで十分です。
見た目は四角でもいいですし、ステージも一つで構いません。敵を何種類も作る必要もありません。
その代わり、途中で終わらせず、「最初から最後まで遊べる」ところまでは作る。
ここまでやると、キャラクターを動かしただけのプログラムとは少し違ったものが見えてきます。
キャラクターが動くだけでは、まだ触らない処理がかなりある
ゲームエンジンを触り始めると、とりあえずキャラクターを動かしたくなります。
キーを押したら左右に移動する。ジャンプする。カメラが追いかけてくる。
プログラム経験があれば、このあたりはサンプルを見ながら比較的早く作れると思います。画面の中で自分のキャラクターが動くので、最初はこれだけでも結構楽しいです。
でも、ゲームとして作ろうとすると、その先があります。
穴に落ちたらどうするのか。敵に当たったらどうなるのか。死んだあと、いつ操作を止めるのか。どこから再開するのか。ゴールしたことは何で判定するのか。クリアしたあともキャラクターは動けるのか。
もう一度遊ぶなら、何を初期状態へ戻すのかも考えます。
こういうものは、キャラクターを動かしているだけだとあまり出てきません。
小さくてもゲームを1本完成させると、入力、移動、衝突判定、状態の切り替え、リスタート、クリア判定あたりを一通り触ることになります。
ゲームプログラムで何度も出てくる処理なので、最初の1本で経験しておくにはちょうどいいと思っています。
最初の1本なら、このくらいの仕様でいい
たとえば横スクロールのアクションゲームなら、かなり小さくできます。
プレイヤーは左右に動ける。ジャンプできる。床に乗れる。穴へ落ちるか敵に触れたらミス。ミスしたらスタート地点からやり直し。ステージの端にあるゴールへ触れたらクリア。
これだけです。
攻撃はいりません。
アイテムも、経験値も、レベルアップもなくていい。セーブもランキングもネットワーク通信も、最初の1本にはまず必要ありません。
敵も一種類で、決まった範囲を左右に歩いているだけで十分です。グラフィックも箱や丸で構いません。
それでも作ってみると、案外いろいろ出てきます。
ジャンプ中にもう一度ジャンプできてしまったら、接地しているかどうかを判定する必要があります。
壁にぶつかったときにキャラクターがガタガタ震えるなら、移動処理と衝突判定のさせ方を見直すことになります。
敵に当たって死亡した直後にもキャラクターを動かせてしまうなら、「プレイ中」「死亡中」のような状態を持った方が扱いやすいかもしれません。
少し意地悪なケースだと、ゴールと敵に同じフレームで触れた場合に、クリアと死亡のどちらを優先するのか、という話まで出てきます。
ゲーム自体はものすごく単純なのに、ゲームプログラムらしい問題は結構入っています。
最初から全部作らない
作る順番も、小さくした方が分かりやすいです。
最初は床を一枚置いて、キャラクターを左右に動かすだけでいいと思います。ジャンプすら後回しです。
左右移動ができたら、重力とジャンプを追加する。
次に、床や壁との衝突を見る。
そこまで動いたら、敵かトゲを一つ置いて、触れたら死亡するようにする。
死亡したらステージの最初へ戻る。
最後にゴールを置き、触れたら「CLEAR」と表示する。
これで一周できます。
タイトル画面がなくてもいいですし、BGMもいりません。敵のアニメーションがなくても困りません。
起動して、操作して、失敗したらやり直せる。最後まで行けばクリアになる。
ここまで通れば、一度「完成」にしてしまっていいと思います。
プログラムを書ける人の方が、途中で仕様を増やしやすい
プログラム経験者の場合、初心者とは少し違うところで止まりやすいことがあります。
いろいろ作れてしまうんですね。
敵を一種類作ったら、「もう一種類くらい作れるな」となる。
攻撃も入れたくなる。武器も持たせたくなる。せっかくだからアイテムも落としたい。ステータス画面も作れる。マップ切り替えも難しくなさそうだ。ここまで来たらセーブも欲しい。
一つひとつを見ると、確かに作れそうです。
ただ、ゲームの場合は機能を一つ足すと、それ単体では済まないことが多いです。
攻撃を追加するだけでも、ジャンプ中に攻撃できるのか、攻撃中に移動できるのか、攻撃が敵に当たったフレームで接触ダメージも受けるのか、といった組み合わせが出てきます。
武器を二種類にしたら、装備変更、表示、攻撃判定、ダメージ、アニメーション、UIなどにも話が広がります。
単純にコードが何行増えるか、という話ではありません。考える仕様が増えていきます。
最初の1本では、「何を作るか」と同じくらい「何を作らないか」を決めておいた方が、最後まで届きやすいです。
ゲームは、入力していない時間も動いている
小さなアクションゲームを作ると、ゲーム以外のプログラムとの違いも分かりやすくなります。
プレイヤーの入力を受け取る。キャラクターの状態を更新する。敵を動かす。衝突を判定する。死亡やクリアを確認して、その結果を画面へ反映する。
そして次のフレームでも、また処理します。
実際にどのタイミングで何が呼ばれるかは、使うゲームエンジンや作り方によって違います。それでも、ゲームの世界が短い時間単位で更新され続けている、という感覚は共通しています。
Webアプリなら、ボタンを押す、リクエストを送る、結果を受け取る、といったユーザー操作を起点にした処理が多いと思います。
ゲームは、こちらが何も入力していなくても敵が歩いています。重力は働いているし、弾も飛んでいる。アニメーションも進んでいます。
ゲーム以外の開発経験が長い人でも、この感覚は最初ちょっと違うと思います。
その意味でも、いきなり複雑なものへ行くより、小さなアクションゲームを一度作った方が分かりやすいです。
どこまで行ったら「完成」なのかを決めておく
初めて作るゲームは、完成条件を先に決めてしまうと楽です。
一例なら、これくらいです。
・ゲームを開始できる
・キャラクターを操作できる
・ジャンプできる
・敵や障害物に触れるとミスになる
・ミスしたら再挑戦できる
・ゴールするとクリアになる
・進行不能になるような致命的な不具合がない
ここまで動けば、私は一度完成扱いにしていいと思います。
効果音がなくてもいい。キャラクターが箱でもいい。ステージが30秒で終わっても構いません。
完成させたあとで、物足りないところを足します。
ジャンプしたら音を鳴らしてみる。着地時にエフェクトを出す。敵を踏んで倒せるようにする。ステージをもう一つ作る。
この順番なら、「この機能を追加したら何が変わったか」も分かりやすくなります。
一度遊べる状態になると、気になる場所が変わる
未完成のゲームを見ていると、どうしても足りないものに目が行きます。
グラフィックが欲しい。敵が少ない。ステージも増やしたい。演出もない。
ところが、いったん最初から最後まで遊べるようになると、今度は別のところが気になってきます。
ジャンプが少し重い。
敵が突然見えて避けづらい。
やられてから再開するまでが長い。
ゴールしたのか分かりにくい。
ここで音が鳴った方が気持ちいい。
これは実際に遊べる状態にならないと、なかなか見えてきません。
ゲーム開発では、作って、遊んで、気になったところを直して、また遊ぶ、ということを何度も繰り返します。
最初のゲームを小さくするのは、この一周を早く経験するためでもあります。
一度完成させると、「今度は敵を倒せるようにしたい」「ステージを増やしたい」という次の欲も自然に出てきます。
最初から100個の機能を並べるより、その方がゲーム制作を続けやすいと思います。
さらに簡単なものならPongやブロック崩しでもいい
実は、もっと単純なゲームから始める方法もあります。
Pongです。
バーを動かす。ボールが壁やバーに当たって跳ね返る。相手側へ抜けたら得点。一定の条件になったらゲーム終了。
これだけでも、入力、移動、衝突判定、反射、スコア、ゲーム開始、ゲーム終了、再スタートまで作れます。
ブロック崩しも近いですね。
ゲームエンジンそのものが初めてだったり、プログラムにもまだ慣れていなかったりするなら、この辺から始めるのもいいと思います。
一方で、ある程度プログラム経験があって、「ちゃんとゲームを作った感じも欲しい」という人なら、左右移動とジャンプのある小さなアクションゲームくらいが面白いでしょう。
Pongにするか、アクションゲームにするかは、それほど重要ではありません。
自分が最後まで作り切れる大きさにする。
最初の1本では、それくらいでいいと思います。
完成したあとなら、いくらでも続きを作れます。
最初から大作である必要はありません。
おわりに
最初のゲームでは、技術をたくさん詰め込むより、一度最後まで作って、自分で遊んでみるところまで行く方が得るものは多いと思っています。
動かしてみると、「次はここを直したい」が必ず出てきます。そこから少しずつ足していけば十分です。
開発や採用、育成、マネジメントについて、日々の仕事の中で考えたことはX・Bluesky・Facebookでも投稿しています。noteの記事にするほど長くない話や、日々の仕事で気になったことも書いています。
X:
https://x.com/itchie_tatsumi
Bluesky:
https://bsky.app/profile/itchie-tatsumi.bsky.social
Facebook:
https://www.facebook.com/ichino.souta
辰巳電子工業SS事業部:
https://www.tatsu-mi-systemsolution.jp/