UE4:WheeledVehicleを用いたアクターへの乗車処理
どうもです。
製作中のゲームで車への乗車処理を作成しました。
バイクにエンジン音とカーステレオが入りました。音楽を鳴らす意味は・・・。あんまりないかもしれません。 #UE4 pic.twitter.com/fj4lWdkHub
— ぶっさん (@Bussan_desu) 2018年10月28日
マルチでの複数人で乗車可能なクルマが出来た~。処理的に4人乗りまで行けるはず(PC足りなくて出来てない。 #UE4 pic.twitter.com/rgYY8LpbVY
— ぶっさん (@Bussan_desu) 2018年11月4日
簡易的な作成方法をまとめようと思います。
(マルチだとカメラカクつきが出たため処理を変えました。)
— ぶっさん (@Bussan_desu) 2018年11月11日
(手が上がっているのは気にしないで・・・・)
仕様
車に近づいて"E"を押すと車に乗れる
車に乗っている状態でEを押すと戻る
使用するもの
Vehicleテンプレート
ThirdPersonCharacterテンプレート
構成としてはコントローラー側で入力処理を行う。
BaseCharacterを作成しThirdPersonCharacterとDriverCharacterに継承させる。
カメラ処理はBaseCharacterで行う。
エンジンを起動しVehicleテンプレートを選択します。
マップに配置されているSedanを選択し、詳細のInputからAutoReceiveinputをDisabledにします。
起動後ThirdPersonCharacterテンプレートを追加します。
ワールド設定にてThirdPersonGameModeを設定します。
新たにキャラクタークラスを継承したBaseCharacter,DriverCharacter
コントローラークラスをDriverControllerを追加します。
追加したThirdPersonCharacterとDriverClassの親クラスをBaseCharacterに設定します。
DriverClassの重力設定を変更します。
DriverControllerをGamemodeに設定します。
BaseCharacter
この関数にはカメラ処理を起きたいのでSpringArmとカメラをコンポーネントに設置します。
ThirdPersonCharacterにてSprinngArmとカメラは削除します。
DriverController
このコントローラーでは前進及び左右の動きの処理を受け付けるようにします。
ThirdPersonCharacterにあるInputAxisMoveForwardとInputAxisMoveRightをコントローラーに移します。
BaseCharacter
BaseCharacterにて関数を作成します。MoveForwardとMoveRightという入力を受け付ける関数となります。
DriverController
BaseCharacterのリファレンスを取得する関数を作成します。
そして移したAxisノードからBaseCharacterを取得してMoveForward及びMoveRight関数を呼び出します。
ThirdPersonCharacter
移動処理の部分にMoveFoward及びMoveRight関数をイベントとして呼び出しAddMoveInputに接続します。
この状態でThirdPersonCharacterが動いているかを確認します。
Sedan
SetSteeringInput及びSetThrottleInputのAxisノードを削除し、各自カスタムイベントを作成します。今回はMoveRightInputとMoveForwardInputという名前にします。
コンポーネントにChildActorを追加します。ChildActorClassの設定をDriverCharacterにし、名前をDriveCharacterにしました。
DriverCharacter
DriverCharacterにVehicleという変数を作成します。変数の方はSedanとなります。
BaseCharacterで作成したMoveForwardとMoveRight関数をイベントにし、先程SedanBPで作成したMoveForwardInputとMoveRightInputのノードに接続します
これでThirdPersonCharacterと同じ要領で車を動かす準備が出来ました。
VechicleにSedanのリファレンスを入れるようにSetVehicle関数を作成します。
Sedan
GetDriverCharacter関数を作成しました。これはChildActorからDriverCharacterのリファレンスを取得する関数です。
BeginPlayでChildActorからDriveCharacterにアクセスしてSetVehicle関数にセルフを接続します。
車の近くでEを押すと車に乗れるようにします。
DriverController
Eを押したらキャラクターの周りでSphereTraceを発行して周りをチェックします。
あたったものがSedanBPだった場合ThirdPersonの情報を変数として取得し、SedanからDriverCharacterを取得して所有権を移します。
これで車にカメラが写りますが、今まで操作していたキャラクターを消さなければなりません。ただデストロイするほどでもないので今回は見えない場所に移そうと思います。
レベルの見えないところに床を起き、TargetPointを起きます。そしてアクタータグをつけます。今回はTeleportTagを入れました。
先程の続きの部分にGetAllActorでTargetPointを検索し、アクタータグが正しいものがあったらその位置にThirdPersonCharacterを移す処理を入れます。
次は乗っているときにThirdPersonCharacterに戻りたいので、Eの入力イベントのあとにDriverCharacterをキャストします。これで成功した場合は下車、失敗した場合は乗車と分けることが出来まぁす。
Sedan
下車ポイントを設定します。Sceneコンポーネントを設置しLeavePointとなずけ、車の横に設置しました。
そしてLeavePointのTransformを取得する関数を作成しました。名前をGetLeavePointとしました。
DriverCharacter
SedanBPのGetLeavePoint関数を取得する関数を作成します。
DriverController
DriverCharacterからGetLeavePointを呼び出し、ThirdPersonCharacterの変数にSetActorAndRotationに情報を入れ、最後操作権を移します。
これで動きます。
動画のようにキャラクターを表示する場合はSkeltalMeshをおいてアニメーションを適応させVisibleをオフにしておきます。
SkeltalMeshのVisibleを設定する関数を作成します。
DriverCharacterにてOnBecomeViewTargetではVisibleをオンに、OnEndViewTargetではオフにします。このイベントノードはカメラの所有権を得たときに発行されるイベントです。
これで動くはず。
ネットワーク対応ですと、これにめんどくさい処理が重なるので、ここでは割愛します。
てかこの記事長い!!!
以上。