【UE4】すり抜け床実装【改良版】
今回はコレの続き。
↑の記事では簡易版ということでいくつか問題があったため、それの解決を行う。
問題点としては以下の2つ
- 2段のすり抜け床を配置した際に頭をぶつける事がある
- 上に乗ったまましゃがむことで下にすり抜けたい
1については実装の甘さによるものなので、その甘さを削っていきます。
2については必須の仕様ではないものの、紹介のため実装します。
-
2段のすり抜け床を配置した際に頭をぶつける事がある
どういう事?というと、こういう事↓
これじゃすり抜け床を登っていくステージが作れないので、なんとかします。
まず原因ですが、トレースを下に出し続けているためにすり抜け床からジャンプしてもすり抜け床との当たり判定は[ブロック]のままになっており、[ブロック]状態ではすり抜けることができないため、頭をぶつけたということになります。
ではどうするかというと、「上昇中は必ずすり抜ける」状態にすることです。
処理としては以下の通り、トレースする前に分岐をさせます。
GetVelocityでキャラクターの移動速度が取れるので、この値が0以下である時は少なくとも上昇していないと言えるため、床を踏む判定を行う。
そうではない場合床を無視し、トレースも行わない。やったぜ。
これで2段のすり抜け床も概ね問題ないですが、2段目のすり抜け床にいるときに下降し始めてしまった場合に、トレースが長いため下段のすり抜け床を見つけてしまい、[ブロック]状態になることで2段目すり抜け中だったのにはじき出されるというあまりよろしくない挙動が発生します。
見てくれも悪いため、トレースを少々調整してみます。
カプセルコンポーネントの半分のサイズを取得することで、トレースの開始点を足元にし、そこから10cm下を見るだけにし、トレース距離を最低限にしました。
これで滅多に床に押し出されるということは無いはずです。
え?最初からこうやって実装しろって?
そっすね… -
すり抜け床を下にすり抜けたい
カービィやスマブラではよくある下へのすり抜けを簡易的に実装します。
ここまで見てきたのであれば、どうすればすり抜ける事ができるかはなんとなくわかってきたと思います。
そう、SetCollisionResponsetoChannelですり抜け床の当たり判定を無視すればいいのです。
では、試しにボタンを押したらすり抜けてみましょう。
アクションマッピングを追加してちょいちょいっと…これではうまくいきませんね。
なぜかというと、Tickで毎フレームすり抜け判定を更新しているので、ここで一瞬変更したところで、すぐに床判定を行ってしまい、[ブロック]判定に戻ってしまうからです。
じゃあどうすれば良いんだよって話ですが、簡単な方法を提案します。
それは…ちょっと下にワープする…すり抜けた瞬間にちょっとだけ下にズラすことで、トレースの範囲外に逃げます。
実装としてはかなり安易なのでお試しするにはピッタリです。
というわけで、お手軽実装ですり抜け床を実装できました。
実装内容としてはすり抜けプレイヤーですけど。
-
注意点
今回行ったすり抜け床は実装は手軽ですが、1つタブーがあります。
それがコレすり抜け床の間隔がキャラクターの高さより狭く、すり抜け床に立っている状態で埋まってしまう状態を作ることです。
エラーで落ちるようなことはないですが、移動ができたりできなかったりで最悪詰むため、こういったステージ配置は行わないよう注意してください。
また、埋まらないにせよ以下の状況で2段目をすり抜けることができないため
このような配置も基本的に非推奨となります。
仕様として許容するのであれば問題ありませんが。
以上が簡易版すり抜け床実装の流れでした。
ゲームのシステムとしては枯れた技術ではありますが、UE4でどう実装するかということを記事にする人がいないため1つの答えとして受け取ってもらえれば幸いです。
なお、配置タブーすら解決するすり抜け床の実装もありますが
一般人が試すにはあまりに危険なため紹介は気が向いたら行います。
ゲームエンジンの改造が必要とかちょっとおすすめしたくない