Slua自学(一)

Slua自学(一)

  • 前言
    • 导入Slua
    • lua与c#互调与简单交互

前言

公司项目需求,本人第一次接触lua热更 ,学习记录。

导入Slua

从slua作者的gihub上下载slua的demo

  1. 导入插件后 Slua/LuaObject文件夹下的文件全部为生成文件,生成方式为菜单中Slua -> All -> Make(每次Make之前最好先Clear一次)
  2. unity - lua交互过程中的文件有:unity C#脚本(自写),LuaObject文件夹下的Lua_C#文件名的脚本(生成),对应的lua脚本(自写)
  3. 若想在lua中调用C#类,需在C#类中加入[CustomLuaClass]或[CustomLuaClassAttribute]属性 如:
    [CustomLuaClass] public class Deleg : MonoBehaviour

lua与c#互调与简单交互

Test_interaction.cs

using SLua;
using System.IO;
using UnityEngine;

[CustomLuaClass]
public class Test_interaction : MonoBehaviour
{
    public delegate void TestInteractionDlg(string path, GameObject go);
    public static TestInteractionDlg dlg;
    LuaSvr svr;
    LuaTable self;
    LuaFunction update;

    void Start()
    {
        svr = new LuaSvr();
        svr.init(null, InitComplete, LuaSvrFlag.LSF_BASIC);
    }

    void InitComplete()
    {
        LuaState.main.loaderDelegate += LuaLoader;

        //m_LuaState = LuaState.main;
        self = (LuaTable)svr.start("testLua");
        update = (LuaFunction)self["update"];

        // 调用lua的方法
        string str = (string)LuaSvr.mainState.getFunction("testFun").call("Hello World!");
        Debug.Log("c#---" + str);
    }

    void Update()
    {
        // 调用lua的update函数
        if (update != null) update.call(self);
    }

    // 调用委托
    public static void CallD()
    {
        if (dlg != null)
        {
            dlg("GameObject", new GameObject("SimpleDelegate"));
        }
        Debug.Log("c#---callD");
    }

    //加载lua脚本文件
    [DoNotToLua]
    public byte[] LuaLoader(string fn)
    {
        string newFn = fn.Replace(".", "/");
        string path = Application.dataPath + "/Code/luaScript/" + newFn + ".lua";
        byte[] data = null;

        if (File.Exists(path))
        {
            data = File.ReadAllBytes(path);
        }
        else
        {
            TextAsset txt = Resources.Load<TextAsset>("luaScript/" + newFn);
        }

        return data;
    }

    // lua调用 C# 脚本函数
    public void luaCallCS(string str)
    {
        Debug.Log("c#---" + str);
    }
}

testLua.lua

import "UnityEngine"
if not UnityEngine.GameObject then
	error("Click Make/All to generate lua wrap file")
end

local class = {}

function main(  )
	print("lua--- run lua main function")
	local cs = GameObject.Find("Main Camera")

	-- 如果C#类没有继承自MonoBehaviour,你可以这样写:
	-- local h = Test_interaction()
	-- h.luaCallCS("wtf")
	local te = cs:GetComponent("Test_interaction")
	te:luaCallCS("hellow word")

	local g
	-- 测试委托
	Test_interaction.dlg = function( path,go )
		g = go
		print("lua---"..path,go.name)
	end
	Test_interaction.CallD()

	-- 测试gameobject
	print("lua---g.name:"..g.name)
	print("lua---cs.name:"..cs.name)
	g.transform.parent = cs.transform
	g:AddComponent("UnityEngine.Rigidbody")
	g:AddComponent("UnityEngine.BoxCollider")
	local c = g:AddComponent("UnityEngine.MeshRenderer")
	c.probeAnchor = cs.transform

	-- 如果要使用update函数,则需要返回class-- return class
end

function testFun( a )
	print("lua--- run this testFun()")
	local  name = "test"
	a = a..name
	return a
end

-- 在C#的Update函数中被调用
function class:update(  )
	print(Time.deltaTime)
end

你可能感兴趣的:(UNITY,LUA)