BLOGブログ

2023.07.21UE5UE/ 初心者向けUE/ Blueprint

[UE5] キャラクターが自由に乗り降りできる車を作ってみよう

執筆バージョン: Unreal Engine 5.2

第20回ぷちコンのテーマ「コントロール」に因んで

ThirdPersonテンプレートをもとに、Vehicleテンプレートのアセットを使用して、

「レベル内にある車に乗って運転する」機能を作成していきます。

 

完成イメージはこちら!

 

●事前準備

Vehicleテンプレートのコンテンツを追加する

まず、ThirdPersonテンプレートを用意し、Vehicleテンプレートのコンテンツを追加します。

テンプレートを追加すると、テンプレートに必要な「ChaosVehicles」プラグインがないため、右下に出てくるEnable Missingを選択して有効化します。

少しすると右下にポップアップが出てくるので、Restart Nowを選択して再起動します。

これで、ThirdPersonテンプレートにVehicleテンプレートのコンテンツを追加することができました!

後の工程のために、追加したVehicleテンプレートに含まれる、Content > VehicleTemplate > Inputの中にある

IMC_Defaultが他のアセットと名前が同じため、見分けがつくように「IMC_Vehicle」に名前を変更します。

車をレベルに配置する

Content > VehicleTemplate > Blueprints > SportsCarにある「SportsCar_Pawn」をレベルエディターにドラッグアンドドロップして、車を配置します。

PlayerControllerを作成する

新規のプレイヤーコントローラー「BP_DrivePlayerController」を作成します。

作成したら、World SettingsタブでBP_ThirdPersonGameModeに、作成した「BP_DrivePlayerController」を割り当てましょう。

これで事前準備は完了です。

 

●車を検知するコリジョンをつける

プレイヤーキャラクター(ThirdPersonCharacter)の近くに車があるかどうかの判定をするコリジョンをBP_ThirdPersonCharacterに作成していきます。

Content > ThirdPerson > BlueprintsにあるBP_ThirdPersonCharacterをダブルクリックして開きます。

Sphereコリジョンを追加する

Viewportタブに移動して、スフィアコリジョンを追加します。

追加したコリジョンの名前を「DetectCarCollision」に変更し、

Sphere Radiusを 100 に変更しサイズを調整します。

コリジョンのプリセットを変更する

DetectCarCollisionが検知するコリジョンタイプを設定します。

車を検知するためのコリジョンなので、Vehicleのコリジョンだけオーバーラップするようにし、他はIgnoreに設定します。

これで、DetectCarCollisionが車と重なっているか判定できるようになりました。

※追加したVehicleテンプレートの、車のコリジョンタイプがVehicleに設定されているので、検知することができます。新しく車を追加する場合も、コリジョンタイプをVehicleにすることで検知できるようになります。

 

●キャラクターと車のコントロールを切り替える

これで準備は整いました。ここからはユーザーの操作する対象を切り替える処理を書きます。

ここでController(PlayerControllerもその一種)とPawn(ThirdPersonCharacterやSportsCar_Pawnもその一種)の関係について把握しましょう。

Controller

操作者。実体(3Dモデル)は持たず、Pawnをコントロールする思考部分を司る。
PlayerControllerのほかに、AI Controllerが存在する。

Pawn 操作される者。いわば操作される人形側。実体(3Dモデル)を持ち、Controllerによって操作される。

PlayerControllerは、実際にコントローラー(ゲームパッド)を握るプレイヤーに対応するクラスです。1人のプレイヤーにつき1つ、PlayerControllerが存在します。

PlayerControllerはプレイヤーのキーボードやコントローラーから受けた入力をもとにPawnを動かすという役割をもっています。

このことから、今回はPlayerControllerの接続を「人」と「車」で切り替えればいいことが分かります。

 

Controllerが操作するPawnを設定することを、UEでは「Possess」と言います。(憑依する、と考えるとしっくりきます)

つまり、PossessというBPノードがあるので、PlayerControllerがThirdPersonCharacter(人)とSportsCar_Pawn(車)で操作先を切り替えればよいということになります。

それでは具体的に実装していきましょう。

 

変数を作成する

BP_DrivingPlayerControllerを開き、変数を2つ作成します。

 ・Boolean型の変数「IsDriving」:車に乗っているかどうかを判断するための変数

 ・BP_ThridPersonCharacter型の変数「TPCharacterReference」:プレイヤーキャラクターを参照するための変数

BeginPlayでキャラクターを取得する

BeginPlayイベントを使って、ゲーム開始時にキャラクターをTPCharacterReferenceに格納します。

Fキーで車に乗り降りするイベントを作成する

今回はFキーを押すと車に乗れるようにします。

以下のことを実装します。

  • IsDrivingで分岐し、運転中でないならば、プレイヤーキャラクターのリファレンスから、DetectCarCollisionがオーバーラップしている車を探す。
    • GetOverlappingActorsのClass Filterには、対象のクラスを指定します(今回はSportsCar_Pawnにしています)。
    • ※車が複数台ある場合は、距離の近さなどの優先順位をつけてIndexを指定する必要があります。今回は1台なので配列の先頭を取得しています。
  • 車が見つかった場合、Possessノードで操作キャラクターを変更する。
  • 運転中フラグをTrueに切り替える。

運転中だった場合、プレイヤーキャラクターに操作キャラクターを変更し、運転中フラグをFalseに変えます。

 

これで切り替えることが出来ました。

しかしこのままだと、操作対象を切り替えただけで実際の操作ができないので、Inputを切り替える処理を追加します。

 

インプットの切り替え

テンプレートに使用されているインプットはUE5から推奨されているEnhanced Inputです。

下の画像のように、入力されたキーに応じて呼び出したいイベントが定義されています。

ThirdPersonCharacterの中身を参考に見てみましょう。

ThirdPersonCharacterにはIMC_DefaultのEnhanced Inputが使われていることが分かります。

同様に車にはIMC_Vehicle(事前準備で名前変更したもの)のEnhanced Inputを使用しています。

そこで、それぞれPossessされた時と、Unpossessされた時に切り替える処理を追加します。

まずは、BP_ThirdPersonCharacterを開き、PossessedイベントとUnpossessedイベントを追加します。

Possessedイベントで、IMC_Defaultを追加し、Unpossessedイベントで、IMC_Dafaultを削除する。

続いて、SportsCar_Pawnを開き、同様にPossessedイベント・Unpossessedイベントを追加します。

SportsCar_Pawnでは、それぞれIMC_Vehicleを指定する。

ここまでの完成イメージはこのようになります。

車とプレイヤーキャラクターの操作を切り替えられるようになりましたが、

プレイヤーキャラクターが置いて行かれてしまっているので、プレイヤーキャラクターを非表示にして車にくっつける処理を作成します。

プレイヤーキャラクターを非表示にする関数を作る

BP_ThirdPersonCharacterを開きます。

車に乗っているときにプレイヤーキャラクターを見えないようにする関数「SetPlayerVisibilityAndCollision」を追加します。

関数が追加できたら、以下の画像のようにプレイヤーキャラクターの見える/見えないを切り替えられるノードを追加します。

SetVisibilityでキャラクターのメッシュの 表示/非表示 を切り替え、SetCollisionEnabledでコリジョンの 有効/無効 を切り替えています。

PlayerControllerでプレイヤーキャラクターの表示/非表示を切り替える

BP_DrivePlayerControllerに戻り、表示/非表示の処理を追加します。

車に乗る処理には、Possessと運転中フラグ切り替えの間に追加します。

Attach Actor To Actorを使用して、車にプレイヤーキャラクターをくっつけます。

Attach Actor To Actor ノードのオプションは、全て Keep Worldに設定します。

こうすることで、車に乗った時の車との位置関係をそのままにくっつくことができます。

ThirdPersonCharacterで作成した関数「SetPlayerVisibilityAndCollision」を呼び出してプレイヤーを非表示に切り替えます。

車を降りる処理では、IsDrivingの分岐とPossessの間に追加します。

「SetPlayerVisibilityAndCollision」を使用してキャラクターを表示させます。

プレイヤーキャラクターをターゲットにDetachFromActorを使用して車から切り離します。

そのままだと、プレイヤーキャラクターが傾いてしまっている場合があるので、RotationのX(Roll)を 0 に変更します。

完成後のノード全体は以下のとおりです。

 

完成!

是非ぷちコンでのゲーム制作にお役立てください!