鸟语天空
xLua——面向对象编程(OOP)
post by:追风剑情 2021-8-19 15:41

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


评论:
发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容