任意のkfファイルをPickIdleで再生させる方法
ポーズMODなどでよく使う、任意のkfファイルを再生させる方法です。画像は私のバイクMODのものを使っています。
Idle Animationsにkfファイルを登録、Conditionsを満たしてPickIdle
流れとしては、「Idle Animations」(待機アニメーション)にトークンアイテムの所持を「Conditions」としてkfファイルを登録、何らかのスクリプトでそのトークンアイテムを「AddItem」して「PickIdle」させて「RemoveItem」すればOKです。
Idle Animationsにkfファイルを登録
まずCSで「Idle Animations」(待機アニメーション)にkfファイルを登録します。
「Idle Animations」は「skeleton.nif」毎に分かれています。人間やHorse、Daedroghなど、生物の種類毎にフォルダ分けされていて、それぞれに「skeleton.nif」というファイル名で骨格が存在しています。
今回は人間のkfファイルを登録すると仮定して、一番上の「Characters\_Male\IdleAnims」の下に作ります。他の生物なら該当の箇所に登録すればいいだけです。
階層的に親となるものを1つ登録
登録の仕方はどうでも機能すると思いますが、階層構造にしたほうが色々いいです。

まず「RaceMenuAnims」などと並んで1つ、そのMODで使う用に1つ登録します。私は同乗者用として「NR500PassengerMiscAnims」としました。IDは重複しなければ何でもOKです。
「アニメーショングループ」はそのMODで扱いたい部位を選択して下さい。体全体の場合は「Whole Body」か「Special Idle」で。バイクMODの場合は前者でないと上手くいきませんでした。
右上でkfファイルを登録しますが、これはあくまで親であって階層や「Conditions」などを整理するだけの存在なのでここには登録しません。「Must return a file」はよくわかりませんがチェックで。
「Conditions」は非常に重要で、この階層以下を再生させるための条件を指定します。よく使うかもしれない条件として、「GetIsID」(それのEdhitorID)や「GetSitting」(椅子や馬に座っている状態)や「GetItemCount」(アイテムの個数)や「GetQuestVariable」(クエスト変数)などがあります。
子として各々のkfファイルを1つずつ登録
親が設定できたら、次は実際に各々のkfファイルを1つ1つ登録していきます。

親と設定は同じですが、kfファイルの登録が必要になります。kfファイルは、その生物の「Skeleton.nif」があるディレクトリにある「Idleanims」ディレクトリ以下に置く必要があります。例えば、人間なら「meshes\characters\_male\idleanims」以下に置くということです。
違うディレクトリ、例えば人間の設定で「meshes\creatures\horse\idleanims」を指定しようとしてもムリなので注意。誤指定防止のためだと思いますが少し不便です。
「Conditions」には、そのkfファイルを再生させるための条件を指定します。今回はトークンアイテムを使うとして、「GetItemCount」で何らかのアイテムを指定します。詳しくは後述。ちなみに「Conditions」は右クリックから「Copy/Paste Conditions」すると楽です。
全てのkfファイルを登録できたら、次はスクリプトで実際にkfファイルを再生させます。
スクリプトでPickIdle
方法は非常に簡単で、スクリプトに以下のように書くだけです。
AddItem TokenItem 1 PickIdle RemoveItem TokenItem 1
「AddItem」でトークンアイテムが渡されてそのkfファイルの再生条件を満たし、PickIdleでゲームエンジンが実際に条件に合った「Idle Animations」を探して再生させて、最後に「RemoveItem」でトークンアイテムを消します。
このようにリファレンスを指定しないと、このスクリプトを持つアクターに実行されます。「Player.PickIdle」や「ArenaFan1.Kill」とやれば、その特定のアクターに実行されます。
ちなみに、PickIdleは連続で実行すると上手く動きません。スクリプトの「Begin GameMode」などで毎フレーム監視しているような場合は、変数などで連続実行を回避する必要があります。バイクMODの場合こんな感じ↓
If RunningSI != 0 AddItem NR500Idle 1 PickIdle RemoveItem NR500Idle 1 Set RunningSI to 0 EndIf
あと、現在再生中の「Idle Animations」を解除する方法は詳しくは試してはいませんが、「Player.Playgroup Idle 1」のようにするか、「Cycle Type」が「CYCLE_CLAMP」のリセット用の「SpecialIdle」を「PickIdle」させればOKだと思います。
おまけ1:Conditionsをどう設定するか
今回は「Idle Animations」の「Conditions」としてトークンアイテムを指定しましたが、他にもいくつかの方法があります。
- kfファイル毎にトークンアイテムを用意
- トークンアイテム数が膨大になりますが、固有のIDを付けることによってわかりやすくなる利点があります。
- 1つのトークンアイテムで、kfファイルによって個数を変える
- 「1個の時、2個の時、3個…」と指定することで、トークンアイテムが1つだけで済んでスッキリします。
- クエスト変数やグローバル変数を利用
- 変数が増えてしまいますが、他から参照しやすいという利点があります。
- Factionを利用
- アイテムも変数も増やさずに実現できます。だけど私は試したことがありません。
有名なCTAddPoseの場合は、プレイヤーがMessageBoxで選んだボタン2つをクエスト変数「major」と「minor」として記憶して使っているようです。
おまけ2:トークンアイテムについて
トークンアイテム方式を利用する場合、アクターなどは専用のトークンアイテムを使うべきですが、例えばHorseのようなインベントリにアイテムを所持しないものの場合は、Appleのような普通のものをトークンアイテムとして使ってもOKです。