僕の私のUnrealな日々

UE4のBluePrintを使って小さなギミックを作ったりしてます。ブログを通じて情報共有ができたらなと思います。

UE4:WheeledVehicleを用いたアクターへの乗車処理

 

f:id:Bussan_dayo:20181111175113p:plain

 

どうもです。

 

製作中のゲームで車への乗車処理を作成しました。

 

 

 簡易的な作成方法をまとめようと思います。

(マルチだとカメラカクつきが出たため処理を変えました。)

 

 

(手が上がっているのは気にしないで・・・・)

 

仕様

車に近づいて"E"を押すと車に乗れる

車に乗っている状態でEを押すと戻る

 

使用するもの

Vehicleテンプレート

ThirdPersonCharacterテンプレート

 

 

構成としてはコントローラー側で入力処理を行う。

BaseCharacterを作成しThirdPersonCharacterとDriverCharacterに継承させる。

カメラ処理はBaseCharacterで行う。

 

 

エンジンを起動しVehicleテンプレートを選択します。

f:id:Bussan_dayo:20181108165248p:plain

 

マップに配置されているSedanを選択し、詳細のInputからAutoReceiveinputをDisabledにします。

f:id:Bussan_dayo:20181108170303p:plain

 

 

 

起動後ThirdPersonCharacterテンプレートを追加します。

f:id:Bussan_dayo:20181108165345p:plain

 

ワールド設定にてThirdPersonGameModeを設定します。

 

新たにキャラクタークラスを継承したBaseCharacter,DriverCharacter

コントローラークラスをDriverControllerを追加します。

f:id:Bussan_dayo:20181108165555p:plain

 

追加したThirdPersonCharacterとDriverClassの親クラスをBaseCharacterに設定します。

f:id:Bussan_dayo:20181108170749p:plain

 

 

 DriverClassの重力設定を変更します。

f:id:Bussan_dayo:20181111163856p:plain

 

DriverControllerをGamemodeに設定します。

f:id:Bussan_dayo:20181111170211p:plain

 

BaseCharacter

この関数にはカメラ処理を起きたいのでSpringArmとカメラをコンポーネントに設置します。

f:id:Bussan_dayo:20181111165034p:plain

 

ThirdPersonCharacterにてSprinngArmとカメラは削除します。

 

 DriverController

このコントローラーでは前進及び左右の動きの処理を受け付けるようにします。

ThirdPersonCharacterにあるInputAxisMoveForwardとInputAxisMoveRightをコントローラーに移します。

f:id:Bussan_dayo:20181111164139p:plain

 

 BaseCharacter

BaseCharacterにて関数を作成します。MoveForwardとMoveRightという入力を受け付ける関数となります。

f:id:Bussan_dayo:20181111164353p:plain

 

DriverController

BaseCharacterのリファレンスを取得する関数を作成します。

 

f:id:Bussan_dayo:20181111164517p:plain

 

そして移したAxisノードからBaseCharacterを取得してMoveForward及びMoveRight関数を呼び出します。

f:id:Bussan_dayo:20181111164650p:plain

 

ThirdPersonCharacter

移動処理の部分にMoveFoward及びMoveRight関数をイベントとして呼び出しAddMoveInputに接続します。

f:id:Bussan_dayo:20181111164836p:plain

 

この状態でThirdPersonCharacterが動いているかを確認します。

 

 

Sedan

SetSteeringInput及びSetThrottleInputのAxisノードを削除し、各自カスタムイベントを作成します。今回はMoveRightInputとMoveForwardInputという名前にします。

 

f:id:Bussan_dayo:20181111170517p:plain

 

 

コンポーネントにChildActorを追加します。ChildActorClassの設定をDriverCharacterにし、名前をDriveCharacterにしました。

f:id:Bussan_dayo:20181111170721p:plain

 

 

 

 

DriverCharacter

DriverCharacterにVehicleという変数を作成します。変数の方はSedanとなります。

 

f:id:Bussan_dayo:20181111171014p:plain

 

BaseCharacterで作成したMoveForwardとMoveRight関数をイベントにし、先程SedanBPで作成したMoveForwardInputとMoveRightInputのノードに接続します

f:id:Bussan_dayo:20181111171234p:plain

 

これでThirdPersonCharacterと同じ要領で車を動かす準備が出来ました。

 

VechicleにSedanのリファレンスを入れるようにSetVehicle関数を作成します。

f:id:Bussan_dayo:20181111171511p:plain

 

Sedan

GetDriverCharacter関数を作成しました。これはChildActorからDriverCharacterのリファレンスを取得する関数です。

f:id:Bussan_dayo:20181111172355p:plain

 

BeginPlayでChildActorからDriveCharacterにアクセスしてSetVehicle関数にセルフを接続します。

f:id:Bussan_dayo:20181111172445p:plain

 

 

 

 

車の近くでEを押すと車に乗れるようにします。

DriverController

Eを押したらキャラクターの周りでSphereTraceを発行して周りをチェックします。

f:id:Bussan_dayo:20181111172143p:plain

 

あたったものがSedanBPだった場合ThirdPersonの情報を変数として取得し、SedanからDriverCharacterを取得して所有権を移します。

f:id:Bussan_dayo:20181111172637p:plain

 

これで車にカメラが写りますが、今まで操作していたキャラクターを消さなければなりません。ただデストロイするほどでもないので今回は見えない場所に移そうと思います。

 

レベルの見えないところに床を起き、TargetPointを起きます。そしてアクタータグをつけます。今回はTeleportTagを入れました。

f:id:Bussan_dayo:20181111172913p:plain

 

先程の続きの部分にGetAllActorでTargetPointを検索し、アクタータグが正しいものがあったらその位置にThirdPersonCharacterを移す処理を入れます。

f:id:Bussan_dayo:20181111173332p:plain

 

 

次は乗っているときにThirdPersonCharacterに戻りたいので、Eの入力イベントのあとにDriverCharacterをキャストします。これで成功した場合は下車、失敗した場合は乗車と分けることが出来まぁす。

 

f:id:Bussan_dayo:20181111173538p:plain

 

Sedan

下車ポイントを設定します。Sceneコンポーネントを設置しLeavePointとなずけ、車の横に設置しました。

f:id:Bussan_dayo:20181111173752p:plain

 

そしてLeavePointのTransformを取得する関数を作成しました。名前をGetLeavePointとしました。

f:id:Bussan_dayo:20181111173849p:plain

 

 

DriverCharacter

SedanBPのGetLeavePoint関数を取得する関数を作成します。

f:id:Bussan_dayo:20181111174043p:plain

 

 

DriverController

DriverCharacterからGetLeavePointを呼び出し、ThirdPersonCharacterの変数にSetActorAndRotationに情報を入れ、最後操作権を移します。

f:id:Bussan_dayo:20181111174256p:plain

 

これで動きます。

 

動画のようにキャラクターを表示する場合はSkeltalMeshをおいてアニメーションを適応させVisibleをオフにしておきます。

f:id:Bussan_dayo:20181111174431p:plain

 

SkeltalMeshのVisibleを設定する関数を作成します。

f:id:Bussan_dayo:20181111174515p:plain

 

DriverCharacterにてOnBecomeViewTargetではVisibleをオンに、OnEndViewTargetではオフにします。このイベントノードはカメラの所有権を得たときに発行されるイベントです。

f:id:Bussan_dayo:20181111174627p:plain

 

 

これで動くはず。

ネットワーク対応ですと、これにめんどくさい処理が重なるので、ここでは割愛します。

 

てかこの記事長い!!! 

以上。