データ構造 は、コーダーが全体のデータセットを保存し整理する方法です。Luau では、データ構造はテーブルで作成されます。 テーブル は、任意の数の値を保持できます。
この記事では、特定のテーブルタイプの 配列 を使用して、話すキャラクターを作成する方法をカバーします。

テーブル
テーブル は複数の値を保持できるデータタイプです。1つの値を保存する他のデータタイプとは異なり、テーブルには固定サイズがなく、異なる値タイプのミックスを保持できます。テーブルを使用すると、プレイヤーのインベントリにアイテムを保存したり、プレイヤーの名前リストを数千個作成したりできます。
配列
テーブルには異なる種類があります。1つのタイプは 配列 で、特定の順序で値のリストを保存します。配列を作成するには、変数を作成してカーリーブレックスを割り当てる { } 。括弧内の値をコンマで区切って以下のように分離します:
local myArray = {"item1", "item2", 10, workspace.Part, myVariable}
話すキャラクターを作成する
配列を探索するには、クリックすると異なるダイアログラインを表示する非再生可能なキャラクター (NPC) で作業します。
このプロジェクトでは、一部のスクリプトとプロンプトディテクターを含む既製の NPC モデルを使用しますが、対話が欠落しています。
エクスプローラでは、ワークスペース を右クリックしてインポートし、ダウンロードしたファイルを選択します。
ダイアログアレイをコードする
これらのステップでは、NPC がプレイヤーがそれと対話するときに言う異なるフレーズを保存するために配列を使用します。
In the エクスプローラー , go to NPC > ProximityPrompt > ChatManager.
ChatManager で、スクリプトでマークされた場所で、対話オプションを保存する 空の配列 を作成します。
-- プロンプトが使用されたときにチャットダイアログを循環するlocal Chat = game:GetService("Chat")local prompt = script.Parentlocal npc = prompt.Parentlocal characterParts = npc.CharacterPartslocal head = characterParts.Head-- ここに配列を追加local dialogueArray = {}local function speak()local dialogue = "I've got one thing to say!"Chat:Chat(head, dialogue)endprompt.Triggered:Connect(speak)まったく新しい配列の {} ブレット内で、セミコロンで区切られた少なくとも 3つの対話文を入力します。
local dialogueArray = {"Hi!", "Do I know you?", "Goodbye!"}
配列インデックスを使用する
アレイの各値には index 番号が割り当てられます。インデックスは、値が保存される順序で値に割り当てられます。最初の値はインデックス 1 で、2番目はインデックス 2 で、と続きます。
Java のようないくつかのコーディング言語は、0 でインデックスを開始します。
たった作成された配列では、"Hi" はインデックス 1 にあり、"Goodbye!" はインデックス 3 にあります。
インデックス | 値 |
---|---|
1 | Hi |
2 | 今日はいい天気だ! |
3 | さようなら! |
特定のインデックス値を使用する
インデックス値を使用して、NPCに特定のダイアログを割り当てます。特定のインデックスで値を使用するには、配列の名前の直後に括弧でインデックスを追加してください、例えば dialogueArray[1] 。
dialogue 変数のデフォルトストリング値をインデックス 2 で置換する
local dialogueArray = {"Hi!", "Do I know you?", "Goodbye!"}local function speak()local dialogue = dialogueArray[2]Chat:Chat(head, dialogue)endプレイテストして NPC をクリックします。2番目の配列値がチャットバブルに表示されます。テーブルの各値をテストするためにコードを変更してみてください。
対話行を変更
プレイヤーがNノンプレイヤーキャラクターと対話すると、NPCは常に同じラインを言います。つまんないね。代わりに、変数を使用して、使用するインデックス値を更新します。
プレイヤーが NPC と対話するたびに、変数値を 1 増やして、次の対話行を表示します。
現在のインデックスを追跡するには、新しい変数 dialogueIndex を追加します。変数を 1 に設定して、配列の始まりに開始します。
local dialogueArray = {"Hi!", "Do I know you?", "Goodbye!"}local dialogueIndex = 1In speak() , 置換 インデックス番号を dialogueArray[2] に新しく作成した変数で置換します。
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)end機能の底部で、1 を dialogueIndex に追加します。次回 speak() が呼ばれると、ダイアログが次の文字列を表示します。
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)dialogueIndex += 1endプレイテストし、NPC をクリックして、配列から各ダイアログ文字列を見る。
スクリプトが配列の終わりに到達すると、出力ウィンドウに エラー が発生することに注意してください。
次のセクションで修正すると、最後の文字列が表示された後、ダイアログが最初から再起動します。
配列サイズ
アレイのサイズを使用して、必要なインデックスを 1 にリセットするタイミングを知ることができます。配列の名前の前に、スペースを含まずに サイズ を検索するには、配列の名前の前に # を入力します。
例: #dialogueArray
配列のサイズを変数の現在の値と比較して、開始時間を知るために、最初から再開する時が来たかどうかを確認します。
対話を再開する
配列サイズを使用して、最初のダイアログに戻る時間がいつかをチェックします。
if 文を追加し、dialogueIndex がこの配列の合計サイズである #dialogueArray と等しいかどうかをチェックします。そうなると、dialogueIndex を 1 に設定します。
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)if dialogueIndex == #dialogueArray thendialogueIndex = 1enddialogueIndex += 1endIf dialogueIndex が最終了にない場合、それでも 1 を dialogueIndex に追加する必要があります。その他の文で dialogueIndex += 1 を移動します。
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)dialogueIndex = if dialogueIndex == #dialogueArray then 1 else dialogueIndex + 1endプレイして、対話を循環して再起動できることを確認します。
概要
データ構造は、データのセットが保存される方法です。Luau はテーブルを使用してデータ構造を作成します。配列は、情報の順序のリストを保持できるタイプのテーブルです。配列内の各値には、インデックス 1 から始まるインデックス番号が割り当てられます。
このスクリプトは、配列を使用して、プレイできないキャラクター (NPC) の可能な対話ラインのリストを作成しました。
完了したスクリプト
-- プロンプトが使用されたときにチャットダイアログを循環する
local Chat = game:GetService("Chat")
local prompt = script.Parent
local npc = prompt.Parent
local characterParts = npc.CharacterParts
local head = characterParts.Head
-- ここに配列を追加
local dialogueArray = {"Hi!", "Do I know you?", "Goodbye!"}
local dialogueIndex = 1
local function speak()
local dialogue = dialogueArray[dialogueIndex]
Chat:Chat(head, dialogue)
dialogueIndex = if dialogueIndex == #dialogueArray then 1 else dialogueIndex + 1
end
prompt.Triggered:Connect(speak)
トラブルシュートのヒント
キャラクターが対話のアレイを通過しない場合は、次のトラブルシューティングヒントを試してください。
- if 文が dialogueIndex が 1 に戻されているかどうかをチェックします。その後、else 文で dialogueIndex に 1 が追加されているかどうかをチェックします。
- 配列のサイズを取得するときは、#dialogueArray の # の後にスペースがないことを確認してください。
オプションのチャレンジ
以下のオプションのチャレンジの 1つを試してください。
- スクリプトをコードして、NPCの対話がアレイを通して逆方向に進むようにします。ダイアログインデックスは、配列で始まり、追加するのではなく、毎回減算する必要があります。
- 順番にダイアログを表示するのではなく、NPC が Random.new() を使用して各回ランダムなダイアログラインを表示するようにします。参照するサンプルスクリプトが以下に含まれています
local randomGenerator = Random.new()
-- NPC がクリックされるたびに新しいダイアログを表示
local function speak()
local randomIndex = randomGenerator:NextInteger(1, #dialogueArray)
local dialogue = dialogueArray[randomIndex]
Chat:Chat(head, dialogue)
end