CHWSを使うと楽
Classic Holstered Weapons SystemというModがあります。インストールするだけで装備中の武器を背中に表示してくれます。
最初はこれを使っていたのですが、不具合をいくつか確認しました。
ベルチバードから降りるときにミニガンを外すタイミングでCTDすることがあります。Big Gunを無効にしても効果がないので、ベルチバード側からミニガンの処理を外したところ改善しました。あるいはミニガンをCHWSの除外リストに入れるといいかもしれません。
FROSTのたいまつが原因でCTDします。これは除外リストに入れることで改善しました。
位置調整機能があるのですが、私の環境では思った位置に移動させることができませんでした。
そしてなにより、装備していない武器は表示されません。本来武器のために用意されている装備スロットを用いて表示させているようなので仕方のないことなのですが、残念です。
複数の武器に対応させたい
武器を常に表示させるModは他にもVisible Weapons – 3rd Person Holsterなどがあるみたいですが、複数装備に対応しているものがなく、他にも実現したいことがあったため、自作してみました。
背中にスナイパーライフル枠(L96A1)、腰にアサルトライフル枠(サブマシンガン)、右脚にピストル枠(Beretta M9-FS)としてみました。
表示されている武器を抜刀すればもちろん消えます。
ついでにグレネードや地雷も出してみました。
長いライフルが2本の場合、1本は背中でいいですが、もう1本が腰だと長すぎ、左脚も微妙に感じたので、バックパックに付けてみました。
バックパックは色々探してみてQ.M.W (Quick Modification Weapon)が良さそうでした。ストラップがないのですが、Vtaw Wardrobe 6のHarnessがぴったり合います。
作り方
大雑把に説明すると、武器に見える防具を用意して装備するだけです。
魔法で作ると防具のスロットを消費することなく表示できます。
防具
武器のメッシュを抜き出して防具用に変換します。バニラであればJust Visible Holstered Weaponsをベースに使うのがオススメです。
都合のいいメッシュが見つからない場合は自分で武器のメッシュから抜き出して用意します。Load.nifという名前がついたメッシュがあれば、それはロード画面用にパーツが結合されているものなので、それを使うのが楽です。
Outfit Studioでメッシュを読み込み、位置を合わせてWeightを塗ります。
問題として、1つの武器につき1つの防具なので、1スロットを専有するのと、アタッチメントに対応させるのは手間を考えると無理なので、あきらめる必要があります。
Weight
Weightの塗り方のコツは、まず機械的に塗ってみます。どのBoneがかかっているのかわかるので、それぞれみていきます。単一に塗らないと武器が歪んだり伸びたりしてしまいます。Weightが少ししかかからないものは取り除いたほうが無難と思います。塗る場合はだいたいの平均値をみて塗ります。
複数のBoneをきちんと塗らないとベルト、ホルスター、ハーネスといったアクセサリ類とずれてしまいます。
以下のように塗ればよさそうでした。
装備箇所 | Bone |
---|---|
背中 | Chest_Rear_Skin(強め) Spine2_Rear_skin |
右脚 | RLeg_Thigh_skin |
腰 | Pelvis_Rear_skin Spine1_Rear_skin(やや強め) Spine2_Rear_skin(やや強め) |
バックパック | Chest_Rear_Skin |
脚は3BBBの太もものWeightを塗るのもいいと思います。その場合は前と後ろを同じように均一に塗れば大丈夫のようでした。塗り方はホルスターと合わせる必要があります。
Shape
武器のメッシュを抜き出して使う場合は、バラバラになっているアタッチメントをすべてまとめてひとつにするのですが、これがパズルゲームみたいでかなり大変です。
- BA2のファイル一覧やesp/esmの武器レコードを見て、どのメッシュを使うのかを特定する。
- Outfit Studioでひと通り読み込んでみる。
- そのままプロジェクトを保存する。
次にNifScopeでプロジェクトのnifファイルを開きます。
- 余計なゴミノードを消す。特にコリジョンやポジショニングといった武器のためのノードがあるので、これを除去しないとレシーバーだけ透明になるといった不具合が起こる。
- ノードは多重にしない。親ノードを右クリックしてTransform、Applyを実施すると、親ノードのTransform情報が子ノードに設定される。そうしたら親ノードを削除する。子ノードが最上位に移動するので、Scene Rootの直下に持ってくる。
再びOutfit Studioでプロジェクトを開きます。
- リファレンスを読み込み、位置を調整する。
- 機械的にWeightを塗ってみる。それから調整する。
1つ完成させてしまえば、次からはプロジェクトをコピーして武器のShapeを取り替えればいいので、効率よく作業できるようになります。
スクリプト
いくつかポイントがあります。
- 抜刀と納刀を検知する
- 武器の脱着を検知する
- 武器の入手と破棄を検知する
抜刀と納刀は、SkyrimであればActorActionでタイミングを検知できるのですが、Fallout 4にはないので、アニメーションを捕捉するのがいいでしょう。
脱着はOnItemEquippedとOnItemUnequippedでできます。Skyrimと違って、任意のスクリプトからRegisterして使えるので、わざわざスペルやReferenceAliasを用意する必要はありません。
装備のタイミングを検知する例 (papyrus)
; あらかじめRegisterしておく
RegisterForRemoteEvent(PlayerRef, "OnItemEquipped")
RegisterForRemoteEvent(PlayerRef, "OnItemUnequipped")
; すると以下のイベントが発火するので検知できる
Event Actor.OnItemEquipped(Actor akSender, Form akBaseObject, ObjectReference akReference)
EndEvent
Event Actor.OnItemUnequipped(Actor akSender, Form akBaseObject, ObjectReference akReference)
EndEvent
入手と破棄も同じですが、OnItemAdded/OnItemRemovedを使うと発火する頻度が多くなりすぎるので、AddInventoryEventFilterを使って無駄に発火する頻度を減らす必要があります。
私の場合は武器を直接拾ったり捨てたりすることが少なく、持ち替えはコンテナの出し入れで行うため、メニューの開閉を監視することにしました。
メニューの開閉を監視する例 (papyrus)
; あらかじめRegisterしておく
RegisterForMenuOpenCloseEvent("ContainerMenu")
; すると以下のイベントが発火するので検知できる
Event OnMenuOpenCloseEvent(string asMenuName, bool abOpening)
if abOpening
; 開いた
else
; 閉じた
endif
EndEvent