1.加载文件:
新建lua脚本:Testo1:
-
1>
-用递归实现阶乘
function Fac(n)
if n<=1 then
return n
end
return n* Fac(n-1)
end
在另一个lua脚本里面:
--注意:1.加载文件时,保证两个文件在同一路径下
--2.require的特点是加载一次
-- a = require("Test01")
-- print("require result="..tostring(a))
-- if a then
-- print("5!"..Fac(5))
-- end
-- a = loadfile("Test01.lua")
-- print("loadfile result = "..tostring(a)) --loadfile result = function: 0x7fa0f0c07420
-- print("5! = "..Fac(5)) --报错
--dofile和loadfile:
--dofile:读入代码文件,并编译执行,每调用一次dofile都会重新编译执行一次
--loadfile:将整个模块当做一个函数返回,并不执行代码
--dofile是对loadfile的一次包装
a = dofile("Test01.lua")
print("dofile result = "..tostring(a))
print("5! = "..Fac(5))
2.协程
function SayHi(msg)
for i=1,10 do
print(msg..i)
--print(coroutine.status(co))
coroutine.yield() --协程挂起
print("执行到这里了")
-- print(coroutine.status(co))
end
end
-- SayHi("lanou")
--coroutine.create:表示创建一个协程
--1.创建协程(协同程序)
co = coroutine.create(SayHi)
-- print(co) --thread: 0x7f8e32407618 当前协程句柄,地址
--2.查看协程的状态,coroutine.status
--running:如果在协程的函数中调用status,传入协程自身的句柄,那么执行到这里才会返回running
--suspended:如果协程还未结束,即自身调用yield或者协程还未开始执行,就会返回suspended
--dead:如果一些协程执行过程中出现错误,或者执行正常结束,那么就睡处于dead状态
print(coroutine.status(co).."first") --suspended 表示挂起的意思
--3.开启协程
isRunning = coroutine.resume(co,"laowang")
coroutine.resume(co,"laowang")
coroutine.resume(co,"laowang")
--4.查看协程是否在执行
print(isRunning) --true
print(coroutine.status(co)) --dead(执行结束)
3.继承
-- beauty = {name = ""}
--beauty相当于类,name相当于属性
-- function beauty.talk( ... )
-- print("今天又有人迟到了")
-- beauty.name = "老王"
-- end
-- beauty.talk()
-- print(beauty.name)
-- function beauty.init(self, na)
-- print("隔壁马上就要开办了")
-- self.name = na
-- end
--用对象接收
-- girl = beauty
-- print(beauty.name)
-- beauty = nil
-- girl.name = "小红"
-- girl.init(girl, "小李")
-- print(girl.name)
--继承(模拟继承)
--男人类
man = {name = "man",age = 25}
--儿童类
child = {}
--声明一个继承空间
man.__index = man
--实现继承,child 类继承man类
setmetatable(child,man)
print(child.name) --man
young = {}
setmetatable(young,man)
young.age = 12
child.age = 5
print("youngAge = "..young.age.." childAge = "..child.age) --youngAge = 12 childAge = 5
4.C#脚本里面lua脚本内容
1>
1.U3D_lua插件:
新建Unity工程:拖入下载的插件文件:
拖入之后,点确定,工具栏会出现lua菜单选项
2>.开启本地服务器
验证:
表示已经打开!
设置本地文件可提供别人访问的方法
本地文件存放在这个文件夹里,可以让别人通过ip地址访问到
设置权限:
4.通过lua文件:
方法一:
方法一:
新建脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LuaInterface; //引用命名空间
/*
*在C#中使用lua代码或者lua文件时,要用到luastate类型
*luaState想大于lua代码的运行环境,只有在这个环境下,lua代码才会被执行
*/
public class HelloLuaTest : MonoBehaviour {
//1.创建lua对象
LuaState lua;
//方法1:直接是lua代码的字符串
string luaStr = "print('HellOLua')";
void Start()
{
//方法1
// NormalMethod (luaStr);
}
/// <summary>
/// 方法1
/// </summary>
/// <param name="str">String.存放的lua代码</param>
void NormalMethod(string str)
{
//使用前必须初始化lua环境对象
lua = new LuaState ();
//开启lua运行环境
lua.Start ();
//执行一段lua代码
lua.LuaDoString (str);
//执行完以后,释放lua环境
lua.Dispose ();
}
}
方法二:加载本地文件
搜索文本编辑器,编写文本:
更改后缀名为.Txt文件,右键:
将文件拖入到工程里:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LuaInterface; //引用命名空间
/*
*在C#中使用lua代码或者lua文件时,要用到luastate类型
*luaState想大于lua代码的运行环境,只有在这个环境下,lua代码才会被执行
*/
public class HelloLuaTest : MonoBehaviour {
//1.创建lua对象
LuaState lua;
//方法2:使用TextAsset.
public TextAsset luaStrText;
void Start()
{
方法2
NormalMethod (luaStrText.text);
}
/// <summary>
/// 方法2
/// </summary>
/// <param name="str">String.存放的lua代码</param>
void NormalMethod(string str)
{
//使用前必须初始化lua环境对象
lua = new LuaState ();
//开启lua运行环境
lua.Start ();
//执行一段lua代码
lua.LuaDoString (str);
//执行完以后,释放lua环境
lua.Dispose ();
}
}
方法三:远程读取,通过IP地址
将建好的文件放到文件夹里面
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LuaInterface; //引用命名空间
/*
*在C#中使用lua代码或者lua文件时,要用到luastate类型
*luaState想大于lua代码的运行环境,只有在这个环境下,lua代码才会被执行
*/
public class HelloLuaTest : MonoBehaviour {
//1.创建lua对象
LuaState lua;
void Start()
{
//方法3
string url = "http://10.90.87.219/reqirelua.lua";
StartCoroutine (LoadLuaStr(url));
}
//方法3
IEnumerator LoadLuaStr(string url)
{
WWW www = new WWW (url);
yield return www;
string luaStr = www.text;
//初始化lua,运行环境'
lua = new LuaState ();
lua.Start ();
//执行lua代码
lua.DoString (www.text);
//访问lua中变量
Debug.Log (lua ["num"]);
//访问lua中的方法
// LuaFunction func = lua.GetFunction ("helloFunc");
// //开启,采用受保护的方法来调用,好处:传递参数,运行时,其他的代码想要调用的时候,需要本次执行完以后,才可以,
// func.BeginPCall ();
// //给方法传递参数
// func.Push ("星期五");
// func.PCall ();
// func.EndPCall ();
// lua.Dispose ();
//
LuaTable table = lua.GetTable ("meta");
Debug.Log (table ["name"]);
}
}