Characterアクター

この記事ではUE4に実装されているCharacterアクターについて調べたこと、わかったことを随時書いていこうと思います。

かなりの数の機能、パラメータが実装されており、すべてを網羅するには少々時間がかかりそうなので。

追記した場合はTwitterでつぶやきますので、気になる人はそちらをチェックしていただければと。

まず、Characterアクターについて簡単に解説します。

このアクターは主に人間(もしくはそれに近い生物、ロボットなど)を取り扱うために実装された基本的なアクターです。

基本的な、と言ってもかなりの機能が実装されており、簡単なアクションゲームを作る上ではほぼ困らない程度の実装が存在します。

ただし、コントローラによる操作やアニメーションの設定はユーザが行う必要があります。

通常はこのアクターを継承したアクターをC++、もしくはBPで作成し、そちらで操作関係を実装したり、アニメーションについてはアニメーションBPを利用したりします。

基本的なコンポーネントは4つです。

CharacterMovementキャラクタの移動など、動きに関する処理を行うコンポーネントです

Characterアクターと密接に結びついているため、他のアクターで利用することはできないようです

CapsuleComponentカプセル状のコリジョン判定を持たせるコンポーネントです
ArrowComponent主にエディタ上で前方方向をわかりやすくするためのコンポーネントのようです
MeshSkeletalMeshです

StaticMeshを使いたい場合は継承先で追加しなければなりません

Characterアクターを理解するうえで重要なコンポーネントはやはりCharacterMovementです。

C++のクラス名はUCharacterMovementComponentで、OwnerとしてACharacter、すなわちCharacterアクターを持つため、Characterアクター、もしくはその継承先アクター以外で使用することはほぼありえません。

また、Characterアクターの継承元であるPawnアクターも重要です。

FPSテンプレートなどでCharacterアクターを継承したMyCharacterが存在しますが、ここで移動や回転を行うために使用しているAddMovementInputやAddControllerYawInputはPawnアクターのメンバです。

続きからは各種機能と関連パラメータについて順次書いていきます。

・Walk

地上を歩く挙動全般です。

通常、カーソルキーやWASDキー、ゲームパッドの左スティックがコントローラとして割り当てられやすいですね。

アクターの移動にはAddMovementInput命令を利用しますが、この辺りは各種テンプレートプロジェクトを参照してください。

関連するパラメータには下記があります。

Max Walk Speed歩く速度の最大速度です

AddMovementInputのスケール値を大きくしてもこれ以上の速度にはなりません

Max Acceleration最大加速度です

数値が大きければ移動開始から最高速まで素早く変化しますが、小さいとその逆になります

Max Step Height歩いている際に登れる段差の高さです

降りる際にも利用されるため、この数値以内の段差では落下処理に入りません

キャラクタの背の高さ、足の長さなどを考慮して数値を設定しましょう

Walkable Floor Angle歩いて登れる坂の角度です

この角度以上の坂には下から侵入することはできません

上から降りた場合、移動ができなくなり滑っていきます

滑っている最中はジャンプができませんが、しゃがみは可能なようです

Ground Friction地面の摩擦の強さです

デフォルトは8.0で、この場合はかなり強めの摩擦で、減速力がほぼ無意味になります

Braking Deceleration Walking歩きをやめた際の減速力です

Ground Frictionが大きめだとあまり効果が出ません

Max Walk Speed以上の数値でも入力終了時に完全停止するわけではないので注意してください

なお、Ground Frictionともども0.0に設定すると止まらなくなります

Can Walk Off Ledges歩いたままで段差を降りることができるかどうかを示すフラグです

Falseに設定するとMax Step Heightより大きな段差では降りることができなくなります

しかし、段差の縁での移動は挙動がイマイチなので注意してください

MovementComponentにはCan Walkというフラグがあるのですが、このフラグをFalseに設定しても移動はできるようです。

ジャンプやしゃがみも対応するフラグが存在していますが、こちらはTrueにしないとそれらの行動ができなくなります。

段差を落ちる(Falling状態になる)際にOnWalkingOffLedgeイベントが発行されますが、Can Walk Off LedgesフラグがFalseだとこのイベントは発生しません。

また、イベント発生段階ではすでにプレイヤーキャラは段差から落ちているので、段差の縁でおっとっとって感じのモーションを流すのは難しそうです。

これらのイベントやフラグによってそのような処理を行う方法があるのかどうか、知っている人がいたら教えてください。

昨今のFPSではスプリント機能、つまりダッシュ的な要素があるのが一般的です。

スプリント中はジャンプはできるが攻撃は出来ず、停止する、しゃがむなどのアクションで解除されます。

この機能はCharacterアクターには存在していません。

ただ、継承先のクラスやBPで実装することは可能です。

わかりやすい方法としてはMax Walk Speedを変更する方法があります。

また、AddMovementInputのスケール値を変更することで対応することも可能ですが、スケール値の最大値は1.0ですので、この場合はMax Walk Speedをスプリント速度とし、Walk状態ではスケール値を0.5にするなどの対応が必要になります。

・Jump & Fall

アクションゲームにはほぼ必須な要素であるジャンプと、ジャンプがあれば当たり前のように存在する落下はこのアクターに機能が存在しています。

実はUE4.4くらいからFirstPersonテンプレートなどのMyCharacterBPは微妙に変化しています。

その中でも目立つのがジャンプキーに関する処理です。

4.3以前ではジャンプキーのPressedイベントでJump命令を発行しているだけでしたが、4.4以降ではReleasedイベント時にStopJumping命令が発行されるようになっています。

これは、ジャンプキーを押している時間が長いほど高くジャンプできる、というよくあるアクションゲームの挙動を実現するための処理です。

これを利用する場合は後述のパラメータの1つ、Jump Max Hold Timeを変更する必要があります。

ということで、以下がジャンプと落下に関する主なパラメータです。

Can JumpMovementの機能としてジャンプを許可します

Falseの場合はJump命令を呼び出したとしてもジャンプできません

ただし落下はできます

Jump Z Velocityジャンプした際に上方向に設定される速度のZ方向数値です
Gravity Scale重力のスケール値です

特定のキャラクタだけ重力を変化させたい場合はこの値を変更します

Braking Deceleration Falling落下処理中の速度ベクトルに対する減速力

Z方向への速度はこの影響は受けないようです

Air Control空中での移動操作をどの程度受けるかの数値を0.0~1.0で指定します

高い数値ならジャンプ後の位置制御がしやすくなります

Air Control Boost MultiplierAir Controlに対する積算値です
Air Control Boost Velocity Threshold現在の速度がこの数値未満の場合、Air Controlに対してAir Control Boost Multplierを積算します
Falling Lateral Friction落下時の空気抵抗的な値です

Walkに対するGround Frictionと同じものと考えればわかりやすいでしょう

Jump Max Hold Timeジャンプキーの入力受付時間を秒で指定します

Jump命令が発行されるとここで設定している時間だけZ方向に速度を設定し続けます

StopJumping命令が発行される、もしくはジャンプ時間がこの数値を上回ることでジャンプ処理は終了します

ジャンプ関連の命令としては主なものが3つあります。

Jump設定されているパラメータでジャンプ処理を開始します
Stop Jumpingジャンプ処理を終了します

Jump Max Hold Timeが有効な場合にのみ効果があります

Launch Characterパラメータを無視し、指定方向に指定の速度でキャラクターを飛ばします

上方向に飛ばすとジャンプ処理と同じになります

通常、Jump命令は1回発行すると着地するまで再発行できません。

UE4Wikiでも2段ジャンプの実装として、1回目はJump命令、2回目はLaunchCharacterを利用しています。

しかし、実はJump  Max Hold Timeが0.0より大きな値(例えば0.1でもいい)が入っているとJump→StopJumping→Jumpと連続で発行することができます。

前述の通り、テンプレートプロジェクトのMyCharacterBPではPressedでJump、ReleasedでStopJumpingが呼ばれているため、Jump Max Hold Timeに0.0より大きな値を入れると無限ジャンプできてしまいます。

これをN段ジャンプに変更する方法は以下のようになります。

ue213.jpg

Do NノードのNに入れた回数だけジャンプが可能になります。

Jump Max Hold Timeに0.0が入っているとNにどんな数値を入れても1回のジャンプしかできない点に注意してください。

ジャンプ力を上げて数段ジャンプできるようにすると操作してるだけでも楽しい感じになります。

ただ、この処理は不具合の可能性もあります。

Jump Max Hold Timeが0.0かどうかで2段ジャンプができるかどうか決まるというのは不自然です。

内部の処理を見てみると、ジャンプが可能かどうか調べるCanJump()の実装として、地上に立っているか、もしくはJump Max Hold Timeが0.0より大きくてジャンプ中かどうかというチェックが入っています。

Jump Max Hold Timeが0.0の場合のみ地上にいないとダメ、というのは仕様的にどうかな、と思いますね。

不具合として修正される可能性を考慮するとLaunchCharacterを使っておいた方がいいかもしれませんね。

・Crouch

しゃがみ動作です。

FPSでは障害物に隠れたりするのに使われますし、三人称アクションならステルス系のゲームで必要になる機能でしょう。

各種テンプレートプロジェクトではデフォルトでOFFになっているため、明示的に実装しないとお目にかかれない動作です。

この動作に関する基本的な命令、イベントは以下の5つです。

Crouch

UnCrouch

しゃがみ状態へ移行、及びしゃがみ状態の解除を行う命令です

しゃがみ状態で天井の低い場所に移動し、UnCrouchを行っても立てるだけの高さがない場合はしゃがみが解除されません

IsCrouching現在しゃがみ状態であればTrueを返します
OnStartCrouch

OnEndCrouch

しゃがみ状態の開始、終了時に発行されるイベントです

パラメータは以下のものが代表的です。

Can Crouchしゃがみ動作ができるかどうかを示すフラグです

デフォルトではFalseなので、この状態ではCrouch命令を使用してもしゃがみません

Max Walk Speed Crouchedしゃがみ状態での歩く速度の最大値です
Can Walk Off Ledges when Crouchingしゃがみ状態で床の縁から下に落ちることができるかどうかのフラグです

デフォルトではMinecraftのようにしゃがみ状態では落ちることができません

Crouched Half Heightしゃがみ状態になった時のカプセルコリジョンの高さの半分です

少しわかりにくい部分があるので、詳細を後述します

Crouched Eye Heightしゃがみ状態のカメラの高さ…と言いたいところですがそうではありません

これについても後述します

ここでわかりにくいのは表にもありますがCrouched Half HeightとCrouched Eye Heightです。

前者を解説する前に、まずカプセルコリジョンについて解説します。

カプセルコリジョンは同一半径の2つの球を同一半径の円柱でつないだ形状のコリジョンです。

UE4ではカプセルを指定するのに半径と半分の高さを指定します。

カプセルの高さ、と言われると、コリジョンを実装したことがある人は円柱部分の高さを思い浮かべるかもしれません。

しかし、UE4ではカプセルの高さは下の球の最下端と上の球の最上端となります。

ここからわかることですが、カプセルに指定する半分の高さは半径より小さくなることはありません。

カプセルの最小サイズというのは上下2つの球が完全に重なっている、つまりただの球だからです。

実際、UE4のエディタでCapsule Half Heightのパラメータは半径未満には設定できません。

このことからもわかる通り、Crouched Half Heightも半径未満には設定できないはずです。

ただ、Characterアクターのデフォルト値は、カプセルの半径が42、Crouched Half Heightが40ですでので、本来は許可されない数値だったりします。

Crouched Half Heightを設定する場合は元のカプセルの半径も考慮してください。

Crouched Eye Heightは名前からカメラに関するパラメータかと思えば、実は違います。

コントローラを意味するAControllerクラスはLineOfSightToという命令を持っています。

この命令はコントローラが所属するPawnの視点から指定された注視点への対ラインコリジョンを調べる命令です。

この命令の引数としては注視点しか指定できず、視点はPawnに設定されているBase Eye Heightから計算されます。

この視点位置はしゃがみの際にはCrouched Eye Heightを用います。

このパラメータがカメラの高さを指定するものではないとすると、しゃがみ状態で確かに視点が落ちるのはなぜでしょう?

これはCrouched Half Heightでコリジョンの高さが小さくなっているからです。

カプセルコリジョンが小さくなることでCharacterアクターは通常より高さが低くなります。

これに伴いカメラの位置も低くなる、ということになっているわけです。

10/29 追記

・Fly

空を飛ぶ能力を与えます。

この状態に設定する命令はCharacterアクターには存在しないため、CharacterMovementComponentに対して直接設定する必要があります。

以下のBPグラフはキー入力によるアクション"Fly"が発行された際にMovementModeをFly↔FallingにTogglingするものです。

ue214.jpg 

MovementModeがFlyになると当然ですが落ちることがなくなります。

しかし、他のMovementModeに変更するような処理を行うと飛行状態はキャンセルされます。

試してみたのですが、まずJump命令を発行するとジャンプ処理に移行、その後は落下処理になります。

水落ちした場合もSwim状態に遷移しました。

しかし、床や壁に衝突しても歩きや落下にはなりませんし、しゃがみ状態へ移行するCrouch命令は無視されました。

この飛行状態はゲームで使用しなくてもデバッグ機能としては非常に有用な機能ですので、とりあえず実装しておいてもいいのではないでしょうか?

関連するパラメータはそれほど多くありません。

Can Fly飛行を可能にするかどうかのフラグですが、直接飛行状態に遷移させるためか意味をなしていません

このフラグのON/OFFに関わらず、前述の設定方法で飛行状態に遷移できます

Max Fly Speed飛行の最高速度を設定します

加速度は歩きなどと同じパラメータを使用しているようです

Braking Deceleration Flying飛行時の減速力です

Braking Deceleration Walkingなどと同じです

なお、FPSテンプレートではAddMovementInputへ入力するベクトルがアクターの方向、つまり水平方向ベクトルになっています。

この状態で飛行状態になっても水平移動はできても上下方向への移動ができません。

上下方向に移動するキー入力を追加する方法も1つの手ですが、DefaultPawnのようにカメラの向いている方向に移動したいと考える方もおられるでしょう。

そのような場合はGetControlRotationから前方ベクトル、右方向ベクトルを取得することで対応できます。

ue215.jpg 

注意点としては、歩き状態でもこの設定にすると下や上を向いて移動する際に移動速度が変わってしまいます。

この処理はMovementModeがFly、Swim状態の時限定にするとよいでしょう。

・その他

MovementModeから少し離れたパラメータを紹介していきます。

Default Land Movement Mode

Default Water Movement Mode

キャラクター生成時のデフォルト状態でのMovementModeを指定します

前者は地上にスポーンした際のデフォルト状態、後者は水の中にスポーンした際のデフォルト状態です

これはスポーンした時点での状態であり、それ以降のMovementModeは影響を受けません

例えば、水の中のデフォルト状態が飛行であっても、それ以降に水に落ちても泳ぐ状態に変化するだけです

Impart Base Velocity X

Impart Base Velocity Y

Impart Base Velocity Z

Impart Base Angular Velocity

移動床などにキャラクターが乗った際、ジャンプをしたら移動床の回転速度などを受け継ぐかどうかのフラグです

XYZはそれぞれの軸に対する速度を受け継ぐかどうか、Angular Velocityは回転の速度を受け継ぐかどうかです

よりわかりやすくにいうと、移動床による慣性の法則を適用するかどうかです

ONなら慣性の法則が働き、OFFなら慣性の法則を無視します。

Ignore Base Rotationキャラクターのローカル回転を乗っている移動床に合わせるかどうかのフラグです

ONにすると回転床の回転を無視しますので、例えば北を向いていたらずっと北を向き続けます

Orient Rotation to Movementアクターの移動に合わせてアクターの回転も行うかどうかのフラグです

ONの場合は移動方向にキャラクターが回転しますが、OFFの場合は回転しません

通常の三人称アクションでは基本的にONにしておきますが、TPSやテンプルランのようなゲームではOFFにします

一旦ここまで。

他の機能は調べ次第追記していきます。