忍者ブログ

方向音痴のSkyrim

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

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

×

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

フォロワー拡張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

コメント

※スパム対策のため、コメント内やその他の項目に「http://」や「https://」があると投稿できません。全角で入れていただくか、URLであることを明記して以降のアドレスのみ入れていただくかでお願いします。 For stopping spam comments, this form doesn't accept the following words, "http://" and "https://".

Author

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

ブログ内検索