プレイヤーを画面の左側に配置していると、接近戦で弾が当たらなくなります。
同じ問題はSkyrimにもありますが、手っ取り早く解決する方法が、1人称視点にするか、3人称視点でプレイヤーを画面中央に持ってくることです。
そのまま撃つことを「腰だめ撃ち」、コントローラーのLB(またはLT、あるいはマウスの右ボタン)を押しっぱなしにした状態を「構える」、構えながら撃つことを「構え撃ち」というようです。
既にあるもので何とかしてみる
Custom Cameraを使ってカメラを調整します。プリセットを6つ作ることができて、ホットキーでプリセットを切り替えられます。とりあえずはこれで出来ますね。
ショットガンで構えている時だけにしたい
とはいえホットキーを増やしたくないので、スクリプトで状況を判断させて勝手にやらせてみます。
構えている時だけカメラを中央にして、構えるのを止めたら元に戻します。
CustomCamera.pscの差分 (papyrus)
Bool IsCentered
Event OnControlDown(string control)
Weapon kWeapon = PlayerRef.GetEquippedWeapon(0)
if kWeapon
Ammo kAmmo = kWeapon.GetAmmo()
if kAmmo == Game.GetFormFromFile(0x01F673, "Fallout4.esm")
IsCentered = true
endif
endif
if IsCentered
Utility.SetINIFloat("fOverShoulderPosX:Camera", 0.0)
Utility.SetINIFloat("fOverShoulderMeleeCombatPosX:Camera", 0.0)
Utility.SetINIFloat("fOverShoulderCombatPosX:Camera", 0.0)
Game.UpdateThirdPerson()
endif
EndEvent
Event OnControlUp(string control, float time)
if IsCentered
ApplyHorizontal()
Game.UpdateThirdPerson()
IsCentered = false
endif
EndEvent
Function Register()
RegisterForExternalEvent("OnMCMSettingChange|" + MCMName, "OnMCMSettingChange")
RegisterForControl("SecondaryAttack")
EndFunction
CustomCamera.pscのどこでもいいので追記します。
Register関数は既にあるので、中に1行だけ追加している点に注意です。
実装の詳細
構えている状態を検知する方法ですが、手っ取り早くRegisterForControlを使ってみました。
引数に指定するイベント名ですが、一覧が見つからないので、F4SEのCustomControlMap.txtを使いました。構えはSecondaryAttackになるようですが、これでうまく動作しました。
RegisterForKey(キー入力)を使ってしまうと、メニューを開いていたり同時押しなどの状況判断がとても面倒になりますので、使わない方がいいです。
カメラの設定はFallout4.iniに記述します。これはスクリプトを使ってゲーム内でも変更できます。これを実装したModがCustom Cameraになるわけです。ゲーム内で変更したらUpdateThirdPerson関数を実行しないとゲーム画面に反映されないので注意です。
ショットガンの判定ですが、どうやら武器の種類がGunでまとめられてしまっているようです。ですので弾薬がショットガンシェルかどうかで判断しています。
弾薬の判定を省略すればすべての銃が対象になり、武器の判定を省略すれば何を持っていてもプレイヤーを画面中央にもってこれます。
1人称視点にする処理
構えている時だけ1人称視点にします。
CustomCamera.pscの差分(1人称視点版) (papyrus)
Bool IsCentered ; 1人称視点に切り替えたのかどうかを覚えておく
; 構えた時に呼ばれる
Event OnControlDown(string control)
; 納刀状態から抜刀するのなら何もしない
if !PlayerRef.IsWeaponDrawn()
return
endif
; 既に1人称視点なら何もしない
if PlayerRef.GetAnimationVariableBool("IsFirstPerson")
return
endif
; 現在装備している武器の弾を調べる
Weapon kWeapon = PlayerRef.GetEquippedWeapon(0)
if kWeapon
Ammo kAmmo = kWeapon.GetAmmo()
if kAmmo == Game.GetFormFromFile(0x01F673, "Fallout4.esm")
IsCentered = true
endif
endif
; 1人称視点に切り替える
if IsCentered
Game.ForceFirstPerson()
endif
EndEvent
; 構えるのを止めた時に呼ばれる
Event OnControlUp(string control, float time)
; 3人称視点に戻す
if IsCentered
Game.ForceThirdPerson()
IsCentered = false
endif
EndEvent