私はコロナ/ルアでゲームに取り組んでおり、ゲーム内の武器、鎧、お守りなどを表す「アイテム」と呼ばれるクラスを実装しています。オブジェクト指向のルアは初めてです。
クラスの新しいインスタンスを作成した後、オブジェクトの特定のプロパティを設定すると、オブジェクト自体ではなく、クラスのメタテーブルに設定されているように見えることがわかりました。
クラスとコンストラクタは次のとおりです。
local Item = {
name = nil,
itemType = nil,
scarcity = "basic",
baseDamage = 0, -- Bow only
bonuses = {
damageBonus = 0,
speedBonus = 0,
critBonus = 0,
dropBonus = 0,
rechargeBonus = 0,
xpBonus = 0
}
}
-- Creates a simple blank instance of the Item class.
function Item:new(o)
local item = o or {}
setmetatable(item, self)
self.__index = self
return item
end
ここで、このプロトタイプに基づいて 2 つのオブジェクトを作成するとします。
local bow = Item:new()
bow.itemType = "bow"
starterBow.baseDamage = 5
local ring = Item:new()
ring.itemType = "ring"
ring.bonuses.damageBonus = 0.25
残念なことに、「bonuses.damageBonus」プロパティがメタテーブル内で設定され、すべてのアイテムに適用されているようです (つまり、弓もダメージ ボーナスを受け取り、リングとスタックします)。ただし、動作は「ボーナス」プロパティに限定されているようです。「itemType」プロパティを設定すると、予想どおり、クラスではなくオブジェクトに関連付けられます。
私が見たい動作は、「ボーナス」テーブルのフィールドを個々のアイテムに設定できることです。私が間違っていることは何か分かりますか?ありがとう!