多くのスクリプトでは、辞書や配列を通過する必要があります。しかし、時にはこれらのデータ構造の開始点や終了点がわからないことがあります。たとえば、プレイヤーの辞書は変化するかもしれませんし、プレイヤーはサイズの異なる配列の在庫を持っている場合があります。
こうした状況では、pairs() と ipairs() を使用できます。これらは、開始点や終了点が未知の状態で各要素を通過するために、for ループと組み合わせて使用できます。
この記事では、それらの使用方法を説明し、料理ゲームでレストランの注文を追跡する実用的なスクリプト例を紹介します。
辞書と pairs()
pairs() は 辞書と共に使用されます。以下に例を示します。
local myDictionary = {["Blue Player"] = "Ana",["Gold Player"] = "Binh",["Red Player"] = "Cate",}for key, value in pairs(myDictionary) doprint(key .. " は " .. value)end
pairs() は辞書要素のキー、値、またはその両方を操作するために使用できます。以下の for ループでは、最初の変数はキーです。2番目の変数は値です。操作したい辞書は pairs() に渡されます。
local inventory = {["Gold Bricks"] = 43,Carrots = 3,Torches = 2,}print("あなたは持っています:")for itemName, itemValue in pairs(inventory) doprint(itemValue, itemName)end
実行すると、コードは以下のように出力します:
あなたは持っています:43 ゴールドブリック3 にんじん2 トーチ
配列と ipairs()
ipairs() は 配列と共に使用されます。ipairs() の "i" は "index" を意味します。ordered values(順位のある値)を操作するために、ipairs() と配列を組み合わせて使用します。以下の例をご覧ください。
local players = {"Ali", "Ben", "Cammy"}for playerRank, playerName in ipairs(players) doprint("勝者 #" .. playerRank .. " は " .. playerName)end
実行すると、コードは以下のように出力します:
勝者 #1 は Ali勝者 #2 は Ben勝者 #3 は Cammy
練習 - レストランスープシミュレーター
プレイヤーが可能なスープの材料のリストから選択するレストランシミュレーター用に、スープを作ってみましょう。材料はキーとして保存され、値は最初は false となり、プレイヤーは選択したものだけを受け取ります。
pairs() を使用して選択されたものを確認し、その後 ipairs() を使用して材料のリストを出力します。
menu という新しい 辞書を作成します。キーが材料で、値が false の 3 ~ 5 のキーと値のペアを追加します。
local menu = {cabbage = false,beef = false,tomato = false,noodles = false,}メニュー辞書の下に、後で顧客の選択で埋める 空の配列を追加します。
-- 顧客のスープlocal selectedIngredients = {}pairs() を使用して、辞書内の各材料が true か false かをチェックします。true の場合、その材料をスープに追加します。
-- 顧客のスープlocal selectedIngredients = {}-- 顧客の選択をスープに追加for menuChoice, value in pairs(menu) doif value thentable.insert(selectedIngredients, menuChoice)endend顧客に注文を復唱します。スクリプト内に以下をコーディングします。
- selectedIngredients にメニュー項目があるか確認します。ある場合は「"あなたはスープに次のものを注文しました:"」と出力します。
- ipairs() を使用して selectedIngredients 配列を通過し、各材料を出力します。
- 少なくとも 1 つのメニューアイテムを true に変更してテストします。
-- "selectedIngredients" からスープの注文を出力if #selectedIngredients > 0 thenprint("あなたはスープに次のものを注文しました: ")for index, soupIngredient in ipairs(selectedIngredients) doprint(soupIngredient)endendメニュー項目があるかどうかを確認する if 文に、顧客に選択した材料がない場合を伝える else 条件を追加します。
if #selectedIngredients > 0 thenprint("あなたはスープに次のものを注文しました: ")for index, soupIngredient in ipairs(selectedIngredients) doprint(soupIngredient)endelseprint("何も選択されていません。お腹が空いていないのですか?")end
任意のチャレンジ
以下は、pairs と ipairs を異なる方法で使用するためのチャレンジです。これらのためにコードを構築できるか試してみましょう。
チャレンジ: ウェイター NPC を作成 出力ウィンドウを使用する代わりに、配列の紹介 からの NPC を使用して顧客の注文を取るウェイターを作成します。
チャレンジ: プレイヤーが注文を出せるように プレイヤーが近接プロンプトなどの物理的なパーツに触れることで材料を選択できるようにします。詳しくは 近接プロンプト を参照してください。
上級チャレンジ: スープシミュレーターを作れ プレイヤーがシェフとなるレストランシミュレーターを作成します!プレイヤーは、ウェイターからの指示に従って材料を組み合わせて注文に合ったものを作る必要があります。
- 3 ~ 5 つの異なる材料のゲーム内プロップを作成します。
- このレッスンの辞書に似た 3 ~ 5 のレシピを作成します。
- すべてのレシピを保持する配列を作成します。
- レシピをランダムに選択し、NPC を使用してプレイヤーに材料を伝えます。
- プレイヤーが触れるプロップ材料に基づいてレシピを作成する新しい辞書を作成します。
- プレイヤーのレシピと NPC が選んだレシピを比較します。
- タイマーなどの追加条件を加えてチャレンジを増やします。