18.Lua调用Unity的协同程序

18.Lua调用CSharp-协同程序


18.1 知识点

准备工作

启动Lua脚本

LuaManager.Instance.Init();
LuaManager.Instance.Require("Lesson18_Lua调用CSharp_协同程序");

定义别名

--别名
Input = UnityEngine.Input
KeyCode = UnityEngine.KeyCode

准备协程相关

必须要去Lua管理器注册Lua协程

-- LuaCoroutine.Register(luaState, this);

声明协程变量

local coroutineDelay = nil

声明协程函数

function Delay()
    local c = 1
    
    while true do
        --可以直接使用类似Unity中的协程相关方法
        --前提是一定要去Lua管理器注册 lua协程相关内容
        
        --可以像C#一样返回不同返回值
        WaitForSeconds(1) 
        --Yield(0)
        --WaitForFixedUpdate()
        --WaitForEndOfFrame()
        --Yield(异步加载返回值)
        
        print('Count: '..c)
        
        c = c + 1
    end
end

启动协程

--启动协程方法 和C#中类似
function StartDelay()
    coroutineDelay = StartCoroutine(Delay)            
end

-- 启动协程
StartDelay()

停止协程

----停止协程方法 和C#中类似
function StopDelay()
    StopCoroutine(coroutineDelay)
    coroutineDelay = nil
end

制作按空格开启协程,再次按空格停止协程的功能,创建Lua的的帧更新函数,在Unity中调用

--制作按空格开启协程 再次按空格停止协程的功能
function Update()

    if Input.GetKeyDown(KeyCode.Space) then

        -- 检测到空格键按下
        if coroutineDelay ~= nil then
            -- 如果协程正在运行,停止协程
            print("停止协程")
            StopDelay()
        else
            -- 如果协程未运行,重新启动协程
            print("启动协程")
            StartDelay()
        end

    end

end
LuaFunction luaUpdate;

void Start()
{
    ...
    
    //tolua获取函数
    luaUpdate = LuaManager.Instance.LuaState.GetFunction("Update");
}

private void Update()
{
    //LuaFunctio函数通过Call方法调用
    luaUpdate.Call();//我是Lua无参无返回值函数
}

18.2 知识点代码

Lesson18_Lua调用CSharp_协同程序.lua

print('我是Lua脚本 Lesson18_Lua调用CSharp_协同程序')

--别名
Input = UnityEngine.Input
KeyCode = UnityEngine.KeyCode

print("**********知识点一 准备协程相关************")

--必须要去Lua管理器 注册 Lua 协程
-- LuaCoroutine.Register(luaState, this);

--声明协程变量
local coroutineDelay = nil


--声明协程函数
function Delay()
    local c = 1

    while true do
        --可以直接使用类似Unity中的协程相关方法
        --前提是一定要去Lua管理器注册 lua协程相关内容

        --可以像C#一样返回不同返回值
        WaitForSeconds(1)
        --Yield(0)
        --WaitForFixedUpdate()
        --WaitForEndOfFrame()
        --Yield(异步加载返回值)

        print('Count: ' .. c)

        c = c + 1
        -- if c > 5 then
        --     StopDelay()
        --     break
        -- end

    end
end

print("**********知识点二 启动协程************")

--启动协程方法 和C#中类似
function StartDelay()
    coroutineDelay = StartCoroutine(Delay)
end

-- -- 启动协程
-- StartDelay()


print("**********知识点三 停止协程************")

----停止协程方法 和C#中类似
function StopDelay()
    StopCoroutine(coroutineDelay)
    coroutineDelay = nil
end

--制作按空格开启协程 再次按空格停止协程的功能
function Update()
    if Input.GetKeyDown(KeyCode.Space) then
        -- 检测到空格键按下
        if coroutineDelay ~= nil then
            -- 如果协程正在运行,停止协程
            print("停止协程")
            StopDelay()
        else
            -- 如果协程未运行,重新启动协程
            print("启动协程")
            StartDelay()
        end
    end

end

Lesson18_Lua调用CSharp_协同程序

using LuaInterface;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson18_Lua调用CSharp_协同程序 : MonoBehaviour
{
    LuaFunction luaUpdate;

    void Start()
    {
        LuaManager.Instance.Init();
        LuaManager.Instance.Require("Lesson18_Lua调用CSharp_协同程序");

        //tolua获取函数
        luaUpdate = LuaManager.Instance.LuaState.GetFunction("Update");
    }

    private void Update()
    {
        //LuaFunctio函数通过Call方法调用
        luaUpdate.Call();//我是Lua无参无返回值函数
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏