LuaObjectOrented

InvokeLua.cs

  1. using UnityEngine;
  2. using System.Collections;
  3. using XLua;
  4. public class InvokeLua : MonoBehaviour
  5. {
  6. [CSharpCallLua]
  7. public interface ICalc
  8. {
  9. int Add(int a, int b);
  10. int Mult { get; set; }
  11. }
  12. [CSharpCallLua]
  13. public delegate ICalc CalcNew(int mult, params string[] args);
  14. private string script = @"
  15. local calc_mt = {
  16. __index = {
  17. Add = function(self, a, b)
  18. return (a + b) * self.Mult
  19. end
  20. }
  21. }
  22. Calc = {
  23. New = function (mult, ...)
  24. print(...)
  25. return setmetatable({Mult = mult}, calc_mt)
  26. end
  27. }
  28. ";
  29. // Use this for initialization
  30. void Start()
  31. {
  32. LuaEnv luaenv = new LuaEnv();
  33. Test(luaenv);//调用了带可变参数的delegate,函数结束都不会释放delegate,即使置空并调用GC
  34. luaenv.Dispose();
  35. }
  36. void Test(LuaEnv luaenv)
  37. {
  38. luaenv.DoString(script);
  39. CalcNew calc_new = luaenv.Global.GetInPath<CalcNew>("Calc.New");
  40. ICalc calc = calc_new(10, "hi", "john"); //constructor
  41. Debug.Log("sum(*10) =" + calc.Add(1, 2));
  42. calc.Mult = 100;
  43. Debug.Log("sum(*100)=" + calc.Add(1, 2));
  44. }
  45. // Update is called once per frame
  46. void Update()
  47. {
  48. }
  49. }

?