忍者ブログ

方向音痴のSkyrim

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

スカイリムの掃除人03【Procedure Treeの組立て】


CK wiki - Package Template -

今回は掃除人専用のAIパッケージを自作します。
・複数の場所をめぐらせたい
・目的地への道中もアイテムを見つけたら拾ってほしい
・探すアイテムの種類を複数設定したい
この希望に沿うパッケージは、デフォルトでは存在しないようです。
唯一のアイテム取得系パッケージは「Acquire」というパッケージテンプレート。
こちらのテンプレートを参考に、Procedure Treeなるものを自分で組み立ててみます。



「Package Tamplate」でAcquireを選択した後、Noneを選択しなおします。
すると暗転していたProcedure Treeが編集可能になります。
Procedure Treeにある「Procedure:Find」などのProcedureは、AIパッケージを構成する行動の最小単位。これが組み合わさってパッケージができているらしいです。
このProcedure Treeを読み解くと、まず最初に「Procedure:Travel」で目的地に行き、「Procedure:Find」と「Procedure:Wander」を同時に行い、目的のアイテムをウロウロしながら探します。そして最後に「Procedure:Acquire」でアイテムを取得して、パッケージ全体の行動が終了します。

各Procedureには、動作に必要なパラメータがいくつか存在します。
「Procedure:Find」を選択すると、上図のように必要とするパラメータがTree欄の右側に表示されます。ここのパラメータは、「Public Package Data」欄で具体的に決定されます。



実際に編集していきます。
まずはPublic Package Dataの各項目を、新しいパッケージ用にリネーム。”Search Loc”→”Location 1”、”Target Criteria”→”Target Criteria 1”に変更しています。
Procedure Treeも、必要のない「Procedure:Wander」等をDeleteして整理。各ProcedureやBranch(後述)はドラッグして位置を変更できます。

ある程度整理できたら、最上位の「Sequence」の上で右クリックして「New Branch」を選択。



一番下に「Stacked」というBranch(枝)が追加されます。
これを選択して、右欄Selected Branchから目的に沿うものを選びます。同じものが二つずつ並んでますが、どっちか一つ選べばいいかな……。

・Random:子要素をランダムにひとつ選んで実行。子要素が終了すればBranchも終了。
・Sequence:子要素を上から順番に全て実行。最後の子要素が終了すればBranchも終了。
・Simultaneous:子要素を全て同時に実行。どれかひとつの子要素が終了すればBranchも終了。
・Stacked:子要素を上からチェックしていき、最初に実行条件が合ったものを実行して終了

ここでは「Simultaneous」を選びます。



新しく追加した「Simultaneous」の上で右クリックして「New Procedure」 。
小さなWindowが開くので、「Find」を選択。
右の「Use existing data if available」は、追加するProcedureに対して、既存のパラメータを当てはめるか(当てはめられなかったら新規追加)、それとも新しくパラメータを追加するか、を決める項目。
パラメータは後からでも追加変更できるので、ここではチェックを入れて既存のパラメータを使うことにします。でないとPurocedureを追加するたびにパラメータが増えて、「Public Package Data」の欄がごちゃごちゃになってしまいます。



既存のProcedureを並べ替えて、こんな感じにしてみました。
目的地へ移動しながらアイテムを探し、取得する行動を全て同時に行います「Procedure:Find」を二つ並べて置いているのは、検索アイテムの種類を2つに増やすため。
さて、まともに機能するか、大変不安な構造です。

Procedureには明確な「終了」があるものと、「リピートする」もしくは「終了がない」ものがあるそうです。
Procedure:Find」は「ターゲットが見つかれば終了」できるけど、「ターゲットが見つからなければ終了できない」タイプのものらしく、「Procedure:Wait」と同時実行するなどして、「Waitの設定時間が過ぎたらBranchごと終了」としてやったほうがいいんだとか。
このへんは各Procedureの動作をよく理解して、慣れていくしかなさそうです。

今回の場合は「Travel」が目的地に着いたら終了してくれるので、「Wait」の代わりに使えるかなと淡い希望を持っておきます。実際にはテストプレイを繰り返して動作を確認するよりほかありません。



次に、各Procedureに必要なパラメータを割り当てていきます。
「Procedure:Travel」を選択。右欄でそれぞれのパラメータに、Public Package Dataで設定されている項目を選びます。

パラメータが足りないとエラーが出るそうです。Procedureが動作するために必ず設定しなくてはいけないものもあれば、必ずしも必要でないらしいものもあり、これは既存のPackage Templeteを見るなどして確認できます。
全てのパラメータに項目を割り当ててあげるのが一番確実かもしれません。


 
「Procedure:Find」についても、割り当てを行います。
「SearchLocation」に”Location 1”が入っていますが、これはTravelの目的地でもあるので、今回の希望に合いません。
移動の最中にアイテムを見つけてほしいので、自分を中心とした範囲を「SearchLocation」に設定したいです。
それから二つ目の「Procedure:Find」のために、「TargetSelector」がもうひとつ欲しい。


 
Public Package Data欄の中で右クリックして「New」。
新しい項目を追加します。一覧の一番下に追加されます。




追加した項目に分かりやすい名前と、パラメータのTypeを入力。
名前は「SearchLocation(only edit Radius)」にして、Locationを「Near Self」に設定します。Radiusも「512」入れておきます。移動しながら物を見つけるにはちょうどいい範囲でしょう。
入力したら、項目を上のほうへ並べ替えておきます。

同様にして、「TargetSelector」用の項目も追加します。


 
Procedure Treeに戻って、パラメータに先ほど作った項目を割り当てます。



二つ目の「Procedure:Find」はこんな感じ。
"FindResults ( ObjectList )" には、検索したアイテムの一覧が入ります。探し当てるごとに追加登録されるみたいなので(別記事で解釈を修正)、二つの「Procedure:Find」で共有して大丈夫そう。その他のパラメータも共有でOK。



最後に「Procedure:Acquire」のパラメータを確認。
パラメータ「Target」には、「Procedure:Find」で設定された"FindResults"が設定されています。このListの中から「NumToAcquire」で設定された回数だけ、取得行動を行うようです。
「Success Completes Package」というチェックボックスがありますが、これは外しておきます。続きの行動をつくるので、ここでPackageを終わられると困ります。

これでようやく移動中のみの行動を作ることができました。軽くテストプレイして動作を確認します。まあなんか大丈夫っぽい、という曖昧な結果が得られました。
同じ手順で目的地に着いた後の行動も追加します。
 
 
  
組みあがったProcedure Tree。
移動中(青矢印)、目的地(赤矢印)のそれぞれの行動です。
目的地では、新たに「Procedure:Wait」を追加。必要な項目もPublic Package Dataに加えました。それぞれにタイマーを設定して、その時間を過ぎたらBranchを終了してくれるようにしています。
最上位の「Sequence」には、「Repeat When Complete」のチェックをいれています。



Public Package Dataの一覧。
いくつかの項目には、汎用性の高い値を入力しておきました。

再びテストプレイを行い、思惑通りの行動をとってくれるかどうか確認して、Public Package Dataの値を調整してみたり、Procedure Treeの組み直しを行います。

結果は、
「目的地までたどり着く前に立ち止まっちゃうこともあるけど、取得行動はほぼ随時行ってくれる」でした。
……とりあえず今回はこれで妥協します。

これを複数の目的地で行うようにするには、さらに「Location 2、3...」を追加し、Procedure Treeにて今回作った基本形をまるっとCopy、好きな数だけPaste。各「Travel」の目的地のパラメータに適切な項目を割り当てて、他項目は設定を共有させます。


ここの「Sequence」をCopyして、最上位の「Sequence」を選択して好きな回数Paste。

 
長~いTreeになりますが、閉じてやれば構造が分かりやすくなります。
基本構造が5つ分。5ヶ所を順番に巡ります。
このままの設定だと、必ず5ヶ所ぶんの目的地を回りますが、フラグとなる項目をPublic Package Dataに追加し、各「Sequence」にてItem Condition欄でフラグの状態を確認させれば、3ヶ所だけなど自由に目的地の数を減らせます。
 
最後にこのPackageをTempleteにする準備を整えます。



と言っても、一番右上の「Package Type」からTempleteを選択するだけです。



Public Package Dataの項目のうち、変更されたくないもの、変更されるとまずいものを選んで、「Public」のチェックをはずします。「Public」のフラグが「N」と表示されます。
既存のTenmpeteでも、”Find Results ( ObjectList )”は基本的に「N」にされています。
「N」になっている項目は、このTempleteを使用してAI Packageを作成する際、Public Package Data欄に表示されなくなります。

必要であれば、一度OKボタンを押して再度データを開き、「Flags」タブや「Conditions」タブを設定します。
「Flags」についてはテンプレートの設定が初期値になるのかどうか定かではありませんでしたが、「Conditions」についてはどうもテンプレートの設定が優先されるようです。自作テンプレートを使用したAI Packageの挙動がおかしかったので確かめてみたところ、テンプレート側で設定した「Conditions」が影響していました。AI Package側の「Conditions」ではこれが見えないため、原因を突き止めるのに苦労しました。テンプレートで「Conditions」を設定する場合は、この点に気をつける必要があるかもしれません。

Templete化はこれで完了。
あとは各地の掃除人達にこのテンプレートを使って、個々のAI Packageを作ってあげるだけ。

……たいへん長い道のりでした。
Procedure Treeっていじればいじるほどドツボにはまりますが、うまく動いてくれた時はうれしいものですね。
大抵は「うまく動いているように見える」だけで、ぬか喜びも多いんですが。
このProcedureTreeは、のちに大幅な改善を行っています。PackageTempleteの作り方はともかく、作っているProcedureTreeそのものは良くない例です。この時点で、各ProcedureとBranchの理解があまりに不十分でした。こちらをご覧ください。


前へ | 次へ
PR

Author

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

ブログ内検索

最新コメント

[10/20 放浪者]
[10/10 斥候]
[10/03 放浪者]
[10/02 放浪者]
[09/29 竜崎まりん]