一、模拟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'
--更多...