为了更好的在lua中开发模块,我们可以把其他语言中的面向对象拿过来使用。
1.模拟C#中的类
----------------------------------------------------------------------
--- 类相关
----------------------------------------------------------------------
local function _ctor(...)
return
end
--[[
实例化一个obj对象,作为cls的实例,同时调用obj对象的ctor方法用于初始化对象
]]--
local function _new(cls, ...)
local obj = {}
--将这个表设置元表
setmetatable(obj, {__index = cls})
--初始化构造函数
obj:ctor(...)
return obj
end
local function _tostr(cls)
return cls.__printName
end
--[[ 构造一个类。
(string)类名称
(class)基类
使用class方法构造表后,直接调用New方法和使用表明()这两种方法是等价的,都是为了触发_new方法
]]--
function class(name, base)
local cls = {}
--给表里存字段,模拟类
--类名
cls.__cname = name
--输出类名
cls.__printName = "class " .. name
--类的构造函数
cls.New = _new
--元表的属性,模拟继承,先去自身找,找不到去父类base里面找
local mt = {
__index = base,
__call = _new,
__tostring = _tostr,
}
--设置继承关系
setmetatable(cls, mt)
--构造
if cls.ctor == nil then
cls.ctor = _ctor
end
return cls
end
2.模拟C#中的接口
–[[
让类t拥有接口的功能,模拟多继承。
改方法用于将接口中的方法都拷贝到当前类中。
]]–
function implement(t, …)
for _, tmp in ipairs({…}) do
for k, v in pairs(tmp) do
if t[k] ~= nil then
print(format(“WARN: the method ‘%s’ will be covered”, k))
end
t[k] = v
end
end
end
3.模拟C#中的枚举
–协议类型–
ProtocalType = {
BINARY = 0,
PB_LUA = 1,
PBC = 2,
SPROTO = 3,
}
4.模拟C#中的单例
local PlayerManager = class("PlayerManager")
local playerDic = {}
local Instance = nil
function PlayerManager:ctor()
end
function PlayerManager:GetInstance()
if Instance == nil then
Instance = PlayerManager()
end
return Instance
end
--添加的话根据角色物体添加
function PlayerManager:AddPlayer(player)
playerDic[player.name]=player
--写入到一个文件中记录一下,方便以后的查找移除
end
--移除的话根据角色名字移除
function PlayerManager:RemovePlayer(playerName)
for name,player in pairs(playerDic) do
if playerName == name then
playerDic[name] = nil
name = nil
end
end
end
function PlayerManager:GetPlayerGameObject(playerName)
for name,player in pairs(playerDic) do
if playerName == name then
return playerDic[name]
end
end
end
return PlayerManager
4.调用单例
function PlayerController:CreatePlayer()
print(self.playerPath)
if self.playerPath ~= nil then
local go = Resources.Load(self.playerPath)
print(go.name)
self.player = GameObject.Instantiate(go)
print(self.player.name)
self.player.transform.position = Vector3.New(0,0,0)
--实例化的时候添加到角色管理器中,方便在其他地方拿到角色这个游戏物体
PlayerManager:GetInstance():AddPlayer(self.player)
end
end