アンリアルクエスト3の実装記録.横スクロールアクションの玉投げとステージアクション分
(このページの内容は本当は最終日の夜中に実装しています)
クエストテーマ~玉~
■初級 玉が当たったら物が壊れる
1日目の課題は玉.玉といっても球を投げる機能自体はサンプルプロジェクトにもともと入っていたので,玉を当てて壊れるモノ側の実装がメインになる.
はじめは前回のタワー同様にぶつけてChaos Destruction によって破壊することを目指していた.
しかし,後述の動く的の段階でうまくいかなかったので,今回はただ単に玉がぶつかったらDestroyするObjectを作ることにした.
しかしそれだけだとそっけないので一応破壊時にEffectを発生させ壊れた感を演出.
もともと入っていたNiagaraのExplosionをそのまま活用.
壊れると煙が出る.
■中級 動く的に玉を当てる
当初の構想ではこの動く的への投擲においてもオブジェクトがカオス破壊させられないかを考えていた.しかし,まっすぐにGeometryCollectionに対してTimeLineの動く床でよくやる実装を行ったところ,重すぎてクラッシュ.どうもこれはやるべき操作ではなかったようだ
というわけでGeometryCollectionではなく,StaticMeshを接続し,球がぶつかった時に壊れる機能を組み合わせて完了.
動く的にはRotationHandleIngicatorなるモノのメッシュを拡大して利用.的っぽい形だと思ったので.
■上級 玉を投げる軌跡を表示しよう (今回は実装できず)
サンプルプロジェクトはチャージ時間に応じて射出ベクトルを算出し,これをもとに投擲を行っている.なので計算によっておそらく射出経路を割り出し,スプラインやエッフェクトで表示させることができるはずなのだろう.しかし今回は時間の関係もあり時間内に実装することはできなかった.
今回出題された15個の課題の中では,センスやデザインによらない純粋な実装が必要な項目の中ではおそらく最も難しい課題だったのではないかと思われる.
今考えるなら,実装が簡単な方法として処理は重くなりそうではあるが,投射していないときに玉の射出と同じ力で別のエフェクト球を投射する方法などが手っ取り早そうだ.
ということでTickの後ろに球の投射と同じSpawnノード構造を追加.
投げる方の玉はコリジョンをBlockでないものにしておき,透過系のマテリアルを適用する.
他の部分はサンプルのBP_Throwそのまま.
チャージ中は画像のように無数に球が表示され,離すとこれをなぞるように玉が発射される.一応申し訳程度に処理を軽くするために,軌跡用の玉は寿命を5秒に設定している.
若干強引だが一応投げる球の軌跡を表示することができた.
クエストテーマ~プレイヤーアクション~
■初級 2段ジャンプで輪をくぐる
isFallingとLaunch Characterを使った空中ジャンプ.
空中ジャンプの回数は地上にいることをis Moving On Groundで判定させた時にリセットされる仕組み. CharacterMovement の状態判定は泳いだり浮いたりしているのを処理できるようなので,便利に使えそうだ.
提出動画では忘れていたけれども この課題は二段ジャンプで輪をくぐる必要がある.
よってわっかも用意.デフォルトでちょうど良いリングがあったのでそれを使用.
このままだとStaticMeshにコリジョンが入っているため,輪をくぐれない.
今回は他でこのリングを使用する予定はなかったので,StaticMeshに入っていたコリジョンを削除して利用した.(マテリアルはのちに2スロ目も1スロと同じものに変更)
横スクロールのマップに配置する際,リングはそのままの向きだと輪が画面方向に向いてしまう.レベルに配置するときに扱いやすいようにするために,z軸に90度の回転を入れておくと便利である.
ということで2段ジャンプでの輪くぐりは無事実装完了.
■中級 空中ブランコ
構想として,ピボットを中心に回転かければよさそうだなというのはすぐ思いついたので,サクサク実装.床材はデフォルトの床,振り子の部分はStandard Assetsからドアフレームを使用することにした.
回転に関してはdeltaTimeの蓄積を剰余式でリセットする若干面倒な実装にしてみた.
回転角はSin関数も使って制御.
今冷静にみると物理法則と若干あっていない気もするけど一応端で減速して中央が一番速いことになっているはず.
プレイ時に思ったのはこの構造だと床面の傾きが振り子の傾きに一致しているので,端っこの時に傾斜が急すぎる.
45度くらいでもグレイマンが踏ん張ってくれないことがあったので,床面に逆回転を仕込んで常に水平になるように調整したほうがレベルデザイン的には調整しやすかったのかもしれない.
この構造で空中ブランコと解釈したのだが,動画の回答によればロープを使ったり,手でぶら下がったりといろいろ別解があったらしく,少し簡単に済ませすぎたかもと反省.
■上級 壁蹴り
初めの構想はプレイヤーカプセルの前方に壁判定用のカプセルを配置し,そこに壁が当たった時に壁蹴りさせる狙いだった.しかしこれではうまくいかなかった.
そもそもコライダ自体が反応しなかったので,コリジョンを使う作戦は今回は保留.
次に考えたのはLineTraceを使う手法.今回はこちらの方がうまくいったのでこれを採用することに.
空中ジャンプの場合にライントレース判定をする.スタートは自身の位置,EndはそこからForwardを取って100cm前方まで.ここがヒットすれば壁蹴りジャンプ,しなければ通常の空中ジャンプ判定に移行する.
強さはZ軸上方とライントレースに使ったベクトルにマイナスをかけて逆向きにスケールしたもの.
プラスとして同方向を与えてしまうと壁に近づく方向に力が加えられほぼ垂直に駆け上がってしまう.
OverrideはXYZ軸いずれにもつけておいた方がよさげである.
実装方法のせいかこの壁蹴りを成功させるためには少々コツがあり,左右のキー入力をせずにジャンプキーを押すとぴょんぴょん反転しながら登っていく.押しっぱなしだと方向転換せずに背中で対面の壁に当たってしまい壁蹴りが連鎖しない.気にする場合は入力系も細工したほうが良いのかもしれない.
コメント