一、模拟OOP中的Class
--用lua进行面向对象的编程,声明方法和调用方法统一用冒号,对于属性的调用全部用点号
--用一个全局Class函数模拟OOP中的Class类
--name:类名称, base_cls:基类table
function Class(name, base_cls)
local cls = {}
local mtbl = {}
cls.__name = name
--将元表设为自己
--当子类中查找不到的东西,会到父类的__index中查找
cls.__index = cls
mtbl.__name = name
--设置基类
mtbl.__index = base_cls
--模拟OOP中的 new 类名()
--cls()就相当于调用mtbl.__call()
mtbl.__call = function(self)
return self:new()
end
--cls继承mtbl
setmetatable(cls, mtbl)
--构造函数
function cls:ctor(luaBehaviour)
--print("ctor")
end
--创建实例函数,模拟OOP中的new关键字
function cls:new()
local new_obj = {__name = self.__name }
return setmetatable(new_obj, self)
end
return cls
end
二、模拟Unity中的MonoBehaviour
local TestUI = Class("TestUI")
function TestUI:Awake()
print("lua Awake")
--直接获取常用组件字段
print(self.this) --LuaBehaviour
print(self.gameObject)
print(self.transform)
--非UGUI元素时,此值为nil
print(self.rectTransform)
--获取UI传参(table)
print(self.parameter)
--通过调用C#方法获取Button组件
local go = self.transform:Find("Button")
self.btn = go:GetComponent(typeof(CS.UnityEngine.UI.Button))
--按钮注册事件回调
self.btn.onClick:AddListener(self.OnClickButton)
--按钮移除事件回调
--self.btn.onClick:RemoveListener(self.OnClickButton)
end
function TestUI:OnEnable()
print("lua OnEnable")
--创建一个子类
--local t = TestUI:new()
--相当于调用__call()
--local t = TestUI()
--print("t "..t.__name)
end
function TestUI:OnDisable()
print("lua OnDisable")
end
function TestUI:Start()
print("lua Start")
end
function TestUI:Update()
print("lua Update")
end
function TestUI:LateUpdate()
print("lua LateUpdate")
end
function TestUI:OnDestroy()
print("lua OnDestroy")
--必须置为nil释放引用
self.btn.onClick = nil
end
--按钮 OnClick
function TestUI:OnClickButton()
print("OnClickButton")
end
--如果采用OOP方式编程,这里一定要返回作为类的table对象
return TestUI
三、Lua侧入口程序
main.lua
require 'Class'
--更多...