[第15回UE4ぷちコン]振り返り:ロボ制御

概要

  • ロボ4形態のBP構成と移動処理

  • Blueprint Interfaceから基底クラスを使う実装に移行

  • 作るのもいいけど、ありものを使う事も覚えたい

ロボの実装

基底クラス

ロボの形態4種毎に別のBPになっているが、

それぞれ共通の基底クラスを持つ、という構成で作った。


Player ControllerはロボBPを参照するが、

基底クラス型で保持する事で、参照の連鎖を防いでいる。

(ロボの全形態を同時に読み込まずに済んでいる)


基底クラスはゲームカメラのような全ロボ共通のComponentを持っており、

Player Controllerからロボへのインタフェースとなる関数群を定義している。


Blueprint Interface(以下BPI)から基底クラス実装に変更

基底クラスを作らなくても、抽象へ依存する構成はBPIで実現できる。

実際、最初はBPIで作っていた。

だが、仕様が定まらぬ中で実装を進める上で、

機能を増減するたびにインタフェース定義の操作をするのが煩わしくなってきた。

今回はロボ派生クラス以外にこのインタフェースを設ける予定がないという事と、

全ロボ形態で共通の処理や変数がいくつか出てきたこともあり、

単純に基底クラスを定義する方向に切り替えた。

切り替えはそれなりの手間ではあったが

無心にインタフェースを基底クラスの関数に移すだけで済んだ。

迷走する仕様で何が正しいのかわからぬ開発が続く中、

その作業は一滴の清水の如く、乾いた心に染み渡るのだった(日記)

ホッパー


ホッピングで移動する。

手抜きのためにウォーカーが歩く挙動を片足だけコピペしてみたら

全然ホッピングっぽくない動きになった。

放物線挙動を自分で実装してもいいが、時間もなかったので

素直に物理エンジンに頼ることにした。

基底クラスのCapsuleのSimulate Physicsプロパティを有効化し、

回転しないようにConstraintを設定した。


移動状態をEnumerationで定義して

「入力待ち」

「ジャンプ中」

「着地して振動中」

の3モードを繰り返して移動させている。

「入力待ち」状態で

移動入力方向に Add Impluseしてジャンプする。


Event Hitで着地判定。

Hit ResultのNormalが上を向いていれば床とみなしている。


ウォーカー

趣味全開の二足歩行。

歩き動作の処理についてはこちらのTweetを参照。

動画を制限なく気軽に使えるのはTwitterのいい所だなぁと思う。

腕や足はUVスクロールするSpline Meshになっている。

ローダー


ウォーカーで時間使いすぎて雑になった三輪車。

これもSimulate Physicsで物理挙動にしている。

と言ってもタイヤとかは判定を持っておらず、

内部的にはCapsuleが滑っているだけである。

ホッパーと違い、常に移動入力方向に加速するが

ロボの現在の向きと入力方向が一致しない場合は加速力を弱めている。

こうすると、移動方向に旋回してから直進する様な動きになる。


ウォーカー以外の物理制御ロボは、

足元に建物が発生した時などに物理神が荒ぶって射出される事故が時々あったので

速度が付きすぎないようにTickで速度の制限をかけている。

(物理エンジンの摩擦をきつくすると通常時の移動もやりにくくなる為)

また、ローダーはジャンプしないので

XY速度制限のついでZ+方向の速度も制限している。


コプター

ヘリ。

これもSimulate Physicsで動かしている。

ConstraintをXYPlaneにすることで、所定の高度を保っている。


仕様的にUFOもビルもヘリの高度に届かないので

後述するプレイエリア境界までは完全に自由に動ける。

境界処理

ロボの動ける範囲には制限がある。

境界用Actorを作成し、

安全領域と、警告領域の大きさを

それぞれ2つのCapsuleで定義した。

外側が半径400m。


これらをロボのCollisionとだけOverlapするようにして、

OverlapのBeginとEndでどこにいるかを制御させた。


こんな面倒なセットアップをしなくても単純に原点からの距離だけ計算すれば済むが、

こういう方法でもできそう、という事で試してみた。学習コンテストばんざい。

この方法の利点というか発展先しては、

安全地帯と警告地帯の出入り数を参照カウンタのように数えることで

デザインされた地形にも対応できると思う。

反省

今回はSimulate Physicsで動かす事を多用した。

しかし、移動周りはもっとエンジンの機能(Move Component系)を使っても良かった気がする。

これは同じ反省をアンリアルクエストでも抱える事になった。

「よく知らないから使わない」

だと知る機会がない。

「作れるから作る」

のでは毎回手間がかかってしまう。

もちろん、自分で1から作ることによる経験の蓄積は確かにある。

しかし、優秀な人間が作っている上に大勢の人間に使用されて洗練されたものを

一度は触ってみることも重要だろう。

両方やって知見ガン積みシナジーで爆アドとって優勝してこ(ゲーミングまとめ)


以上