2010年5月17日月曜日

XMarker と Creature 考察

ながらく XMarker を戦艦の中と外、転送装置に利用してきたのだけど、今回、シャトルと戦艦のMODの分離を行ったので、ついでに以前から気になっていた XMarker を Creature に 置き換えた。

CSWiki によると XMarker を、WorldSpace と Interior Cell を行き来するような場合に利用するのは推奨されないとある。

たしかに、XMarker は、CTDは少ないものの安定しなかった。
セーブとロードを繰り返したぐらいでは、位置情報は失われないようで、いったん Oblivion を終了し、ロードしたような場合でも大丈夫な模様。

ロードして、どっかのセルを行き来すると、とたんに、おかしくなった。

いったんおかしくなると、再び位置情報をMoveTo,GetPos,SetPos で更新してやっても、きちんと動作しないようだ。

XY座標に関しては、アップデートされているようだが、Z座標が指定した通りにはならないようで、安全な地面に自動で補正されるような、そういう処理がなされているように考えられる。

また、戦艦本体は Visible When Distant が有効になっているのだが、Playerのいない別のセルに移動させたつもりでも、disableしないと遠くのほうに見えていたりする。

で。
CSWiki にあるとおり、Creature を XMarker 代わりに使えという事だったので、そのようにしてみた。

(ちなみに、Rat を使うのがどうも、気分が良くないので、WillOtheWispを複製して Makrer代わりにした。適当なnifで新規作成してみたが、CTDしたので、Creatureは、いろいろと他にも情報が必要なんでしょう・・・たぶん。)

Creature は Creature で問題がある。
まず、Enabled にすると、見えてしまうのは、しょうがないとしても、指定した直近のパスグリッド上に移動しているようで、細かな指定が無視されているような印象を受ける(調査中)

なので、 Disabled のまま MoveTo やGetPos,SetPos を行うようにしたのだが、どうも戦艦のinterior cell と worldspace で行き来すると CTD となる。

Enabled のまま移動させても、どうも所定の場所に現れないことも有り、DisableとEnable でいったんはさんでやら無いといけないような予感もする。

スクリプトの変更が結構な量なので、原因が他にあるかもしれないが、Actor が関わるとどうも落ちる気がする。
GGC を導入した状態で、戦艦のinterior cell と worldspace を転送装置利用で2度往復するとCTD というのが前にもあった。
それと似た様な状況。

戦艦に入るには、主に戦艦の後方に配置されたハッチ(ドア)と、トランスポート(転送装置利用)の2つの方法があるのだが、CTDするのはトランスポートの場合のみ。
(他にも4箇所あるが未テスト)

ちなみにハッチのほうは、試作の時から、実験的に Interior cell に配置された Door が、外から中に入る場合の XMarkerHeading代わりに利用されている。
(中から外に出るときは、XMarker。今は Creatureに置き換わった)

Door を一度、他のDoorにリンクし、その上で DoorのMarkerの位置と向きを設定し、リンクを解除すると、以後、Doorが XMarkerHeading 代わりに利用できるようになり、MoveToMarkerで、動作するようになるようなのだが、今までの統計的に見て、一度も CTD が無く、とても安定している。
(コードのレベルでどうなっているのかは追っていないので全く不明ですが)

このDoor MarkerはGGCを導入しても、今回の XMarkerをCreatureに置き換えた場合でも、一度も CTD せずに機能している。

なので、interior cell に関しては、この方法で置き換えてしまったほうが良いのかどうなのか今後の状況を見て判断したい所。
(ただし、Door Marker は動かす方法が分からないので、外には利用できないので、それが悩める所です)

(追記: OBSEのSetDoorTeleportでDoorMarkerも移動できる模様)

Doorのスクリプトは、OnActivateで動いていて、転送装置利用は、OnEquipとGamemodeで動作している。
この辺の違いもあると思うので現在調査中。

追伸
いつもながら、書いてから直るという。
頭の中が整理されるからだろうか。
そういえば、disable enableやら負荷のかかる処理は、別フレームで行うと良いというのを思い出したので、Creature の Markerを diable MoveTo GetPos SetPos enable  してから、return で返して、後で disable MoveTo を行うと CTD がなくなった。
残るは視覚的な問題で。
enable と disable のタイミングの調整をするか妥協すればなんとかなりそうな予感だ。

0 件のコメント:

コメントを投稿