配列の内容は、プレイヤーのインベントリからアイテムを削除する必要があるときなど、頻繁に変更する必要があります。Luauには、これを簡単にするためにテーブルと一緒に使用できるビルトイン関数があります。
この記事では、値の検索方法を説明しつつ、追加や削除のようなテーブル用のあらかじめ作成された関数を概説します。
これらのスキルを応用するために、プレイヤーのインベントリを管理するスクリプトを作成します。

配列に値を追加する
配列に新しい値を追加するには、table.insert(array, valueToInsert)を使用します。2番目のパラメータには、文字列、数値、またはPlayerやIntValueのようなオブジェクト全体など、任意の値を指定できます。
練習のために、プレイヤーアイテムをテーブルに保存し、それに追加するスクリプトを作成します。この例はスクリプトのみであるため、任意のファイルやプロジェクトで使用できます。コードのテストは、出力ウィンドウを使用して行います。
playerItemsという名前の空の配列を作成します。
playerItems = {}table.insert()と入力して、配列にインベントリアイテムを追加します。カッコ内に、追加するテーブルであるplayerItemsを入力し、各アイテムの文字列を続けて入力します。少なくとも3つの値を挿入します。
playerItems = {}table.insert(playerItems, "Potion")table.insert(playerItems, "Bread")table.insert(playerItems, "Sleeping Bag")print(playerItems)プロジェクトを実行します。出力ウィンドウで、3つのドット...を展開して印刷されたテーブルを確認します。
配列から値を削除する
値を削除するには、プレイヤーがアイテムを使用したときや、アクティブプレイヤーのリストの誰かが体験から離れたときなどに、table.remove()を使用します。提供されたパラメータによっては、関数はテーブルの最後の値を削除するか、特定のインデックスで削除することができます。
最後の値を削除する
時には、特定のアイテムを削除する必要がある場合があります。例えば、プレイヤーのインベントリの最初のアイテムを削除したり、リストの最初のプレイヤーを選択したりする場合です。配列の最後の値を削除するには、table.remove(arrayName)を使用します。この場合、必要な唯一のパラメータはテーブル自体です。
前の例からアイテムの配列を使用します。次に、テーブルから最後の値(この場合は"Sleeping Bag")を削除するために、table.remove(playerItems)と入力します。
playerItems = {}table.insert(playerItems, "Potion")table.insert(playerItems, "Bread")table.insert(playerItems, "Sleeping Bag")table.remove(playerItems)print(playerItems)プロジェクトを実行します。出力ウィンドウで最後の値"Sleeping Bag"が印刷されないことを確認します。
インデックスで削除する
配列の特定の位置にある値を削除するには、2番目のパラメータに削除するインデックスを入力します。例えば、table.remove(arrayName, 1)のようにします。
同じテーブルを使用して、table.remove()と入力します。パラメータには、テーブルの名前と1(削除する値)を入力します。
playerItems = {}table.insert(playerItems, "Potion")table.insert(playerItems, "Bread")table.insert(playerItems, "Sleeping Bag")table.remove(playerItems, 1)プロジェクトを実行します。最初の値"Potion"が削除されたことを確認します。
配列内の値を検索する
特定の値を配列内で、例えば勝利したプレイヤーの名前を見つけるには、table.find()関数を使用します。あるいは、forループとifステートメントを使用して自分自身で検索関数をコーディングすることもできます。
単一の値を見つけて返す
配列内の値を見つけるために、まず、配列を通過し、一致する値が見つかった最初の場所で停止するfindValue()という名前の関数を作成します。
値を見つけると、その関数はreturnキーワードを使用して、その値のインデックスを返します。インデックスを使えば、配列からそれを削除できます。
次に示す配列playerItemsをコピーします。
local playerItems = {"Potion","Bread","Bread","Sleeping Bag"}whichArray(検索する配列)とitemName(確認する特定の文字列)の2つのパラメータを持つ新しい関数findValue()をコードします。
local function findValue(whichArray, itemName)endfindValue()内で、forループを使用して、配列内の任意の値がitemNameに一致するかどうかを確認します。値が一致する場合、キーワードreturnを使用して、currentIndexに見つかった値を返します。
local function findValue(whichArray, itemName)for currentIndex = 1, #whichArray doif whichArray[currentIndex] == itemName thenreturn currentIndexendendendvalueFoundという変数を作成し、findValue()を呼び出して検索関数をテストします。検索する配列と、検索する値を渡します。コードを実行して、期待される出力がインデックス2であることを確認します。
local function findValue(whichArray, itemName)for currentIndex = 1, #whichArray doif whichArray[currentIndex] == itemName then-- currentIndexの値を返すreturn currentIndexendendendlocal valueFound = findValue(playerItems, "Bread")print("値はインデックス " .. valueFound .. " にあります")
値を削除する
見つけ関数を使用して値が見つかった場合、それを削除することができます。valueFoundの中に値があるかどうかをifステートメントで確認します。
valueFoundの中に値があるかどうかを確認し、ある場合はtable.remove()を使用してその値を削除します。
if valueFound thentable.remove(playerItems, valueFound)end次のコードを使用して配列を印刷します。
for index = 1, #playerItems dolocal itemString = playerItems[index]print("インデックス " .. index .. ": " .. itemString)endプレイテストして、最初の"Bread"の値が配列から削除されたことを確認します。findValue()の第2パラメータを変更することで、他の値を削除してみてください。
この関数は一度呼ばれたため、"Bread"の最初のインスタンスのみが削除されました。次のセクションでは、全てのインスタンスを見つけて削除する方法を説明します。
特定の値の全てのインスタンスを見つけて削除する
前のコードは見つかった値の最初のインスタンスのみを削除できましたが、このコードスニペットは配列内の全ての出現を見つけて削除します。例えば、プレイヤーがゲーム内の店で全てのパンを売りたい場合などです。
少なくとも4つの値と重複のセットを持つplayerItemsという配列を使用します。
local playerItems = {"Potion","Bread","Bread","Sleeping Bag"}配列を通過するために、#playerItemsから1に向けて、-1ずつ増加するforループを作成します。
for index = #playerItems, 1, -1 doendループ内でifステートメントを使用して、playerItems[index]の値が"Bread"と等しいかどうかを確認し、そうであればそのアイテムを削除します。
for index = #playerItems, 1, -1 doif playerItems[index] == "Bread" thentable.remove(playerItems, index)endend配列を印刷する2つ目のforループを追加するために、次のコードを使用します。
for index = 1, #playerItems dolocal itemString = playerItems[index]print("インデックス " .. index .. ": " .. itemString)endスクリプトを実行して、全ての"Bread"という名前の値が削除されていることを確認します。
まとめ
値は配列に追加または削除することができますが、そうすることでインデックスがシフトすることに注意が必要です。ループを使用してテーブルを反復し、値の全てのインスタンスを削除したり、見つかった最初のインスタンスを削除したりします。
returnキーワードを使用してループを停止し、必要に応じて情報を返すことができます。
完成したスクリプトのバージョンは、以下で参照できます。
このプロジェクトには、このチュートリアルの全てのスクリプトが含まれています。ダウンロードはこちらから。
すべてのスクリプトはServerScriptServiceにあり、無効になっています。スクリプトを使用するには、プロパティで無効フィールドのチェックを外し、スタジオを実行します。