Unity3D Lua语言学习(一)

我是一名游戏开发者,目前主要是使用Unity3D开发游戏客户端,想学习Lua,掌握热更新技术,尽管近期苹果爸爸宣布要禁止AppStroe上的游戏热更新。

在网上看了许多Lua的学习博客,受益良多,今天总结一下学习Lua的知识。

至于怎样去配置Lua环境和在Vs工程中的添加的引用可以参考链接点击打开链接

这里直接放上我的代码和输出的结果。


C# Main程序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LuaInterface;

namespace TestLua
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建lua的解释器
            Lua lua = new Lua();
            Console.WriteLine("C# 中添加lua属性");

            // C# 中添加lua属性 
            lua["num"] = 34;
            Console.WriteLine(lua["num"]);

            Console.WriteLine();
            Console.WriteLine("C# 中编写 lua 脚本");

            // C# 中编写 lua 脚本
            lua.DoString("name = 'XiaoMing'");
            lua.DoString("age = 18");
            lua.DoString("print(name, age, num)");

            Console.WriteLine();
            Console.WriteLine("C# 中执行.lua文件");

            // C# 中执行.lua文件
            lua.DoFile("Mylua.lua");

            Console.WriteLine();
            Console.WriteLine("把C#一个类中的普通公共方法注册进去");

            // 把C#一个类中的普通公共方法注册进去
            Program p = new Program();
            // "LuaMethod" 指定注入的方法在lua中的方法名
            // p 指定方法所在的对象
            // p.GetType().GetMethod("CLRMethod")注入该对象的方法
            lua.RegisterFunction("LuaMethod", p, p.GetType().GetMethod("CLRMethod"));
            lua.DoString("LuaMethod()");

            Console.WriteLine();
            Console.WriteLine("把C# 一个共有静态方法注册进去");

            // 把C# 一个共有静态方法注册进去
            lua.RegisterFunction("MyStaticMethod", null, typeof(Program).GetMethod("MyStaticMethod"));
            lua.DoString("MyStaticMethod()");

            // 执行.lua文件,并在.lua文件中使用C#的类
            lua.DoFile("Script.lua");
            Console.ReadKey();
        }

        public void CLRMethod() {
            Console.WriteLine("hehe");
        }

        public static void MyStaticMethod() {
            Console.WriteLine("haha");
        }
    }
}

MyLua.lua 文件中的lua程序,文件需要放在Debug文件夹下

name = "XiaoMing"
age = 18
print(name,age)

C# 中 Test类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestLua
{
    class Test
    {
        private string name = "Yogi";
        private int age = 25;

        // Default constructor
        public Test() {
        } //  end  Constructor

        // Constructor two!
        public Test(string name, int age) {
            this.name = name;
            this.age = age;
        } // end  Constructor

        public string Name {
            get {
                return name;
            }
        } // end Property

        public int Age {
            get {
                return age;
            }
        } // end Property

        public void Print() {
            Console.WriteLine(name + " " + age);
        } // end Method

        public void OutNameLenghtAndAge(out int lenght) {
            lenght = name.Length;
        } // end Method

        public int ReturnAgeAndRefNameLenght(ref int lenght) {
            Console.WriteLine(lenght);
            lenght = name.Length;
            return age;
        } // end Method
    }
}

Script.lua文件中的lua程序,文件需要放在Debug文件夹下

require "luanet" -- 引入luanet库

print()
print("Start Lua")

luanet.load_assembly("System") -- 加载.dll文件
luanet.load_assembly("TestLua")

Int32 = luanet.import_type("System.Int32")
Test = luanet.import_type("TestLua.Test")

print()
print("Check import is succeed!")
print(Int32)
print(Test)

print()
print("Default constructor!")
test1 = Test() -- 使用构造方法1
print(test1.Name) -- 访问属性
print(test1["Age"]) -- 访问属性
test1:Print() -- 访问方法

print()
print("Constructor two!")
test2 = Test("XiaoMing", 18) -- 使用构造方法2
print(test2.Name)
print(test2.Age)
test2:Print()

print()
print("Test Out Method!")

-- Lua 调用 C# 含 out 参数的方法时,无须传入 out 参数。out 参数会以返回值的形式返回
-- void 接收函数返回值(函数没有返回值是void为nil)
-- lenght 接收 out 返回值(即名字长度)
void, lenght = test2:OutNameLenghtAndAge()
print(void, lenght)

print()
print("Test Ref Method!")

-- Lua 调用 C# 含 ref 参数的方法时,须要传入 ref 参数。ref 参数也会以返回值的形式返回
-- age 接收函数返回值(函数没有返回值是void为nil)
-- lenght 接收第一个 ref 返回值(即名字长度)
age, lenght = test2:ReturnAgeAndRefNameLenght(100)
print(age, lenght)

输出结果:


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值