Driveables of the Commonwealth - APCを改造してみたを色々と改造していったところ、ベルチバードに関する知識がないとどうにもならない部分が出てきたので、色々と調べてみたことをまとめます。
APCはベルチバードが変化したもの
APCはベルチバードを改造してAPCに見えるようにしたものです。ですので基本的な処理はベルチバードと同じようです。
ベルチバードは内部的にはActorである
Mount可能なActorとして定義されています。Skyrimでいうところの馬と同じです。
Actorなので動いたり他のActorに攻撃されたりします。ヘルスがちゃんとあるわけです。
動かないようにするには、Packageをその場から移動しないPackageにしておきます。さらにSetUnconsciousをtrueに設定しておくといいです。Unconscious状態は気絶しているという扱いで、自身のAIが行動せず、周りからも攻撃されなくなります。
プレイヤーが乗車するときにSetUnconsciousをfalseに設定して、降車したらSetUnconsciousをtrueに設定です。
Mount(乗車)について
ActorにMount可能であるというフラグを設定しておきます。このActorをアクティベートするとMountを開始します。
Skyrimでプレイヤーが馬に乗るときの内部処理は、おそらくこうなっています。
- 馬のAIを切ります。
- 操作対象を馬に切り替えます。(馬を操作対象に加えて、プレイヤーを操作対象から外す)
- 乗る時のアニメーションはプレイヤー側のIdle Animationで定義されています。
- 乗った時のプレイヤーの位置は馬のSkeletonで座標が定義されています。
ベルチバードに乗るときの内部処理も同じようなものだと思われます。
馬は一人用で乗る位置も固定ですが、ベルチバードは複数人が乗れます。操縦席、砲手、後部座席があるようです。
ベルチバードはFurniture(家具)でもある
ベルチバードに乗っている間は、乗っているActorのIsOnMount関数がtrueを返します。馬に乗っているのと同じというわけです。つまりベルチバードは騎乗可能なActorとなります。
ベルチバードから降りる際に、ベルチバード側でOnExitFurnitureイベントが発火します。ベルチバードは家具でもあるということになります。
アクティベート処理について
APCの処理はこうなっていました。
- ゲーム内でアクティベートすると、APC側でOnActivateイベントが発火します。
- スクリプトでActivate関数を実行すると、ActorがAPCに乗ります。
- コンソールでActivateコマンドを実行すると、上の2つが同時に発生します。
この結果にはPerkか何かが影響しているかもしれません。
プレイヤーが乗るためには、OnActivateイベントを捕捉してActivate関数を実行すればいいことになります。
乗車位置について
乗車位置を決めるKeywordがあります。これを予め付与しておけばいいようです。
バニラのHumanRaceSubGraphData種族にて定義されているSubGraphによって、Actorのキーワードによって使われるアニメーションが切り替わり、乗車位置や姿勢が決まるようです。
APCの場合はp-AttachGunnerキーワードがあると砲手の位置に乗ります。コンパニオンでも砲手になれます。
砲手の位置はAPCのSkeleton内部のPlacementsの下にありました。運転席と後部座席は見つけられませんでした。
PlacementsのNode全体でTranslateを変更するとすべての乗車位置が変更されるので、関係しているのはわかったのですが、子Nodeを特定できませんでした。あと車輪やヘッドライトの位置もPlacements以下で定義されていますので、それらも位置がずれてしまいます。
キーワードでアニメーションがかわるのですが、どのアニメーションも最後は乗車体勢を維持するように作ってあるみたいです。p-AttachGunnerキーワードがあるとミニガンを構えた姿勢になるわけです。
APCの場合は以下のようになっているようです。
キーワード | 乗車位置 |
---|---|
p-AttachCopilot | 先頭で頭だけ出して座る席 |
p-AttachDogmeat | 外側最後部の右側 |
p-AttachGunner | 外側中央のミニガン |
p-AttachPassenger | 内側左後方の座席 |
p-AttachPilot | 内側左前方の座席 |
砲手について
砲手は特定の位置でミニガンを構えます。ミニガンはAPC側にはなく、砲手側に武器として持たせます。
ですので、砲手として乗車が完了したらミニガンを与えて装備させ、降車したらミニガンを没収する必要があります。
与える方はASAAPCVertTurretScript.pscで、没収はASADrivablesNewAPCScript.pscでやっていました。
コンパニオンの乗車について
バニラのコンパニオンではCompanionVertibirdEntryTypeというグローバル変数を2に設定することになっています。
正確にはCompanionVertibirdEntryType_SnapIntoPositionとイコールになるようにします。CompanionVertibirdEntryType_SnapIntoPositionの初期値は2なので、CompanionVertibirdEntryTypeを2にすればいいみたいです。
コンパニオンのPackageにベルチバードに乗車するためのものがあり、その稼働条件が以下のようになっています。
- グローバル変数CompanionVertibirdEntryTypeの値がCompanionVertibirdEntryType_SnapIntoPositionである。
- コンパニオンに乗り物がリンクされている。
このパッケージにはスクリプトが設定されており、リンクされている乗り物に移動して座るような処理が行われます。
降車はCompanionVertibirdEntryTypeを0に設定します。正確にはCompanionVertibirdEntryType_Exitと同じにします。これでパッケージの条件を満たさなくなり、降りるわけです。
乗る時の処理の流れは、こうなります。
- コンパニオンにキーワードを設定します。(砲手ならp-AttachGunner)
- コンパニオンに乗り物をリンクさせます。(SetLinkedRef関数を使う)
- グローバル変数CompanionVertibirdEntryTypeを2に設定します。
- コンパニオンにたいしてEvaluatePackage関数を実行します。(必須ではないが、実行すると最速で乗ってくれる)
降車はこうです。
- コンパニオンからキーワードを取り除きます。
- コンパニオンの乗り物へのリンクを解除します。
- グローバル変数CompanionVertibirdEntryTypeを0に設定します。
- コンパニオンにたいしてDismount関数を実行します。
- コンパニオンにたいしてEvaluatePackage関数を実行します。(必須ではないが、実行すると降りたあとの行動が早い)
これらの処理に従うことで、自前のコンパニオン管理Mod側で乗る処理を行うようにしたり、複数人を乗せたりもできるようになります。
操作対象とカメラ対象
操作対象とはキーボードやコントローラーでの移動操作を伝えるActorです。カメラ対象はカメラが捉える対象です。基本的にはどちらもプレイヤーになっています。
プレイヤーがAPCに乗ると、ゲームエンジンによって(アニメーションによって?)両方がAPCに切り替わります。プレイヤーは座った状態で動けなくなります。
カメラ対象
プレイヤーが対象になっている場合のみカメラの設定が適用されるようで、プレイヤー以外が対象になっている間はカメラの制御が制限されます。特に距離が固定されてしまいます。
カメラ対象はスクリプトのGame.SetCameraTarget関数を使うことで変更できます。カメラ対象をプレイヤーに戻してあげることでカメラの制御が元に戻ります。操作対象はAPCのままであることに注意してください。
操作対象
操作対象はスクリプトで制御できます。少し複雑で、操作を伝えるかどうかをActor単位で指定します。
操作対象からAPCを外す場合は以下のコードになります。
APCRef.SetPlayerControls(False)
APCRef.EnableAI(True, False)
APCを操作対象に戻す場合は以下のコードになります。
APCRef.SetPlayerControls(True)
APCRef.EnableAI(True, False)
SetPlayerControlsのあとはEnableAIを実行しないと反映されないようです。
誰かが降りると操作不能になる
APCからActorが降りると、操作対象がAPCから外れてしまうようです。よって、降車を監視しておき操作対象をAPCに戻してあげる必要があります。
結合メッシュが無効になる
APC(ベルチバード)に乗っている最中は結合メッシュが無効になるようです。
結合メッシュに不整合があると物が角度によって見えたり消えたりしますが、APCに乗ると改善します。場所によってはFPSが大幅に低下します。コンソールからのtpcコマンドの動作が変化します。
ボストン市街地のような場所はAPCで走るのには向いていません。