忍者ブログ

方向音痴のSkyrim

PCゲーム「Skyrim」の雑多なCKいじり日記

Combat Override作成03【仲間の検索】

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

Combat Override作成03【仲間の検索】


プレイヤーへの回復行動ができたので、今度は他のフォロワーも回復できるようProcedure Treeを拡張します。
とりあえず仲間を適当に見繕いました。老夫婦戦士とオーク女性です。華がないどころではない枯れたパーティーですが、これらのフォロワー達が「CurrentFollowerFaction」に加入していることが今回のポイント。

一般的に雇用中のフォロワーはModを使用していたとしても、このファクションに加入していることが多いです。Modで追加されたNPCを含め、フォロワーとなる不特定多数のNPCを探すには、このファクションが良い目印になります。逆に、Scriptを使わずAI Packageのみで彼らを検索する場合、ファクションくらいしか効果的に探せる方法が分からなかったともいいます……。
やっかいなことに、「CurrentFollowerFaction」に加入することなくフォロワーになる例外的NPCもいます。セラーナさんなど専用の雇用クエストを持つNPCが挙げられますが、少数派と思われるので彼らについては諦めることにしました。

【フォロワーの検索】


前回作ったAI PackageのProcedure Treeをこんな感じで拡張しました。

「Pablic Package Data」に新しく3つの項目を追加。既存の"SelfLocation"についてはRadiusを3000に修正し、前より広めに取りました。自分の周りにいる他フォロワーを検索する範囲設定と兼用させるためです。
Procedure Treeにはフォロワー回復用の「Procedure:UseMagic」を新たに追加し、さらにその前段階の行動として、「Procedure:Find」を行うようにしました。設定は上図のとおりです。検索の対象は「CurrentFollowerFaction」。これによって、このファクションに加入しているNPCを見つけることができます。加えて「Procedure:Find」実行中に武器を収めないよう、Flag Overridesの「Weapon Drawn」にチェックを入れています。
いつ、どんな条件で検索を行うかは色々なやり方があるので、ここで上げたProcedure Treeは一例に過ぎません。より効果的なTree構造もあると思います。

Procedure:Find」は他のAI Packageでもよく使われているProcedureです。
SearchLocationとTargetSelectorにて探す場所と対象を指定すると、検索結果をObjectListに列挙してくれます。またRandamizeListをTrueにしておくと、検索結果をランダムに並べ替えてくれます。
このObjectListに収められたデータは、他のProcedureでTarget指定して使うことができます。Procedureによっては、ObjectListにあるデータを最初から順番にすべて参照して使用できるものもありますが、Listの一番目のデータしか使わないものもあります。だいたい後者のProcedureが多く、UseMagicもおそらくListの一番目のデータしか使えないProcedureと思われます。
そのためこのProcedure Treeだと、回復できるのはフォロワー1人だけということになります。



「Procedure:Find」と一緒に「Procedure:Wait」をSimultaneous Branchにて実行しています。Findは指定されたものが見つかるまで終了することができません。他フォロワーを連れていない場合や、ヒーラーの周囲3000Radiusに他フォロワーがいなかった場合、Findの実行を中断するために必要です。時間は0.5秒で十分です。見つかるものが見つかれば、Findは一瞬で終わるようです。



プレイヤー回復動作の下に追加したフォロワー回復動作用の「Procedure:UseMagic」の設定。
TargetにはFindで探した結果である"FoundFollower"のデータを使用できます。
実行条件にも、"FoundFollower"をRun Onに設定して体力が7割以下のConditionを設定しています。死亡していないこともあわせてチェック。

最後に、ふたつの「Procedure:Magic」にはSuccess Completes Packageのチェックを入れておきました。回復動作を行ったら一度AI Packageを終了し、再度最初からProcedureTreeを繰り返してもらおうという魂胆です。これによってFindの検索結果である"FoundFollower"を定期的に更新できないかな、と考えていたのですが、結果はいまいち。一度戦闘が始まると、最初のFindで見つけたフォロワーの回復しか行わず、他のフォロワーを回復するところは見られませんでした。

【動作確認】

前回同様カーススパイアーにて。
ちゃんと他のフォロワーを回復してくれてます。でも戦闘中はこのフォロワーとプレイヤーの二人だけしか回復してくれませんでした。
Findしなおしても"FoundFollower"がこちらの思惑通り更新されていないのか、偶然前回と同じフォロワーが選ばれただけなのか分かりません。戦闘が一度収束し、再度始まれば別のフォロワーが回復対象に選ばれることはありました。
また、Findによってヒーラー自身が検索対象にあがるという現象は見られませんでした。ヒーラーも「CurrentFollowerFaction」に加入しているフォロワーですから、どうなるか心配だったんです。よかった。
おそらく検索範囲をヒーラー中心にしているためかと思われますが、SearchOwnInventoryを"False"に設定しているのも地味に効いているかも。
(↑バニラのテンプレート「Acquire」や「Eat」において、SearchOwnInventoryは、自分のインベントリ内を検索対象に加えるかどうかの設定に使われています。もしかしたらSearchOwnInventoryは、自分のインベントリ内というより自分自身まるごとを検索対象から除外する機能があるのかもしれません。いずれにしても今回ヒーラー自身が検索対象にならなかった理由が不明確すぎるので、取り消し線をつけました)

しかしやることが増えたせいか、前回よりすばやい回復ができなくなっている気がします。体力が8割以下のときに回復するよう条件を変えたほうがいいかな。弓持ちから魔法で戦うように変えるのもありか。弓を収めて魔法を構える動作で1.5秒くらいロスしてる気がします。



うー、でもフォロワー1人にしか対応できないってのもなんだかなぁ。
プレイヤーを回復してくれるだけでもありがたいのですが。


 
そこで"FoundFollower2"という新しいObjectListを用意してみました。
2回Findを行い、"FoundFollower"と"FoundFollower2"、2つのObjectListに見つけたフォロワーを放り込みます。運がよければそれぞれのListの1番目に別のフォロワーが並ぶことになるはず。
"FoundFollower2"に対するUseMagicも増やして、動作確認してみました。
結果はすばらしいの一言。運任せではありますが、回復できる他フォロワーが2人に増えました。プレイヤーとあわせて回復対象が3人。これだけでヒーラーが相当優秀に見えるようになります。

プロテクト属性で守られている他フォロワーの回復はおまけ程度の演出かもしれませんが、Scriptを使わなくてもここまでできるのであれば、個人的に大満足です。



気づいたらヒーラーが襲われていた図。

このProcedure Treeの問題点はいくつかあります。
UseMagic中に敵に殴られたりしてキャストのタイミングを逃すと、魔法を構えたまま固まってしまうのが一番の大問題。そうなると他の回復対象に対するUseMagicが実行可能状態になるか、もしくは戦闘が終わるまでそのままです。Procedureにはこんな風に、邪魔が入ると動作が止まってしまう繊細なものがあります。UseWeaponも同じ傾向を持つので、使うときは注意が必要。
敵に狙われないよう守ってあげるか、Procedure Treeのさらなる改善を目指すか、どちらかになります。

前へ | 次へ
PR

コメント

1. Faction魔法によるFindの効率化

自作Modの“ヒーラーの挙動の見直し”と道化エルフの“操作能力の作成を”行っている最中に、とても興味深い設定が行えることに気付きました。現在、「執政」の検証に専念しているため…記事に書き記すのは後回しになってしまいそうなので、早速UNIさんにお知らせしておこうと思った次第です!

以前にUNIさんから、「ヒーラー」が対象を検索し、目的の人物にキャストするためには、「一つ一つActorを直に指定する」もしくは『Faction』で探し出す他ない、ということを教えていただきました。私もその後、『収集系フォロワー』の記事で、「Find:Procedure」関連の試行錯誤をし、対象物をConditionsの「IsInList」で絞り込むという方法に辿り着きました。

しかし、上記の2つの方法は検索の幅が広すぎる分、Findで取得したListが更新が上手く行かずに同じActorを狙い続けてしまったり、範囲内に存在する全ての対象を「Acquire」などして除外しない限り、結局は下位のProcedureに移行できないという問題がネックになっていました。ところが…!MagicEffectを作成している際に、『一時的にActorにFactionを与え、一定時間後にFactionを消去する』という画期的なScriptを発見しました!!

PapyrusScriptsの『VoiceCharmFactionScript』です。このScriptはEffectのStart/Finish時に、Propertiesの「CharmFaction」に指定したFactionをAdd/Removeする処理を一括して行ってくれるようです。あらかじめ任意の“自作Faction(空)”を用意し、Propertiesに設定しておき、Conditionsで絞った“目的の人物にのみ全体魔法などで効果と一緒にFactionを届けて”おきます。いわゆる、ヒーリングの前の“事前準備や目印を付ける”といった目的です。その上で、AIPackageのTargetSelectorから自作したFactionに属している人物をFindで検索・選択的に探し出して、UseMagicやUseShoutで目印の付いた対象だけにキャストさせます。

Factionを搭載したSpellをDurationタイプにしておけば、時間経過でEffectと共にFactionは消失するため、Findしても見つからなかった場合(=魔法の効果が切れた時)は、再び魔法をかけ直したり、自然にヒーリング以外の行動に移行・専念させることが可能です。ヒーラーを作る時には、対象を限定するためにProcedureの順番にかなり注意と工夫が必要になりますが、この辺の制約が若干ゆるめられ、AI製作の自由度がゆとりをもたらすような気がします。

自作のFactionは、メンバーを追加しない空のFaction(目印)として作成します。メンバーの絞り込みは、Spellの効果が出るか出ないかの条件で決めます。そのため…既存のActorに、変更は一切加わりません。新規FactionとEffectの組み合わせを複数用意すれば、「CompanionsFaction」という一括りのメンバーではなく、「アシスを除く、同胞団のメンバー」や「同胞団の女性限定」というように、余分な対象を事前に省くことができます。この方法を上手く活用できれば、「ヒーラーの硬直問題に対する安定化、ヒーリング対象の更新」などが図れそうです。元々、バニラのデータに存在しているScriptなので、そのまま使ってしまえばScriptフリーになるかもしれません。(←本人も良く分からない部分です。汗)

最大のメリットとして、ヒーラー自身のキャラによって認識が異なる、「味方」や「敵」といった検索対象を、「Actors:Any」や「CreatureFaction」などでざっくり集めてから、ProcedureのConditionsで念入りに絞り込むという製作上の手間が、かなり軽減されます。余分な対象が含まれる項目に依存せず、MagicEffectやSpellのConditionsで設定した、“効果を受けた対象のみを狙える”という利点があります。例えば、「男性のエルフだけ」、「〇〇の装備を着ている者」、「動物以外」など、従来のFactionだけではなかなか限定するのに苦労した細かい対象を、比較的簡単に狙えるようになりました。

もちろん、回復目的だけでなく「膝を着いている者」だけをあっという間に探し出して、遠くから弓で射るという…ゲスい攻撃にも応用できます。その他にも、「プレイヤー用の“目印魔法”として作り変えれば、フォロワーに回復してほしい対象に、プレイヤーが自ら好きなタイミングで目印(Faction)を付けたり、目印を消したりできる」。「Findの数だけ、他の検索結果に阻害されずに対象を取得できる」。なども良い点だと思います。

長くなってしまいましたが、短くまとめますと…“対象の絞り込み時に、本来AIのProcedureで条件設定を行うところを、逆にSpell側で予め全部行ってしまう”という、作成上の『Conditions設定の序列入れ替え』を目的とした方法です。

なかなか面白い製作に使えそうな予感がしていて、テストプレイやブログ更新を忘れて色々と実験しておりました(^^;) まだ、使えるのか使えないのかハッキリ分かっていませんが、だいぶ前に頓挫していた、リアの『攻撃的回復』の改善には役立ちそうです。

UNIさんご意見を是非、伺いたいです。全くダメかもしれませんが…画期的な方法に進化できればいいなぁと思っています!

Re:Faction魔法によるFindの効率化

ファル粕さん、すごく画期的なアイデアだと思います!
確かに「Actor:Any」で探した後、さらにProcedureのConditionsで相手を見分けるのは、効率が悪くなってしまいますね。
魔法で一時的なFactionを与えてNPCにマーキングできると、相当賢く動けるAIを作れそうです。既存のScriptを使って簡単にできるのも嬉しいです! 既存のScriptを変更するMODはほとんどないと思うので、競合の心配もなさそうですね。

処理的には重くなってしまうかもしれませんが、複数のFaction魔法で周りのNPCに随時適切なFactionを割りつければ、刻々変わる戦況にも素早く対応できるのではと、ファル粕さんのアイデアを読んで思いました。瀕死になった時アクティブになるFaction魔法をつけておけば最優先で回復できるので、優秀なヒーラーが誕生しそうです。
プレイヤーが魔法を使ってフォロワーにターゲット指定できるのも、アイデア次第で遊び方が広がりますね。随所に隠密待機させたフォロワーに、ターゲット指定して一斉攻撃させられたら待ち伏せ攻撃っぽくできて面白いです。
これ全部、Scriptを自前で用意しなくてもできるかと思うと、かなりわくわくします。リアさんもこれで瀕死の味方にどすどす回復矢を撃つことになるのでしょうか。絵的にはかなり怖いですが、これほどありがたい援護射撃はないと思います(^^; ファル粕さんの記事、楽しみにしています! 私もFaction魔法を試してみようと思います。

※「VoiceCharmFactionScript」の他に「VoiceAllegianceFactionScript」というScriptも見つけました。未使用のScriptみたいですが、処理内容はFactionをつけはずしするだけのシンプルなものです(「VoiceCharmFactionScript」と違ってStopCombatの処理がないです)。ただこちらを使ってしまうと、Scriptフリーっぽくはならないかも。既存Scriptとはいえ未使用の物を使用してるので、もしかしたらセーブデータにScriptの記録が追加されるかもしれないです。
すでにゲーム内で使用されている既存Scriptを流用するのであれば、ほとんどScriptフリーに近い扱いができると思うのですが…。どのタイミングでScriptがセーブデータに記録されるのか、難しいですね。ちらっと自前のScriptで「Quest用Script」、「魔法用Script」、「Dialogue用Script」を出し入れして確認してみましたが、いまひとつ確信が持てる結果は得られませんでした(汗)

2. Faction魔法の期待と課題

UNIさんにご相談をさせていただけて、本当に良かったです(^0^)/
ちょっと分からない部分が多すぎて、けれども同時に…「これはいいものだろうな…」という雰囲気も感じていたので、改めて取り組んでいけそうな気がしてきました。

呪文タイプのヒーラーの作成は、UNIさんが製作されたTempleteMod:『SLPackages』によって、製作上の不安要素はもう無くなったと言えるくらい、私でも優れたヒーラーフォロワーが生み出せるようになりました!!『Faction魔法』は、SLPのベースを元に…もっと尖った人物や特殊な役割を担った“補助系のキャラ”を実装したい際に、組み込める方法の一つになれば嬉しいです!

>瀕死になった時アクティブになるFaction魔法
そうですよね~!自分の環境では、ヒーラーが回復を優先してほしい人とは別の人ばかりを治癒している現象が起こることがあります。何故か…私の作成したシャウトヒーラー「スレン=ドラ」は、体力の低い人は回復しようとするのに、膝を着いた人を滅多に回復してくれません。一番大事なのは、死にかけてる人だと思うのですが…(汗)

>随所に隠密待機させたフォロワーに、ターゲット指定して一斉攻撃
こっ、こんな活用法があるなんて全く思いつきませんでした!!戦略や作戦を考えてプレイするのが好きなので、かなり魅力的なアイディアです!手強いボスを倒すときにフォロワーとプレイヤーの連携、フォロワー同士の連携が見られるかもしれないですね!UNIさんの独自の感性によって、もっと色々な製作方法が誕生しそうで、すごく参考になります(^^)

自分が試した中で得られた、わずかな成果を書かせていただきます。

埋もれていたリアの『弓ヒーラー』のデータを引っ張り出してきて、シャウトタイプのFaction魔法でマーキングした対象を狙うように設定してみたところ…以前の「弓を引き絞ったまま硬直する現象」を、かなり抑えることができるようになりました! しかし、弓を使って「UseWeapon」で狙う方法は、硬直した場合に対象が“敵”なら下位の「HoldPosition」で自然に射ようとして硬直解除してくれるのですが、自主的に“味方”を「HoldPosition」で撃つことはまず無いので…“硬直率0%は達成できていない”のが現状です。体感で、20~30%くらいです……(^^;)

おそらく、呪文タイプのヒーラーはキャスト動作が素早い分、弓ヒーラーより安定していそうですが、“Effectの切れ目”に運悪く動作が行えないと同じような状況になりかねないです。でも、SpellやMagicEffect側のConditionsの方を上手く設定できれば、“100%硬直しない時にしかUseMagic/UseWeaponの動作に移行しない”という感じで…バグが起こりやすい状況や行動になるのを、未然に完封してしまうことも、作成するSpellの“Conditions捌きの技量”によっては可能なのではないかと思っております。(技量が足りていないのが悲しい…汗)

それから、まだ自信は無いのですが…UNIさんのこちらの記事:【仲間の検索】と“Faction魔法”をハイブリッドにすることでも、硬直防止率の向上が期待できそうです。最初に思いついた方法では、効果が切れた際に「いったん開始した、狙った対象に撃つ/放つ動作」を完了させられなければ、結局は硬直してしまいますが、それとは反対に「ターゲットをActors:Anyなどの大きな括りとして検索しておき、ProcedureTree側でマーカーとなるFactionを条件にして絞り込む」という真逆の方法も良さそうです。ヒーリング用のBranchやProcedureのConditionsに目印Factionで入った段階で、タイミング悪くEffectが切れてFactionを失った対象に対しても、Targetが「Actors:Any」ならばキャストすることが可能だからです。こちらの方法は、従来法の色が強いです。(主にConditionsの簡略化の役割)

文章に起こしてみると…自分でも割と理路整然で、確立している方法のように思えてきますが…実際には予想とは全然違った状況になることが多いので、私自身…この辺の複雑さや概要を全て把握できていない状態で、苦戦しております…σ(^_^;)

追伸
>いまひとつ確信が持てる結果は得られませんでした(汗)
Scriptの情報、すごくありがたいです!!私は英語が殆ど読めないので、CKの解説ブログやCKwikiをWeb翻訳機能で訳していますが、それでもあまり書いてあることの意味が取れず、いつも困っています。UNIさんに頼りきりですね…。Scriptフリーまで望むのは、欲張りすぎたかもしれません…(^▽^;)

FactionScriptには、「Charm」と「Allegiance」という2種類があったのですね!しかも、“StopCombat”の有無で微妙に違ってくるなんて…。一瞬、「Faction魔法を当てられた人物の敵意がリセットされて、別のターゲットを狙う」ようになったりしていたのには…ちゃんと理由があったのですね。以前に、ファルログの「新・補助系フォロワー」への挑戦⑧の記事で、「鎮静」や「恐怖」などの『状態異常』について検証したことがあったのですが、「ProtectedとEssentialにチェックが付いているNPCは、敵意がリセットされるとゲージが満タンになってしまう」というチート的な仕様があった気がします。プレイヤーの体力を減らしてヒーリングを試していたので…仲間を回復させるAIの場合に、今のままでは「ヒーラーが治癒する前に勝手に全回復してしまう…(困惑)」などという、バランスブレイカー的な問題があるかもしれません…(涙)

スリのAIでも、“敵意の所在”に問題がありましたが、こちらにも実装するまでに解決すべき事が多くありそうです。「Allegiance」の方が使えると良いですよね~…(ToT)
導入しているModのEffectやEnchant、Abilityを受けている状態で、Modを取り外してしまうと…セーブデータに残ってしまい、そのMod由来の効果がSpellIDなどが存在しないために、コンソールからもRemoveできなくなるという話を耳にしたことがあるので、アンインストール時には「少なくともFaction魔法のEffectの効果が切れた状態でセーブする」という、使用者の注意は必要かもしれないです。バニラのScriptなので…大きなバグの原因にならなければ、思い切って使ってしまおうかな…と考えています。(〃∇〃) ノ

Re:Faction魔法の期待と課題

ファル粕さんにはいつも面白いアイデアをたくさん教えていただけて、本当に嬉しいです!
CK wikiはNexusmodsに日本語訳がありますよ~。私もすごくお世話になっています。
http://www.nexusmods.com/skyrim/mods/15919/?

「随所に隠密待機させたフォロワーに、ターゲット指定して一斉攻撃」
これはお膳立てが大変かもしれないと、後になって思いました。どちらかというとプレイヤーは常に待ち伏せされる側ですから(^^;
難しいかもしれませんが囮役AIをつけたフォロワーを使ったりすると、さらに面白そうです。

従来のFactionで対象を探す方法は確実に見つけておきたい相手には使いやすいので、Faction魔法とあわせると挙動が安定するかもしれませんね。 ヒーラーの硬直問題にしても、別Procedureを実行させればとりあえず硬直が解けるので、Faction魔法で状況に応じて優先度高の行動がちょくちょく発生してくれればくれるほど復帰までの時間が短くなりそうです。
試しにFaction魔法で膝をついた仲間用Factionの検索とUseMagicの実行をSLFollowersのダリウスに適用してみたのですが、硬直する確率は変わらないか、体感として少なくなっている気がしました。Findで見つける瞬間にFaction魔法がかかっていればいいので、効果時間の切れ目も心配するほどの影響はなさそうです。とはいえ、もう少し時間をかけて様子を見ないとなんとも言えませんが……。

「Allegiance」のScriptは内容も単純だし、使ってしまっても問題はないかと思います。探してみると、デフォルトで用意されているScriptは使いまわしができそうなのが結構あります。こういったものを活用すると、自分でScriptを用意しなくてもできることが飛躍的に広がりそうです。
※スパム対策のため、コメント内やその他の項目に「http://」や「https://」があると投稿できません。全角で入れていただくか、URLであることを明記して以降のアドレスのみ入れていただくかでお願いします。 For stopping spam comments, this form doesn't accept the following words, "http://" and "https://".

Author

UNI
Skyrimで遊ぶのも、CKで改造するのも好きなファンタジー好きです。
戦闘苦手で難易度は基本EASY、慣れてもNORMAL程度。 アンデッド恐怖症なので、ノルド遺跡探索が辛い……。

ブログ内検索