プレイヤーの周辺にいるActorを探して何かする実装をまとめます。
クエストを使う方法
動作が格段に速く、おそらくですが負荷も少ないのでオススメです。
Questを作る
CKでQuestを作ります。Start Game EnabledとRun Onceはオフにしておきます。
Reference Aliasを作ります。Optionalをオンにします。死体も含める場合はAllow Deadもオンにします。Fill TypeはFind Matching Referenceを選び、In Load AreaとClosestをオンにします。
必要であればさらにMatch Conditionsに条件を追加していきます。プレイヤーとの距離であるとか、雇用中のフォロワーであるとかです。
Reference AliasをDuplicateで複製して数を増やします。多くすればそれだけ一度に多く検知できます。
Questを動かす
このQuestをStartさせると、条件に合ったActorがReference Aliasに埋まります。Closestがオンになっているので、Reference Aliasの上から、プレイヤーから近い順に埋まっていきます。
Reference AliasにたいしてGetActorReferenceでActorを取得できます。埋まらなかったReference AliasはNoneが返ってきますので、これで埋まった個数を特定できます。
用が済んだらQuestをStopさせます。
サンプルスクリプト
プレイヤーの周囲にある死体を検知するQuestを作ったときの例です。
Actorを探す (papyrus)
Scriptname hpQuestCorpseScript Extends Quest
Int Function GetCorpseCount()
Alias[] kAliasList = GetAliases()
Int i
Int c
while i < kAliasList.Length
if (kAliasList[i] as ReferenceAlias).GetActorReference()
c += 1
else
return c
endif
i += 1
endwhile
return c
EndFunction
Actor Function GetClosestCorpse()
return (GetAlias(0) as ReferenceAlias).GetActorReference()
EndFunction
スペルを使う方法
プレイヤーがCloakスペルを使用する方法です。この方法のメリットは、周囲にActorが何人いようが気にせずスペルをばら撒くことができる点です。
周囲のActorにScriptをひたすら配り続ける例を説明します。
Magic Effect
3つ必要になります。
名前 | Cloak | Deliver | Entry |
役割 | Deliverスペルを周囲にばらまく | ActorにEntryスペルを配布 | Actorに持たせたいスペル |
フラグ | No Hit Event Painless Hide in UI Power Affects Magnitude | No Hit Event Painless | No Hit Event Painless |
Archtype | Cloak | Script | Script |
Casting Type | Fire and Forget | Concentration | Constant Effect |
Delivery | Self | Aimed | Self |
Script | なし | DeliverScript | EntryScript |
その他 | Assoc. ItemにDeliver Spellを指定 | Conditionに「Entry Spellを持たない」を設定 |
Spell
Magic Effectに合わせてSpellも3つ用意します。
Cloak SpellはDeliver SpellをばらまくSpellです。ゲームの中では炎のマントに使われています。炎のマントはダメージを与えるSpellをばらまいているわけです。Magnitudeで配布範囲を決めます。
Deliver SpellはCloak SpellでばらまかれるSpellです。Cast TypeがConcentrationでないとCloak SpellのAssoc. Itemに設定できません。DeliverScriptでは対象のActorにEntry Spellを持たせます。
Entry Spellは対象のActorに付与されるSpellです。
配布の仕方
PlayerがCloak SpellをCastすると周囲のActorにEntry Spellが配布されます。常に配布を続ける場合は、PlayerをQuestのReferenceAliasに入れるなどして、OnUpdateイベントを利用して定期的にCastします。
Cloak SpellのMagic EffectをConstant Effectに、SpellをAbilityにすると、PlayerにCloak Spellを持たせるだけで常時配布を続けるSpell(Ability)になります。便利に思えますが、Deliver SpellのConcentration効果がひたすら周囲のActorに着弾しつづけるため、場合によっては高負荷の原因となります。Magic EffectはFire and Forgetにして、SpellのDurationを0秒にしておけば、Castした直後に1回だけConcentration効果が着弾するだけなので、負荷を最小限に抑えることができます。
SKSEプラグインを使う方法
Papyrus Utilには周囲のActorを配列で取得する関数が用意されています。
Spell Perk Item DistributorというModはSpell、Perk、Itemなどをゲームの起動時に配布できます。このModを使って実装した例としてCold Region Behavior - Beta Testがあります。