2018年9月22日土曜日

第10回ぷちコンに応募した話 技術編

というわけで導入編に続き、技術解説や助けられた記事紹介など。




プレイヤーキャラクターのBP全景。こうするとキレイになるよ、というのがあれば教えてください(切実)

プレイヤーキャラクターのスケール変化処理について

今回、主人公のグレイマンスケールは時間経過でどんどん縮みながらも、修正マニュアルを取得していくことで人間サイズまで大きくなれるという設定だよ。ただしゲーム上では、1/100サイズが原寸で、それ以上は拡大しているという、設定とは真逆の処理になっているよ!

というのも、初期のテストでは、プレイヤーキャラクターを縮小すると、例えば背後の壁などに後ずさりした際に通常ならTPS視点用のカメラアームが縮んでカメラは壁を貫通しないけど、1/10以下に縮小した結果、同じことをすると壁などオブジェクトを突き抜けてしまうよ!

カメラコリジョンの大きさを変えたりして試行錯誤したけど結局解決できなくて上記の方法をとったけど、もしキャラクター縮小時の不具合について解決策があれば教えてください!




また、プレイヤーを100倍するために当然部屋のステージも100倍しているため、ライティングビルドで大きすぎるオブジェクトにダイナミックシャドウが投影されているのでパフォーマンスに影響があるよ、という旨のメッセージが出ることに…

結局部屋は大したポリゴン数でもテクスチャサイズでもないし、最終的に十分なFPSは出ていたので無視しました。(これでいいのかわからない…)




スケール変化はプレイヤーキャラクターのBP上のTickで処理しているよ。Tick上でめちゃめちゃいろいろ処理しているので、その道の方が見たら卒倒起こすかも…!?一応ほとんどのTickはインターバル0.01で処理しているけど…。



またスケールが変化すると当然移動速度や加速度、ジャンプ力などCharacterMovementの各パラメーターも変化させる必要があるので、Tick処理で変化させたスケールの変数をそれぞれ必要に応じて加算・乗算して各パラメーターに与えそれっぽい挙動になるようにしているよ。

これは全部のパラメーターの調整が必要だし、特にジャンプ力と重力の設定が曲者だったよ。


どう設定してもプレイヤーキャラクターを拡大していった結果、極端にジャンプ力が低くなるか、一定の低高度で滞空し続けるといった状態を引き起こしてしまったよ。


初期は滞空中のみTick処理でマイナス方向にLaunch Characterで力を与えて疑似的に重力として運用していたけど、当然ながらTick処理のため、ジャンプ力がパフォーマンスによって変化するという致命的な状態だったので止めたんだ…。


結局試行錯誤でジャンプ力(今回ジャンプはLaunchcharacterで処理しているので、その数値)と重力は設定したよ…。拡大すると滞空時間長めなのはいまだ解決できていないけどね…。

CharacterMovement設定についてはこの記事を参考にさせていただきました。

もんしょの巣穴blog [UE4] Characterアクター


UIについて


UIのBP全景


スケールインジケーターと称したHPバーに当たる部分は縦横のスケールとXY位置、そして色の変化をアニメーションさせている


現状のプレイヤーの体の大きさUIはUMGのアニメーション機能で拡大・縮小しているよ。0秒で最小、10秒で最大といった感じに画像をアニメーションさせて、プレイヤーキャラクターの現在スケールを取得して再生時間と同期させているよ(UIのBP全景参照)。あと、HPバーが一気に減った時に残像的な表現がしたかったので、プレイヤーキャラクター側で遅延したスケール値を設定しているんだ。↓


プレイヤーキャラクター側のUI用処理。遅延スケール値はタイムラインとFinterpを使ったシンプルな処理
 

それをUIのBP側で受け取ってスケールインジケーターの背後のレイヤーで同じようにアニメーションさせているよ!
このあたりはアンサーハブを参考にしました。

 UE4 ANSWER HUB プログレスバーのアニメーション。

最初はスケールインジケーターをSet Render Transformで変化させていたけど、ぎこちない動きなのと、残像のエフェクトも作りたくなった結果UMGアニメーションが必要となり、結果的に以下の記事が参考になりました。



 

旧スケールインジケーターのアニメーション処理。調整が面倒。


敵のランナーグレイマンについて



ランナーグレイマンのBP全景

 


ランナーグレイマンのビューポート 


敵のランナーグレイマンはPawnSensingで視界にプレイヤーが入れば、AI Move Toで追いかけてプレイヤーがトリガーのスフィアに触れたら自爆し、プレイヤーにダメージを与えるという処理をしているよ!

PawnSensingの使い方は以下の記事を参考にしました。
GPU_RETURNS UE4でらくらくAI実装に挑戦!!-その2 -

ちなみにビヘイビアツリーで処理しようとしたけど、勉強不足で上手く動作しなかったのと、追いかけて自爆するだけならAI Move Toでいいや、という結論になりました。


 

 

また、隣接するランナーグレイマンがプレイヤーを発見すれば、ほかのランナーグレイマンの視界に入っていなくてもAI Move Toを実行する処理を与え、より自然な挙動になるようにしているよ。

そして同じように、隣接したランナーグレイマンが自爆した際に、誘爆するような処理も組んでいるよ!



ランナーグレイマンもステージスケール100倍の弊害を受けていて、Nav proxy Linkがうまく機能しなかったよ。これは検証時間も少なく、プロジェクト設定を見直せていなかったので(時間がある時に検証します…)、結局段差の前にトリガーボリュームを置いて、適合したタグを持つランナーグレイマンがオーバーラップした時にLaunch Characterでジャンプさせているよ。



ランナーグレイマンジャンプ用トリガーのBP


縁の部分でも同じ処理をして自然に飛び降りているかのように見せているよ。


緑色の枠がジャンプ用トリガー。ブーリアン変数「Do jump?」をパブリック化してレベル上に置いてからジャンプ台として運用するか、縁から飛び降りる用とするか個別に切り替えられるようにした


リザルトのプレイ時間カウントについて




これが意外と資料がなくて困った反面、分かってしまえばとても簡単だったよ。

時間を測るタイマーを作るには? (翻訳/要約) - UE4 AnswerHub

上記のアンサーハブ記事を参考に(資料少ないと書いたけど、「UE4 タイマー」でググれば上から4段目にあるよ…!)、プレイヤーキャラクターBP上のTickで「Get Game Time in Seconds」から得たプレイ時間を、自分で作ったGame Instance内のFloat変数を参照し、それに書き込んで(Game Instanceはリスタートなどでレベルを再読込してもゲームインスタンス内の変数情報を保持し、大抵のBPから参照できる)




プレイヤーキャラクターBPのTick上のカウント処理。ポーズ中やボスカットシーン中は左のブーリアン変数の「Ingame」をFalseにしてカウント停止するようにしている(とドヤ顔で記入したけど、この処理多分意味ない…)


リザルト画面のUIでそのGame InstanceのFloat変数を参照して、バインドしたテキストを設定してあげるだけだよ!


 

その他参考にした書籍・サイト様 

体力の関係で詳細を紹介しきれないものを以下に!!!m(-_-)m

この本はUE4の義務教育的なもの (ビヘイビアツリーリベンジします)
Unreal Engine 4で極めるゲーム開発:サンプルデータと動画で学ぶUE4ゲーム制作プロジェクト

タイトル画面やポーズ画面実装の参考にさせていただきました!
UE4:ポーズ画面の作り方 - 僕の私のUnrealな日々

ボスキャラの頭上のインジケーターの参考にさせていただきました!
敵の頭上にある HP ゲージの作り方 - 情報は力ではない

UI関係でいろいろと参考にさせていただきました !
実はぷちコン期間中にブログを始めて拝見させていただきまして、早く知っておけばよかったァーー!!という情報が沢山詰まっておりました…!

みつまめ杏仁

お世話になっております(今回は制限時間関係の記事をいろいろと参考にさせていただきました)
UE4小ネタ : 制限時間の実装方法を色々と - ぼっちプログラマのメモ

alwei神のありがたいサイト。国内UE4勢でこのお方のブログの世話になっていない人なんていない(断言)
今回はシーケンサーやポストプロセスエフェクトをわかりやすく習得させていただきました!
UE4 シーケンサーを使ってみよう 基本編 - Let's Enjoy Unreal Engine


僕がこれまでUE4を触る上で参考にしたYoutube上のチュートリアル
 ナスヴィッチのYoutubeのUE4資料集 再生リスト


あとは書きべきことや参考にしたものを思い出せば書き足そうと思います。

UE4を触る過程で参考にさせていただいたすべてのサイト様に感謝を!
そしてこの記事が誰かの役に立ちますように。

ここまで読んでくれて、ありがとう!!!

0 件のコメント:

コメントを投稿