Actorを検知してスクリプトを付与する

Mod作成

Nuclear Winterを改造していて調べたことをまとめます。

Actorを検知する理由

Actorでスクリプトを動かすためにはいくつかの方法があります。

  • Actorにスクリプトを割り当てる。
  • ActorにSpellを持たせる。Spellにスクリプトを付与する。
  • ActorをQuestのReferenceAliasに入れる。ReferenceAliasにスクリプトを付与する。
  • SPIDでActorにSpellを持たせる。
  • Cloakスペルで周りのActorにSpellを持たせる。

Actorを直接編集すると競合しやすくなります。半自動的に処理するためのxEdit用スクリプトやzEdit用スクリプトもあります。いずれにせよ、Modの構成を変更するたびに毎回調整しないといけないので、運用に手間がかかります。

そこで、SPIDでゲーム起動時に動的に持たせたり、CloakスペルやQuestを稼働させてゲーム実行中に動的に持たせると、Modの構成に関係なく、競合を気にせずに処理できます。

Cloakスペルがいけない理由

Cloakスペルは主にプレイヤーにたいして使います。プレイヤーを中心とした半径○○ユニット内の全Actorにたいして問答無用でスペルを放つことで、その場にいるActorにスクリプトを動かすわけです。

どのような弊害があるかをモス・マザー洞窟の近くに行くとスタックエラーでまとめてあります。負荷が高いのです。

Cloakスペルの利点は対象人数を問わないところです。逆に言えば、何体にスペルが付与されるかわからず、一斉にかかるので順番に処理していくことができません。

SPIDの問題

Actorにスクリプトやスペルを直接持たせるのがあるべき姿なので、もっとも負荷が低いのですが、競合や運用面での問題が出てきます。そこでSPIDを使うと、あたかも初めからスペルを持っていたかのように振る舞い、競合の心配がなく運用も楽になります。

ところが、SPIDは死んでいるActorにはスペルを付与できないようです。死んでいるActorにもスペルを付与したいのであればQuestを使う必要があります。

Questを使ってActorを検知する

Questは稼働時にReferenceAliasにReferenceが埋まります。これを利用して、プレイヤーの近くにいるActorを埋めるようなQuestを用意して、定期的に稼働させることで、プレイヤーの近くにいるActorを次々に検知できるわけです。

RefCollection

SkyrimではReferenceAliasを用意した数だけしかActorを検知できませんでした。Fallout 4ではRefCollectionという仕組みが用意されました。

RefCollectionはいわばReferenceAliasの配列です。要素の数はQuestの稼働開始時に自動的に決定されます。

Skyrimでは用意したReferenceAliasのひとつずつにスクリプトを付与する必要があったため、開発が大変でした。RefCollectionであればRefCollection自体にひとつスクリプトを付与するだけで済みます。

CKでの編集作業やスクリプトのコードがすっきりするので、不特定多数のActorを検知する用途に向いています。

Story Manager

QuestをStart関数で開始させると負荷が高くてフリーズの原因となるらしいです。Story Managerを経由させると対策できるようなのですが、効果の程は不明です。スクリプトからクエストをStartさせるとフリーズ?にてまとめてあります。

Start as deadのActorはスペルが発動しない

ActorにはStart as deadというフラグを設定できます。最初から死んでいるという扱いになります。サンクチュアリを出たところにいるスカベンジャーの死体がそうです。

このStart as deadがついたActorはスペルを持たせることはできても、Magic Effectが稼働しないようです。

Questでは検知できますので、Questにスクリプトを付与して、Quest稼働後に検知したActorにたいしてスクリプトを実行する方法があります。

タイトルとURLをコピーしました