Bethesda Tutorial Papyrus Events and Properties/ja

From the CreationKit Wiki
Jump to navigation Jump to search
JapaneseFlag.pngこのページは日本語です。
リンク先ページの編集上の訂正または翻訳が必要です。


Language: English  • français • 日本語 • polski

Bethesda Tutorial Papyrus イベントとプロパティ



Bethesda Tutorial Papyrus イベントとプロパティ
スクリプティング シリーズ、4章
チュートリアルハブに戻る
LeftArrow.png 前のチュートリアル 次のチュートリアルRightArrow.png

概要[edit | edit source]

このチュートリアルはPapyrus EventPropertyの説明をしています。

このチャプターで学べること:

  • イベントの基礎とトリガー
  • プロパティの基礎と作成・使用方法
  • イベントの伝達と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>Actorall"LvlDraugrMissileMale""LvlDraugrWarlockMale"を探してください。 そしてそれらをドラッグ&ドロップでボスの部屋に配置してください。

それらのドラウグラーはデフォルトでは、ゲーム上で生きた状態でスタートします(一応生きてるということにします)。 私たちは今彼らを死んだ状態にしておきたいと思っています。それぞれをダブルクリックしてStarts Deadをチェックすれば死んだ状態でスタートします (当該ドラウグラーのリファレンスを編集するのはCell Viewウィンドウからそのリストを右クリックして「Edit」を選択する方法もあるのは以前のチュートリアルで説明したとおりです)。


Achtung.png BGSタイトルに慣れているモッダーは注意してください -- 単純にベースアクターのHealthを「0」にしてもアクターは死者でスタートしません。死者の状態でスタートしたいならば「Starts Dead」をチェックする方法でしてください。

Save your plugin and run it in-game to check things out so far. あなたのプラグインをセーブして、ここまでの設定が上手く出来ているか確かめてください。
2体のドラウグラーがボスの部屋の床に死んで横たわっているならば成功です。それではCKにもどってそれを蘇生させましょう。

イベント計画[edit | edit source]

This diagram gives a very rough idea how events allow the Game and Papyrus to interact

イベントについて[edit | edit source]

私たちは今、ボスが墓から現れた時に、それらのドラウグラーを復活させたいと思っています。これはEventに対応して欲しいということです。


"Events" はアクションまたは状態が変化した場合、それをゲームがPapyrusに通知するものです。
何百もの異なるイベントが存在しています。
例えば:

簡単に言えば、もしあなたがゲームで何か反応を望む場合、「Event」はそれをする方法だということです。

the Activation Eventのトリガー[edit | edit source]

理解できるかわかりませんが、私たちのサンプルは既にPapyrusに送られたEventを使用します。 これはボスが彼の石棺を出た時がわかるというです。 あなたがAmbushes Tutorialを完了しているならば、 ボスはActivate Parentとして「Trigger Volume(トリガーボリューム)」を持っていることを思い出してください。 プレイヤーが「Trigger Volume」に足を踏み入れた時、そのトリガーはボスをアクティベートすることで、彼は起き上がります。


InDepth.jpg 既存のスクリプトがここでプレイされますが、以下はそれによって起こるシステムの概要です:
  • プレイヤーはトリガーに接触し、これに対応して onTriggerEnter イベントが起きます
  • トリガー上のスクリプトはこれに対応しActivate Eventを送ります
  • ドラウグラーボスはトリガーのアクティベートChildとなっているので、そのActivationを受けます
  • ドラウグラーのボス上のスクリプトは彼の墓から這い出ることによって、そのActivationに応じます

私たちは2体の死んでいるドラウグラーにActivate Eventを送るための幾つかのトリガーを使用していきます。

ドラウグラーのそれぞれに設定すること:

  1. ドラウグラーをダブルクリックしてプロパティウィンドウを開きます。
  2. Activate Parentsタブを選択します。
  3. そこにある空のリスト上を右クリックしてNewを選択します。すると「Activate Ref Selection」ウィンドウが出現します。
  4. 'Select Reference in Render Window' をクリック
  5. マウスカーソルが十字に変わるので、その「Trigger Volume」上をダブルクリックすることでそれを指定します。
Achtung.png もしレンダーウィンドウでそのトリガーが見つからない場合、"M"キーでマーカーの表示・非表示が切替えられるのを思い出してください。

これで、それら両方のドラウグラーは、プレイヤーがそのトリガーに触れた時「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.}


InDepth.jpg
  • scriptName LokirsDraugrResurrection - これはスクリプトの名前です。スクリプトの名前は今回エディタで作成したファイルの名前と一致させてください。
  • extends Actor - このスクリプトがアクター上に置かれるものであることを示します。したがってこれはアクターができる事のいずれもすることができます。
  • {...} - この括弧に挟まれているテキストはただの注意書きです、これは絶対に必要なものではありませんが、そのスクリプトについてのメモ書きを残すのは良い習慣です


次に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で特別の呪文を使用することを許可します。


NewFeature.jpg

以前の古いスクリプト言語("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


InDepth.jpg
  • 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"キーを利用して一番右端のタブにジャンプすることができます)。

作成したスクリプトをアタッチしましょう:

  1. Addクリック.
  2. 次に出現したAdd script...ウィンドウで、作成したスクリプトの名前"LokirsDraugrResurrection"を入力してください.
  3. ドラウグラーにそれを追加するため、そのスクリプト上をダブルクリックしてください.

これでこのリファレンスにスクリプトをアタッチしましたが、まだCKに何の呪文を唱えるか教えていません。これをするために「dunReanimateSelf」を使用します。 特に今回のような場面に好都合な呪文を「唱えたふりをする」ことができるものです。

  1. Scripts タブでLokirsDraugrResurrectionを選択します。
  2. Propertiesをクリック
  3. リストには reanimateSpellPropertyだけが表示されているはずです。
  4. そのreanimateSpellを選択し、Edit Valueをクリック。
  5. 注意:このリストは有効なフォーム(今回の場合Spell)だけ表示させます
  6. 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


InDepth.jpg
  • objectReference - これは新しいPropertyのデータタイプを示しています
  • myTrigger - 従来と同じく、新しいPropertyのために付けた名前です
  • if - これは "if構文(if statement)"の始まりをあらわします。この構文下で、もしその条件がTrueなら、そのスクリプトが実行されることになります。もし条件がTrueでないなら、Papyrusはこの構文下を無視して、ifに対応する "endIf" 以下、つまりそのIF構文以下のコマンド処理を再開します
  • (akActionRef == myTrigger) - これはテスト条件です。「==」は論理演算子の「イコール」をあらわします。今回の場合、「akActionRef」と「myTrigger」が同じリファレンスだという条件が満たされた場合、IF構文以下を実行します
  • endIf - これはIF構文を終わらせるのに必要なものです。より複雑な操作をしたい場合、その中にさらに複数のIF構文を持たせる事も可能です。それゆえ後で自分で見るときや他のスクリプターのための足跡(メモ書き)が重要になります。IF構文の下に別のIF構文をおく場合、それはネスト(入れ子)されると言われます。

最後にやるべきことはその新しいPropertyに変数を割り当てる事です。 CKに戻り2体の死体のドラウグラーのどちらかをダブルクリックしてください。 そしてそのプロパティウィンドウの「Scripts」タブでLokirsDraugrResurrection スクリプトを選択し、リストからその新しく作成した「myTrigger」Propertyを選択し、「Edit Value」をクリックしてください。つぎに表示されたウィンドウで「Pick Reference in Render Window」ボタンを押して、ボスドラウグラーが出現するトリガーであり、今回の目的のTriggerである青いアクティベーションボックスをダブルクリックして指定してださい。

それが終わったらプラグインをセーブして、ゲームでテストしてみてください。

問題なく設定されていたならば、ドラウグラーは一度だけしか復活しないはずです。プレイヤーがそのアクティベーションボックスをいつ通っても再度決してドラウグラーが復活しない理由(そしてボスドラウグラーのトラップトリガーが一度だけしか作動しない理由)は「doOnce」と呼ばれるPropertyだからです。

そのトリガーボックス(defaultActivateSelf)にアタッチされているスクリプトをチェックするため、デフォルト割当や自動割当、そしてPropertyに変数を割当てる方法の詳細を知るのは良い案だと思います。