2013/10/17

スカイリム室内装飾ガイドの続きの話

スカイリムの世界では、プレイヤーが自分の持ち物(インベントリ)からアイテムを捨てた場合、そのアイテムの座標は実際の位置とは異なる、ちょっと特殊な状態にあります。
そういった特殊な状態のアイテムは、ロード画面を挟んだ後、そのアイテムのある場所(セル)に改めてプレイヤーが侵入する時に初めて実際の位置と座標が一致する通常の状態になります。
そのため自宅などの飾りつけをする際は、捨てたアイテムをロード前にいくら動かしても無駄です。
そのアイテムが武器、もしくは最初からそのセル内に存在している場合でない限り、大半のアイテムはロード画面を挟むと、アイテムを捨てた直後の位置に配置が戻ってしまいます。
アイテムを捨てたら、まずは外に出て、ロード画面を挟んで戻ってくる。
それがスカイリム室内装飾のお約束です。

ところでこの不思議な現象についてなんですが、少し補足することがありまして、実はコンソールコマンドを使って直接、プレイヤーのインベントリからアイテムをドロップさせた場合は、ちゃんと実際の位置と座標が連動する通常の状態でセル内に出現するんですよね。
「drop」コマンドだけではなく、アイテムを新規生成する「PlaceAtMe」コマンドでも同様です。
またコンソールコマンドではなく、スクリプトの処理でアイテムを出現させる場合も、最初から座標が連動する状態になってます。

…ですから、たとえばプレイヤーがアイテムを置いた場所に別の何か別のオブジェクトを配置するようなModを作る場合は、プレイヤーが「アイテム」を捨てた瞬間に、そのアイテムとそっくりな別の「アイテム」を「PlaceAtMe」ですげ替えるという小技を使うとうまくいきます。
プレイヤーが捨てたアイテムをそのまま、他のオブジェクトを配置する目印として使ってしまうと、実際の座標と見た目の位置が違うので、正確な位置指定ができませんのでね。

ちなみに「アイテムを捨てた瞬間」というのは、そのアイテムがセル内にロードされる瞬間に稼動する「Event OnLoad()」のタイミングや、もしくはアイテムがインベントリから別の場所に移動した瞬間の「Event OnContainerChanged()」のタイミングで察知できますので、それらのイベント時に捨てたアイテムとそっくりさんな別アイテムをPlaceAtMeで新規配置してやればよいです。
スクリプトによる配置は瞬間的に行われますので、形状が同じ物であればアイテムを捨てた瞬間に別の物にすげ替えられた、ということに気づく人はいないでしょう。
もちろん、捨てた瞬間に稼動するようなスクリプトをアイテムに直接つけた場合は、PlaceAtMeですげ替えるアイテムの方は最初に捨てるアイテムとはBaseObjectが異なる別個の物である必要があります。
ややこしいですが、プレイヤーのインベントリから捨てる専用のアイテム(a)と、位置を指定するための配置用アイテム(b)の2種が別オブジェクトとして必要、ということですね。


ところで最近気がついたのですが、実は「PlaceAtMe」等のスクリプト、もしくはコンソールコマンドでアイテムを配置していても、そのアイテムの座標が実際の位置と連動しない特殊な状態になってしまう…という状況があります。
それは、そのアイテムと同じnifファイルを使っているアイテムが、既に座標連動しない特殊な状態でセル内に存在している場合…です。
つまり、PlaceAtMe等で配置するよりも先に、プレイヤーがそのアイテム、もしくはそのアイテムと同じnifファイルを使用している別アイテムをセル内に捨ててしまっていると、コンソールコマンドやスクリプトで配置されたアイテムもプレイヤーが捨てたアイテム同じように座標が連動しない状態で配置されてしまうのです。……地味に困ります、これ。
同じ形状ですが、左の銀の皿にのっているのが「イスグラモルのスープスプーン」、
右の皿は単なる「フォーク」です。

スプーンなのに、なにゆえフォークなのかはさておき……PlaceAtMeで配置したスープスプーンも
先にプレイヤーによってフォークが捨ててあると、座標は連動しない状態で生成されてしまいます。
セル内のアイテムの座標の挙動については、過去に色々実験をしたことがありまして、まあ、詳しくは過去記事(【実験編】【考察編】)を直接見ていただくのが良いのですが、あまりにもクソ長いので簡単にまとめますと、プレイヤーが捨てたアイテムでも、同じセル内に既に座標確定している同種のアイテムがある場合は、そいつが一種のテンプレートのような役目を果たすのか、ロード画面を挟まなくても最初から座標と見た目上の位置が連動している通常の状態になるんですよね。
…で、過去の実験ではそこまで思い至らなかったんですが、実はそのテンプレート的な存在になりうるのは、座標確定している通常の状態のものだけではなかった…ようなんです。
実はプレイヤーが捨てた座標連動しない特殊な状態のアイテムも、セル内に同種のアイテムがいない場合は「テンプレ」となって、後に続く弟たちの挙動を決めてしまう影響力があったんですね。
しかも参照しているnifファイルが同一のアイテムは、たとえBaseObjectが別の異なるオブジェクトでも、最初に呼び出された物にならって、座標連動する、しないという特性を帯びてしまうようなのです。
うーむ、これっていったいどういう原理なんでしょうねえ……
まあ、仕様ですと言われれば「そうですか」と思うしかないわけなんですけども。
しかしこれだけのアイテムをいっぺんにバラまいても画面がカクついたりとかしないのはスゴイです。
そのための仕様です……と言われたら、納得せざるをえない。

ちなみにこれはどんなアイテムが水に浮くのか調べていた時のスクリーンショット。
決して自宅のゴミを不法投棄しにきたわけではありません。
そういえば、まったく同一のnifファイルでも、格納されている場所(パス)が違えば、別のメッシュデータと認識してくれるようでして、座標連動する、しないの特性は引き継がれることはありませんでした。
ですから上記の薪をキャンプファイヤーに置き換えるModなどで、アイテムの外観にゲームオリジナルのバニラのnifファイルを使う場合は、念のためそのMod専用のフォルダ内にnifファイルをコピーして参照場所を変えて使用した方が良いかもしれません。
ゲーム本体のメッシュの場所をそのまま指定していると、同じnifファイルを使った他のアイテムが、Modの配置用アイテムの座標を狂わせてしまう可能性がなきにしもあらず……ですので。