今更なオブリビオンブログ
おもにMOD関連のメモを書いていくと思います、MODをいじったり、作ってるのが楽しいです。
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

メッセージの表示について
メッセージの表示

MODでよく使われる、いわゆる「天の声」としてのメッセージの表示の仕方について自分なりに、軽くまとめをしておこうと思います。

メッセージの表示は主に3つの方法があります。
・「クエストジャーナル」を使う
・「Message」を使う
・「MessageBox」を使う


■「クエストジャーナル」を使う場合は、画像のようにQuestStagesに文章を書いておくと、SetStageなどのコマンドで
その数字のステージになった時に自動的に表示されます。



利点としては、見ての通り、文章の表示とともに記述したスクリプトを一回だけ走らせることが出来ます。
あえて文章を表示せず、スクリプトの実行だけをすることも可能です。
この文章はメニューからいつでも見直すことが出来るため、重要なメッセージや、複雑な指示を必要とするクエストに向いています。


注意点は一度しかポップアップで表示できないことです。
一度進めたステージは、戻すことが出来ないので、これも注意が必要です。
以前にも書いたようにダイアログのスクリプトからのSetStageだと、ポップアップで表示されません。
どうしても会話後にクエストジャーナルの表示がしたい場合は、外部にステージを進めるための専用のスクリプトを作っておき、
ダイアログでそのスクリプトを発動させる、等の工夫が必要になります。



■「Message」を使う場合は、スクリプトで

Message "表示させたい文章"

と記述します。
これで画面上部に文章が表示されます。喋る武器のMODなどではこれがよく使われています。

利点としては、唯一文章の表示中に時間を止めないという特性のため、戦闘中にも流れる可能性のあるメッセージの表示に向いています。
ほかの方法に比べると、あんまりうるさくないので、各種確認のメッセージとして使うのにも向いています。
ゲーム中でちゃんとスクリプトが走ったかどうか、確認したい時には処理の途中に挟んでおくと分かりやすいです。

注意点は自動で流れていってしまうため、読んでいる途中で消える、戦闘中など忙しい時には見逃す可能性があるということ。
そのため、重要なメッセージの表示には向きません。



■「MessageBox」を使う場合は、スクリプトで

MessageBox "表示させたい文章"

と記述します。
これで画面中央に文章がポップアップで表示されます。
完了(done)のボタンを押さない限り、表示されたままです。

利点としては、文章の表示中に時間を止めるため、わりと重要なメッセージの表示にも向いています。
とは言え、本当に重要なメッセージの表示は後から見直せるクエストジャーナルのほうがいいです。

注意点は、表示中時間を止めるため、戦闘中にこれが出ると、かなりめんどうな事になります。





また、「MessageBox」には色々オプションがあって、駆使すれば、擬似メニュー画面が作れたりします。
簡単な使い方の説明だけしておきます。

・メッセージの中で変数の表示が出来ます。これは「Message」でも使えます。

short LV

set LV to player.GetLevel

MessageBox "あなたのレベルは %.0f です",LV


と記述すると、プレイヤーのレベルが表示されるはずです。

書式は、

MessageBox "文章 %.0f ",[変数名]

となっていて、「%.0f」の所に変数が入ります。これは、複数表示させることも出来て、その場合は

MessageBox "文章 %.0f 文章 %.0f 文章 %.0f 文章 %.0f",[変数名1],[変数名2],[変数名3],[変数名4]

という感じになります。「%.0f」を書いた所に順番に変数が入っていきます。
最大9個まで変数を表記することが出来ます。

なお、変数の表記法ですが、
「%[数字(省略可)].[数字]f」となっていて、前の数が表示する桁数を、後ろの数が小数点の表示する桁数を表しています。
つまり、
「%.0f」…変数を整数で表すことになります。
「%.2f」…変数の小数点第2位までを表示します。(「3」を「3.00」と表記)
「%5.0f」…変数を5桁の整数で表します。(「3」を「00003」と表記)

また、「%」の直後に「+」や「-」を付けて書くと、数字の前にこれらの記号を付けて表記することが出来ます。
MessageBoxで「%」を表示するためには、「%%」と書かなくてはいけません。(全角の「%」は、問題なく表示できます)


・ボタンを複数作ることも出来ます。

MessageBox "ボタンを選んでください","ボタン1","ボタン2","ボタン3"


こんな感じで""で囲って「,」で区切った文章が羅列した順にボタンになります。最大10個までボタンを作ることが出来ます。
ただし、これだけだと本当にボタンが増えただけで、どれを押してもOKボタンを押すのとなんら変わりがありません。


それぞれのボタンに意味を持たせるには「GetButtonPressed」という関数を利用します。
これは、今MessageBoxのどのボタンを押しているかの識別に使える関数です。
「GetButtonPressed」は、何もボタンを押していない時には「-1」の数字を返して、
一つ目のボタンを押した時に「0」を、二つ目のボタンを押した時に「1」を…という感じで順番に数字を返してきます。


以下は石像などのアクティベーターに付けるためのスクリプトです。
アクティベートした時にメッセージを表示させるものです。
文章の内容は適当です、気にしないでください。

short button
short LV

begin onActivate
set LV to player.GetLevel
MessageBox "あなたのレベルは %.0f ですね",LV,"そうだよ","ちがうよ"
end

begin GameMode
set button to GetButtonPressed
if button == -1
return
elseif button == 0
MessageBox "この正直者め!"
elseif button == 1
MessageBox "嘘をつくな!"
endif
end


このように二つのブロックに分けて書かなければいけません。


「begin onActivate」のブロックでは、一枚目のMessageBoxを出しています。
ここで出したMessageBoxにはボタンが二つあるはずです。

次の「begin GameMode」のブロックではボタンの状態を常に監視しています。
初めにボタンの状態が「-1」(ボタンを押していない状態)だと、「return」のコマンドを実行しています。
これは、そこで処理を中断するという意味になります。
これをこのブロックの最初のほうに書いておくと、以下のスクリプトの内容を評価しないため、負荷の軽減になるそうです。

次にボタンの状態が「0」(一つ目のボタンを押した状態)だったら、二枚目のMessageBox "この正直者め!"を出します。
次にボタンの状態が「1」(二つ目のボタンを押した状態)だったら、二枚目のMessageBox "嘘をつくな!"を出します。


ただし、これだけでは実際に運用するには支障があります。
どういうことかというと、初めのMessageBoxが出てから次のMessageBoxが出るまでにほんの少しタイムラグがあるため、
その間に再度アクティベートできてしまい、動作がおかしくなる可能性があります。
そのため、普通は以下のようにして処理が全て終わるまではアクティベートが出来ないようにします。

short Choosing
short button
short LV

begin onActivate
if Choosing == 0
set LV to player.GetLevel
MessageBox "あなたのレベルは %.0f ですね",LV,"そうだよ","ちがうよ"
set Choosing to 1
endif
end

begin GameMode
if Choosing == 1
set button to GetButtonPressed
if button == -1
return
elseif button == 0
MessageBox "この正直者め!"
set Choosing to 0
elseif button == 1
MessageBox "嘘をつくな!"
set Choosing to 0
endif
endif
end




OBSEを使えば、「MessageEx」「MessageBoxEx」が扱えるようになります。
これは、上記に加えて色々と変数の表示の種類が増えたり、専用の関数が増えたりしています。
一部を紹介すると、

「%r」…改行する
「%i」…IDを表示
「%n」…名前を表示
「%k」…その数に該当するキーボードのキーを表示する
「|」…メッセージ内に書くと、以降の文章をボタン扱いに出来る。それの何が嬉しいかというと、ボタンに変数を表示することが可能になります。

・「SetMessageSound」…MessageBoxExの呼び出しによって再生される音を設定します。
書式は
SetMessageSound [soundID:string]

・「SetMessageIcon」…MessageBoxExのテキストの左側に表示されるアイコンを設定します。("Data\Textures\Menus\"に位置するDDSファイルです)
書式は
SetMessageIcon [iconPath:string]


その他注意としては、MessageBoxは、どんなに長くなっても改行せずに書かなくてはいけません。

あと、アイテムを使ってこういうメニューを出したい場合は、
「onActivate」を「OnEquip」に、「GameMode」を「MenuMode」にすればいけると思います。


それから、これはあくまでも簡単な使い方の例で、あんまり負荷とかを考慮していません。
「begin GameMode」を使っているため、こういうオブジェクトが同一セルに沢山増えるとその分負荷がかかってしまいます。
まあ、二つや三つくらいなら問題ないでしょうが…
余談ですが、大型MODのMMMでは宝石をクリックして粉末に出来る機能があるんですが、そのときに出るメッセージボックスが
おそらく上記のような書き方で「MenuMode」のスクリプトを付けていると思われます。
そのせいで、気づかずに2~300個くらい貯まっていたりすると、メニューを開いた時に高負荷のせいでCTDを頻発します。

解決法としては、「GameMode」あるいは「MenuMode」で行っている処理を「マジックエフェクトスクリプト」か「クエストスクリプト」に任せるのがいいと思います。
魔法でやる場合はアビリティにスクリプトを付与して、一枚目のメッセージボックスを表示した時にAddして終わったらRemoveする。
クエストスクリプトの時は必要な時にそのクエストをStartQuestして、終わったらStopQuestするのがいいと思います。
クエストスクリプトでやる際には忘れずに「fQuestDelayTime」を使ってクエストスクリプトが処理される頻度を変更しないとサクサク動かないでしょう。



追記
「Quest Data」のタブの「Start Game Enabled」にチェックが入った状態でステージ0に文章を書けば自動でクエストジャーナルが表示されるかと思ったのですが、そううまくはいかないようです。
やはりクエストジャーナルを表示するにはSetStageを使うしかないようです。
スポンサーサイト

テーマ:PCゲーム - ジャンル:ゲーム

コメント

コメントの投稿














管理者にだけ表示を許可する


トラックバック
トラックバック URL
http://5588ob.blog.fc2.com/tb.php/19-45be202a
この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。