LlDialog/ja
From Second Life Wiki
関数: llDialog( key avatar, string message, list buttons, integer chat_channel );
avatarのスクリーンにmessageと選択するbuttons、同様に無効ボタンを加えて、右上隅にダイアログボックスを表示します。これは単一なメッセージ配信から複合的なメニューシステムまで多数用いているレンダリングです。
| • key | avatar | – | 同一リージョンに居るアバターの UUID | |
| • string | message | – | 表示されるメッセージ | |
| • list | buttons | – | ボタンのラベル | |
| • integer | chat_channel | – | 出力チャンネル、いずれかのinteget値 |
ボタンが押されたとき、avatarはchat_channel上でボタンのテキストを叫びます。
チャットの位置はダイアログボックスが作られたときのプリムの場所です。
| チャンネル定数 | 解説 | |
|---|---|---|
| DEBUG_CHANNEL | 0x7FFFFFFF | チャットチャンネルはスクリプトからデバッグとエラーメッセージを受け取ります |
| PUBLIC_CHANNEL | 0x0 | チャットチャンネルは全ての近くのユーザに届きます |
|
| |||||||||||||||||||||||||
警告
- この関数は1.0秒間、スクリプトを停止します。
- スクリプトでダイアログボックスを消す方法はありません。
- スクリプトでユーザが小さな"ignore"ボタンを押した場合に探知する方法はありません。(このボタンを押した結果でチャットは生成されません)
- ダイアログボックスからの入力と、同じユーザによる通常チャットを識別する方法はありません。
- 応答がボタンの一つによるものではないことを想定することは重要です。
- プリムがダイアログの作られた場所でのシャウトの範囲から外れた場合、応答は聞こえなくなるでしょう。
- この制限は、装着物がダイアログボックスが作られた場所でのシャウト範囲を超えた場合でも作用します。
メッセージの制限
- 8行を超えた場合、スクロールバーが現れます。
- メッセージは512byteより少なく、かつ空にでは無いようにすべきです。それらの場合は デバッグチャンネルにてエラーがシャウトされるでしょう。
ボタンの限界
- ボタンが空のリストの場合、"OK"のみのようなリストが初期値となるでしょう。
- エラーはデバッグチャンネルにてシャウトされるでしょう。
- 12ボタンよりもおおい場合
- いくつかのリスト項目がstringでは無い場合
- いくつかのリスト項目で、stringの長さ(byte計算)が0もしくは24より多い場合
例
integer channel = 1000; list pairs = []; default { state_entry() { llListen(channel,"", "",""); } touch_start(integer count) { llDialog(llDetectedKey(0), "This is a test dialog.\n\nPlease choose one of the below options.", ["Yes", "No", "0", "1"], channel); } listen(integer chan, string name, key id, string mes) { if(id == llGetOwnerKey(id))//won't listen to objects unless they aren't in the region. llSay(0,name + " (" + (string)llGetObjectDetails(id, (list)OBJECT_POS) + ") chose option " + mes); } }
部分的な利用
//Compact function to put buttons in "correct" human-readable order integer channel; list order_buttons(list buttons) { return llList2List(buttons, -3, -1) + llList2List(buttons, -6, -4) + llList2List(buttons, -9, -7) + llList2List(buttons, -12, -10); } default { state_entry() { // Create random channel within range [-1000000000,-2000000000] channel = (integer)(llFrand(-1000000000.0) - 1000000000.0); llListen(channel,"", "",""); } touch_start(integer total_number) { llDialog(llDetectedKey(0),"\nPlease choose an option:\n", order_buttons(["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]),channel); } listen(integer _chan, string _name, key _id, string _option) { llSay(0, _name + " chose option " + _option); } }
ノート
メニューシステム作成でダイアログボックスを用いるには、ダイアログメニュー: ステップバイステップガイド (初学者対象)を参照しましょう。
Tips
大きなマイナス域のチャンネルを使うのはよい手段です。(最大マイナス域での32bit integerで、これ以上はありえないマイナス域とすれば、-2,147,483,64です) 例
// Create random channel within range [-1000000000,-2000000000] integer channel = (integer)(llFrand(-1000000000.0) - 1000000000.0); llDialog(llDetectedKey(0), "Please choose one of the below options:", ["Yes", "No", "0", "1"], channel);
マイナスチャンネルは、クライアントがこれらのチャンネル上で直接的にチャットは不可能なので、スクリプトのコミュニケーション用としてよく知られています。("/-xxxx message" は"-xxxx"チャンネル上での"messeage"チャットにはなりませんので、チャンネルゼロ上での"/-xxxx message"チャットとなるでしょう。)llTextBoxに先立ってすることは、24バイトに制限したllDialogを用いることです。
あなたは、全てのあなたのスクリプトされたオブジェクトがこの小さな関数とユニークチャットチャンネルを持つことで、確実に安心することができます。
integer dialog_channel; // top of script in variables integer channel() { // top of script in functions return (integer)("0x"+llGetSubString((string)llGetKey(),-8,-1)); } dialog_channel = channel(); // somewhere in actual script execution, such as state_entry()
表示
messageが8行以上を要求する場合、縦スクロールバーがダイアログに表示されるでしょう。
メッセージテキストは"\n"(改行)と"\t"(タブ)を用いて整形が可能です。あなたはフォントとサイズあるいは大きさには影響を及ぼすことはないでしょう。
ダイアログの実サイズも色も変更する方法はありません。
関連項目
イベント
| • | listen |
関数
| • | llListen | |||
| • | llTextBox | |||
| • | llRegionSay | |||
| • | llWhisper | – | 10メートル制限でチャットを送信します | |
| • | llSay | – | 20メートル制限でチャットを送信します | |
| • | llShout | – | 100メートル制限でチャットを送信します | |
| • | llInstantMessage | – | 指定されたユーザにチャットを送信します | |
| • | llOwnerSay | – | オーナのみにチャットを送信します |
項目
| • | ダイアログメニュー: ステップバイステップガイド | – | 全てのダイアログメニュープロセスの手引きです(初学者対象)。 |

