おかえり。
これで、スプリング アームとカメラ コンポーネントにキャラクターができました。
プロジェクトとプログラムの入力、キャラクターの移動機能を構成する必要があります。
始めましょう。
そのため、プロジェクトにはいくつかの入力が必要になります。 そのために、編集とプロジェクト設定に進みます。
ここから、入力を選択して、アクション マッピングと AXIS マッピングを展開します。
ここで、軸マッピングにいくつかのアクションが見られます。これらは、ラーニング キット ゲームからいくつかのアセットを移行したときに作成されました。
プロジェクト設定からこれらの軸マッピングをすべて削除します。 これをすべてゼロから行いましょう。
アクション マッピングでは、ジャンプできるようにしたいと考えています。
ジャンプ アクション マッピングを作成し、これをスペースバーにマッピングします。 このアイコンをクリックしてスペースバーを押すと、スペースバーをジャンプ アクション マッピングにリンクできます。
AXIS マッピングでは、これらのいくつかが必要になります。
1 つ追加して、これを MoveForward と呼びます。 そして、これを W キーにマッピングしたいと思います。 また、これを S キーにマップし、スケールを -1 にして後方に移動します。 これで、MoveForward ができました。
MoveRight も必要です。 そこで、MoveRight を追加して、これを D キーにマップします。 また、スケール -1 の A キーにマップしたいと思います。
これで左右に移動できるようになります。
ここで、前進と右への移動に加えて、マウスを使用してカメラを回転できるようにしたいと考えています。 そこで、さらに 2 つの軸マッピングを追加し、そのうちの 1 つを [Turn] と呼びます。
このために、マウスの x 軸をマップし、look up という別の軸を作成して、これをマウスの y 軸にマップします。
ここで、マウスの y 軸のスケールを -1 に設定します。
そうすれば、マウスを前方に動かすと、下ではなく上を向くようになります。
したがって、これらのアクションと軸のマッピングがあります。
文字クラスでこれらのマッピングにバインドする関数をいくつか作成できます。
これが BlasterCharacter.h で、動きを処理する関数をいくつか作成します。
ここで、子クラスからこれらにアクセスしたい場合に備えて、これらを保護されたセクションに貼り付けます。 BlasterCharacter から派生する可能性があります。
そして、float を取る MoveForward という関数を作成します。 この値を呼び出します。これは、軸のマッピングのための軸の値です。
MoveRight という void 関数も作成し、そのために value という float を追加します。
次に、Turn と LookUp が必要です。
そこで、value という float を持つ Turn という関数と、value という float を持つ LookUp という関数を作成します。
そして、これらは私たちの基本的な動きを処理します。
これらを定義していきましょう。
ここに関数の定義があります。
ところで、これは現時点でのレビューです。 以前にこれを行ったことがなく、私たちが行っていることについて少し理解していない場合は、他の C++ Unreal Engine コースの 1 つを受講することをお勧めします。ここでは、ここで行っていることをより詳細に説明します。 少なくとも一度はこれを行ったことがあると思います。
キャラクターを立ち上げて機能させるには、このレビュー資料のいくつかを通過する必要があります.
Unreal Engine のマルチプレイヤーに関連するいくつかの新しい機能に入る前に、関数の動きができたので、setupPlayerInputComponent 関数を取得して、beginPlay の下にカット アンド ペーストします。
こうすることで、ここで関数をアクセス マッピングにバインドしているため、プレーヤー入力コンポーネントの設定を確認できます。
これで、これらの移動関数は非常に単純になり、前進します。
文字コントローラーが null ではなく、値がゼロでないことを確認します。
したがって、コントローラーが null ポインターと等しくなく、値が 0.f と等しくない場合を言います。
そのため、Character クラスには、AController 型の controller と呼ばれる継承された変数があります。
ここで、この IF チェックを行う場合、どの方向が前方であるかを調べる必要があり、コントローラーの回転を使用してこの値を見つけます。
getActorForwardVector を使用して前方方向を取得しないのはなぜですか? これは、アクティブな前方ベクトルがキャラクターの前方方向であるためです。
より具体的には、カプセルであるルート コンポーネントの前方ベクトルです。 ただし、コントローラーの回転を変更します。
コントローラーはルート コンポーネントとは異なる回転を持つ可能性があり、キャラクターの前方方向ではなく、コントローラーの前方方向に移動したいと考えています。 そこで、コントローラーを前方に向けます。
ローカル変数を宣言しましょう。 const FRotator になります。 これを YawRotation と呼びます。 これは、ヨーのピッチがゼロの FRotator になります。 そこで、ヨーイングのピッチには 0.f を使用します。 しかしヨーに関しては、私はコントローラのヨーが好きなので、controller->getControlRotation と言って、その回転からヨーを取得します。
前述のように、ロールとピッチに 0.f を使用します。 したがって、この回転 F rotator はピッチとロールに対してゼロであり、コントローラーの回転ヨーです。
次に、この FRotator を使用して前方ベクトルを取得し、方向を取得します。これが FVector になります。 そこで、const FVector を作成します。 そして、これを単に「方向」と呼ぶことにします。
FRotation 行列を使用してヨー回転から前方ベクトルを取得することで、これを初期化します。 そのため、回転を使用して FRotationMatrix を作成できます。
FRotationMatrix は、行列と呼ばれる単純な数学的構造です。 ローテーターから回転行列を作成でき、その回転行列には情報が含まれています。 FRotationMatrix で getUnitAxis という関数を使用できます。
ここで、getUnitAxis と getUnitAxes があることに注意してください。 getUnitAxis が必要で、これに値を渡します。値は EAxis::X になります。 EAxis は名前空間であり、この「列挙型」定数 X が含まれています。
私たちが行っているのは、x 軸を指定して、それを単位軸と呼んでいることだけです。 この背後にある数学を理解する必要はありません。 FRotator から FRotationMatrix を作成し、それを単位軸と呼び、FVector を返すことだけを知っておく必要があります。
このベクトルは、回転の方向を表します。 これで、ピッチとヨーの回転がゼロになります。 したがって、このベクトルは地面に平行で、コントローラーのヨーに対応する方向を指しています。
これが前進したい方向なので、キャラクターの継承関数 addMovementInput を呼び出し、方向と値を渡します。
ここで、方向の大きさは問題ではないことに注意することが重要です。 たとえば、方向を 2 倍することでこれをスケーリングできると考えていて、それが移動速度を 2 倍にする場合、それは機能しません。 AddMovementInput は単に方向と値を取り、その方向にキャラクターが移動する結果になります。
ただし、速度と加速度は characterMovementComponent から取得されます。 キャラクターをより速く動かしたい場合は、characterMovementComponent の変数を変更する必要があります。 したがって、これで先に進むことができます。
moveRight で同じコードを使用します。 回転行列から x 軸を取得するのではなく、重要な違いが 1 つあります。 y 軸を取得します。 これにより、ヨー回転に対応する前方ベクトルではなく、正しいベクトルが得られます。 他のすべては同じです。
回転と見上げがさらに簡単になりました。 turn 関数の addControllerYawInput を呼び出すだけで、マウスを左右に動かしながら値を渡します。 値は、マウスを動かしてコントローラーを追加する速度を表します。 ヨー入力は、コントローラーの回転にヨーを追加します。
LookUp は単純に addControllerPitchInput を呼び出し、ここに値を渡します。 したがって、基本的な移動関数があり、これらを軸マッピングにバインドする必要があります。
タイプ UInputComponent のオブジェクトにアクセスできるため、セットアップ プレーヤー入力コンポーネントでそれを行うことができます。 これが playerInputComponent です。 もちろん、playerInputComponent には bindAxis があります。 今 bindAxis は FName を取ります。
ここで実際の FName を渡すか、その中に文字列を含むテキスト マクロを渡すことができます。 または、単に通常の文字列を使用することもできます。リテラル バインド アクセスは、その軸名に対してこれらすべてを受け入れます。 これで moveForwards ができたので、それから始めることができます。
2 番目の入力は、このキャラクターになるユーザー オブジェクトです。
そして、ABlasterCharacter::MoveForward になるバインド先の関数のアドレスが必要です。
次に、moveRight に対して同様の方法で他の軸マッピングをバインドします。 文字列を moveRight に変更し、関数を moveRight 関数に変更できます。
「turn」と「lookUp」もあります。 それでは、それらも見つけてみましょう。 ターンにはターン軸マッピングが必要であり、ターン関数をバインドし、ルックアップまたはルックアップ軸マッピングにバインドし、ルックアップ関数を使用しています。
これで、ジャンプに関するアクション マッピングもできました。 今のところ、キャラクターの継承されたジャンプ機能を直接バインドするだけです。 これを一番上に挙げてみましょう。
playerInputComponent と言います。 bind アクションを使用します。 アクション名は「ジャンプ」。
EInputEvent があります。 これが、使用できるキー イベントです。 IE_Pressed ユーザー オブジェクトはこれで、関数は単純に ACharacter::Jump です。
後で、追加の機能が必要になる可能性があるため、ジャンプ機能をオーバーライドしますが、今のところは、キャラクターのジャンプ機能で十分です。 そのため、移動を設定し、移動関数を入力にバインドしました。
これをコンパイルしてみましょう。
エディターに戻って、キャラクター クラスをここに置いておきます。
プレーヤーの開始もまだ使用していません。
私はワールドに実際の BP_BlasterCharacter を持っています。最後のビデオでは、詳細パネルに移動し、自動所有プレイヤーをプレイヤー 0 に設定しました。
そうすれば、Play を押すと、実際にプレーヤーを所有していることになり、動き回ることができます。
もちろん、アニメーション ブループリントを使用していないため、キャラクターは固く、アニメーション ポーズすらありません。
それが私たちの次のステップになるでしょう。
キャラクターのセットアップの基本はほぼ終わりました。キャラクターを動かせたら、マルチプレイヤー プログラミングの概念を学び始めることができます。
そのため、この講義では、基本的なキャラクターの動きのアクションとアクセスのマッピングを設定し、それらの動き関数を作成してマッピングにバインドしました。
そして、実際にキャラクターとコントローラーを動かし、ひいてはスプリング アームとカメラを動かしています。
繰り返しますが、これはすべてあなたのためのレビューです。
キャラクター設定の基本はほぼ完了しており、すぐにマルチプレイヤー プログラミングに取りかかることができます。
また後で。