読者です 読者をやめる 読者になる 読者になる

UZABASE Tech Blog

株式会社ユーザベースの技術チームブログです。 主に週次の持ち回りLTやセミナー・イベント情報について書きます。

Lua

技術ミーティングでLTをしたので、ブログでも書きます。
テーマはLuaです。


Luaとは
リオデジャネイロ・カトリカ大学で開発されたスクリプト言語です。
もともとC言語などに組み込まれることを想定しているため、高速な動作、高い移植性、組み込みが容易な事が特徴として挙げられます。

実用例
・FF14←もはや()
・Baldur’s Gate
・VOCALOID3←残念ながら我らがミクさんはVOCALOID2です。
ヤマハのルータ

などで使われています。

Luaスクリプト言語としては速度が速く、組み込みもしやすいのでゲーム制作で活躍しています。
(キャラクターの移動であったり、AIの思考ルーチンだったり……変更が多い箇所で活躍)

どれくらい早いのかは下記を参照してください


特徴
Rubyなんかでおなじみの連想配列
・関数が変数として扱えるJavascriptのような機能
ガベージコレクションが採用されておりメモリ管理も楽ちん

更に、今回紹介したい面白機能として「コルーチン」があります。
スクリプト言語による効率的ゲーム開発 新訂版」によれば協調的マルチスレッドを実現する機能で平たく言えば実行を途中で止めたり、途中から再開したりできるような関数が作れます!


実例
[コード]
function func(x)
for i=0,3 do
print(x..i)
coroutine.yield()
end
end

co1 = coroutine.create(func)
co2 = coroutine.create(func)

while true do
r1 = coroutine.resume(co1, "A")
r2 = coroutine.resume(co2, "B")
if (r1 and r2) == false then
break
end
end
--

coroutine.yieldで関数を抜けて
coroutine.resumeで再開するんですが……

[実行結果]
A0
B0
A1
B1
A2
B2
A3
B3

おぉ……ちゃんと途中で切って途中からプログラムが走ってる……


風……なんだろう吹いてきてる確実に、着実に、俺たちのほうに!
なんだかおもしろいことができそうでwktkします。

--
[参照]
スクリプト言語による効率的ゲーム開発 新訂版