レシプロ機でGO!

2021年にレシプロ機でGO!というゲームをunityで作ったので、その関連の話。
3Dフライトゲームを作ろうとしている人の参考になれば幸い。

プレイはコチラ

https://unityroom.com/games/flightshooting3d

作った感想

ゲームとしての完成度は今一つといった感じ。
3Dなので自分でモデルを作れず無料アセットに使ったためにできる事が限られてしまった。
ステージも単調で、どうも面白さに欠ける。
リアル系にしたのでゲーム的なアレンジもしづらく攻撃方法や回避方法が単調。
そしてリアルかといわれるとそうでもない物が出来上がってしまった。というかリアルな物つくるのはあまりに難易度が高くて無理という結論。
と、あまり良い事無し。しかしながら3D空間での計算などは良い練習になった。

仕様素材

アセットストアで見つけたLAGG-3とspitfire
どちらも無料アセット

他にも地形などはアセットストアから入手

BGM素材は甘茶の音楽工房とTAM music factory

飛行機の挙動

飛行機の基本的な挙動

加速減速
 速度の上げ下げ
ロール
 進行方向に対するZ軸回転。機体を左右に傾ける。
ピッチアップ・ダウン
 進行方向に対するX軸回転、機体を上向き、下向きにする。
ヨー
 機体を上から見たときに左右回転。Y軸で回転。

ロール、ピッチ、ヨーを解説してるサイト

プログラム的な処理は以下
ロール
rigidbody.transform.RotateAround(transform.forward, ロール角度変化値);
進行方向(transform.forward)に対しての左右回転。

ピッチ
rigidbody.transform.RotateAround(transform.right, ピッチ角度変化値);
自機から右側に向けた軸(transform.right)に対しての回転。

ヨー
rigidbody.transform.RotateAround(transform.up, ヨー角度変化値);
自機から上に向けた軸(transform.up)に対しての角度回転。

ストール(失速)

 機体はある程度の速度以下になると揚力を得られなくなって失速する。
 この挙動がなかなかうまくいかず。基本的に真下方向に機首を回転させているだけなので、あまりリアルではない。
 ここの挙動をリアルにしようとすると相当難易度が高い。

コンピューターの思考

 今回大変だったのがコンピューターの挙動。
 とくに地面への衝突回避はなかなかうまく行かずに試行錯誤を繰り返しています。

敵機体の追尾

 コンピューターが敵機を追尾する場合、まず自分の進行方向ベクトル、自分とターゲット機へのベクトルの二つのベクトルの角度を求める。
二つのベクトルの角度はVector3.Angleで求まるので以下のように。

Vector3 vectorToTarget = 狙ってる機体.transform.posotion - transform.position;
角度 = Vector3.Angle(transform.forward, vectorToTarget);

 二つの角度が5度以下なら、ほぼ正面なので微調整するだけ。ピッチアップ、ヨーを駆使してターゲット機を正面に捕らえる。
 角度が大きい場合は、ロールによりターゲット機を上方に合うようにする。
 ひたすらピッチアップ。

地形との衝突回避

 自分の正面数百メートルまでのrayを飛ばす。
 rayが地面にヒットすればこのままいくと地面に衝突する可能性があるので回避行動に遷移。
 回避行動状態になった場合、機体を上向きになるようにロール。
 と同時にピッチアップ。ただし背面飛行状態の場合はピッチアップしない。
 地形との衝突回避はこれだけだと地面に衝突しやすいので他にもいくつか判定しているが長くなるので説明は省略。

攻撃判定

 自機の進行方向と、自機とターゲット機へのベクトルで内積を取り、ほぼ正面で、なおかつ距離が一定以下なら攻撃。
 ただこれだけだと敵が移動している場合に敵の後方を撃ってしまうので、少し敵の移動先を狙って攻撃している。


ゲーム性での試行錯誤

コンピューターでも仲間がいるとやっぱり楽しい

最初はプレイヤー一人 vs 敵たくさんという構成。
しかし、どうも単調な感じがあり、やはりつまらなかった。
戦車でGOの時を参考に仲間を3人追加し、やはり戦車でGO同様に味方がしゃべるようにしたらゲーム的には面白くなった。
しかしながら、仲間がすぐ死んでしまったり、自分が倒そうとしていた敵を仲間が倒したりしてしまうイマイチな部分もあり。

リアルにするとつまらない

大体現実同様にしたら、パワーアップなど非現実的な攻撃方法がとれない。
緊急回避などもできず。
結局のところ敵機の後ろについて300m以内程度の距離から攻撃というのがセオリーになってしまった。現実的といえば現実的。
ゲームと割り切って3方向ビームや誘導弾など入れればまあ面白かったのが、今回は見送り。

といってもいろいろリアルにはならず

上昇能力高すぎ

数十秒で10000メートルまで上昇できますが、これは速過ぎるようです。現実的に10分ほどかかるとか。

空力とか迎え角とか

厳密にこの辺を計算していくと相当難易度が高そう。
また、操縦系もデジタル入力(onとoffしかない)なので、リアルな挙動はどう頑張っても不可能という感じでした。
このへんをリアルに作ろうとしたらフライトゲームは底なし沼かもしれないです。

その他思ったこと

3D計算系を多用する。

・二つのベクトルの角度を求める事をよく使う。(Vector3.Angle)
・3D座標系は慣れないと思い通りに動いてくれない。

マップ作るのがなかなか大変

・飛行機だと速度が速いので広いマップにしないと狭い。
・マップを3Dで作らないといけないので大変。なので殺風景なマップになってしまい、ゲーム的にもつまらなくなってしまった。

機体が二種類しかいない

無料アセットに無い物は使っていないので機体数がとても少なくなってしまった。
2Dゲームと違い素材づくりが難しい。

この記事が気に入ったらサポートをしてみませんか?