Luaスクリプト事始めLuaが出たての頃、とにかく情報が少なくてどうして良いやらさっぱりわからなかった時がありました。昨今ではネット上に非常に沢山のLuaの情報が置かれるようになりました。いわゆるLuaなプログラム(if文とかループ文とか)についてはそういうサイトを参考にして頂ければと思います。その気になれば基本文法は2時間もあれば終わります。Lua組み込み編で注目したいのは、LuaのC言語とのやりとりの部分です。ここが出来て初めてゲームプログラムとの連携が取れるようになります。言え、何にも知らない状態からだと大変なのも確かなので、この章では簡単なプログラムを色々と作ってLuaに慣れて見ることにしましょう。lua_Stateがすべての始まりLuaはテキストでプログラムを作成します。テキストはそのままですと文字列ですから、誰かが解釈する必要がありますね。その解釈してくれる人、環境を「Luaステート」と呼ぶことにします。作ったコードをLuaステートに投げると、コードが走り出し、変数や関数などを保持してくれます。このLuaステートさんの存在をしっかり感じるのが、Luaスクリプトを体得する上で非常〜〜に大切だということを、私は使いながら学びました(^-^;。Luaには「lua.exe」という単独実行環境が提供されています。このアプリを実行するとコンソールウィンドウが表示され、1行ずつ実行される(インタプリタ)Luaプログラムを打つ事ができるようになります。100;と打ってEnterキーを押すと、実際にvalに100が代入されます。先程のvalは誰が覚えていてくれたのか?それがLuaステートさんです。lua.exeの中身ではLuaステートさんが一人作られて、打たれたプログラムを1行ずつ解釈してくれていたというわけです。逆に言えば、Luaステートさんはプログラムを行単位でいつでも解釈できる能力があります。Luaステートさんの存在を意識した上で、話をC言語側にしてみます。C言語側でLuaコードを解釈するためには「lua_State」というLua環境の管理者を通す必要があります。これが正にLuaステートさんです。lua_StateはLuaのすべてを握っていて、LuaコードとC言語とでデータのやり取りの仲立ちをしたり、内部で使用している変数を覚えてくれてたりします。実は「Luaコードが知らない変数や関数をC言語側で設定」出来ます。);というLuaコードをその後で読み込んでもプログラムは正常に動いてしまうんです。220);というのがLuaスクリプト内にいきなり出てきても、C言語側で予めLuaステートさんに「DrawLine関数」を教えておけばちゃんと動きます。C言語側でLuaステートに下準備をしてあげれば(=環境を作ってあげれば)、スクリプト側でいくらでも好きな関数や変数を使えるわけです。この感覚、とっても大切です。その大元となるlua_StateはluaL_newstate関数で作り、使い終わったらlua_close関数で削除します。削除を忘れるとメモリ内にいつまでも残るので注意が必要です。0;}lua_Stateオブジェクトの実体は構造体なのですが、この中身を触ることはまずありません。以後、あらゆるluaの関数にこのオブジェクトを渡していくことになります。Luaは内部でガベージコレクトを採用しています。そのため、lua_Stateオブジェクト意外でオブジェクトの寿命を管理する必要はありません。lua_Stateは沢山作れるlua_Stateは唯一というわけではありません。作ろうと思ったらメモリの許す限り作れます。これは実は割と重要な事だったりします。Luaスクリプトファイルを2つのlua_Stateで別々に読みこめば、完全に分離した環境で同じスクリプトを動かす事ができます。lua_Stateを作るのもスクリプトファイルを読み込むのも多少時間がかかる処理でメモリも食います。作れますが、毎フレーム作るとかは暴挙ですから気を付けて下さい。一度作ったLuaステートは必要に応じてとっておいて、再利用するのが良さそうに思います。スタック事始めLuaはスタックに始まりスタックに終わるほど「スタック」が超重要な鍵を握ります。そのスタックとは何か?これは値を積み上げた箱のようなイメージです。LuaはスクリプトとC言語側のやりとりの「すべて」をこのスタックで行います。これを理解しない限りはLuaを理解できません!図示するなら以下のような感じでしょうか:スタックは箱をどんどん積みます(push)。箱は上から外されます(pop)。この非常に単純な仕組みでLuaは値をやりとりするんです。このスタックはプログラムをする上で非常に大切なのですが、如何せん目に見えないので何ともイメージし辛いんですよね。そこで、現在積まれているスタックを見えるようにするヘルパー関数を一番最初に作ってしまうのを強くお勧めします。スタックに値を積むには主にlua_push****系の関数を使います。Luaはスタックに積める型が厳格に決まっています。値が無いのであり0ではない。