学习lua笔记分享(三)--C#远程加载lua代码

10 篇文章 0 订阅
3 篇文章 0 订阅

1.加载文件:

新建lua脚本:Testo1:


-
-用递归实现阶乘
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>.开启本地服务器
验证是否开启本地服务器:浏览器输入: http://127.0.0.1/ 打不开表示没有开
打开:终端

验证:
表示已经打开!
设置本地文件可提供别人访问的方法


本地文件存放在这个文件夹里,可以让别人通过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"]);
            
    }
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值