忍者ブログ

方向音痴のSkyrim

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

フォロワー拡張Modの自作02【AI Package作成】

クエストの骨組みができたので、今度はフォロワー達の通常行動の要である追従AI Packageを自作します。

どんな行動をとってもらいたいかというと、こんな感じ。
  1. プレイヤーの近くにいる時は、付近で自由にくつろぐ(Sandboxその1)
  2. プレイヤーが遠くに離れたら、急いでついてくる(Follow)
  3. 「ここで待て」したら、近辺で自由にくつろぐ(Sandboxその2)

デフォルトではこのような行動をとってくれるAI Package Templeteは多分ないので、一から作ることになります。



Object Windowより、Character > Package。Newで新規作成します。
PackageのIDを決めて、Package Templeteは"None"を選択。
すると、暗転していたProcedure Treeが編集可能になります。



Procedure Treeの一番上にある「Sequence」を、右欄より「Stacked」に変更します。
これは、子要素を上から順番に見ていき、最初に実行条件が合った子要素を実行して終了するBranchです。



まずは2番のプレイヤーを追いかける行動を作ります。
「Procedure: Travel」を選択し、右欄のTypeから「Follow」を選択。



「Procedure: Travel」を「Procedure: Follow」に変更した直後。
Followを動かすのに必要な設定値のリストが「Selected Procedure」に表示され、足りない設定値の項目が左上欄の「Public Package Data」に追加されました。追加されたといっても、必要最低限の追加です。



「Public Package Data」へ追加された項目を、分かりやすいように修正。
まずは"target"となっていた項目を"Player"という名前に変えます。



"MinRadius"だけじゃあれなので、"MaxRadius"も欲しい。
「Public Package Data」欄の中で右クリックしてNew。
新しい項目が追加されるので、Nameを"MaxRadius"にして、Typeを"Float"にします。



「Selected Procedure」に戻って、MaxRadiusのところに先ほど作った項目を設定します。
これで必要最低限の設定がそろいました。フォロワーは"Player"をターゲットにして、"MaxRadius"より遠くにいると走って追いつこうとし、MaxとMinの距離の間では歩調を緩めてついてきてくれます。"MinRadius"よりターゲットに近づくと、立ち止まって距離が離れるのを待ちます。



「Public Package Data」欄に戻って、"Player"、"MinRadius"、"MaxRadius"に値を入力します。
……とその前に、Travelで使用されていた項目は、もういらないので消します。



"Player"の設定。
プレイヤーを選択してOKします。



追従のみのAIができました。
Followには、まだ何も設定がなされていない項目値(GoToLeader...とか)が残っています。このまま放置しておくと、デフォルトの設定が適用されるようです。場合によってはそれで困ることもあるので、やはり「Public Package Data」で具体的な値を与えたほうがいいでしょう。
3つとも値のTypeがBoolなので、「True」と「False」、2つの値を「Public Package Data」に作って設定を共有させることにします。



「Public Package Data」に"Always True"と"Always False"というその名の通りの項目を新規作成して、「Selected Procedure」にてそれぞれの項目を当てはめました。
"RideHorseIfPossible"にはTrueを設定したので、乗れそうな馬があったら乗って移動してくれるでしょう。多分。

これで2番の行動が完成です。
次は1番の行動「Sandboxその1」を作ります。



親となる「Stacked」Branchを選択して、New Procedure。



Choose Procedureウィンドウが開きます。
Sandboxを選択し、隣の「Use existing data If available」にチェックが入っているのを確認してOK。



Procedure: Sandbox」が追加されます。これもこれで、かなり多くの設定値を必要とします。
Boolタイプの項目はたくさんあるので、ひとつずつ項目を作るのが面倒。Followの所で作った"Always True/False"を適宜当てはめることにします。
LocationにはSingleRefタイプの"Player"が勝手に当てはめられていますが、これにはちゃんと項目を作ってあげます。



「Public Package Data」にて"Sandbox Location"と"Energy"を新しく作り、Sandoboxの各設定に項目を当てはめました。
プレイヤーの半径800以内で、食べたり座ったりの行動をとります。ひとつひとつの行動に費やす時間は"Energy"にて設定。他のAI Packageをみると、ほとんど全部が50に設定されているようです。長すぎず短すぎずといったところでしょうか。値を小さくすると落ち着きのない人になります。(←そういうわけでもないらしいです。値を変えても顕著な差は実感できませんでした)
プレイヤーに追従時の行動なので、いくらくつろぐといっても、寝るのだけはFalseにしておきました。

これで1番の行動も完成。



3番目の行動を作る前に、Procedure Treeの構造を変えます。
親要素の「Stacked」Branchの上で右クリックして、新しいBranchを追加します。
追加したら、「Procedure: Follow」の上で右クリックしてCopy。



新しく作った「Stacked」Branchを親要素として、Followをペーストします。
同様にして、Sandboxもコピーしてペースト。



新しい「Stacked」BranchにFollowとSandboxが子要素として加わっているのを確認したら、コピー元は消しておきます。



各要素は、ドラッグ&ドロップで並び順を変更できます。
SandboxをFollowの上に移動させましょうか。



SandboxとFollowの親要素である「Stacked」Branchを選択し、下欄の「Item Conditions」にてこのBranchが実行される条件を決めます。
これは待機命令を受けていない場合の行動なので、ActorValueのWaitingForPlayerが1ではない時に当たります。



WaitingForPlayerが1じゃない時は基本的に0なので、"== 0"と設定してもいいかもしれません。



次に「Procedure: Sandbox」を選択して、これにも条件を設定します。プレイヤーとの距離が800以内の時、Sandboxが実行されるように。
まずは「GetDistance」を選びます。
それから、[TARGET]の上にある(Use Pack Data)にチェックを入れます。これで「Public Package Data」内の項目をターゲットとして選択できるようになります。



こんな風に、Condition Fuctionで使える「Public Package Data」内の項目が列挙されて選べます。GetDistanceに使えるのはSingleRefタイプの"Player"だけなので、選択の余地はないのですが。
ここももちろん、直接PlayerのReferenceを指定しても構いません。しかしこうして適宜Package内のデータを使うことで、条件設定をフレキシブルなものにすることができます。



ようやく3番目の行動を作る準備ができました。
3番目もSandboxを使いますが、「ここで待て」されている時の行動なので、新しいLocationが必要になります。
「Public Package Data」にて"Wait Location"を追加。あまり遠くに行かれると困るので、本人の周囲半径600でくつろいでもらうことにしました。



「Procedure Tree」でSandboxをコピーし、一番上の「Stacked」Branchにペースト。



一番下に「Procedure: Sandbox」が貼り付けられます。
Item Conditionsは消して、「Selected Procedure」にてLocationを"Wait Location"に変更。あと、寝るのもOKにしてあげます。



最後に、Flagsタブにて必要なものにチェックを入れ、そうでないものからはチェックをはずします。
これで目的のAI Packageができました。



ProcedureTreeの構造はこんな感じになります。注釈がついていないProcedureにはなんの条件づけもしていないので、自分より上位のProcedureやBranchが条件判定でFalseになったとき、必ず実行されるようになっています。
なんだか自分の近くでウロウロするSandboxが主体になっているような怠け者AIにも見えますが、セラーナみたいにプレイヤーの近くをふらふらしながら追従してくるAIです。

ちなみに「プレイヤーの近くにいる時」のSandoboxですが、これのLocation"Sandbox Location"をこんな感じに設定したりもできます。


ConditionsでもPackage Dataを使って距離を測ったりしましたが、"Sandbox Location"の設定もこうしてやると、「プレイヤーに追従するSandbox&Follow」から「"Player"に設定されたターゲットを追従するSandbox&Follow」に大変身します。
例えば"Player"のターゲットをカジートキャラバンのマドランにかえてやるだけで、このAIをつけられたフォロワーはマドランのお供みたいに振舞うことができます。

ProcedureTreeや各Procedureの設定項目に間違いがないかもう一度よく確認したら、AI Packageは完成です。
次はフォロワー用のFactionやらGlobal Valueやらを作ります。

前へ | 次へ
PR

Author

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

ブログ内検索

最新コメント

[07/16 chomechome-X]
[07/16 ブレトン魔術師]
[07/15 amo]
[07/10 初心者シセロ]
[07/10 ソウルケルンのエレンウェン]