前回、タイトル画面の製作記についてあれこれ書きました。今回はゲーム本編、クレーンゲームそのものの製作についてです。
どういうゲームにするか
ぷちコン応募作品を作るにあたって思いついたクレーンゲームシミュレーター。ただ固定のカメラでクレーンゲームを作って遊ぶよりかは、やはりUnreal Engine4のパワーを使って、クレーンゲームがいっぱい置いてあるゲームセンターみたいなの作って歩き回りたいと思いました。そういうことが簡単に実現できるのがUnreal Engine4というゲームエンジンだとも思ったので。
そんなわけでゲームセンターを歩き回って、クレーンゲームを操作するFPSタイプのゲームに決定しました。
後はゲーム性です。現実のクレーンゲームを考えた時、いかにお金を使わずに景品を取れるかということが目標だと思います。そしてクレーンゲームで景品が取れる時というのは、アームが強い時です。全然取れない時もあれば、簡単に取れる時もあるアームの強度を演出できれば、目標というのが生きてきます。ついでに、昨今の全然掴んで取れないクレーンゲーム事情(ずらして取る…みたいなの)を実現できればいいとも思いました。
操作に気をつける
FPSというゲームは操作が複雑です。WASDに加えてshiftとctrlとspaceとマウスの操作。
私はSteamのゲームをよくプレイしますが、FPSのゲームにはアクションキーもしくはインタラクトキーと呼ばれるものが多くあり、キャラクターのアクションを1つのキーに集約してしまうといったのがよく見られます。
物を取るボタンはR、奥ボタンはFといった具合に分けるのではなく、HUDで状況を表示することによって、1つのボタンで色々できるインテリジェンスなキーとして集約させることによって、ただでさえややこしいFPSの操作キーの煩雑さを回避するのに一役買っています。
Payday 2のインタラクトキーの例。鍵を開ける、カードキーを通す、人質をタイで縛る、現金バックを拾う、現金バックを投げるといったアクションのほとんどを担当するのがFキー。HUDに表示されるために今インタラクトキーで何が行われるかということも理解できる。便利かつ煩わしさが無いのが好きです。
というわけで「さプライズ」にもこのインタラクトキーを導入します。クレーンゲーム機に近づいたら状況によって
- コインを入れる
- 横移動
- 奥移動
- それ以外(クレーン動作中の待ち状態)
を1つのキーで全て行えるようにします。
これは特に難しいことはなく、インタラクトキーに割り当てたキーが押されたら、状況によって操作を変えるだけです。
さプライズの肝。クレーンゲームの物理シミュレーション
このゲームの肝はなんといってもクレーン部分の物理です。そのためクレーンの動作に関してはある程度妥協せずに物理を実現させたい。そのためには物理コンストレイントというのを使います。
物理コンストレイントは物理物体を接続するジョイントで、角度制限や移動制限を付けたり、移動エネルギーを加えることができます。
Unreal Engine4の公式ドキュメントに物理コンストレイントについて記載されていますが、
ウィジェットの時と違い、物理コンストレイントの説明はサラッとしていて、自分でトライアンドエラーを繰り返してアームの開閉ができました。なので忘れないように開発記を残しておきます
まず、物理コンストレイントには2つのメッシュが必要です。
アームの接続元となるUFOのパーツ。
アーム本体。
この2つを物理コンストレイントで接続していきます。
コンポーネントの追加ボタンを押してPhysicsConstraintを選びます。
PhysicsConstraintをクリックして詳細を開き、アーム接続元となるufoをComponent Name 1に、アームをComponent Name 2に設定します。選択タブとかは無く、キーボードでコンポーネント名を打ち込むだけです。
これでビューポートにてufoとアームが青と赤の立方体で囲われていたら物理コンストレイントは動作しています。Disable Collisionにチェックを入れると、物理コンストレイントで接続した物体同士の衝突が無視されます。今回はチェックを入れています。
続いてはアームを動作させる角度の設定です。アームの開閉角度は45度で、1方向のみという事を考えつつ数値を設定していきます。
平行移動に関しては移動させないので全てLockedで固定。
Angular Limitsがアームの開閉に適した部分です。Twistのみ有効にして、中心から両側22.5度動作するように設定します。
設定した後がこちら。物理コンストレイントがアームの回転軸になるため、物理コンストレイントの位置もキッチリ合わせておく必要があります。
物理コンストレイントの子パーツであるアームメッシュのSimulate Physicsを有効にすると、物理コンストレイントをシミュレーションで確認することができます。なお、物理コンストレイントを使用して動作させるメッシュは、プリミティブなコリジョンでないと警告が出ます。
アームのコリジョンはカプセルなどを使用して設定しています。
当然ながらアームに対してエネルギーを加えていないため、実行しても何も起きません。ただし、外から力を加えてもアームの開閉以上の動作はしないようになっています。
アームを開閉させる
物理コンストレイントの詳細、Angular Motorのところでエネルギーを加えることができます。大きく2つの方法があり、Target Orientationはその角度へ持っていくためのエネルギーが発生します。Target Velocityはその角度方向のエネルギーが発生します。
アーム開閉方向へのエネルギーを加えてみます。Target VelocityのXを22.5、Twistにチェックを入れて、シミュレーションをスタートさせます。
アームが開きました。このままでは遅いので、Strengthを10倍の10.0などにすると早くアームを開くことができます。
アームとUFO部分のコンストレイントができたら、他の物理コンストレイントも加えていきます。
最終的にはアームの左右開閉、UFO部分の上下移動、横移動、奥移動と5つの物理コンストレイントを使いました。
物理コンストレイント微調整ポイント
ここから先は微調整に微調整を重ねることになりますが、微調整のポイントを整理します。
Linear Motor、Angular Motor
物理コンストレイントのMotor部分はエネルギーを生み出す設定そのもの。LinearもAngularもあまり変わらず、その場所に持っていく設定がPosition Target、Target Orientationです。エネルギーのベクトルを指定するのがVelocity TargetとTarget Velocityです。
例えばPosition TargetをX 100.0に設定すれば、X 100.0方向に向かうエネルギーが常に発生します。X 0の位置ある場合は+方向のエネルギー、X 200にいたら-方向のエネルギーといった具合です。
Strengthはエネルギーの強度です。
Linear Limits、Angular Limitsの詳細設定
物理コンストレイントに違反(制限値に触れた場合)の動作設定。例えばSoft Constraintにチェックを入れると、スプリングのように反発する動作が得られます。アームを開いた時のように、バシッと止めたい場合はSoft Constraintのチェックを外し、Restitutionを0.0にして反発しないようにすると、アームっぽくなりました。
物理コンストレイントの子パーツの物理設定
物理コンストレイントで接続したメッシュの物理設定も微調整のポイントとしては重要です。
Linear DampingやAngular Dampingはデフォルトでは低すぎるので、少し上げた方が良い事が多いでしょう。
例えば前述のPosition Targetを使ってエネルギーを発生させる場合、X 100を指定して、X 0にある物理メッシュを動作させるとします。実行するとX 100まで物理メッシュが動作した後、制限が無い場合はX 125などといった数値まで滑ります。そうなるとまたX 100に向かって動作するのでX 80、X 110といった具合に設定した値を行ったり来たりします。Linear Dampingの数値をすこし上げることでこの行ったり来たりを抑える摩擦のようなものが発生します。
また、Angular Motorで回転させたりする場合はCenter Of Mass Offset(重心)も重要です。クレーンゲームのアームも、重心が中心にありすぎると簡単に掴んで運べてしまうため、アームの弱さを演出するために重心をアームを開く側に設定しています。
ブループリントで制御する
各種物理の設定が固まったら、エネルギーの方はブループリントで制御できるようにします。
Angular Motorは、SetAngularVelocityTarget、SetAngularDriveMode、SetAngularDriveParamsで設定できます。
クレーンゲームを完成させる
アームが制御できたら、クレーンゲームを肉付けしていきます。
メッシュを配置しているぐらいで特にテクニカルな事は無し。Arrowは景品の配置用に追加しています。
GetWorldTransformでTransformが取得できるので、景品の配置位置の調整に便利です。
クレーンゲームの動作を状態を分けて考えて
- アイドル状態(コイン投入待ち)
- 横移動
- 奥移動
- クレーン操作(アームの開閉とボディの昇降)
- もとの位置(穴の位置)に戻ってアームを開閉
- 1に戻る
ステートマシンとしてブループリントを記述していきます。
スケルタルメッシュのアニメーションの方はステートマシンを使えたのですが、Actorのブループリントで使えないので、昔ながらのSwitchによる処理分けです。ブループリントをたくさん使うだけで、特に難しいことはしていません。
最終的なアーム動作はサイズが大きくてgifでは無理そうなので応募作品から確認して見て下さい。
長くなってので一旦ここまでにします。次はゲームセンターの店内についてです。
ではでは