辞書は、インデックスの代わりに名前やキーを値に関連付けるテーブルです。
例:
local pet = {
Name = "ボビー",
Type = "犬",
}辞書は、値にラベルを付ける必要があるときに使用します。配列のように順番にリストするだけではありません。このチュートリアルでは、プレイヤーに関連付けられた値を操作することで辞書を使用する練習をします。
辞書の構文
配列と同様に、辞書は波括弧 {} で変数に割り当てられます。キー-値ペアは、カンマの後に別々の行に保存されます。キーと値は、文字列、数値、変数名など、任意のデータ型にすることができます。
local playerNames = {
player1 = "ザップ",
player2 = "ケル",
}
print(playerNames["player1"])部分や他のインスタンス化されたオブジェクトをキーとして参照するには、ブラケットを使用します。
local greenPart = workspace.GreenPart
local redPart = workspace.RedPart
local 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)プレイテストを行い、出力ウィンドウを確認します。
既存の変数をキーとして使用する
辞書は、スクリプトの他の部分で宣言された既存の変数と相互作用できます。以下のコーディング例では、プレイヤーがゲームに参加したときに変数を使用してプレイヤーの名前をキーとして追加し、その後ポイントの値を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 を取得する変数を追加します。これはすべての Player オブジェクトにあるプロパティで、テスト用の 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) do
print(key .. " は " .. value .. " です")
endpairs() は、辞書要素のキー、値、またはその両方を操作するために使用できます。以下の for ループでは、最初の変数がキーです。2番目の変数が値です。操作したい辞書は pairs() に渡されます。
local inventory = {
["金のレンガ"] = 43,
ニンジン = 3,
トーチ = 2,
}
print("あなたは持っています:")
for itemName, itemValue in pairs(inventory) do
print(itemValue, itemName)
end実行すると、コードは以下のように出力されます。
あなたは持っています:
43 金のレンガ
3 ニンジン
2 トーチまとめ
辞書は、インデックス値の代わりにキー-値ペアを使用するテーブルです。辞書と配列は、波括弧を変数に割り当てることで似たように始まります。エントリはカンマで区切ります。
辞書内のすべてのキーは同じデータ型を使用する必要がありますが、値はデータ型を混合しても問題ありません。
辞書へのアクセス方法は、その目的を伝えることができます。敵のプロパティの辞書は、ドット演算子でアクセスされる可能性が高いですが、名前のリストは tableName[keyName] を使用する可能性が高いです。
ブラケットを使用する際は注意が必要です。テーブル内で作成されたキー名は文字列として扱う必要があります: tableName["keyName"]。ただし、パーツのようなオブジェクトを参照する場合、引用符は必要ありません: tableName[keyName]。
多くのスクリプトは辞書や配列を通過する必要がありますが、これらのデータ構造の開始点と終了点を常に知っているわけではありません。たとえば、プレイヤーの辞書が変化している場合や、プレイヤーがさまざまなサイズの配列インベントリを持っている場合があります。
このような状況では、pairs() や ipairs() を使用して、開始点と終了点が不明な各要素をループすることができます。また、in キーワードを使用して、pairs() や ipairs() を必要とせずに要素をループすることもできます。