辞書は、名前やキーを値に関連付けるテーブルです。インデックスではありません。
例:
Luau 辞書の構文local pet = {Name = "ボビー",Type = "犬",}
辞書は、値にラベルを付ける必要があるときに使用します。単に配列のように順番にリストするだけではありません。このチュートリアルで、プレイヤーに関連付けられた値を操作することによって辞書の使用を練習します。
辞書の構文
配列と同様に、辞書は波括弧 {} を使って変数に割り当てられます。キーと値のペアは、それぞれ別々の行にコンマの後に記載されます。キーと値は、文字列、数字、変数名など、任意のデータ型を使用できます。
local playerNames = {player1 = "ザップ",player2 = "ケル",}print(playerNames["player1"])
部分や他のインスタンス化されたオブジェクトをキーとして参照するには、ブラケットを使用します。
local greenPart = workspace.GreenPartlocal redPart = workspace.RedPartlocal partList = {[greenPart] = true,[redPart] = false,}print(partList[redPart])
辞書の作成
辞書の一般的な使用法の一つは、プレイヤーまたはキャラクター情報の整理です。理論的な敵キャラクターの情報をどのように保存してアクセスできるかを以下の手順で探ります。
新しいスクリプトで、enemy という名前の辞書を作成します。
local enemy = {}辞書の最初のキーは、変数 Name を使用して敵の名前を追跡します。
local enemy = {Name}敵の名前をキーに割り当て、コンマの後に続けます。
local enemy = {Name = "スパイク",}敵の健康状態を表すための2番目のキーと値のペアを追加します。キーは常に同じデータ型を使用するべきですが、値は異なるデータ型を使用しても問題ありません。
local enemy = {Name = "スパイク",Health = 1000,}
辞書の値を使用する
辞書の値にアクセスする方法は2つあります。
- tableName["keyName"] (重要: 引用符に注意)
- tableName.keyName
local enemy = {Name = "スパイク",Health = 1000,}print("悪役 " .. enemy["Name"] .. " が近づいてきます!")print("悪役 " .. enemy.Name .. " が近づいてきます!")
どのスタイルを使用するかは通常、テーブルの目的によります。サーバー内のプレイヤーのリストのように値のコレクションを保持するテーブルでは、コーダーは通常 tableName["keyName"] を使用します。オブジェクトを説明するために使用される辞書では、コーダーは tableName.keyName を使用する可能性が高くなります。
辞書の値を変更する
キーの値を変更することは、他の変数と同様です。等号 = 演算子を使用します。
enemy テーブルの下に、敵の名前を他の名前に設定します。
local enemy = {Name = "スパイク",Health = 1000,}enemy.Name = "ラナ"print("敵の名前は " .. enemy.Name .. " です")プレイテストをして、Output ウィンドウを確認します。
既存の変数をキーとして使用する
辞書は、スクリプトの他の部分で宣言された既存の変数と相互作用できます。以下のコーディング例は、プレイヤーが体験に参加するときにその名前をキーとして追加し、そのポイントの値を0に設定します。
ServerScriptService に新しいスクリプトを作成し、PlayerPointsという名前を付けます。そのスクリプト内で、Players サービスを取得し、空の辞書 playerPoints を作成します。
local Players = game:GetService("Players")local playerPoints = {}新しいプレイヤー変数のパラメータを持つ、プレイヤーポイントを設定するためのローカル関数をコーディングします。この関数を Players.PlayerAdded イベントに接続します。
local playerPoints = {}local function setPoints(newPlayer)endPlayers.PlayerAdded:Connect(setPoints)関数内で、プレイヤーの Name を取得する変数を追加し、その後テスト用の print ステートメントを追加します。
local function setPoints(newPlayer)local name = newPlayer.Nameprint("こんにちは " .. name)endname を playerPoints 辞書にキーとして挿入し、値としてプレイヤーのポイントを0に設定します。
local function setPoints(newPlayer)local name = newPlayer.Nameprint("こんにちは " .. name)playerPoints[name] = 0endname を使用してプレイヤーの名前を表示し、playerPoints[name] を使用して変数に一致するキーの値を表示します。
local function setPoints(newPlayer)local name = newPlayer.Nameprint("こんにちは " .. name)playerPoints[name] = 0print(name .. " は " .. playerPoints[name] .. " ポイントを持っています。")endプロジェクトを実行して出力を確認します。
完成したスクリプト
local Players = game:GetService("Players")
local playerPoints = {
}
local function setPoints(newPlayer)
local name = newPlayer.Name
print("こんにちは " .. name)
playerPoints[name] = 0
print(name .. " は " .. playerPoints[name] .. " ポイントを持っています。")
end
Players.PlayerAdded:Connect(setPoints)
オプショナルチャレンジ
以下は、辞書をさまざまな方法で使用することに関連するいくつかのチャレンジです。これらのコードを構築できるか試してみてください。
- プレイヤーに時間をかけてダメージを与える罠パートを作成します。プレイヤーが罠に触れたらダメージを与え、待機してから再度ダメージを与えられるようにします。
- 辞書にアクセスして、2人のプレイヤーのどちらが最も多くのポイントを持っているかを確認する関数を作成します。
- 文字列を別のものにスワップして「秘密の」コードを作成する暗号を作成します。例えば、文字「A」を「G」に、単語「apple」を「orange」にスワップすることができます。
辞書と pairs()
pairs() は、辞書を反復処理するためによく使用される関数です。以下に例を示します。
local myDictionary = {["青いプレイヤー"] = "アナ",["金のプレイヤー"] = "ビン",["赤いプレイヤー"] = "ケイト",}for key, value in pairs(myDictionary) doprint(key .. " は " .. value .. " です")end
pairs()を使用して、辞書要素のキー、値、または両方を操作できます。以下のforループでは、最初の変数がキー、2番目の変数が値です。操作したい辞書が pairs() に渡されます。
local inventory = {["金のレンガ"] = 43,にんじん = 3,たいまつ = 2,}print("あなたは持っています:")for itemName, itemValue in pairs(inventory) doprint(itemValue, itemName)end
実行すると、次のように出力されます。
あなたは持っています:43 金のレンガ3 にんじん2 たいまつ
概要
辞書は、インデックス値の代わりにキーと値のペアを使用するテーブルです。辞書と配列は、波括弧を変数に割り当てるところから始まります。エントリはコンマで区切ります。
辞書内のすべてのキーは同じデータ型を使用する必要がありますが、値は異なるデータ型を混合しても問題ありません。
辞書にアクセスする方法は、その目的を示すことができます。敵のプロパティの辞書は、ドット演算子を使用してアクセスされる可能性が高く、名前のリストは tableName[keyName] を使用してアクセスされる可能性が高いです。
ブラケットを使用するときは注意が必要です。テーブル内に作成されたキー名は文字列として扱わなければなりません: tableName["keyName"]。ただし、パーツのようなオブジェクトを参照する場合、引用符は必要ありません: tableName[keyName]。
多くのスクリプトは辞書や配列を通過する必要がありますが、これらのデータ構造の開始点と終了点を常に知っているわけではありません。たとえば、プレイヤーの辞書が変わっている場合や、プレイヤーが異なるサイズの配列を持つインベントリを持っている場合があります。
こうした状況では、pairs() や ipairs() を使用して、開始点と終了点がわからない状態で各要素をループ処理できます。また、in キーワードを使用して、pairs() や ipairs() を必要とせずに要素をループすることもできます。