データ構造は、コーダーがデータの全セットを保存および整理する方法です。Luauでは、データ構造はテーブルで作成されます。テーブルは任意の数の値を保持できます。
この記事では、特定のテーブル型である配列を使用して、会話するキャラクターを作成する方法について説明します。

テーブル
テーブルは、複数の値を保持できるデータ型です。単一の値を保存する他のデータ型とは異なり、テーブルは固定サイズを持たず、異なる値の型を混在させることができます。テーブルを使用すると、プレイヤーのインベントリにアイテムを保存したり、数千のプレイヤー名のリストを作成したりできます。
配列
テーブルには異なるタイプがあります。そのうちの1つが配列で、特定の順序で値のリストを保存します。配列を作成するには、変数を作成し、中括弧 { } を割り当てます。中括弧内の値はカンマで区切ります。
local myArray = {"item1", "item2", 10, workspace.Part, myVariable}
会話するキャラクターの作成
配列を探索するために、クリックされると異なるセリフを表示する非プレイヤーキャラクター(NPC)を使用します。
このプロジェクトでは、部分的なスクリプトとプロンプト検出器を含む、あらかじめ作成されたNPCモデルを使用しますが、セリフは欠けています。
エクスプローラーで Workspace を右クリックし、ファイルから挿入を選択して、ダウンロードしたファイルをインポートします。
ダイアログ配列をコーディングする
以下の手順では、NPCがプレイヤーと対話するときに言う異なるフレーズを保存するために配列を使用します。
エクスプローラーで 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 = "言いたいことが1つあります!"Chat:Chat(head, dialogue)endprompt.Triggered:Connect(speak)作成した配列の中括弧 {} 内に、カンマで区切った少なくとも3つのダイアログの文字列を入力します。
local dialogueArray = {"こんにちは!", "あなたを知っていますか?", "さようなら!"}
配列インデックスの使用
配列内の各値には index 番号が割り当てられます。インデックスは、値が保存された順序で、最初の値はインデックス1、2番目はインデックス2、というふうに割り当てられます。
Javaのような一部のコーディング言語では、インデックスは0から始まります。
作成した配列では、 "こんにちは!" がインデックス1、 "さようなら!" がインデックス3です。
| インデックス | 値 |
|---|---|
| 1 | こんにちは! |
| 2 | 今日は素晴らしい日です! |
| 3 | さようなら! |
特定のインデックス値を使用する
インデックス値を使用して、NPCに特定のダイアログを割り当てます。特定のインデックスの値を使用するには、配列の名前の後に直接インデックスを中括弧で追加します。例えば、 dialogueArray[1] のようにします。
dialogue 変数のデフォルトの文字列値をインデックス2に置き換えます。
local dialogueArray = {"こんにちは!", "あなたを知っていますか?", "さようなら!"}local function speak()local dialogue = dialogueArray[2]Chat:Chat(head, dialogue)endプレイテストを行い、NPCをクリックします。2番目の配列の値がチャットバブルに表示されるはずです。コードを変更して、テーブルの各値をテストしてみてください。

ダイアログラインを変更する
プレイヤーがNPCと対話すると、NPCは常に同じセリフを言います。それは退屈です。代わりに、どのインデックス値を使用するかを更新するために変数を使用します。
プレイヤーがNPCと対話するたびに、次のダイアログを表示するために変数の値を1増加させます。
現在のインデックスを追跡するために、 dialogueIndex という名前の新しい変数を追加します。この変数を1に設定して、配列の最初から始めます。
local dialogueArray = {"こんにちは!", "あなたを知っていますか?", "さようなら!"}local dialogueIndex = 1speak() 内で、 dialogueArray[2] のインデックス番号を先ほど作成した変数に置き換えます。
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)end関数の末尾で、 dialogueIndex に1を加えます。次に speak() が呼び出されるときに、ダイアログは次の文字列を表示します。
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)dialogueIndex += 1endプレイテストを行い、NPCをクリックして、配列内の各ダイアログ文字列を確認します。
スクリプトが配列の最後に達するとき、Outputウィンドウにエラーが表示されることに注意してください。
次のセクションでこの問題を修正し、最後の文字列を表示した後にダイアログが最初から再開されるようにします。
配列のサイズ
配列のサイズを使用して、いつインデックスを1にリセットする必要があるかを知ることができます。配列のサイズを知るには、配列の名前の前に # を入力します(スペースなし)。
たとえば: #dialogueArray
配列のサイズを変数の現在の値と比較して、最初から再開する必要があるときに確認します。
ダイアログの再開始
配列のサイズを使用して、いつ最初のダイアログに戻るべきかをチェックします。
if文を追加し、 dialogueIndex がこの配列の合計サイズである #dialogueArray に等しいかどうかを確認します。そうであれば、 dialogueIndex を1に設定します。
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)if dialogueIndex == #dialogueArray thendialogueIndex = 1enddialogueIndex += 1endもし dialogueIndex が最後ではない場合は、まだ dialogueIndex に1を加えるべきです。dialogueIndex += 1 をelse文の下に移動します。
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 = {"こんにちは!", "あなたを知っていますか?", "さようなら!"}
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)
トラブルシューティングのヒント
キャラクターがダイアログの配列を通過しない場合は、以下のトラブルシューティングのヒントを試してください。
- dialogueIndex が1に戻されるif文を確認します。else文で、 dialogueIndexが自分に1を加えていることを確認します。
- 配列のサイズを取得する際は、 #dialogueArrayの # の後にスペースがないことを確認してください。
オプションの課題
以下のオプションの課題のいずれかを試してください。
- 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