Lua の基礎
このページは、Lua をはじめて触る人向けの入門です。Lua スクリプトエフェクトで使える範囲に絞って、 言語そのものの書き方を学びます。エンジンは Lua 5.2 互換の MoonSharp です。 ファイル入出力やコルーチンなど一部の機能は使えません。詳しくは標準ライブラリを参照してください。
コメント
Lua のコメントは -- から行末までです。複数行コメントは --[[ から ]] までです。
コメントは実行に影響しません。なお、行頭の --track: や --!native のような特定の書式は
プラグインが解釈する指定子として扱われます。
| 書き方 | 意味 |
|---|---|
-- text | 1 行コメント |
--[[ text ]] | 複数行コメント |
値と型
Lua の値には次の型があります。スクリプトでよく使うのは数値・文字列・真偽値・テーブルです。
| 型 | 例 | 説明 |
|---|---|---|
| nil | nil | 値が無いことを表す。未定義の変数も nil |
| boolean | true, false | 真偽値。条件分岐で使う |
| number | 10, 3.14, -0.5 | 数値。内部は倍精度浮動小数点 |
| string | "hello", 'abc' | 文字列 |
| table | {1, 2, 3} | 配列や連想配列に使う唯一の構造体 |
| function | function(x) return x end | 関数も値として扱える |
false と nil だけです。
0 も ""(空文字列)も「真」です。これは C や JavaScript と違うので注意してください。
変数
変数は local を付けて宣言します。local を付けるとそのブロック内だけで有効な
ローカル変数になります。付けないとグローバル変数になります。スクリプトでは原則 local を使ってください。
local a = 10
local b = 20
local sum = a + b
obj.x = sum
複数の変数を一度に宣言・代入できます。
local x, y = 100, 200
x, y = y, x
演算子
| 分類 | 演算子 |
|---|---|
| 算術 | + - * / %(剰余) ^(べき乗) |
| 比較 | == ~=(等しくない) < > <= >= |
| 論理 | and or not |
| 連結 | ..(文字列の連結) |
| 長さ | #(文字列やテーブルの長さ) |
and と or は値を返します。a and b は a が偽なら a、
真なら b を返します。a or b は a が真なら a、偽なら b を返します。
これを使うと既定値を簡潔に書けます。
local amp = obj.track0
local v = amp ~= 0 and amp or 50
obj.x = obj.x + v
このプラグインは、標準の Lua に無い記法(is not・??・複合代入・範囲 for など)も追加しています。
詳しくは構文拡張を参照してください。
条件分岐
if obj.t < 0.5 then
obj.alpha = 255
elseif obj.t < 0.8 then
obj.alpha = 128
else
obj.alpha = 0
end
三項演算子の代わりに and / or を使うのが定番です。
obj.alpha = obj.check0 and 255 or 0
繰り返し
数値 for
for 変数 = 開始, 終了 [, 増分] do ... end です。終了値も含みます。
local total = 0
for i = 1, 10 do
total = total + i
end
ピクセル処理では 0 始まりで幅・高さ分ループするのが基本形です。
for y = 0, obj.h - 1 do
for x = 0, obj.w - 1 do
local r, g, b, a = obj.getpixel(x, y)
obj.setpixel(x, y, 255 - r, g, b, a)
end
end
汎用 for(ipairs / pairs)
配列を順に走査するなら ipairs を、すべてのキーを走査するなら pairs を使います。
local points = {10, 20, 30}
local sum = 0
for index, value in ipairs(points) do
sum = sum + value
end
while と repeat
local i = 0
while i < 5 do
i = i + 1
end
local j = 0
repeat
j = j + 1
until j >= 5
関数
関数は function で定義します。スクリプト内で定義した関数は入力補完にも出ます。
local function ease(t)
return t * t * (3 - 2 * t)
end
obj.alpha = ease(obj.t) * 255
複数の戻り値
Lua の関数は複数の値を返せます。anim.polar など多くの組み込み関数がこれを使います。
local function offset()
return 10, -20
end
local dx, dy = offset()
obj.x = obj.x + dx
obj.y = obj.y + dy
可変長引数
local function sum(...)
local total = 0
for _, v in ipairs({...}) do
total = total + v
end
return total
end
テーブル
テーブルは Lua で唯一の複合データ構造で、配列にも連想配列にも使えます。
配列として
local list = {5, 10, 15}
local first = list[1]
local count = #list
obj.getpixel(x, y) の座標や、数値 for を 0 から回す処理は別物です。
ピクセルデータプロキシのインデックスは 1 始まりです(ピクセル操作)。
連想配列として
local config = { speed = 90, radius = 100 }
obj.rz = time * config.speed
テーブル操作
table ライブラリで挿入・削除・連結・並べ替えができます。
local t = {}
table.insert(t, 1)
table.insert(t, 2)
table.sort(t)
local joined = table.concat(t, ",")
文字列
文字列は string ライブラリで整形・検索できます。連結は .. です。
local label = string.format("%.1f", obj.t)
local upper = string.upper("abc")
local n = string.len(label)
標準で使える数学関数
math ライブラリに基本的な数学関数があります。よく使うものだけ挙げます。
local r = math.sqrt(obj.x * obj.x + obj.y * obj.y)
local angle = math.atan2(obj.y, obj.x)
obj.rz = math.deg(angle)
obj.zoom = math.max(0.1, 1 + math.sin(time))
全関数の一覧は 標準ライブラリ を参照してください。 アニメーション向けの高度な補間や波・ノイズは anim ライブラリ にまとまっています。
このエフェクト特有の注意点
標準 Lua との違いとして、使える標準ライブラリの範囲、乱数の扱い、5 秒の実行時間制限などの制約があります。 これらは制限事項とトラブルにまとめています。