Ninja Character Pluginを触ってみる


この記事は[Advent calendar 2023](https://qiita.com/advent-calendar/2023/ue)シリーズ3の24日目の投稿記事です。

Ninja Character Pluginを触ってみたのでそちらの紹介をしてみたいと思います。
UE5.1.1で触っています。

### 触ってみた結果
![Videotogif (5).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536845/ed1aae12-cf1b-edf5-9f12-aa975c14cc4a.gif)


### Ninja Character Pluginとは
[Ninja Character Plugin](https://www.unrealengine.com/marketplace/ja/product/ninja-character-plugin)のダウンロードページ
文字通り、忍者のように壁に張り付いたり走ることができるプラグインです。

基本的な使い方は[こちら](https://sbcomputerentertainment.com/other-2/marketplace-tutorials/how-to-integrate-the-ninja-character-plugin/)を参考にすればできました。

### 使ってみる
最初に使用するエンジンにインストールをします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536845/831cd8e6-687c-b5c7-992b-89377bbf5cf6.png)

編集→プラグイン→Ninja Characterを有効にして再起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536845/0c5db62f-7efe-1384-2c64-55c42bdaf08c.png)

親クラス`Ninja Player Character BP`を継承したBPを作成します（ここでは`BP_TestPlayer`を追加）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536845/58d7d3f0-f67e-9783-25e9-e7239235e510.png)
追加したBPのSkeletaleMeshを`SKM_Quinn_Simple`に、AnimClassを`ABP_Quinn_C`に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536845/57e10ed3-f035-56a6-4016-7b1541bdc9c6.png)


`NinjaPlayerCharacter_BP`で操作できるように画像のように入力アクションを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536845/87c2253a-d89e-c972-7de3-2f951594b082.png)

Default Pawn ClassをBP_TestPlayerに変更してプレイインすることで下記のようなものができるかと思います。
NinjaCharacterPlugin用のテストレベル：`/Script/Engine.World'/NinjaCharacter/NinjaCharacter/Maps/NinjaCharacterExampleMap.NinjaCharacterExampleMap'`
![Videotogif (4).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536845/7f411a86-32e2-8752-eb39-7cfdbb13fb9e.gif)

縦の移動のときに走ってほしい場合は下記ABPの画像の部分をVectorLengthに置き換えてください。
`/Script/Engine.AnimBlueprint'/Game/Characters/Mannequins/Animations/ABP_Manny.ABP_Manny'`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536845/90d4443a-486d-7ed1-d9c4-d5062ef4bf84.png)


### Ninja Character Movement Componentに関して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536845/5e6a7ca5-f742-867b-5124-0f1685346355.png)

### パラメータの説明
調べた範囲になりますがパラメータの説明を記載します（間違っていたらすいません）。
壁走り等をさせるだけであれば、`Align Component to Floor`, `Align Component to Gravity`にチェックを入れることで壁に立つことや壁走りはできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536845/29d3977d-7672-2aa1-68db-d9ad20b0a69e.png)


|パラメータ名|説明
|---|---|
|Force Simulate Movement|ネットワーク用の設定のようですが、この辺り詳しくなく...|
|Revert to Default Gravity|[DefaultPhysicsVolume](https://docs.unrealengine.com/4.26/en-US/API/Runtime/Engine/GameFramework/ADefaultPhysicsVolume/)に触れたときに重力を下に戻す設定|
|Land on Any Surface|着陸時にサーフェスが歩行可能かどうかを知るための重力方向のチェック|
|Trigger Unwalkable Hits|歩けない地形に当たった時にイベントを通知するか（ネイティブのみ）|
|DisableGravity Replication|こちらもネットワーク用の設定...|
|Ignore Other Gravity Scales|trueの場合、ANinjaPhysicsVolumeの重力倍率を無視する|
|AlignGravityToBase|trueの場合、重力の方向を変更（GravityDirectionModeによって重力の方向が変わります）。|
|Align Component to Floor|床が見つかった場合、地面の法線にキャラクターを回転させる|
|Align Component to Gravity|trueの場合、キャラクターを回転させて重力方向に合わせる|
|Always Rotate Around Center|trueの場合、キャラクターが何かに位置合わせされている場合、常にキャラクターをその中心を中心に回転させる|
|Rotate Velocity on Ground|trueの場合、キャラクターが歩行中に何かに位置合わせされている場合、速度方向も回転する|
|ThresholdParallelAngle|計算結果のベクトルの垂直か平行かの閾値を設定する|

### ジャンプ時の重力を立っているときの方向に変更したい
`AlignGravityToBase`で変更できます。

・OFFの場合
　UEの重力方向に補正されるようにジャンプします。
![Videotogif (7).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536845/6d5cc2ed-bd6b-63b6-e916-4874a1032f29.gif)

・ONの場合
　今立っている方向を基準にジャンプできますが、ジャンプしたアクターを基準にしているわけではないので少し扱いに注意が必要です。
![Videotogif (6).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536845/7717357d-e85b-34ed-f543-894adb9a60f9.gif)


### 壁走り許容角度を増やしたい
`CharacterMovement` → `Walkable Floor Angle`で壁走りの許容角度を変更できます。
ただし、垂直な壁は90を設定しても登ることはできませんでした。
壁を89度くらいにするか、壁との設置面にスロープを設置するなどをした方がよさそうでした。

### 使ってみた所感
球体の上を走らせる場合や、回るような坂を登らせたいとき等に使用する場合であれば手軽に実現できました。
また、重力の方向も変えることができるのでステージギミック等で使ってみるのも有用そうでした。