首页 > 其他分享 >xlua - lua协程与Unity协程

xlua - lua协程与Unity协程

时间:2024-02-28 22:55:37浏览次数:16  
标签:end filePath self lua Unity LuaEnv 协程 LuaEnumeratorImpl

lua脚本:Assets/Lua/Test3.lua.txt

local move_end = {}

local LuaEnumeratorImpl = {}
LuaEnumeratorImpl.__index = LuaEnumeratorImpl

function LuaEnumeratorImpl.new(coRun)
    local obj = {}
    setmetatable(obj, LuaEnumeratorImpl)
    obj:ctor(coRun)
    return obj
end

function LuaEnumeratorImpl:ctor(coRun)
    self.Current = nil
    self.m_CoFunc = function()
        coRun()
    return move_end
    end
    self.m_Co = nil
end

function LuaEnumeratorImpl:MoveNext()
    local flag, result = coroutine.resume(self.m_Co)
    self.Current = result
    if self.Current == move_end then
        self.Current = nil
        return false
    end
    return true
end

function LuaEnumeratorImpl:Reset()
    self.m_Co = coroutine.create(self.m_CoFunc)
end

local enu = nil
--该lua table会映射为c#的IEnumerator接口实现对象, StartCoroutine的参数也是IEnumerator类型
enu = LuaEnumeratorImpl.new(function()
    print("stop coroutine after 5 seconds")
    coroutine.yield(CS.UnityEngine.WaitForSeconds(5))
    Test3MonoInst:StopCoroutine(enu)
    print("coroutine stoped")
end)
enu:Reset()

Test3MonoInst:StartCoroutine(enu)

 

Test3.cs

public class Test3 : MonoBehaviour
{
    private LuaEnv m_LuaEnv;

    void Start()
    {
        m_LuaEnv = new LuaEnv();
        m_LuaEnv.AddLoader((ref string filePath) =>
        {
            filePath = filePath.Replace('.', '/');
            filePath = $"Assets/{filePath}.lua.txt";
            var txtAsset = AssetDatabase.LoadAssetAtPath<TextAsset>(filePath);
            return Encoding.UTF8.GetBytes(txtAsset.text);
        });

        m_LuaEnv.Global.Set("Test3MonoInst", this);
        m_LuaEnv.DoString("require('Lua.Test3')");
    }

    void OnDestroy()
    {
        if (null != m_LuaEnv)
        {
            m_LuaEnv.Dispose();
        }
    }

}

 

标签:end,filePath,self,lua,Unity,LuaEnv,协程,LuaEnumeratorImpl
From: https://www.cnblogs.com/sailJs/p/18041236

相关文章

  • xlua - lua中操作c#对象
    1,c#对象映射为lua的userdataa)默认情况,c#对象都是映射为lua的userdata,数据存放在c#层,调用函数也是走c#层。functionLuaUseVector3(v1,v2)v1.x=10print(type(v1),v1.x,v1.y,v1.z)print("v1:",v1,"v2:",v2)print("v1+v2:",v1+v2)v1......
  • xlua - c#访问lua函数
    lua代码Assets/Lua/Test1.lua.txtfunctionIntParam(p)print("~~~~~IntParam")print(type(p),p)print("~~~~~")returnpendfunctionVec3Param(p)print("~~~~~Vec3Param")print(type(p),p.x,p.y,p.z)......
  • Lua调试函数 debug.getinfo() namewhat详解
    Lua调试的时候会用到debug.getinfo()函数,what的值文档给了解释:"Lua":Luafunction"C":Cfunction"main":mainpartofachunk(通过load函数等执行的语句)关于namewhat的值到底表示什么,官方文档只是简单列举(不全)。列举一些常见情况localgetinfo=debug.getinfol......
  • Unity3D 光照计算方向与法线贴图详解
    在Unity3D中,光照计算方向与法线贴图是实现高质量光照效果的重要技术之一。本文将详细介绍光照计算方向与法线贴图的原理和实现方法,并给出相应的代码示例。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学......
  • Unity3D 逐顶点光照与逐像素光照详解
    Unity3D提供了丰富的功能和工具,其中包括逐顶点光照和逐像素光照。本文将详细解释这两种光照技术的原理和实现方式,并提供代码示例。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。一、逐顶点光照逐......
  • 项目中协程加入的原因和过程分享
    原文已经发到项目wiki页面:https://github.com/youngyangyang04/KVstorageBaseRaft-cpp/wiki/协程加入的原因和过程分享欢迎大家给项目来个star哈哈哈。在feat:协程替代doElectionTicker和doHeartBeatTicker线程byTiNnNnnn·PullRequest#29·youngyangyang04/KVstorageBa......
  • Redis加Lua脚本实现分布式锁
    先讲一下为什么使用分布式锁:在传统的单体应用中,我们可以使用Java并发处理相关的API(如ReentrantLock或synchronized)来实现对共享资源的互斥控制,确保在高并发情况下同一时间只有一个线程能够执行特定方法。然而,随着业务的发展,单体应用逐渐演化为分布式系统,多线程、多进程分布在不同......
  • Python并发编程的协程
    一、协程的概念1、协程是单线程下的并发,它是程序员级别的,我们来控制如何切换。2、进程的开销>>>>>>线程的开销>>>>>>协程的开销3、协程的使用需要借助于第三方模块gevent模块或者asyncio模块4、gevent 和 asyncio 是两个在Python中常用的协程框架,它们都提供了在......
  • 机器学习策略篇:详解单一数字评估指标(Single number evaluation metric)
    单一数字评估指标无论是调整超参数,或者是尝试不同的学习算法,或者在搭建机器学习系统时尝试不同手段,会发现,如果有一个单实数评估指标,进展会快得多,它可以快速告诉,新尝试的手段比之前的手段好还是差。所以当团队开始进行机器学习项目时,经常推荐他们为问题设置一个单实数评估指标。......
  • Unity xLua开发环境搭建与基础进阶
    Unity是一款非常流行的游戏开发引擎,而xLua是一个为Unity开发者提供的Lua框架,可以让开发者使用Lua语言来进行游戏开发。在本文中,我们将介绍如何搭建UnityxLua开发环境,并进行基础进阶的学习。 对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正......