學習lua筆記分享(三)--C#遠程加載lua代碼

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"]);
            
    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章