データ構造は、コーダーがデータのセット全体を保存および整理する方法です。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 = "言いたいことが一つある!"Chat:Chat(head, dialogue)endprompt.Triggered:Connect(speak)作成した配列の中括弧 {} 内に、カンマで区切った少なくとも3つのセリフの文字列を入力します。
local dialogueArray = {"こんにちは!", "あなたを知っていますか?", "さようなら!"}
配列インデックスを使用する
配列内の各値にはインデックス番号が割り当てられます。インデックスは、値が保存される順序に従って値に割り当てられます。最初の値はインデックス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をクリックして配列の各セリフを確認します。
スクリプトが配列の最後に達すると、出力ウィンドウにエラーが表示されることに注意してください。
次のセクションで、最後の文字列を表示した後にセリフが最初から再開されるように修正します。
配列のサイズ
配列のサイズを使用して、目的のインデックスを1にリセットするタイミングを知ることができます。配列のサイズを知るには、配列の名前の前に#を入力します。スペースは入れません。
例えば:#dialogueArray
配列のサイズを変数の現在の値と比較して、最初からやり直すタイミングを知ります。
セリフを再起動する
配列のサイズを使用して、最初のセリフに戻るタイミングを確認します。
if文を追加し、dialogueIndexがこの配列の合計サイズである#dialogueArrayに等しいかどうかを確認します。そうであれば、dialogueIndexを1に設定します。
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)if dialogueIndex == #dialogueArray thendialogueIndex = 1enddialogueIndex += 1enddialogueIndexが最後でない場合は、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