Bethesda Tutorial Papyrus Events and Properties/ja
このページは日本語です。 リンク先ページの編集上の訂正または翻訳が必要です。 |
Language: | English • français • 日本語 • polski |
---|
Bethesda Tutorial Papyrus イベントとプロパティ
Bethesda Tutorial Papyrus イベントとプロパティ | |
---|---|
スクリプティング シリーズ、4章 | |
チュートリアルハブに戻る | |
前のチュートリアル | 次のチュートリアル |
概要[edit | edit source]
このチュートリアルはPapyrus EventとPropertyの説明をしています。
このチャプターで学べること:
- イベントの基礎とトリガー
- プロパティの基礎と作成・使用方法
- イベントの伝達とPapyrusとの相互作用
- プロパティのアクション実行とパピリストとの相互作用
このチュートリアルはLevel Design Tutorials(en)でされたサンプルダンジョンであるLokir's Tombのイベントを元に作成されています。
あなたがもしそのチュートリアルが終わっていない場合、完成したプラグインをダウンロードすることができます。download a plugin with the finished level
ただしこのチュートリアルはそれらの知識することができます。ただしこのチュートリアルはそれらの知識(基本的なエディタ使用法・Ambushes・Activation・Activate Parentsなどの知識)があることを前提として作成されているので注意してください。
計画[edit | edit source]
現在プレイヤーがLokir's Tombの最後の部屋に入る時、ボスのドラウグラーは彼の石棺から起き上がり攻撃をしてくるはずです。
この戦闘をユニークなスクリプト要素を使用することでよりエキサイティングに演出してみましょう。
具体的にはボスが墓から現れる時に死んでいたドラウグラーを(特殊エフェクトを活用しながら)2体生き返らせてみましょう。
Stageの設定[edit | edit source]
最初に復活させたいドラウグラーを設定しましょう。 エディターでLokirsTombセルを開き、洞窟(Cave)エリアにフォーカスをあわせてください。 そこがボスの部屋です。 Object Windowで、Actors>Actor か all で "LvlDraugrMissileMale" と "LvlDraugrWarlockMale"を探してください。 そしてそれらをドラッグ&ドロップでボスの部屋に配置してください。
それらのドラウグラーはデフォルトでは、ゲーム上で生きた状態でスタートします(一応生きてるということにします)。 私たちは今彼らを死んだ状態にしておきたいと思っています。それぞれをダブルクリックしてStarts Deadをチェックすれば死んだ状態でスタートします (当該ドラウグラーのリファレンスを編集するのはCell Viewウィンドウからそのリストを右クリックして「Edit」を選択する方法もあるのは以前のチュートリアルで説明したとおりです)。
Save your plugin and run it in-game to check things out so far.
あなたのプラグインをセーブして、ここまでの設定が上手く出来ているか確かめてください。
2体のドラウグラーがボスの部屋の床に死んで横たわっているならば成功です。それではCKにもどってそれを蘇生させましょう。
イベント計画[edit | edit source]
イベントについて[edit | edit source]
私たちは今、ボスが墓から現れた時に、それらのドラウグラーを復活させたいと思っています。これはEventに対応して欲しいということです。
"Events" はアクションまたは状態が変化した場合、それをゲームがPapyrusに通知するものです。
何百もの異なるイベントが存在しています。
例えば:
- オブジェクトまたはキャラクターの相互作用(レバーを操作したり、ドアを開けたり、体から奪ったりなど)。
- ピッキング, 装備, 装備解除, or アイテムを捨てるなど。
- Locationの出入り。
- 戦闘の開始や離脱, 攻撃の当たり, 死亡など。
- その他にも多くのイベントがあります。
簡単に言えば、もしあなたがゲームで何か反応を望む場合、「Event」はそれをする方法だということです。
the Activation Eventのトリガー[edit | edit source]
理解できるかわかりませんが、私たちのサンプルは既にPapyrusに送られたEventを使用します。 これはボスが彼の石棺を出た時がわかるというです。 あなたがAmbushes Tutorialを完了しているならば、 ボスはActivate Parentとして「Trigger Volume(トリガーボリューム)」を持っていることを思い出してください。 プレイヤーが「Trigger Volume」に足を踏み入れた時、そのトリガーはボスをアクティベートすることで、彼は起き上がります。
既存のスクリプトがここでプレイされますが、以下はそれによって起こるシステムの概要です: - プレイヤーはトリガーに接触し、これに対応して onTriggerEnter イベントが起きます
- トリガー上のスクリプトはこれに対応しActivate Eventを送ります
- ドラウグラーボスはトリガーのアクティベートChildとなっているので、そのActivationを受けます
- ドラウグラーのボス上のスクリプトは彼の墓から這い出ることによって、そのActivationに応じます
私たちは2体の死んでいるドラウグラーにActivate Eventを送るための幾つかのトリガーを使用していきます。
ドラウグラーのそれぞれに設定すること:
- ドラウグラーをダブルクリックしてプロパティウィンドウを開きます。
- Activate Parentsタブを選択します。
- そこにある空のリスト上を右クリックしてNewを選択します。すると「Activate Ref Selection」ウィンドウが出現します。
- 'Select Reference in Render Window' をクリック
- マウスカーソルが十字に変わるので、その「Trigger Volume」上をダブルクリックすることでそれを指定します。
これで、それら両方のドラウグラーは、プレイヤーがそのトリガーに触れた時「Activate Event」を受け取れるようになりました。 ただ私たちはまだ実際に何かできるようにしたわけでありません。 次はそのEventに応じるスクリプトを作成していきましょう。
蘇生のスクリプト[edit | edit source]
初期設定[edit | edit source]
それではスクリプトを作成しはじめましょう。 スクリプト作成に使用するテキストエディタを開いてください(私たちはNotepad++とSublime Text)テキストエディタ用のプラグインを用意しています)。 そして"LokirsDraugrResurrection.psc"と名づけた新しいファイルを作成してください。
そして以下のスクリプトを作成してください:
scriptName LokirsDraugrResurrection extends Actor
{Resurrects the two dead Draugr in Lokir's Tomb.}
次にonActivate Eventについて聞くための指示を書きましょう。ActivationはプレイヤーやNPCがそのオブジェクトに「アクティベート」または「Use(使う)」した時に起こります。 今回の場合、Ambush Trigger上のスクリプトがそのActivationを送ります。
scriptName LokirsDraugrResurrection extends Actor
{Resurrects the two dead Draugr in Lokir's Tomb.}
Event OnActivate(ObjectReference akActionRef)
; Cast a Reanimate spell on the Draugr
EndEvent
呪文を唱える[edit | edit source]
次にActivation Eventが受け取られた時、そのドラウグラー上でReanimate(蘇生)呪文を唱えるようにしましょう。 これをするには"Property"を作成する必要があります。 今回の場合、私たちが使用するそのSpellTypeのPropertyです。これはCKで特別の呪文を使用することを許可します。
以前の古いスクリプト言語("legacy")からの著しい変化があります。 Papyrusはあなたが操作したいオブジェクトのEditor ID上でそれを書く事ができません。 あなたはProperty(プロパティ)を使用しなければなりません。これはより柔軟性があり、再利用できるスクリプトを許容します。 なぜならスクリプトの各インスタンスはその Property のための異なる値を持つ事ができるからです。 これらについての詳細を知りたい場合、variables in Papyrusを参照ください
Spell Propertyを以下のように「宣言」しましょう:
scriptName LokirsDraugrResurrection extends Actor
{Resurrects the two dead Draugr in Lokir's Tomb.}
Spell property reanimateSpell auto
EVENT OnActivate(ObjectReference akActionRef)
; Cast a Reanimate spell on the Draugr
EndEVENT
- Spell - これはそのPropertyのtypeを示します。これはPapyrusに使用するためのSpellを提供します。
- property - これは 予約語 です。新しいproperty を予想させるためにPapyrusに伝えるものです。
- reanimateSpell - これは変数です。ゲーム内でPapyrusは私がそのpropertyを参照するときはいつもその呪文を使用するでしょう。
- auto - 別の 予約語です。 - それはその変数のため自動で「Get」と「Set」関数を生成するためPapyrusに言います。この詳細については心配しないでください。通常これは重要ではありません。
- ; ... - セミコロンはPapyrusの注釈文字です。これを使用してあなたの作成したスクリプトについてのメモ書きをしておいてください。セミコロンの後の文章はゲーム上では完全に無視されるので、何でも書く事ができます
We've defined a spell, but it isn't doing anything yet. Spell properites can use the Cast function, これで呪文を定義しましたが、まだ何をするかを指図していません。Spell PropertyはCast関数で使用することができます。
onActivate Eventの中に以下の新しいラインを入れてください:
scriptName LokirsDraugrResurrection extends Actor
{Resurrects the two dead Draugr in Lokir's Tomb.}
Spell property reanimateSpell Auto
EVENT OnActivate(ObjectReference akActionRef)
; Cast a Reanimate spell on the Draugr
reanimateSpell.Cast(Self, Self)
EndEVENT
多くの関数のように、私たちはそれに何をしたら良いか知らせるために、1つかそれ以上の"引数(arguments)"を使用します。 Cast関数は「ソース」と「ターゲット」の引数を必要とします。 今回の場合、ドラウグラーはそれ自身にその呪文を唱える必要があります。その場合、予約語の"Self"が役に立ちます。 その両方の引数を通すことでPapyrusはそのスクリプトがアタッチされているのと同じ(実体)オブジェクトを参照したいことを自動的に知る事ができます。 "Self"は私たちが復活させるドラウグラーのための新しいPropertyを作成するのと同じです。
スクリプトをセーブ・コンパイルしてCKに戻ってください。
スクリプトをつける[edit | edit source]
エディターから戻って、ドラウグラーの1つをダブルクリックしてそのプロパティウィンドウを開いてください。 そしてその"Script"タブに行って下さい("End"キーを利用して一番右端のタブにジャンプすることができます)。
作成したスクリプトをアタッチしましょう:
- Addクリック.
- 次に出現したAdd script...ウィンドウで、作成したスクリプトの名前"LokirsDraugrResurrection"を入力してください.
- ドラウグラーにそれを追加するため、そのスクリプト上をダブルクリックしてください.
これでこのリファレンスにスクリプトをアタッチしましたが、まだCKに何の呪文を唱えるか教えていません。これをするために「dunReanimateSelf」を使用します。 特に今回のような場面に好都合な呪文を「唱えたふりをする」ことができるものです。
- Scripts タブでLokirsDraugrResurrectionを選択します。
- Propertiesをクリック
- リストには reanimateSpellPropertyだけが表示されているはずです。
- そのreanimateSpellを選択し、Edit Valueをクリック。
- 注意:このリストは有効なフォーム(今回の場合Spell)だけ表示させます
- dunReanimateSelfを選択して、OKボタンを押します。
もう片方のドラウグラーにも同じ手順で呪文を使えるようにしてください。 それが完成したらプラグインをセーブしてゲームでテストしてみてください。
蘇生呪文のデバッグ[edit | edit source]
一見したところ問題なく動いているように見えます。 しかし、あなたがそのままプレーを続けたならば、そのドラウグラーがActivate Eventを受け取る時ならいつでもそれが起こってしまう事に気づいたかもしれません。 これはプレイヤーが死体から戦利品を取るときも含まれています。これは私たちが意図したものではありません。この予期しないバグはあるロジックを使用することで解決可能です。
これを修正する方法は実はたくさんあります。その中には制御変数(control variable)を使用することで一度だけその復活呪文を起こす方法などがあります。 またプレイヤーからのアクティベーションを無視するスクリプトを作成する方法もありますが、その方法だとNPCによってそれが誤って起こされてしまう可能性が残ります。
これらの代わりに私たちはTriggerBoxがアクティベーションを送る時だけ復活呪文を起こさせるようにしたいと思います。 これをするには別のPropertyを作成する必要があります(今度はトリガーに割り当てるものとしてObject ReferenceのPropertyを使用していきましょう。)
OnActivate()Eventによって提供される"akActionRef"パラメーターに新しいPropertyを参照させましょう。 このパラメーターは一種の特殊変数です。 これはOnActivate() Eventの中でのみ使用可能であり、Papyrusはそのアクティベーションの原因となるリファレンスに自動的に割り当てます。
scriptName LokirsDraugrResurrection extends Actor
{This Script lives on the dead minion draugr in Lokir's Tomb. It handles their resurrection}
Spell property reanimateSpell Auto ; this is the special self-resurrection spell to use
objectReference property myTrigger auto ; This is the reference we are waiting on to send an activate
Event OnActivate(ObjectReference akActionRef)
; I've been activated - see if was my trigger
if (akActionRef == myTrigger)
; Cast a Reanimate spell on the Draugr
reanimateSpell.Cast(Self, Self)
EndIf
EndEvent
最後にやるべきことはその新しいPropertyに変数を割り当てる事です。 CKに戻り2体の死体のドラウグラーのどちらかをダブルクリックしてください。 そしてそのプロパティウィンドウの「Scripts」タブでLokirsDraugrResurrection スクリプトを選択し、リストからその新しく作成した「myTrigger」Propertyを選択し、「Edit Value」をクリックしてください。つぎに表示されたウィンドウで「Pick Reference in Render Window」ボタンを押して、ボスドラウグラーが出現するトリガーであり、今回の目的のTriggerである青いアクティベーションボックスをダブルクリックして指定してださい。
それが終わったらプラグインをセーブして、ゲームでテストしてみてください。
問題なく設定されていたならば、ドラウグラーは一度だけしか復活しないはずです。プレイヤーがそのアクティベーションボックスをいつ通っても再度決してドラウグラーが復活しない理由(そしてボスドラウグラーのトラップトリガーが一度だけしか作動しない理由)は「doOnce」と呼ばれるPropertyだからです。
そのトリガーボックス(defaultActivateSelf)にアタッチされているスクリプトをチェックするため、デフォルト割当や自動割当、そしてPropertyに変数を割当てる方法の詳細を知るのは良い案だと思います。