45.キャラクターをイチから作成する②実践
①カメラ視点に合わせてWASDで前後左右移動させる
ではWASDで前後左右移動させていきます。まず最初にインプットで操作ボタンを作成していきましょう。
まずプロジェクト設定のインプットを開きます。
https://scrapbox.io/files/65c3eea082cdaf00247bf09b.png
軸マッピングのプラスボタンを二回押します。
https://scrapbox.io/files/65c3eeb9cbaf7800240e3b6f.png
新規作成されたインプットの名前を「MyCharacter Move Forward / Backward」にします。その後プラスボタンを押してボタン割り当てできる項目を増やします。
https://scrapbox.io/files/65c3eee32353a9002587a878.png
WとSキーを割り当てます。Scaleは1と-1にします。
https://scrapbox.io/files/65c3eefaec168f00258f09ca.png
これで前進後退のキー操作を作成しました。
ちなみに割り当てる際にキーボードのアイコンを押してからWやSキーを入力すると簡単にそのボタンを割り当てる事ができます。
https://scrapbox.io/files/65c3ef16917f6a00238d701f.gif
同じようにもう一つの軸マッピングも名前を「MyCharacter Move Right / Left」にしてAキーを-1、Dキーを1で割り当てます。
https://scrapbox.io/files/65c3ef682353a9002587a993.png
軸マッピングは現在こんな感じになっています↓プロジェクト設定は完了なのでこれで閉じます。
https://scrapbox.io/files/65c3ef92efd26c0024e65587.png
MyCharacterのイベントグラフを開きます。以下のノードを追加していきます。MyCharacter Move Forward / Backwardノードを作成してAddMovementInputを繋げます。
https://scrapbox.io/files/65c5d6b11961450026835629.jpg
ノード解説
MyCharacterMove Forward / BackwardノードはWまたはSキーを押したときに実行されてかつAxisScaleのピンからはWキーなら1という値が、Sキーなら-1という値が出力するという仕組みになっています。AddMovementInputノードはキャラクターを移動させるためのノードです。WorldDirectionとScaleValueを掛けた値分移動させます。例えばWorldDirectionを1,0,0にします。
https://scrapbox.io/files/65c3f08c2abe370026b6be08.png
この状態でプレイしてみると、WorldDirection(1,0,0) × マウスのWSキーのScale値の合計がキャラクターの動きに反映されますhttps://scrapbox.io/files/65c3f0bef1774800269ef058.gif
これでワールド軸のX軸に沿って前後移動できるようになります。今回作りたいのはワールドのX軸に沿った前進後退ではなく、カメラの方向に合わせた前進後退機能を作りたいのでそのノードを作っていきます。
GetControlRotationノードとGetForwardVectorノードを追加して、それぞれ右クリックして構造体ピンを分割させます。
https://scrapbox.io/files/65c3f1140d7ce70024b63c79.gif
以下のように繋ぎます。
https://scrapbox.io/files/65c3f13f38e6250028b63d6c.png
一旦プレイしてみましょう。カメラ方向に合わせてWSキーによる前進後退ができるようになりました。
https://scrapbox.io/files/65c5bb3fe2b2eb0024acbe63.gif
キャラクターの向きがおかしいですが後から直すので、先にノード解説していきます。
GetControlRotationノードとは?
まず先にGetControlRotationノードですが、これはカメラ(コントローラー)が向いている角度を取得するノードです。例えば以下のようにGetControlRotationのZ軸をprintstringに接続したとします。
https://scrapbox.io/files/65c5bba05019a700260d01ba.png
プレイしてみてカメラを動かすと、カメラの見ている角度を取得する事ができます↓
https://scrapbox.io/files/65c5bbca8901910026bf99fd.gif
ちょっと見にくいですが、キャラの正面方向だと0度でキャラの真後ろ方向だと180になっています。ぐるっと360度になっています。こんな感じにGetControlRotationはカメラの向いている角度を取得する事ができます。
GetForwardVectorノードとは?
もう一つのGetForwardVectorノードは回転軸を元に正面方向のベクトル(Vector)を出力するものです。例えば以下の様なノードを作ったとします↓
https://scrapbox.io/files/65c5bc0852ab810024e2dc51.png
プレイしてみるとカメラの正面方向のVector(X,Y,Z軸)を取得する事ができます。例えばキャラから見て真左なら座標はX=0,Y=1,Z=0になります。キャラから見て真正面方向なら座標はX=1,Y=0,Z=0になります↓
https://scrapbox.io/files/65c5bc39f07c5900250c26d6.gif
なので角度からX軸、Y軸、Z軸を計算して出力してくれるのがGetForwardVectorノードになります。
🐱ここの辺りは少し難しいですが、シンプルに言うとカメラの方向に前進後退するためのノードを組んだ形になります。そしてWSキーでWキーではプラスのScale値、Sキーには-のScale値をセットしているため、その値が掛けられて前進後退するという仕組みになっています。
では現時点でキャラクターの向きが進行方向に進まないのでそれを直していきます。MyCharacterのCharacterMovementコンポーネントを選択した状態で、キャラクタ移動(回転設定)にあるOrientRotationtoMovementにチェックを入れます。
https://scrapbox.io/files/65c5bcd0b9e6d700257aa5f2.png
OrientRotationtoMovementとは?
OrientRotationtoMovementとはキャラクターの移動方向にキャラの正面方向を合わせるように回転させる設定項目です。チェックを外した状態だとキャラは移動方向に関わらず特定の方向を向いたままになります。
これでプレイしてみると、カメラの方向に合わせて前進後退するようになりました。
https://scrapbox.io/files/65c5bd0f8516170025bbc849.gif
同じようにキャラクターの左右移動も実装しましょう。MyCharacterに以下のノードを追加します。先ほどのノードと似ていますが、若干異なるので注意です。MyCharacter Move Right/LeftノードからAddMovementInputノード、GetControlからGet"Right"Vectorを作成します。
https://scrapbox.io/files/65c5bd3a55653200262290b4.png
これもカメラの回転を取得して、左右方向のVectorを出力させて左右方向に移動するようにしています。
プレイしてみてAまたはDキーを押すと、カメラの向きに合わせて左右移動するようになりました。
https://scrapbox.io/files/65c5bdc8d7a20e0024da5c0c.gif
※影が残ってしまうバグがある場合
そして上のgifでも確認できるのですが、キャラクターの影がバグで残ってしまっているのでこれを直します。プロジェクト設定のRenderingでshadowmapと検索します。シャドウマップメソッドをShadowMapに変更します。
https://scrapbox.io/files/65c5bde6e2b2eb0024acff8e.png
これでキャラクターの影のバグは直りました。詳しい原因は掴めていませんが、このVisualShadowMapsは開発中の機能らしく、こういったバグが起こるのかもしれません。
キャラクターはカメラの向きに合わせてWASDキーによる前後左右移動が実装できました。
https://scrapbox.io/files/65c5be14472a510024c04378.gif
②ジャンプを実装する
プロジェクト設定を開いてインプットを開きます。アクションマッピングのプラスボタンを押して、以下のようにジャンプのインプットを作成します。名前をMyCharacter Jumpにしてスペースを割り当てます。
https://scrapbox.io/files/65c5be63caad6e0025e384b5.png
MyCharacterに以下のノードを追加します。MyCharacter JumpノードからPressedからJumpノード、ReleasedからStopJumpingノードを作成します。
https://scrapbox.io/files/65c5beaece8fd00026b08226.png
Jumpノードはそのままジャンプするノードですが、StopJumpingノードはジャンプをキャンセルするノードです。後で解説します。
一旦プレイしてみましょう。キャラがジャンプするようになりました。
https://scrapbox.io/files/65c5bf3508da710025c1738a.gif
続いてコンポーネント一番上のMyCharacterを選択した状態で、JumpMaxHoldTimeを10にします。
https://scrapbox.io/files/65c5bf5dea51ae0025f0878e.png
JumpMaxHoldTimeはジャンプしてそのまま飛び続ける秒数です。
プレイして、スペースバーを押したままにします。するとキャラがジャンプし続けて、離すとジャンプが終了します。
https://scrapbox.io/files/65c5bf88fb92b50025d3206c.gif
そして先ほど作成したStopJumpingノードですが、飛んでる最中にジャンプを終了するノードです。なのでStopJumpingノードが無いと10秒に設定したので10秒間飛び続ける事になります。基本的にジャンプさせてそのまま飛び続ける機能というのは稀だと思うのでStopJumpingノードはあっても無くてもどちらでも構いません。
ちなみに、JumpMaxHoldTimeの下にあるJump Max Countを2にすると2段ジャンプできるようになります。
Character MovementのGravity Scaleでジャンプの落下速度を速くできます。
イチから作成したキャラクター完成
https://youtu.be/rx_4eShqRPA
Characterクラスで1からキャラクターを作る事ができました。
今回作成したキャラクターはほぼサードパーソンのテンプレートのキャラクターとほぼ同じです。ケースにもよりますが、最初三人称のゲームを作るならサードパーソンのテンプレートのキャラクターを元に作っていく事をお薦めします。
③キャラクターの移動スピードや乗り越え角度を調整してみよう
では、残りはキャラクターの移動スピードなどを調整する項目について軽く紹介していきます。キャラクターの挙動に関する設定は基本的にCharacterMovementコンポーネントの詳細にあります↓ここの項目を紹介します。
https://scrapbox.io/files/65c5c04a19614500268114b8.png
まず移動スピードを変更してみましょう。CharacterMovementコンポーネントを選択した状態で、キャラクタームーブメント:歩行にあるMaxWalkSpeedを1500にします。
https://scrapbox.io/files/65c5c0eead9b92002630c4c2.png
プレイしてみましょう。キャラクターのスピードが速くなりました。
https://scrapbox.io/files/65c5c2bfe974710026ba57c0.gif
試したらスピードは戻しておきます。
次にキャラの乗り越える高さについて紹介していきます。Cubeを追加します。CubeのZ軸の位置を0にします。
https://scrapbox.io/files/65c5c2ce3af3310025a8579b.png
プレイしてみて、キューブに向かって歩いてみましょう。この状態では乗り越えられません。
https://scrapbox.io/files/65c5c2e95565320026230ea4.gif
CharacterMovementコンポーネントを選択した状態で、キャラクタームーブメント:歩行にあるMaxStepHeightを100に変更します。
https://scrapbox.io/files/65c5c2fec539480025051de2.png
MaxStepHeightではキャラが乗り越えられる最大の高さを設定できます。
プレイすると、100cmの高さのオブジェクトまで乗り越えられるになっています。
https://scrapbox.io/files/65c5c3129dce520025639d6a.gif
🐱では今度はキャラクターが進める最大傾斜角度を調整したいと思います。
設置したキューブの回転のx軸を60度にします。拡大縮小のY軸を14にします。
https://scrapbox.io/files/65c5c332d221a30024fad823.png
これでプレイしてもキャラクターは登る事はできません。
https://scrapbox.io/files/65c5c34783aeea0025c0529f.gif
CharacterMovementコンポーネントを選択した状態で、キャラクタームーブメント:歩行にあるWalkable Floor Angleを60にします。
https://scrapbox.io/files/65c5c3680b00380026e4d821.png
プレイしてみます。キャラクターは60度の傾斜角度まで登る事ができるようになっています。
https://scrapbox.io/files/65c5c39df07c5900250ce3a3.gif
🐱こんな感じにCharacterMovementではキャラクターの移動やジャンプなどの挙動を調整する事ができるのでキャラクターを作る際には覚えておきましょう!