【Roblox】ModuleScriptをインスタンス化して別個に利用するやり方

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にセットしたテーブルの関数はあたかも、そのオブジェクトの関数のように使うことができます。

これにより、継承

コメント

タイトルとURLをコピーしました