xLua——面向对象编程(OOP)

作者:追风剑情 发布于:2021-8-19 15:41 分类:Lua

一、模拟OOP中的Class

  1. --用lua进行面向对象的编程,声明方法和调用方法统一用冒号,对于属性的调用全部用点号
  2. --用一个全局Class函数模拟OOP中的Class
  3. --name:类名称, base_cls:基类table
  4. function Class(name, base_cls)
  5. local cls = {}
  6. local mtbl = {}
  7. cls.__name = name
  8. --将元表设为自己
  9. --当子类中查找不到的东西,会到父类的__index中查找
  10. cls.__index = cls
  11. mtbl.__name = name
  12. --设置基类
  13. mtbl.__index = base_cls
  14. --模拟OOP中的 new 类名()
  15. --cls()就相当于调用mtbl.__call()
  16. mtbl.__call = function(self)
  17. return self:new()
  18. end
  19. --cls继承mtbl
  20. setmetatable(cls, mtbl)
  21. --构造函数
  22. function cls:ctor(luaBehaviour)
  23. --print("ctor")
  24. end
  25. --创建实例函数,模拟OOP中的new关键字
  26. function cls:new()
  27. local new_obj = {__name = self.__name }
  28. return setmetatable(new_obj, self)
  29. end
  30. return cls
  31. end


二、模拟Unity中的MonoBehaviour

  1. local TestUI = Class("TestUI")
  2.  
  3. function TestUI:Awake()
  4. print("lua Awake")
  5. --直接获取常用组件字段
  6. print(self.this) --LuaBehaviour
  7. print(self.gameObject)
  8. print(self.transform)
  9. --非UGUI元素时,此值为nil
  10. print(self.rectTransform)
  11. --获取UI传参(table)
  12. print(self.parameter)
  13.  
  14. --通过调用C#方法获取Button组件
  15. local go = self.transform:Find("Button")
  16. self.btn = go:GetComponent(typeof(CS.UnityEngine.UI.Button))
  17. --按钮注册事件回调
  18. self.btn.onClick:AddListener(self.OnClickButton)
  19. --按钮移除事件回调
  20. --self.btn.onClick:RemoveListener(self.OnClickButton)
  21. end
  22.  
  23. function TestUI:OnEnable()
  24. print("lua OnEnable")
  25. --创建一个子类
  26. --local t = TestUI:new()
  27. --相当于调用__call()
  28. --local t = TestUI()
  29. --print("t "..t.__name)
  30. end
  31.  
  32. function TestUI:OnDisable()
  33. print("lua OnDisable")
  34. end
  35.  
  36. function TestUI:Start()
  37. print("lua Start")
  38. end
  39.  
  40. function TestUI:Update()
  41. print("lua Update")
  42. end
  43.  
  44. function TestUI:LateUpdate()
  45. print("lua LateUpdate")
  46. end
  47.  
  48. function TestUI:OnDestroy()
  49. print("lua OnDestroy")
  50. --必须置为nil释放引用
  51. self.btn.onClick = nil
  52. end
  53.  
  54. --按钮 OnClick
  55. function TestUI:OnClickButton()
  56. print("OnClickButton")
  57. end
  58.  
  59. --如果采用OOP方式编程,这里一定要返回作为类的table对象
  60. return TestUI


三、Lua侧入口程序
main.lua
require 'Class'
--更多...


标签: xLua

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号