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

テーブル
テーブル は複数の値を保持できるデータタイプです。単一の値を保存する他のデータタイプと異なり、テーブルには固定サイズがなく、異なる値タイプのミックスを保持できます。テーブルを使用すると、プレイヤーのインベントリにアイテムを保存したり、数千のプレイヤー名のリストを作成したりできます。
配列
テーブルにはさまざまな種類がある。1つのタイプは 配列 で、特定の順序で値のリストを保存します。配列を作成するには、変数を作成してカーリーブレックスを割り当てる { } 。括弧内の値を、以下のようにコンマで区切って別々にする:
local myArray = {"item1", "item2", 10, workspace.Part, myVariable}
話すキャラクターを作成する
配列を探索するには、クリックすると異なるダイアログラインを表示する非再生可能なキャラクター (NPC) を使用します。
このプロジェクトでは、一部のスクリプトとプロンプトディテクターを含む既製の 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番目の配列値がチャットバブルに表示されます。テーブルの各値をテストするためにコードを変更してみてください。
対話ラインを変更
プレイヤーがNPCと対話すると、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 が最後にない場合、それはまだ dialogueIndex に 1 を追加する必要があります。別の else 文の下で 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