■はじめに
書籍「スクリプト言語による効率的なゲーム開発 C/C++へのLua組み込み実践」を使ってLuaの学習を行いました。
ズブの素人がこの本とWEB上の情報を参考に学習を進める際に躓いたポイントを纏めていこうと思います。
かなり初歩的なことしか書かないと思います。
■開発環境
- Lua 5.1.5
- tolua++ 1.0.92
- Visual Studio 2022 Community
- Intellij IDEA 2022.2.4
- EmmyLuaプラグインを使用
- Visual Studio Code
- Lua Helper Guideプラグインを使用
■tolua++の開発が停止中
本書は LuaとCpp の繋ぎ部分を楽にするために tolua++ を使用してグルーコードを生成していましたが、
書籍に載っているWEBページが404になっていました。
幸いtolua++を試している方がいらっしゃったので参考にさせていただきました。
ただし、tolua++が10年以上更新が止まっておりLua5.1までしか対応していないようですので、よっぽどの理由がない限り使わないほうが良いかと思います。
■オブジェクト指向的なメソッドコールの種類
オブジェクト指向的な書き方が出来るLuaで2種類のメソッドコールがあり使い分けが最初わかりませんでした。
下記の例のようにself部分を省略するかどうかのようです。
function Character:move(x, y)
-- 中略
end
local chr = Character:new()
-- ドットの場合
chr.move(chr, 100, 200)
-- コロンの場合
chr:move(100, 200)
変数に持たせたりコルーチンにわたす際はドットしか渡せないようでした。
local chr_move1 = chr.move -- OK
local chr_move2 = chr:move -- ERROR
local co1 = coroutine.create(chr.move) -- OK
local co2 = coroutine.create(chr:move) -- ERROR
■テーブルによる変数管理
変数が格納されているのはあくまでテーブルなんだということを知れた良い例でした。
例えば、Pointというテーブルの定義があるとします。
Point = {
count = 0,
}
function Point:new()
local table = {}
local mt = { __index = Point }
setmetatable(table, mt)
return table
end
function Point:add_count()
self.count = self.count + 1
self["count"] = self["count"] + 1
end
下記の出力結果は「PointCount:2」となります。
self.count
でも self["count"]
でも同様にアクセスできることがわかります。
dofile("point.lua")
local point = Point:new()
print("PointCount:"..point:add_count())
■まとめ
書籍がしっかりサポートしてくれたので難しいと思っていたガベージコレクションやコルーチンの部分で躓くことはほぼ有りませんでした。
基礎的な部分はかなりサッパリと記載されているので、プログラムに慣れている方がLuaを学びたいと思うなら丁度いい難易度の書籍だと思います。
■おまけ1:書籍の注意点(2022/12/11現在)
著者が用意しているサンプルはページが存在しないようで入手することが難しくなっていますのでお気をつけください。
■おまけ2:EmmyLua と Lua Helper Guide
今回の学習にあたって最初にEmmyLuaを使用していたのですが、途中からLua Helper Guideに変更しました。
理由としては、Lua Helper Guideにはデバッガーの機能も入っており、スクリプト単体でテストする際にステップ実行をすることが出来るのが大変便利でした。
他にもターミナル上からリアルタイムに引数を変えたりもできたので、そのポイントも良かったと思います。
難点を上げるとすると、出力される言語が中国語なのでコンソールログ等の解読には少し苦労しました。