RobloxでModuleScriptは非常に便利ですが、基本的な使い方としては、関数をまとめたライブラリ的な使い方や、グローバルな変数のみを管理したstaticクラスみたいな使い方になるかと思います。
ただ、モジュールによっては、インスタンス(Object)化して、それぞれでプロパティを別個に管理にするような使い方もしたくなりますよね。
こちらでは、そんなやり方を解説していきます。
実装方法
Moduleの関数はLuaのメタテーブルで参照できるようにして、インスタンス生成のnew関数を別途作る、ってやってあげればそれが可能となります。
以下が例です。
Timerという、Startからの経過時間を取得したり、設定時間が終わったかを取得できるModule。
local Timer = {}
Timer.__index = Timer
function Timer.new()
local obj = setmetatable({}, Timer)
obj._StartTime = os.clock()
obj.Span = nil
return obj
end
function Timer:Start()
self._StartTime = os.clock()
end
function Timer:StartWithSpan(span)
self._StartTime = os.clock()
self.Span = span
end
function Timer:GetTime()
return os.clock() - self._StartTime
end
function Timer:Clear()
self.Span = nil
end
function Timer:IsEnd()
if self.Span then
return self:GetTime() >= self.Span
else
return false
end
end
return Timer
コードの中身の話
Luaではテーブルに隠れプロパティとしてメタテーブルというものを付与できます。
メタテーブルは、単純にテーブル要素としてアクセスはできない(「.」などでは取れない)隠れ要素的な存在です。
ただこのメタテーブルにはいろいろな演算などの要素があって、
例えば
__add は + 演算のときに行われる処理
などがあります。
このメタテーブルのなかで特にオブジェクト指向化に有用なのが「__index」。
「__index」にテーブルが設定されている場合、そちらからも指定プロパティを探すという、Luaのメタテーブルの仕組みを使います。
結果__indexにセットしたテーブルの関数はあたかも、そのオブジェクトの関数のように使うことができます。
これにより、継承
コメント