概览
Lua IDE 脚本
01Hello World.lua
--脚本的后缀名必须是.lua
-- 单行注释
--[[
多行注释
/*
asdasd
*/
]]--
--print是lua内置的方法
--字符串可以用双引号表示,也可以用单引号表示
--行尾没有分号
print('Hello World')
02变量.lua
--[[命名规范
1.不需要定义类型,根据存储的类型,决定采用什么类型
2.变量名不能以数字开头
3.尽量避免下划线和大写字母开头,这种格式Lua自身保留(e.g. _Name)
4.推荐使用驼峰命名法,跟c#一样
5.练习:小红 16 false QingDao
]]--
name ="xiaoming"
age=18
sex = true
school = '蜗牛'
print(name,age,sex,school)
---------------------------------------------------
name='xiaohong'
age=16
sex=false
address='QingDao'
print(name,age,sex,address)
-----------------------------------------------------
--[[Lua table(表)
1.初始化表
mytable = {}
2.指定值
mytable[1]='Lua'
3.移除引用
mytable = nil
4.lua 垃圾回收会释放内存
]]--
myTable = {"小红",16,false,'QingDao'}
print(myTable[0]) --打印出了nil,nil表示空数据,相当于c#中的null
print(myTable[1]) --索引从1开始
print(myTable[2])
print(myTable[3])
print(myTable[4])
------------------------------------------------------
--[[观察类型
1.number表示小数类型,lua中没有整型
2.string表示字符串类型
3.boolean表示布尔类型,里面存储true和false
4.table表示表类型
5.nil表示空
]]--
print(type(name))
print(type(age))
print(type(sex))
print(type(school))
print(type(myTable))
-------------------------------------------------------
--全局变量和局部变量
--默认都是全局变量,局部变量前需要加local
--代码块中声明的局部变量当运行结束后会被释放
local playerHP = 100
03运算符.lua
num1 = 12;
num2 = 34;
--[[算术运算符
+、-、*、/、%
没有++、--、+=、-=
]]--
res1=num1+num2
res2=num1-num2
res3=num1*num2
res4=num1/num2
res5=num1%num2
print(res1,res2,res3,res4,res5)
--[[关系运算符
< <= > >= == ~=
]]--
res6 = res1 ~=res2
print(res6)
res7 = res1 < res2
print(res7)
res8 = res1 >res2
print(res8)
res9 = res1<= res2
print(res9)
res10 = res1>= res2
print(res10)
res11 = res1 ==res2
print(res11)
--[[逻辑运算符
and or not分别对应c#中的&&、||、!
]]--
--一假即假
res12 = res6 and res7
--一真即真
res13 = res6 or res7
res14 = not res6
print(res12)
print(res13)
print(res14)
04条件结构.lua
--条件结构
num1=1;
num2=2;
--if
--then ...end相当于c#中的{},是一个代码块
if num1 < num2
then
print('num1 < num2')
print(num2)
local num3 = 3
print(num3)
end
print(num2)
print(num3)
--if ...else
if num1 > num2 then
print('num1 > num2')
else
print('num1<=num2')
end
---------------------------------
--if ..elseif..else
hp=5;
if hp >= 80 and hp <= 100 then
print("健康")
elseif hp < 80 and hp >= 60 then
print('良好')
elseif hp < 60 and hp >= 10 then
print('注意血量')
else
print('即将死亡')
end
05循环结构.lua
--循环结构
--while 条件 do 循环语句 end
--[[
index = 1
while index < 100 do
print(index)
index = index + 1
end
]]--
-- 1-100所有的偶数
--[[
index1 =1
while index1<=100 do
if index1%2==0 then
print(index1)
end
index1=index1+1
end
]]--
-- 1-100所有奇数的和5000
--[[
index2=1
sum=0
while index2<=100 do
if index2%2==1 then
--print(index2)
sum=sum+index2
end
index2=index2+1
end
print(sum)
]]--
---------------------------------
--repeat 相当于c#中的do while
--[[
index3=0
repeat
print(index3)
index3 =index3 +1
until index3>100
]]--
----------------------------------
--for
--[[
for i=1,100 do
print(i)
end
]]--
-----------------
--[[
for i=1,100,2 do
print(i)
end
]]--
-----------------
--[[
for i=100,1,-1 do
print(i)
end
]]--
------------------
--1-100之间所有的素数,并记录有多少个
print(2)
count1=1
isSuShu=true
for i =3,100 do
for j=2,i-1 do
--不是素数
if i%j==0 then
isSuShu=false
break
end
end
if isSuShu==true then
print(i)
count1=count1+1
else
isSuShu=true
end
end
print('---------------------')
print("素数个数:",count1)
06方法.lua
--方法
--定义方法
function Plus(a,b) --带返回值的方法
return a + b
end
--调用方法
res1 = Plus(12,34)
print(res1)
function Mul(c,d) --不带返回值的方法
print(c*d)
end
Mul(3,4)
function M()
print('qwer')
end
M()
print(math.max(12,34,89,56,67,78))
print(math.abs(-12))
print(math.random())
07字符串.lua
--字符串
str = "XiaoMing Age is 18, Sex is 男,in Snail"
--都转化为小写
print(string.lower(str))
--都转化为大写
print(string.upper(str))
--截取字符串,索引从1开始
print(string.sub(str,1,4))
--拼接字符串
s = ", 学习好"
print(str..s)
08table.lua
--table
--[[创建方式1
myTable = {}
--添加元素
myTable[1]=12
myTable[2]=34
myTable[5]=100
myTable["name"]="xiaoming"
--访问和赋值
print(myTable[2])
print(myTable["name"]) --当表里面的元素是字符串时,可以["字符串"]或.字符串的方式访问和赋值
print(myTable.name)
myTable.age=18
print(myTable.age)
print(myTable["age"])
]]--
--创建方式2
--[[
myTable={name="xiaoming",age=18,sex=true}
myTable.address="蜗牛"
print(myTable.name,myTable["age"],myTable["sex"],myTable.address)
]]--
--当没有键的时候,会自动分配从1开始的索引
--table中最好不要出现nil
--[[
myTable={12,34,nil,age=56,78,"xiaoming",true}
print(myTable[1],myTable[2],myTable[3],myTable[4],myTable[5],myTable.age)
]]--
--[[
--得到表的长度
--有键的和nil不算一个元素长度
myTable={name="xiaoming",nil,age=18,sex=true}
print(#myTable)
--遍历,使用迭代
--1.pairs用于遍历有key的table
myTable01={name="xiaoming",age=18,sex=true,address="蜗牛"}
for key,value in pairs(myTable01) do
print(key,value)
end
--2.ipairs用于遍历没有key的table
myTable02={"xiaoming",12,true,"蜗牛"}
for index,value in ipairs(myTable02) do
print(idnex,value)
end
]]--
--3.混合
myTable03={"xiaoming",age=18,sex=true,"蜗牛"}
for key,value in pairs(myTable03) do
print(key,value) --先把没有键的打印出来,后打印有键的
end
print("-----------------------------------------------------------")
for key,value in ipairs(myTable03) do
print(key,value) --只打印出了没有键的
end
print("-----------------------------------------------------------")
myTable04 ={"xiaoming",[4]="age",[3]="sex",[6]="address",false}
for key,value in pairs(myTable04) do
print(key,value) --先把没有键的打出来,后打有键的,有键的索引会乱掉
end
print("-----------------------------------------------------------")table.insert(myTable03,2,100)
table.remove(myTable03,age) --??????????
for k,v in pairs(myTable03) do
print(k,v)
end
print("-----------------------------------------------------------")
scores={80,50,70,60,100,90}
table.sort(scores)
for i,v in ipairs(scores) do
print(v)
end
print(table.concat(scores))
print("-----------------------------------------------------------")
09面向对象.lua
--面向对象思想
Player = {}
local this=Player
--定义并声明对象属性
this.name="xiaoming"
this.level=12
this.sex=true
--[[
function M1()
print(this.name,this.level,this.sex)
end
M1()
]]--
this.M1=function()
print(this.name)
end
this.M1()
this.M2=function()
print(111)
this.M1()
end
this.M2()
10LuaScript.lua
--引用库文件,这个文件必须跟此lua文件同目录
require "luanet"
--加载命名空间
luanet.load_assembly("System")
luanet.load_assembly("Lua_Test01")
--导入类型
Int32InLua = luanet.import_type("System.Int32")
ProgramInLua = luanet.import_type("Lua_Test01.Program")
--字符串类型转换为数字类型
num = Int32InLua.Parse("1234")
print(num)
--保存C#中的Program类
p = ProgramInLua()
--普通方法通过对象:调用
p:M() --调用Program类中的M方法
--静态方法通过类.调用
ProgramInLua.MStatic() --调用Program类中的MStatic方法
C# IDE 脚本
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LuaInterface;
namespace Lua_Test01
{
class Program
{
int n = 10;
static void Main(string[] args)
{
//创建Lua解析器
Lua lua = new Lua();
#region MyRegion
lua["num"] = 2; //相当于在lua中书写num=2
lua["str"] = "a string"; //相当于在lua中书写 str="a string"
lua["sex"] = true;
lua.NewTable("myTable"); //myTable={}
//Console.WriteLine(lua["num"]);
//Console.WriteLine(lua["str"]);
//Console.WriteLine(lua["sex"]);
double d = (double)lua["num"];
string s = (string)lua["str"];
//Console.WriteLine(d);
//Console.WriteLine(s);
//在VS中执行Lua代码,通过DoString()方法
lua.DoString("name='xiaoming'");
lua.DoString("age=18");
object[] os = lua.DoString("return name,age");
Console.WriteLine(os.Length);
Console.WriteLine(os[0]);
Console.WriteLine(os[1]);
//在VS当中执行Lua文件,通过DoFile()方法
lua.DoFile("09面向对象.lua");
#endregion
//将C#的普通方法注册到lua中
Program p = new Program();
//p.M();
lua.RegisterFunction("MInLua",p,p.GetType().GetMethod("M"));
lua.DoString("MInLua()");
//将C#中的静态方法注册到lua中
lua.RegisterFunction("MStaticInLua", null, typeof(Program).GetMethod("MStatic"));
lua.DoString("MStaticInLua()");
lua.DoFile("LuaScript.lua");
}
//普通方法
public void M()
{
Console.WriteLine("普通方法");
}
//静态方法
public static void MStatic()
{
Console.WriteLine("静态方法");
}
//引用参数方法
public void MRef(string name,ref int count)
{
Console.WriteLine(name);
Console.WriteLine(count);
count = name.Length;
}
//输出参数方法
public void MOut(string name, out int count)
{
Console.WriteLine(name);
count = name.Length;
}
}
}
1.C#要想使用Lua文件,需要引用LuaInterface命名空间
2.Lua要想使用C#文件,需要引用luanet
LuaInterface命名空间
类:Lua
- 创建Lua解析器:类名 对象 =new 类名();
- 在C#环境中写lua变量:lua["变量名"]=数字/字符串/true/false
- 在C#中声明lua表:对象.NewTable("变量名");
- 将lua变量转化为C#中的变量:对应的类型 变量名=(要转换的类型)lua["lua变量名"];
- 在VS中执行Lua代码:对象.DoString();
- 在VS中执行Lua文件:对象.DoFile("lua文件名.lua");
- 将C#普通方法注册到lua中:对象.RegisterFunction(在lua中的方法名字,C#中的目标类,目标类中的方法);
Luanet库文件
在lua IDE使用
- 引用库文件:require"luanet"
- 加载命名空间:luanet.load_assembly(命名空间名)
- 导入类型:luanet.import_type(命名空间名.类名)
- 普通方法通过对象:调用
- 静态方法通过类名.调用