2017年11月15日

CKで既存オブジェクトを非表示にする方法

スカイリムには数多くの物(オブジェクト)が配置されています。MOD作成時に既存のオブジェクトを非表示にする方法を書いてみました。

重要なのは「Enable Parent」の設定です。


1. ブリーズホームを見てみよう

上の画像はCKのレンダーウィンドウにブリーズホームを表示したところです。ゲーム内でブリーズホームを購入した直後はガランとしていてゴミしかありませんが、改装することで様々な家具や食べ物が配置されます。
この改装前後のオブジェクトは、データとしてすべて最初からその場に存在しています

オブジェクトが「存在」することと、それを「表示」することとは別の事柄です。この存在しているオブジェクトを表示させるかどうかを設定項目やスクリプトで決めているのです。


2. オブジェクトが「存在」することとは

「存在」は原則として esm/esp ファイルに従う

ブリーズホームの改装前後のオブジェクトは、「Skyrim.esm」や「Hearthfire.esm」によって配置されています。もしブリーズホーム改装MODを入れれば「改装MOD名.esp」で上書きされることになります。
これらの esm/esp ファイルで作られた世界がCKのレンダーウィンドウで見ている配置そのもので、改装前後のオブジェクトが重なって「存在」しています。


3. オブジェクトを「表示」することとは

「表示/非表示」の設定

すべてのオブジェクトは「Enable (表示)」か「Disable (非表示)」かの二者択一のフラグが設定されています。初期状態は esm/esp ファイルによって指定されており、オブジェクトをCKで単純に配置した場合は「Enable (表示)」の状態でゲーム内に出現します。
もし初期状態で「Disable (非表示)」にしておきたいときは「Initially Disabled」のチェックを入れます。

こうすることで通常は非表示になります。
既存オブジェクトに「Initially Disabled」のチェックを入れれば非表示となり、何らかのスクリプトで「Enable」にすることで初めて表示させることができます。ただし例外があるので後述します。

スクリプトやコンソールからの制御

スクリプトでは該当のオブジェクトを指定して「Enable」と「Disable」を制御することができます。コンソールでも該当のオブジェクトをクリックして「Enable」または「Disable」と打つことで制御できます。

ここまでは、とても単純な話に聞こえます。がしかし、実はこれ以外に強力な設定項目が存在しますので、次にご紹介します。


4.「Enable/Disable」に対する強力な制御

Enable Parent

スクリプトでもコンソールコマンドでも対抗できない、「Enable/Disable」に関する強力な制御項目があります。それが「Enable Parent」です。

上図中央の「Select Reference in Render Window」ボタンを押すと、Parent(親)とするオブジェクトを指定することができます。親を指定してあるオブジェクト(子)は、親の「Enable/Disable」の状態に追従します。親が Enable なら、子も必ず Enable になります。

この設定は非常に強い制御力を持っています。例えば親が Enable 状態のとき、その親を持つ子に対してコンソールから「Disable」と指定しても完全に無視され、子は Enable のままになります。
さらに、子の「Initially Disabled」の設定は無意味になります。子が表示されるかどうかは、常に親の状態に従います。

既存オブジェクトを非表示にする

非常に強い制御力を持っていることを利用して、既存のオブジェクトを強制的に非表示にすることができます。この方法は必ず非表示にしておきたいオブジェクトがある場合に便利で、「ニューゲーム推奨」という制限を付けずに家MOD等を作成することができます。

方法は至って簡単です。

  1. 親として新規にオブジェクトを配置し、「Initially Disabled」のチェックを入れる。
  2. 非表示にしたい既存オブジェクトの「Enable Parent」に1の新規オブジェクトを指定する。

1で配置する新規オブジェクトを「Enable」にすることはありませんので、何を配置しても良いでしょう。個人的には「XMarker」を良く使っています。
親を配置した際は、Reference Editor ID を空欄のままにせず、わかりやすい名前を入れておきましょう。IDが空欄だと「Select Reference in Render Window」ボタンで選択できないことがあります。

既存オブジェクトは子となりますので、親が「Disable」である以上、ゲーム内では表示されなくなります。

家の改装への応用

この「Enable Parent」をうまく設定すれば、家の改装具合によってオブジェクトの「表示/非表示」を制御することが可能です。

ブリーズホームでは子供部屋と錬金術実験室を相互に改装し直すことができますが、それぞれの部屋に対応する親が家の外に「XMarker」として置かれており、改装の度にその親を「Enable」にしたり「Disable」にしたりしています。

子供部屋にしたときにだけ表示するオブジェクトを新規追加したいときは、子供部屋に対応する「WhiterunPlayerHouseChildBedroom」を親に指定しておけば良いわけです。

また、親になっているオブジェクトは、さらに上の親(おばあちゃん)を持つこともできます。
例えばハースファイアの家では、棚が親で周囲の物品群が子になっていたりします。この場合も新規オブジェクトをおばあちゃんとして「Initially Disabled」で配置し、棚の「Enable Parent」にそのおばあちゃんを指定してやれば、棚と物品群もろとも非表示にすることができます。

ちなみに、とても制御力の強いこの親子関係ですが、親の変更には柔軟です。子の「Enable Parent」を変更すれば、いとも簡単に親を変更でき、新しい親に従います。


5. オブジェクトの「存在」を消してしまう方法

「存在」を消してしまう Deleted フラグと MarkForDelete コマンド

※この方法は 強く非推奨 です。方法の1つとしてご紹介します。

オブジェクトの「存在」そのものを消してしまう方法です。

1つはespファイルの「Deleted」のフラグです。MOD作成時にCKで既存オブジェクトをDelキーで消すとそうなります。TES5Editでは「Deleted」のフラグが付きます。

そしてもう1つはコンソールコマンドの「MarkForDelete」です。ゲーム内でオブジェクトをコンソール画面でクリックしてコマンドを打つと、オブジェクトを消去したことがセーブデータに書き込まれます。

これらの方法で消したオブジェクトは、そのセーブデータでは存在しないものとして扱うことになります。
これによる弊害はかなり大きく、もし他のMODでその消してしまったオブジェクトを参照している場合には確実に不具合が起こります。参照しようにも無くなってしまっていますから当然です。
さらに困ったことには、その消してしまったオブジェクトは絶対に元に戻せません。そのセーブデータでは復活させることは不可能です。このような不可逆的な消去はできるだけ避けるべきです。


6. まとめ

まとめることも無いんですがポイントは以下の3点でした。

  1. 表示するかどうかは「Enable/Disable」で決まる。
  2. 「Initially Disabled」で初期状態を非表示にできる。
  3. 「Enable Parent」の制御は強力で、子は親に必ず従う。

これに関連して、ニューゲームしないと「移動」ができない既存オブジェクトのお話もあったんですが、今回は見送りました。CKで移動したつもりがテストプレイすると移動できていないオブジェクトがあるよというものです。
結論から言うと、そういったオブジェクトはニューゲームするしか移動手段は無いので、どうしてもという場合は今回ご紹介した方法で「非表示」にしてしまって、同様のオブジェクトを新規に配置すると良いでしょう。


0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。