Formation with Followers – フォロワーとフォーメーションを組むMOD

※2022/08/07; version 1.2 に更新。コアクエストの優先度を60に設定しました。ポジション移動の安定性が増し、戦闘スタイルとの相性も改善しました。MCMでクイックメニューを無効化できるように変更しました。


フォロワーと自由にフォーメーションを組むMODです。位置設定は保存され、次にフォロワーになった際にも自動的に適用されます。


1. 最新版ダウンロード(英語版 Nexus Mods / 日本語版 uploader.jp)

※SKSE、および SkyUI が必須です。

LE

AE/SE (ESLフラグ付き .esp)


2.「フォーメーション」パワー

2-1. クイックメニュー

当MODを導入すると、自動的に「フォーメーション」というパワーを習得します。フォロワーにクロスヘアを当ててパワーを唱えると、クイックメニューが開きます。

設定は追従、隠密、戦闘時の3つに分かれており、その状態での位置を個別に指定します。設定のない状態のときはフォーメーションが解除され、元のAIに従って行動します。クイックメニューでは、位置を8方向の中から選んで指定します。

フォロワーと別れた際はフォーメーションが解除されます。別れた後も設定は保持され、次にフォロワーになった際に自動で適用されます。

当MODにはフォロワーの人数を増やす機能はありません。2人以上連れていきたい場合には、Simple Follower Extension AE などのフォロワー拡張MODを併用してください。

2-2. 全体指示

クロスヘアにNPCを捉えずにパワーを唱えると、全体への指示となります。唱えるたびに、全員のフォーメーションの有効/無効を切り替えます。


3. MCM

3-1. 一般設定

ロケーション

屋外の居住区域やダンジョン内で、フォーメーションを維持するかどうかを設定します。自宅など、屋内の居住区域では常にフォーメーションが解除されます。

距離

X/Y規定量は、クイックメニューで位置を指定する際の、X/Y方向のオフセット量です。このXY値を使って8方向に設定します。

歩行範囲は、位置取りする際に歩いて向かう半径です。値が小さいほどプレイヤーの動きに素早く反応しますが、停止時にオーバーランしやすくなります。

停止範囲は、位置取りする際の遊び半径です。値の範囲内に入れば停止します。値が小さいほどプレイヤーの動きに素早く反応しますが、停止時に落ち着きにくくなります。

方向同期

プレイヤーの体の向きに同期させる間隔秒数を指定します。値が小さいほど自然な向きになりますが、より負荷が増えます。

向きの同期は、ロケーションを移動したときやプレイヤーの視界から外れたとき、そしてAIが切り替わったときにも行われます。

フォーメーション(全員)

全員のフォーメーションの有効/無効を一括して切り替えます。「フォーメーション」パワーの全体指示と同じです。

ホットキーを設定すると、そのキーで「フォーメーション」パワーを発動させます。デフォルトでキーボードの「V」キーが設定されており、ゲームパッドでプレイ中でも有効です。ゲームパッドでプレイしていて別のキーボードキーへ変更したい場合には、次項で説明するMCM設定ファイルの以下の行を編集してください。指定する数値は DXScanCodes を使います。テキストエディタで編集・保存したらファイルを閉じて、ゲーム内でMCMから設定を読み込めば反映されます。

"hotkey" : 47

クイックメニュー使用のチェックを外すと、パワーを唱えたときにクイックメニューが出なくなり、必ず全体指示になります。位置設定が終わってクイックメニューが邪魔になった場合に、チェックを外してご利用ください。

設定の手動保存

PapyrusUtil 導入下でのみ表示されます。設定の保存や読み込みを手動で行いますが、通常はこれらの作業を行う必要はありません。PapyrusUtil が導入されていれば、設定はゲームをセーブする際に自動的に保存され、ニューゲームの際に自動的に読み込まれます。

設定ファイルの保存先は “Data/SKSE/Plugins/StorageUtilData/FormationWithFollowers-MCM.json” です。

MOD稼働状態

当MODの有効/無効を切り替えます。無効化すると、設定値やフォロワー情報がすべてクリアされます。アンインストールする際は、ここからMODを停止させてください。

3-2. フォロワー別設定

一度でもクイックメニューを表示したことのあるフォロワーは、当MODのリストに登録されます。登録の上限は64人です。

MCMでは、位置をXYのオフセット値によって詳細に指定します。Xが左右を表し、プラス値は右、マイナス値は左方向になります。Yは前後を表し、プラス値は前、マイナス値は後ろの方向になります。XおよびYを両方とも0にすると、設定が解除されます。

フォーメーションの項目では、フォーメーションの有効/無効を個別に切り替えます。設定値だけ保持してフォーメーションを無効化したいフォロワーがいる場合には、ここから行ってください。


4. インストール / アンインストール

4-1. 互換性について

フォーメーション指示の可否は、対象がチームメイトであるかどうかで判断しています。バニラ、および一般的なフォロワー拡張MODでは、フォロワーとして雇う際にこの設定が行われています。セラーナさんのようなカスタムAIフォロワーでも同様です。そのため、原則としてはほとんどのフォロワー追加MODやフォロワー拡張MODと互換性があると思います。雇用時にチームメイトにしないカスタムAIフォロワーMODだけは互換性がありません。

それから、フォロワー自身が騎乗中の場合はフォーメーション行動を取りません。

4-2. インストール

導入には以下のものが必要です。

  • SKSE
  • SkyUI (LE/SE)
  • PapyrusUtil (LE/SE) … MCM設定を保存する場合のみ

MOD管理ツールでインストールしてください。ロードオーダーは問いません。

4-3. アンインストール

以下の手順でアンインストールしてください。

  1. MCMで当MODの機能を停止させる。
  2. MOD管理ツールでアンインストールする。
  3. MCM設定ファイルがある場合は手動で削除する。(Data/SKSE/Plugins/StorageUtilData/FormationWithFollowers-MCM.json)

5. 更新履歴

  • 2022/08/07 (version 1.2) ; コアクエストの優先度を60に設定。MCMでクイックメニューを無効化できるように変更。
  • 2022/07/07 (version 1.1) ; 体がより正しい方向を向くよう、回転待ち時間をわずかに延長。フォロワーがシーンの再生中である場合はフォーメーションを取らないように変更。VR用のコードにおいて、パワーによる全体指示を出しやすくするため、ターゲットの取得範囲を狭小化。
  • 2022/04/19 (version 1.0) ; 公開。

6. 作成秘話

最近「ないない」という曲にはまっている eka. ですこんばんは。ReoNa さんの声好き。「生きてるだけでえらいよ」もぶっ刺さるから聴いてみてほしい。あと最近の私の作業動画はもっぱらミオしゃの歌枠。ボイトレ効果なのか、前に比べて音がものすごい安定した気がする。難しいって言ってあんまり歌ってくれないけど「Howling」が好きです。Startend の3人の連携を観るのも好きで、FPSまったくやらない派の私が結構リアルタイムで追ってた。あとそれからトワ様さんがおかゆんの生誕ライブで歌ってたのかっこよかったー。そうそう、ういままがアルバム出すらしいです今年一番の大ニュース。(イラストレーターとは…?)

あっ作成秘話やるんだった。

6-1. 位置指定について

今回はフォーメーションMODを作ってみました。きっかけは、戦闘中に弓使いフォロワーの位置を固定したいと思ったことでした。私自身も弓使いなんですけど、弓を引き絞っているときにフォロワーさんが素早くこっちの射線上に入ってきて、意図せず大ダメージを与えてしまうことがあります。近接フォロワーの方は気を付ければなんとかなるものの、弓使いフォロワーは不定期に横移動して射線に入ってくるから本当に困る。

ということで、弓使いの戦闘位置をプレイヤーの隣に固定すれば、心おきなく弓攻撃に専念できるようになります。一緒に並んで攻撃している感も出るので楽しいです。ファイヤーボールみたいな発射式魔法を持つフォロワーを隣に置いてみるのもいいかもしれない。

逆に、近接フォロワーは戦闘位置を未設定のままにするのがおすすめです。今回使っているスクリプト関数は、位置を固定できる代わりに向きを柔軟にコントロールするのが難しいです。近接戦闘中は特に敵との位置関係が変動しやすく、自由にさせておかないと単なるおとり役の肉壁になる可能性があります。まぁ、そういう使い方もあるかもしんないけどね。

互換性のところでも触れたように、一部の戦闘スタイルとは相性が良くないようです。MOD独自の戦闘スタイルを持ったフォロワーだと、戦闘中になんかものすごい遠くに位置取りしてしまって どこ行くのー?! ってなったりします。これについては私も理由が良くわからないんで、試してダメだったら戦闘位置を解除するようにしてください。バニラのフォロワーであればだいたい大丈夫。

フォーメーションのレスポンスを良くしたいときには、「方向同期」の間隔をデフォルトの5秒から短くしてみてください。負荷が気にならないなら、個人的には3秒くらいがベストかと思います。プレイヤーの動きに良く反応してくれる。

仕様として、立って静止している状態のときにはフォーメーションを取らないようになっています。向きを変えてフォロワーに話しかけられるようにするためです。なので、静止からの動き出しではフォーメーションするまでに少しタイムラグがあります。

あとそうだ。クイックメニューを出すのにクロスヘアの対象を取得しているんですけど、これVRだとダメだっていう情報を見かけて、ちょっとした対策をしてあります。私VR持ってないからテストできなくて、もし試してダメだったら教えてもらえると嬉しいです。

6-2. KeepOffsetFromActor 関数

今回作ったスクリプトのメイン的な存在です。ある Actor が、別の Actor を基準として一定のオフセット距離を維持する関数になります。

Function KeepOffsetFromActor(Actor arTarget, float afOffsetX, float afOffsetY, float afOffsetZ, float afOffsetAngleX = 0.0, \
    float afOffsetAngleY = 0.0,  float afOffsetAngleZ = 0.0, float afCatchUpRadius = 20.0, float afFollowRadius = 5.0) native

以前から面白い関数だなーと思ってはいたものの、使いどころが見当たらなかった。一緒に歩かせるにしても普通はAIパッケージで十分だしね。

当MODでは、プレイヤーを基準としてフォロワー達にオフセット距離を維持させています。この関数はAIパッケージの制御よりも優先されるみたいなので、フォロワーのAIをいじることなく管理できるのがいいところ。ただし戦闘スタイルとの噛み合わせは良くない。ちなみに解放するときは ClearOffsetFromActor() を使えばOKです。

この関数には、困ったところが2つあります。

まず1つ目。ナビメッシュを考慮しない。岩にぶち当たろうが急流に落ちようがお構いなしに猪突猛進。設定したオフセット位置に向かって直線で突き進みます。特に室内扉をうまく通るのが超絶苦手なため、屋内の居住区域では問答無用でフォーメーションをオフにしています。ダンジョン内についてはMCMから有効にできるようにしてあるけど、たぶんホットキーでのオンオフを駆使しないと使い物にならないと思う。

そして2つ目。向きを合わせるのが苦手。基準となる Actor(当MODの場合はプレイヤー)に向きを合わせてくれればいいのに、そんな気の利いたことはできません。一応、引数に「afOffsetAngleZ」というそれっぽいのがあるにも関わらず、これは動かす対象の Actor(当MODの場合はフォロワー)自身を基準にした角度指定になってしまっているので、0以外の数値を入れるとフォロワーがその方向にくるくる回り続けてしまいます。とは言え0を入れるだけだとフォロワーの向きが変わらないんで、カニ走りしたり後ろ向きに走っちゃったりします。なんでこういった仕様なのか、この引数に想定されている使い道がちょっとわからない。プレイヤーに対するオフセット角度にしておいてくれれば、0を入れておくだけで常にプレイヤーの角度に同期するのになぁ。まさか内部的に実装を間違えてるなんてことは…ないよね?

6-3. 馬の話

プレイヤーが馬に騎乗しているときも、フォーメーションの処理は正常に行われます。姫と従者ごっこもできるよ。馬に乗るとプレイヤーの高さが114くらい上がり、それとともにフォロワーのポジション予定位置も空中に設定されることになるので、何も対策しないとフォロワーさんたちが常に走ってしまいます。XY平面では到達していても高さの分は離れているから、その空中ポジションに行こうとしてその場でずっと走り続ける。afCatchUpRadius や afFollowRadius の値を128とかに大きくすれば止まるけど、それだとプレイヤーが騎乗していないときのフォロワーの反応が悪くなってしまいます。

この問題への対処として、当MODではプレイヤーとフォロワーの高さの差を吸収するようにしています。関数を当てるときにプレイヤーおよびフォロワーのZ位置をそれぞれ取得し、その差を afOffsetZ に入れています。

あと、バニラでは起こらないことですが、フォロワー自身が何らかのMODで騎乗中の場合にはフォーメーションを取らせることができません。スクリプトよりも騎乗システムが優先されるようで、通常通りに後ろをパカパカついてきます。全員騎乗でアローフォーメーションとかできていたら、南門一点突破も夢じゃなかった。私ビビが一番好き。

6-4. MCMの話

MCM作るの時間かかったー。登録されているフォロワーごとのページを作りたくて、SkyUI のサイト見ながらうなり続けてた。結論としては、Event OnPageReset の中で初期画面を表示するタイミングまでなら、ページ名となる Pages プロパティの書き換えが有効でした。一度MCMのページを表示しちゃうとその場では書き換えられなくて、MCMを開き直さないと更新できないという仕様のようでした。

実は地味に名前順にソートしてあって、マックス人数を登録したらソートにかかる時間が長くなるから大丈夫だろうかとちょっと心配。クイックソートっていうのにすれば短縮できる、いやしかし Papyrus って再帰できるのか?とか考えて原始的なソートを使ってます。名前だけなら PapyrusUtil にあるソート関数が使えるけど、どのメンバーページを開いたかを識別するためにページ番号からメンバーを取得できるようにしなきゃいけなくて、結局自分で書いた。同姓同名が可能だから名前を識別子にするわけにはいかないし。何言ってるかわかんないかもしれませんが悩んでたんだよ。

あと、以前にAEではホットキーの登録がうまくできないと勘違いしていたのが解決して、今回実装してあります。ホットキーに関するイベントを全部しっかりと組み込めば正常に動作しました。イベントを設定しておかないとMCM画面を抜けられなくなる。

初期設定をVキーにしたのは気分です。形がなんかフォーメーションぽいかなと思って。Formation だから本当はFキーにしたかったんだけどね。


本編よりも作成秘話の方が長くなってしまった。さてローソンのおにぎりでも食べよう。コンビニはセブン派だけどおにぎりはローソンが好き。セブンはパンが好き。メロンパンってメロンじゃないのに違和感を感じないのがすごいよね。

Leave a comment

メールアドレスが公開されることはありません。

twelve − six =