Welcome! Wikis are websites that everyone can build together. It's easy!

スイッチと罠

CS Help (My First Dungeon)では読み取れない事柄について。
 
Getting StartedのTraps(罠)の項では「親設定」をする事で罠が作動するかのように書かれていますが
恐ろしく誤解を招く記述だと思います。(俺だけカモシレナイけど)

本:1 プレイヤーが操作できるモノ(拳骨マークが出る)はActivatorと呼ばれる分類になっています。
対照的なモノとしては
Static(そこにあるだけ…家や壁や階段など)があります。
本:2 Activatorにはスクリプトが添付されており、一般的にはプレイヤーがそれに行為した時、一定の
動作をするように書かれています。スイッチや罠が作動するのは、そのスクリプトによるのです。
親設定は本質的には無関係だった!


て、「スイッチを操作すると明かりが灯る」をやってみます。
まず、Object WindowからWorldObjects>Activatorと辿って、一覧から適当なものを選ぶ。
一旦レンダーウインドウにドラッグドロップして形を見ても良いし、見覚えのあるセルからCTRL+C
でコピーしてきても良いです。

重要:Object Windowの一覧からなら、右クリックして<Edit>を選び、必ずIDを書き換え
新規のオブジェクトとして登録する事。レンダーウインドウに落としたのなら、ダブルクリックで
出た窓(Referenceとタイトルのある小窓)の「Edit Base」ボタンを押してIDを書き換えます。

理由:Activatorにはスクリプトが添付されている(例外もある)が、そのスクリプトは同形(同じID)の
Activatorに共通のものなので、新規登録しないでスクリプトを書き換えてしまうと、そのスイッチ
が他の場所で使用されていた場合、ゲームがハマる恐れがあります。

補足:IDにも2種類あって(これがややこしい)レンダーウインドウでダブルクリックして出てくる小窓の
Reference EditorID:  というのは、そのモノだけの固有名詞。(ex.山田太郎)
一方、Object WindowのEditorIDや「Edit Base」ボタンで進んだ先のIDは一般名詞(ex.人間)
どっちもEditorIDですが、違うものなんです。(…名前変えろよ、と思いますね…)

え置きが長くなりましたが・・・とりあえず、新規に登録したActivatorの「Script」をNONEに設定して
OKします。(後でこれから書くスクリプトを添付しましょう)
レンダーウインドウにドラッグドロップして設置しておいて、スイッチはひとまずOK.

に明かりを持ってきます。こちらもWorldObjects>Lightと辿って、IDを書き換えて新規登録します。
(WorldObjects>ActivatorやWorldObjects>StaticにもLightはありますが、
 WOrldObjectst直下のLight項目の方から選んでください。)
スイッチ同様に、こちらもレンダーウインドウにD&Dで設置します。
そこでさらに、その明かりをダブルクリック(またはCell Viewウインドウなら右クリック>Edit)でReference
小窓を開き、
練習の為に、Reference EditorID: に固有名詞(ここではTestLightとします)をつけます。
そして下段に6つ並んでいるチェックボックスからPersistent Referenceにチェック
を入れます。この意味は、「この物品をスクリプトの対象にするぞ」という宣言です。
(チェック入れてないとスクリプト書いた時点で警告が出ます。)

そして更に、今回はスイッチを入れるまで消えていて欲しいのでInitially Disabledにもチェックを入れて
おきます。コチラの方は、HELPにもあるように「通常は存在しないモードにする」宣言です。

はスクリプトを書きましょう。

scriptName zzzTest <----scriptNameと書かずにscn と略しても大丈夫です。zzzTestこれがスクリプトの名前です。

short c     <----- このスクリプトでこれからCという変数を使うよ、という宣言です。整数の場合Short、
ID(モノの名前)の場合はrefです。

Begin onActivate   <----- 「これが添付されたモノがアクティベート(操作)された時に一回だけ走るスクリプトだよ。」
という意味です。

IF C == 0
TestLight.Enable
set c to 1
Else
TestLight.Disable
set c to 0
EndIf

End

細かいハナシは長くなるので、置いといて、TestLight.Enableという風に、固有名詞を名指しして
Enable(出現)Disable(消去)と書いています。「人間.(ドット)消せ」じゃなくて「山田太郎.消せ」と書く
わけです。このスクリプトを添付したスイッチを押す度にTestLightの明かりが点いたり消えたりするはずです。

しかしこれでは照明ひとつづつに新しいスクリプトを書くハメに!
(TestLightの為にスクリプト書いて、TestLight02の為にまた書いて…小規模なMODならいいんですが数が多いと泣ける。)

そこで、やっぱり親設定。ようやく、その理由に辿り着くわけでした。

スクリプトの関数に 
GetParentRef
(そのスクリプトが添付されたモノが親設定で関連づけられたモノ、のID(名前)を取り出す)
と、いうのがあります。
コレを使うと、上記のスクリプトは

scn zzzTest

Short c
Ref Koredayo  ←--- ID(名前)を代入する変数としてKoredayoを(勝手に)宣言します。

Begin onActivate

set Koredayo to GetParentRef <----- 親設定してあるモノの名前を変数Koredayoに代入します

IF C == 0
 Koredayo.Enable
(以下略)

このようにすれば、スイッチで出たり消えたりする系のカラクリは全部このスクリプトでまかなえます。楽ですね。
同じ動作をするスイッチは最初に書いたように新規登録する必要もありません。

ダンジョンでよくお目にかかる、スイッチでないと開かないドアは、GetParentRefと、GetSelf(それ自身の
名前)を使っています。スイッチの方に「A(GetSelf)がB(GetParentRef)をける」というスクリプトを
添付しておいて、ドアの方には「プレイヤー(や生き物)以外がアクセスした時だけ開け」というスクリプトを添付しているのです。

実際には親子オブジェクト間のENABLE/DISABLEは連動しており、子オブジェクトが消えると親オブジェクトも消えてしまう仕様のため、この記事に書かれたスイッチによる灯りのON/OFFは実現できません。


Latest page update: made by Anonymous, Jun 29 2007, 11:30 AM EDT (about this update About This Update Posted Anonymously Edited anonymously

1 word added

view changes

- complete history)
Keyword tags: None (edit keyword tags)
More Info: links to this page

Anonymous  (Get credit for your thread)


Started By Thread Subject Replies Last Post
Anonymous nothing 0 Jul 3 2007, 8:57 PM EDT by Anonymous
Thread started: Jul 3 2007, 8:57 PM EDT  Watch
>実際には親子オブジェクト間のENABLE/DISABLEは連動しており、子オブジェクトが消えると親オブジェクトも消えてしまう仕様のため、
>この記事に書かれたスイッチによる灯りのON/OFFは実現できません。

この赤字での書き方では混乱を招くと思われます。
親オブジェクトが消えたので、関連付けられている子オブジェクトも消えてしまったというのが正しいかと。
一応確認してみましたが、子オブジェクトを削除しても親オブジェクトは消えませんでした。
Do you find this valuable?    
Keyword tags: None (edit keyword tags)