2021年6月11日に発売されたNintendo Switch用『ナビつき! つくってわかる はじめてゲームプログラミング』。プログラムをするのに必要な考えかたや仕組みを、実際にゲームを作りながら学べるソフトである本作だが、ここでは自身もゲーム開発に取り組んでいるライターの戸塚伎一が、実際に同作を使ってゲームを作ってみた。はてさて、その顛末やいかに。

※本作の概要などを伝えるレビュー記事はこちら

『ナビつき! つくってわかる はじめてゲームプログラミング』(Switch)の購入はこちら (Amazon.co.jp) 『ナビつき! つくってわかる はじめてゲームプログラミング』ニンテンドーeショップページ

ゲーム制作ソフトとしての実力や、いかほどに?

 いままでまったく経験ないけどテレビゲームを作ってみたい! という人にピッタリな『ナビつき! つくってわかる はじめてゲームプログラミング』。“ノードン”と呼ばれるプログラムの機能のまとまりどうしをワイヤーでつなぐ……というスタイルのプログラミングを、複数のサンプルゲームの制作を通して学べる新感覚のプログラミング体験ソフトです。わかりやすく無理なくステップアップしていける、ということは前回のファーストインプレッション記事で紹介しましたが、オリジナルゲームを一から作るためのソフトとしてはどうなのか? 実際どの程度のものがどのくらいの時間で作れるのかを、当記事の記者がみずから試してみました。

 参考までに、記者のゲームプログラミング関連の経歴は以下の通り。

  • 1980年代、BASIC(初心者向けのプログラミング言語)で制作したミニゲームが、当時のゲームプログラム投稿雑誌に何度か掲載される
  • 2010年代前半にJavascriptでのゲーム制作を試みるもさっぱり理解できず挫折
  • 2010年代中盤、Scratch(子ども向けのプログラミング学習環境)でアクション性のあるミニゲームを何本か作る
  • 2020年、ティラノスクリプト(ノベルゲーム制作に特化したスクリプト記述型ゲームエンジン)でミニゲームを制作

 初心者向けの環境でミニゲームを作れる程度のプログラミング経験はあるけれどそこからステップアップできず……といったところです。そんな中途半端な経歴だからこそ今回のような記事を担当するのに適任だと思うと“人間万事塞翁が馬”を実感せずにいられません。

基本的なゲーム内容を固めたら、即プログラミング開始

 制作することにしたのは「上から降ってくる鉄骨を左右移動でひたすら避け続けるアクションゲーム」。システム上の空間がカメラ固定の2Dで済む、複雑なアクションがないからバランスもとりやすいはず……など、消極的な引き算の末たどり着いたスタイルです。

 “フリープログラミング”モードで“新規作成”を選択すると、何もプログラムされていない虚無の空間に投げ出されます。ゲーム画面の大前提となる見ためを司るワールドノードンのデフォルト設定──無機質なタイルが敷き詰められた地平と雲が浮かぶ昼の空が果てしなく続くビジュアルに、創造主の使命感が刺激されます。

 まずはプレイヤーキャラの設定。といってもヒトノードンを呼び出して、“左右”のポートに、Joy-ConのLスティックの左右操作用のスティックノードンを連結させれば9割がた終了です。あとはサイズ調整と、“鉄骨に当たったらゲームオーバー”という判定のため、ふるまい設定で“こわれる”を有効化するくらいです。

『ナビつき! つくってわかる はじめてゲームプログラミング』実践編・ゲーム制作経験が中途半端にあるライターがオリジナルゲームを作ってみた
コード記述型のプログラミング環境では、キャラを左右に動かす処理を組むだけでもそこそこ手間がかかるのに、本ソフトの場合はわずか3アクションで完了。キャラの移動速度やスティックのアナログ出力範囲などの微調整は、各ノードンの設定画面で行える。

ノードンの仕組みに合わせてゲームシステムを再現

 ゲーム画面ノードンで画面の表示範囲を指定し、床(直方体のモノノードン)を配置してからは、このゲームの肝心かなめとなる鉄骨の処理。こいつをランダムな位置からランダムなタイミングで降らせることで、何度も遊べるミニゲームとしての基礎が完成します(バランス面はさておき)。

 記者がこれまでに使ってきたプログラミング環境では、まずは“鉄骨なるものの概念・構造(見ため、どういう挙動をするかなど)”をあらかじめ作成。そしてゲームプレイ中、特定のタイミングごとに画面に出現させるかどうかを判定し、いざ出現となったら所定の場所に鉄骨をインスタンス(実体)化……という形で実装するのですが、『ナビつき! つくってわかる はじめてゲームプログラミング』ではその必要がありません。というか、すでにいくつかの汎用性の高いオブジェクトが“モノ系ノードン”として構造化されていて、それらをいかに扱うかに集中できる作りになっているのです(あまりの便利さについスルーしましたが、前述のヒトノードンは、基本的なプレイヤーキャラの性質に加え“任天堂ゲームクオリティー”が反映された、相当に高度なゲーム内オブジェクトです)

 というわけで使用するのは、(鉄骨に見立てられる直方体状の)モノ系ノードンを射出し続けられる“モノを発射ノードン”。砲台や弾を撃つ敵の攻撃機構として便利に使えるこのノードンを、ゲーム画面上端の表示範囲外にズラズラと並べます。それぞれ、任意のタイミングで下方向にひとつずつ発射するようプログラムすれば、いい感じになるはず。

『ナビつき! つくってわかる はじめてゲームプログラミング』実践編・ゲーム制作経験が中途半端にあるライターがオリジナルゲームを作ってみた
ゲーム画面のいわゆる“天井裏”に、モノを発射ノードンをならべた状態。このままゲームを始めると、すべてのモノを発射ノードンが同じタイミングで鉄骨を発射し続けるので、ゲームとして成立しない。

 “任意のタイミング”の決めかたは乱数。現代風にたとえると“ガチャの確率”で使われているものです。モノを発射ノードンひとつにつき、乱数(整数)を生成する“ランダムノードン”をひとつずつ割り当てて、低確率で出る特定の数字が生成されたときに発射させることにします。

 各ランダムノードンは、1から1000までの乱数を延々と生成し続けるよう設定。そして、くらべるノードンで996以上の数字が出力されたときに発射させることで、簡単すぎず難しすぎずな発射頻度になることを、何度かにわたるプレイ検証から導き出しました。確率5/1000……だったら最初から1/200でよかったんじゃないの? と思うかもしれませんが、桁を多めにしておくことで小数点以下の単位での確率調整も可能になります。今回はたまたま約分できる数値になっただけです!

『ナビつき! つくってわかる はじめてゲームプログラミング』実践編・ゲーム制作経験が中途半端にあるライターがオリジナルゲームを作ってみた
モノを発射ノードンに、発射タイミングの条件づけをした状態。各ランダムノードンに“1”の定数ノードンをつないで、つねに乱数を生成させる状態にしている。乱数の生成速度はとんでもない速さのため、たかだか0.5パーセントでも結構な割合で発射されるのだ。
『ナビつき! つくってわかる はじめてゲームプログラミング』実践編・ゲーム制作経験が中途半端にあるライターがオリジナルゲームを作ってみた
実際に動かしてみたところ。ちゃんとバラバラなタイミングで落ちてくるか、プレイヤーキャラ、鉄骨、床の衝突判定は思った通りに機能しているかをチェックする。なお、画面の両端に“見えない壁”を作っておかないと、プレイヤーキャラが画面外に逃避行してしまうので注意。

いかにしてゲームプレイの“循環”の仕組みを作るか

 ここまでできたらメインパートはほぼ完成。あとはスコアシステムとリトライの仕組みさえ作れば、“スコアアタック形式のシンプルなミニゲーム”としての体裁が整います。スコアは、鉄骨が床に落ちて壊れるごとに (直方体だけを対象にしたモノがこわれたしゅんかんノードンで検知) 、プラス1点。プレイヤーキャラが落下中の鉄骨に触れたら(ヒトノードンだけを対象にしたモノがこわれたしゅんかんノードンで検知)ゲーム終了。そのプレイのスコアを確定し、しばらく表示した後にまた最初から……というルーチンを組みました。

『ナビつき! つくってわかる はじめてゲームプログラミング』実践編・ゲーム制作経験が中途半端にあるライターがオリジナルゲームを作ってみた
ゲームオーバーまわりの処理。最終的な獲得スコアをちゃんと確認できるよう、タイマーノードンで3秒間の猶予を設定した。ちなみに音を鳴らすノードンに入力されている定数ノードンの数字(2)は、再生音量の値。

 鉄骨専用のモノがこわれたしゅんかんノードンをカウンターノードンに直接つなぐと、ゲームオーバーになってからも加点され続けてしまいます。そこは“鉄骨が壊れた”かつ“プレイヤーキャラが壊れていない”という複数の条件を満たしている時だけカウンターノードンに信号(+1)を送るプログラムを組むことで対処しました。

『ナビつき! つくってわかる はじめてゲームプログラミング』実践編・ゲーム制作経験が中途半端にあるライターがオリジナルゲームを作ってみた
スコア加算関連のプログラム。ちょっと複雑だが、こうすることで“プレイヤーキャラが壊れていない状態”を発信し続けることができる。

 やや込み入った条件判定が必要な場面で、ロジック系ノードン(AND、NOT)やくらべるノードン(=、<、>)をいちいち配置しなければならな作りは、ほかのプログラミング言語の経験がある人ほど「もっとスマートに記述できないものか」と感じるかもしれません。しかし、ノードンひとつひとつの機能がここまで細分化されているからこそ、初学者にとっては部分的な理解が進みやすいとも言えます。

“〇〇をひとつまみ”が、ゲームの印象を左右する

 これにてマスターアップ! ということにしてもいいのですが、ビジュアルや演出などの“ちょっとした味つけ”を加えることで、そのゲームが備えるメッセージがより豊かになります。

 たとえば“鉄骨をよけ続ける”という謎のシチュエーションに、

 “大型ロボに搭乗して出撃したいけど、整備がまだ終わっていなくて、しかも基地が敵の襲撃を受け、屋根から鉄骨がボロボロ落ちてきて危ない”

 というこれまた謎なバックストーリーを想定したとします。背景(ゲーム画面の奥行き方向)に巨大ロボの姿を配置することで画面のインパクトを追加するとともに、「このロボ、何か関係あるのかな……」という期待感をプレイヤーに持たせます。

『ナビつき! つくってわかる はじめてゲームプログラミング』実践編・ゲーム制作経験が中途半端にあるライターがオリジナルゲームを作ってみた
『ナビつき! つくってわかる はじめてゲームプログラミング』実践編・ゲーム制作経験が中途半端にあるライターがオリジナルゲームを作ってみた
モノ系ノードンの配置を真上視点(XZ軸)から見るとこんな感じ(命令系ノードンもそのまま表示されるため、かなりゴチャゴチャした印象になるのはご容赦のほどを)。ゲーム空間は2D構成のため、ほとんどの要素がゲーム画面ノードン(プログラム画面下部の横に長い直方体)と同じX軸上に配置される。中央上部の大きな四角形で表されているのが背景用ロボット(“えんちゅうなオシャレ”にカテゴライズされているモノノードン)で、左下の数つきモノノードンが、スコア表示パネル。見やすさや画の収まり具合を考慮し、ゲーム画面ノードンと奥行き(Z軸)の位置をずらして存在させていることが、ゲーム画面の真上視点と比較することで、なんとなくおわかりいただけるだろうか。

 そして、スコアが100点を超えたときにロボっぽい音声を再生。同時に、ロボの真正面付近エリアに配置しておいた、さわっているセンサー(ヒトノードンにのみ反応するよう設定)からの信号を受け付けるようにします。

 ここで“スコアが100点を超えてから背景のロボに重なると搭乗成功となりゲームクリアー”としてしまうと、スコアアタック形式のゲームのルールとしてはいささか不十分。そこで“スコアが100点を超えてから背景のロボに重なるごとに、画面を覆う爆発アニメーション&爆発音を再生”という、アクションゲーム上級者に不自由なプレイを強いる姑息な仕様にしました。ロボに搭乗できるかと思いきや、ただ、爆発。このバックストーリーに何の希望もなかったことが証明されてしまいました。

『ナビつき! つくってわかる はじめてゲームプログラミング』実践編・ゲーム制作経験が中途半端にあるライターがオリジナルゲームを作ってみた
『ナビつき! つくってわかる はじめてゲームプログラミング』実践編・ゲーム制作経験が中途半端にあるライターがオリジナルゲームを作ってみた
スコアが100点を超えてからの一連の処理。ワイヤーワーブ・出口ノードン(ID:A)からANDノードンに送られているのは、ヒトノードンがゲーム画面中央(巨大ロボの真正面)にきたという信号だ。くらべるノードンとANDノードンの中間にフラグノードンを設置しているからこそ、爆発エフェクトを何度も発生させられる。

“わかりやすさ”を重視した結果、犠牲になっている要素も……

 プレイ時間の長期化にともなう難度上昇措置は、本来であれば、鉄骨が降ってくる頻度や落下速度を変化させることで行うべきです。しかし、それらを後づけで実装するのは厳しいと判断し、今回は見送りました。

 また、このゲームプログラムで見て見ぬふりをしまったバランス調整面でのもうひとつの問題点は“鉄骨を絶対避けられないケースがあること”。計8個のモノを発射ノードンの発射タイミングが完全にランダムだからこそおこりうる不具合です。対策としては“モノを発射ノードンが発射命令を受け取ったら、隣のどちらか、あるいは両隣のモノを発射ノードンの発射命令を一定時間無効化”というプログラムの組み込が考えられますが……考えるだけにしておきました。

 記者が上記の作業を躊躇した理由は“複数のノードンをまとめてコピー”、“選択した同一種類のノードンの設定内容を一括変更”のような操作が、『ナビつき! つくってわかる はじめてゲームプログラミング』にはなく、調整が長時間に及ぶ可能性があったからです。そもそも初心者向けのプログラミング体験ソフトにこういった機能は不必要かもしれませんが、くり返し系の手作業が増えるほどケアレスミスが発生するのはたしかです。

『ナビつき! つくってわかる はじめてゲームプログラミング』実践編・ゲーム制作経験が中途半端にあるライターがオリジナルゲームを作ってみた
ただでさえ配線がごちゃごちゃしている箇所に新たなプログラムを追加するには、ある程度の覚悟がいる。ノードンの位置をずらしてスペースにゆとりを作って、なんてしているうちに思わぬバグ(プログラム構成上のミス)が発生しないとも限らない。こうした局面を何度も経験することで“後に修正や要素追加をしやすいプログラムの組みかた”が身につくとしたら、それはそれで意義のあることだ。

 ケアレスミスといえば、携帯モードのタッチ操作の意図しない反応には相当苦しめられました。ノードンやワイヤーを感覚的に操作できること自体はよいのですが、そこそこの表示倍率で操作していても、動かしたくないノードンをつかんでしまったり、出したくないワイヤーをひっぱり出したりしてしまうのです。わけがわからなくなったらアンドゥ(ひとつ前の操作状態に戻る)ボタンを押せばいいのに、とか、携帯モードでもスティックポインタで操作すればいいじゃないか、とか、動かしたくないノードンは片っ端からロック設定にしておけよ、などと言われたら、まったくその通りです。でも……指が太いおっさんだって、流れるような指さばきでゲームを作りたかったんだよ。

『ナビつき! つくってわかる はじめてゲームプログラミング』実践編・ゲーム制作経験が中途半端にあるライターがオリジナルゲームを作ってみた
ノードンをつかんだはずが、そのノードンのポートからワイヤーを伸ばしていて、違う違うと指を離したら機能的にぜんぜん関係ない近くのノードンとワイヤー接続……みたいなミスが、携帯モードでは頻発。やむをえずノードンを重ねて配置している場所では、さらにシッチャカメッチャカなことに。

 逆にとてもよかったのは、ドックにUSBマウスを接続するTVモードでの操作。いつでもどこでも気軽にプログラミング! という利便性が犠牲になったぶん、PCのアプリケーション感覚ですいすい操作できます。とりわけ左手でマウス、右手でJoy-Con Rを操作する“二刀流スタイル”が隔世の快適さでした。ゲーム画面/プログラム画面の切り替えや、プログラム画面の表示軸変更(XY/XZ)といったサブアクションをJoy-Conでショートカット風に利用することで、作業効率がアップしました。これは記者がたまたま左利きだからの感想であり、通常は右手でマウス操作&左手でJoy-Con R持ちで問題ないと思います。

結論・アイデアや思いつきをストレートに形にするツールとして秀逸!

 本記事の締め切りなど外部条件を考慮した上で、ひとまずの完成となったのがこちら。グラフィックこそソフト側であらかじめ用意されたものをそのまま使用していますが、過去にどこかで見たようなそうでもないようなゲームプレイに仕上がっているのではないでしょうか。

 プログラム画面の全景はこんな感じ。どことなく一個の生き物のようなまとまりというか躍動感が感じられます。……作った本人だからそう見えるだけですかね。

『ナビつき! つくってわかる はじめてゲームプログラミング』実践編・ゲーム制作経験が中途半端にあるライターがオリジナルゲームを作ってみた

 このくらいの規模やクオリティーの作品であれば、ゲームプログラムをちょっとかじったことがある人ならソフト入手から2、3日で十分作れます。まったくの初学者も、“ナビつきレッスン”モードをプレイし終えた後ならば、もっとすごいものを作れるスキルが身についているはずです。記者の頭脳では到底無理ですが、位置を角度にノードン、角度を位置にノードンなどの三角関数関連のノードンを自在に使えるようになれば、かなり本格的なアクションゲームも作れるでしょう。

 ひとつのプロジェクトで使用できるノードンやワイヤーの数に上限があるため、製品レベルの超大作を生み出せるわけではありませんが、ちょっとしたネタゲーを量産したり、ほかのプログラム環境で本格的に作り込むことを前提としたゲームのテスト版を制作するには申し分ない機能が揃っている『ナビつき! つくってわかる はじめてゲームプログラミング』。Nintendo Switchを使っていてふと気が向いたときに起動できるプログラミング環境のひとつとして持っておいて損はありません!