【はじプロ】つくってわかる はじめてゲームの裏側体験

# はじめに
　**【ナビつき！ つくってわかる はじめてゲームプログラミング】** を手にとって半年弱の初学者です（プログラマーID: P 008 KDY HWJ）。最初の作品として戦車のシューティングゲームを作りました。はじプロでの自身の初作品であるとともに、自身の中でも初めて挫折しないで最後まで作り上げることができたゲームでもあります。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214020/e9affaea-0907-cccb-1e66-3eb69b215d96.png)

　この制作を通じて、ゲーム制作者だけが知っている「ゲームの裏側の虚構」的な可笑しみの一端を経験できた気がします。デザインを通じて振り返ってみようと思います。

# マップ端から落ちる
　**ロングレンジ射撃が楽しめる戦車シューティング** というコンセプトで始めてみたものの、最初にぶつかったのがワールドの大きさの問題です。広い荒野で、遠くから敵を発見して撃破するというのが目標です。そのため、ワールドは最大の200m x 200mにして戦車もできるだけ小さくするということが必要でした。それでも端っこはどうしても存在します。
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214020/aaa8cc52-47a4-81ad-8008-915703720d40.png)
　結局のところは、砂漠と青空の見た目が好きだったのと、端の存在を隠すこともできなさそうだったので、地面をそのまま使うことにしたわけですが。自機も敵もそのまま端から落ちてしまうと、最終的に戦車が消失して[^1]ゲームが続行不能になってしまいます。そのような状態を防ぐべく、Y方向の位置がマイナスになったらダメージを与えて撃破されるようにしました。
　見えない可動式壁なども検討しましたが、コストの割に面白さに貢献しないなーと考え、代わりに敵の動きや配置の設計で、普通にやっていればマップ端で立ち回らなくても良くなるように心がけました。

---
　行ってほしくないエリアへの侵入をどう防ぐか。そのデザインを通してコンセプトや工夫や苦労が見えて面白いと感じるようになりました。思えば、抜け道が発見されて「なぞのばしょ」を歩き回れてしまうというバグは昔からよくあった気がします。
![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214020/872276bc-a3d3-21ee-776e-c8c06f9fb697.png)
　今回自分では、容量やスキルの都合で「普通はそんなことしないっしょ」というプレイヤーの操作まで完全にはケアするのは難しかったですが、あらゆる可能性を考えてプログラムしている人々が世の中にいることを思うと頭が下がります。

[^1]:±400mくらいの座標でモノが消失する仕様。二度と戻ってこない。ヘリも飛び去ったあとどこかで消失している。

# テクスチャの嘘
　演出のために、ところどころにテクスチャを貼っています[^2]。
![図4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214020/b9bcac71-467e-1a75-0613-cdc21281a8f3.png)
　情報量を増やしてそれっぽくするために、テクスチャにはハイライトを入れるようにしています。ここにちょっとトリックがあります。
![図5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214020/d6ec95d1-fe6d-bce2-b0c2-6e438070bb29.png)
　ノードン数（と描く労力）を節約するために、なるべく同じテクスチャをサイズの異なる複数の面・パーツで使いまわしています。ところが、光の当たってる方向と無関係にハイライトが出てしまったり、パターンが変なところで切れてしまったりしています。
　ダメ元で1枚のテクスチャをまとめて貼り付けてみたのがはじまりだったのですが、意外と悪くない気がしたので、あり！ということにして多用しました。

　ここで、試しにハイライトなしver.を作って比較してみました。どうでしょう。
![図6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214020/f285d198-c55b-e4c1-f123-cc2cdfc2633e.png)
　感覚としてはプラモデルのスジボリ・墨入れ・ウェザリング・デカール貼りに近く、キマると結構楽しいのです。バーチャル・プラモデルと言っていいかも。破損を気にせず動かして遊べるし！

[^2]:はじプロではモノと呼ばれるゲーム上の物体に、自作のテクスチャを貼り付けられるのですが、独特の仕様がありいい感じにするのが結構難しい。

# 戦車といえば傾斜装甲
　ですよね。（※個人の感想です）
　はじプロで実現するには、直方体と斜め接続用のヒンジが余計に必要となってコスト高ですが、どうしても傾斜装甲にしたかったのです。見てくれだけの問題ですが、優先的に実施しました。**敵だけ！** あいにく自機のほうは、ただの箱なデザインになっています。
![図7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214020/718fcf84-bb1a-4310-c268-83726d8e864a.png)
　最初に出会う敵は作品の顔かも！と思ってなるべく妥協せずに。一方で自機の正面はゲーム中ほとんど見えないだろ、ということで、泣く泣くオミットしています。勢力ごとの設計思想の違いです。ということにして自分を納得させることにしました。なお、有名どころの例として、連邦は直線的、ジオンは曲線的、のような設計の違いがありますね。それと特に関係はないですが、最初の敵戦車はリスペクトを込めてザクカラーにしてみました。

　このようにして、システムの都合とコンセプトをどう折り合い付けて **納得感（主に自分自身の）** を出すか、というのも作り手ならではの楽しみなのかなという気づきがありました。

# 亜空間から湧く敵
　敵の使い回しは常套手段です。ダメージが一定になったら爆発し、破壊されたように見せかけてワープさせるというセオリーどおりの対応をしています。しかし本作では基本的にマップ全体が見渡せる状態にあることから、ワープ先が見えてしまう恐れがあります。何もない空間から突然敵が湧くといかにも嘘っぽい印象を与えてしまうかと思いました。

　完全には隠せていないのですが、以下のような方法でごまかすことにしました。

- 出現ポイントのワープ出口を物陰にする
- 複数のワープ出口を用意して、同じワープ出口から連続して出ない　（ワープの消費が多くなるのがデメリット）
- ワープ出口を常に動かし続ける　（そらとぶおじさん方式＝見えないおじさんにワープ出口を連結して動かしている）

　どうせならなるべくバレない様にしたいですからね。
![図8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214020/94a93a7d-816c-11f2-939a-954a6d70145e.png)
　そらとぶおじさん方式は、運が悪いと視界の目の前に敵が出てきてしまうのですが、他の要素を優先した結果最終ステージでは使っています。ワープ出口を常に視界の外に移動する、なんて案も考えたもののちょっとうまく入りきりませんでした。

　さらに敵の使い回しはもう1パターン。ラスボスは雑魚の赤戦車の使い回しです。条件を満たすと、見えないように隠しておいたラスボスのガワが赤戦車にワープ連結される様になっていました。この2機は実は動きがほとんど同じです。攻撃パターンなどで違いを演出しています。
![図9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214020/08970f7d-36ae-f013-31c8-a69b6b32c0bd.png)

---
　余談ですが、最近「あなた今、視界の外で勝手にワープしましたよね？」という振る舞いに出会いました。仕組みが垣間見られた気がして可笑しかったです。先に触れたFFしかり、本場のプロ作品と並べたてるのもおこがましいですが、ゲームプログラムという地平の、ちょっとだけ地続きを感じられて嬉しくなった瞬間でした。
![図10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214020/fde4d507-6f2d-9eda-5fdf-549aa3a4f992.png)
　※3人のNPCがついてくるが、時々どっかに引っかかっていなくなる。このあと、しれっと視界の外から登場する。




# 弾の有効射程は無限
　いちばん初め、弾に重量をつけて、有効射程のある仕様にしたほうがリアルになるかと思っていました。しかしゲーム的に現実的な発射速度だとすぐに地面に落ちてしまって接近戦しないと当たらなくなるので、これは結局無重力にしました。その結果として、どんなに遠くても当たれば敵を倒せる仕様になりました。
![35m.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214020/a9ece29f-764f-68f4-6f2c-90df3c505307.gif)
最初期バージョン、弾がすぐ落ちる

　実のところ本当にリアルを追求するなら、弾速はもっと圧倒的に速いですし、仰角も考えないと当たりません。遠くなれば威力が弱まりますし、当たりどころによってダメージも異なります。実現性も踏まえた上で、**なんの要素を抽出してそれっぽい感じに仕立てるのか**、というのがデザイン上の悩みどころでした。

　また、遠くの敵に向けて連射したときにモノ発射の制限で自機の弾が消える[^3]ことは、ロングレンジ射撃を謳っている手前どうしても避けたかったので、連射の遅い主砲でもモノ発射は(1)でなく(10)を使っています。そのおかげで「モノノードンはこれ以上呼び出せません」という画面を何度も拝むことになりました[^4]。
![図11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214020/892033a1-13d4-3530-c260-feb57935c273.png)
　なるべく気が付かれないようにしてるつもりですが、敵の弾は消えることがあります（笑）。モノコスト節約のためです。

　こうした、**リアルと虚構の間での葛藤** は、頭を悩ませたポイントであるとともに、ゲーム制作という体験の面白さでもありました。

[^3]:モノ発射は、その個数を超えると、古い発射物から順に消える仕様。モノ発射(2)とかあればいいのに。

[^4]:モノ発射10はモノ12個分のコストを消費する。モノコストが512になるとノードン数が空いていてもモノが出せなくなる。モノ発射のリファレンスをよく読めばちゃんと書いてあるが、「モノノードンはこれ以上呼び出せません」という突き放したエラーに、最初出たときは理由がわからず焦りました。


# 調和を乱せ
　最終ステージでは、3対3の乱戦を試みました。動かす戦車が増えたので、動作ルーチンを共通化して詰め込むためにおめくり式[^5]関数にチャレンジしています。
![図12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214020/8c866e81-3e46-ef13-dcd1-90108db70590.png)
　NPCの基本的な動きは以下のような超単純なものです。
1. 相手との距離を比較、最短距離にいる相手軍機の座標を取得
1. そこに向かって直進
1. 距離が一定になったら射撃

　が、これをそのまま動かすと、NPCの射撃は正確でNPC自身に対して直進してくる相手にほぼ必中なので、ひたすら最短距離の敵に向かって行って撃って、次の敵に向かって行って撃って…の繰り返しになります。これではいかにもプログラムしました！という感じが見えてしまって面白くありませんでした。ほどよくあいまいな動きをしてくれたら良いのですが、そのような複雑なルーチンを作る技術は私にはありません。色々悩んだ結果、同じ関数のままで、**敵の中の赤戦車１機だけ、読みづらいトリッキーな動き** をしてもらって、場をかき混ぜてもらうことにしました。ここに、プレイヤー自身の不規則な動きが乱数として加わることで全体としては、いくらか予定調和感を抑えられたかと思います。

　赤戦車のおおざっぱな仕組みです。
- プレイヤー機から、原点(0,0)を軸に反対側を目標にする
- さらに、目標のX,Z座標に随時増減する値を足して、最終的な目標座標とする（目標地点が常に動いているので、足が止まりにくい）
- 赤戦車は相手を正面に捉えて移動しないため、そのまま正面に射撃しても当たらない、なので砲塔を旋回式にして、車体と独立して任意の方向に撃てるようにする（1機で2機分の計算結果を使ってます）
    - こいつだけ旋回砲塔でちょっとズルいですが

![図13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214020/46d551a7-9940-324d-d684-2c8bb0db321e.png)
　改めて俯瞰してみると我ながら複雑なことはないのですが、目指したのは戦場の展開が **プレイヤーの視界の中でそれっぽく動く** ということです。それっぽく見えてるといいのですが。

[^5]:シグナルが存在できる最小単位が1/16フレームであるという発見に基づいて、同じ回路に時間で分割して16倍のシグナルを流せるというすごい技術！
***
　こうして、自ら制作を経験することで、ゲームの裏側にある様々なカラクリに対する関心が高まりました。これまでにやってきたゲームでもまた違った見方をすることで、楽しみ方が広がります。あと、バグに寛容になった気がします（笑）

　私自身は、発売から約一年経ってからの参入で、先人たちの模倣が多くあまり目新しいことはお伝えできませんでしたが、始めたタイミングでいろんなテクニックや想像を超えた素晴らしい作品に出会えたことが、ハマったきっかけになりました。
　もしも自分一人でやっていたら、レッスンにちょっと手を加えたくらいで挫折していたはずです。公式コンテンツでも、これマジはじプロ？という作品を取り上げてもらうと、これから始める方の可能性が広がっていいんじゃないかなと思います。
　また、人生のかなり早い段階で数学あきらめた勢の自分に、改めて三角関数や剰余演算といった数字の世界と向き合うきっかけをくれたソフトでもあります。一緒に始めた小学生の息子は、現時点でそこまで理解できていないと思いますが、こんな時に数学が必要となるよ！という世界の入り口を見せられただけでも良いきっかけになったかなと感じています。