スポンサーリンク

【Roblox開発】Luaの基本:制御構文(if、for、while、repeat)

Roblox

Roblox(ロブロックス)のゲーム開発のスクリプト言語に使われているLuaスクリプトに関する解説です。

ここではLuaプログラミングの基本となる制御構文について説明しています。

本コンテンツの内容は、2021年現在Roblox Studioで利用できるLuaスクリプトバージョン5.1.4を基準に記述しています。また、RobloxのLuaには利用できる構文などに違いがあるため、特別な記載がない限りRobloxでの使用における解説を前提に記述しています。

スポンサーリンク

Luaの制御構文

if文

if文は条件式による処理の分岐を行うための構文です。

ある条件式を指定し、それが真か偽かによって異なるブロックの処理を実施します。

書式
もし条件を満たすならブロックを処理する

ある条件を満たすときにブロックを処理する場合、if 条件式 then ブロック endの構文で記述できます。この場合、条件が満たされなければ何も処理されません。

if 条件式 then
  ブロック
end
もし条件を満たすならブロック1を処理し、そうでなければブロック2を処理する

ある条件を満たす場合と、そうでない場合の2通りの処理を分岐させたい場合、if 条件式 then ブロック1 else ブロック2 endの構文で記述できます。この場合、ブロック1もしくはブロック2の処理のいずれかが必ず処理されます。

if 条件式 then
  ブロック1
else
  ブロック2
end
複数の条件のいずれかを処理する

elseifを使用することで、条件を変えて複数のブロックへの処理の分岐を行うこともできます。elseif 条件式 then ブロックの構文は複数回記述することができます。

if 条件式1 then
  ブロック1
elseif 条件式2 then
  ブロック2
elseif 条件式3 then
  ブロック3
else
  ブロック4
end

C言語やJava、phpなどにあるswitch構文はLuaには無いため、elseif構文を使って代用します。

for文

for文は、設定した回数を繰り返しループし、反復処理を行うための構文です。

while文と似た繰り返し処理ですが、for文では繰り返しごとに制御変数の値の自動的な加算や、処理するデータ要素の値の生成が自動的に行われます。

Luaにおけるfor文には2通りの書式があります。

制御変数による繰り返し

ある変数を指定し、その値が条件を満たすまで処理を繰り返します。

書式
for 名前 = 開始値, 終了値 (,加算値) do ブロック end

名前で指定された変数などが開始値で始まり、終了値を超えるまでブロックに記述された処理が繰り返し行われます。ブロックの処理が1度終わると変数に数値が1加算され、最初の処理に戻ります。

開始値、終了値、加算値の評価はループが始まる前に行われます。開始時に評価が成立するような場合、for文のループ処理は一度も行われません。(最低0回のループ処理)

local count = 5
local x = 0
for i = 1, count do 

  x = x + 1
end

また、加算値を指定することで、反復時に加える値を変更することができます。この値が指定されていない場合は1が使われます。

なお、forのループ変数(名前)はループ本体のローカル変数となり、for文の外からは参照できません。ループ処理の終了後にその値を利用するにはループ内で他の変数に値を保管しておく必要があります。

local count = 5
local n

for i = 1, count do
  print(i.."番目をチェックしています") --参照できる
  if myArray[i] == "ぴよぴよ" then
    n = i
    break
  end
end

if n < 5 then
  print(i.."番目に見つかりました") --参照できない(エラー)
  print(n.."番目に見つかりました") --参照できる
else
  print(count.."回探しても見つからなかったので諦めました")
end

データの各要素に対する繰り返し

table型の配列に含まれる値に対する処理など、指定したリストとなる対象の各要素に対して処理を繰り返します。

この構文は「汎用for文(generic for statement)」と呼ばれています。

local members = {"ほげほげ", "ふがふが", "ぴよぴよ"}

for member in members do
  print("こんにちは"..member.."さん")
end

while文

while文は、ある条件を満たすまでブロックを繰り返しループし、反復処理を行うための構文です。

for文と似た繰り返し処理ですが、制御変数の自動的な変更などは行われず、単純に評価を満たすまで処理がループします。

書式

repeat文

repeat文は、ある条件を満たすまでブロックを繰り返しループし、反復処理を行うための構文です。

for文と似た繰り返し処理ですが、制御変数の自動的な変更などは行われず、単純に評価を満たすまで処理がループします。

書式
repeat
  ブロック
until 条件式

whileとの使い分けがのポイントとして、repeat文ではブロック内部で宣言したローカル変数を条件式から参照できます。

goto文

RobloxのLuaスクリプトではgoto文は使用できません。

break文

break文は、ループ処理を終了(中断)するための構文です。

ループ内のブロックにbreakを記述することで、それを囲んでいる最も内側のループの処理を終了します。

break文はブロックの終了直前(endelseuntilなどの直前)でしか使えないというルールがあります。

しかしながら、ブロックはdo ... end文を使って明示できるため、do break endの構文を利用することで実質的にいずれの位置にも記述することが可能です。

return文

return文は、関数(無名関数なども含む)から値を返す(戻り値を渡す)ための構文です。

ブロックの最後の文にのみ記述することができ、戻り値を指定することで呼び出し元にその値を渡して処理を継続することができます。

書式
return 戻り値

タイトルとURLをコピーしました