当前位置: 首页 > news >正文

toLua[七] Examples 06_LuaCoroutine2分析

一.运行工程

本例展示Lua模拟Unity的Coroutine携程的第二种做法

二.C#代码分析

TestCoroutine2.CS

using UnityEngine;
using System.Collections;
using LuaInterface;//两套协同勿交叉使用,类unity原生,大量使用效率低
public class TestCoroutine2 : LuaClient 
{string script =@"function CoExample()            WaitForSeconds(1)print('WaitForSeconds end time: '.. UnityEngine.Time.time)            WaitForFixedUpdate()print('WaitForFixedUpdate end frameCount: '..UnityEngine.Time.frameCount)WaitForEndOfFrame()print('WaitForEndOfFrame end frameCount: '..UnityEngine.Time.frameCount)Yield(null)print('yield null end frameCount: '..UnityEngine.Time.frameCount)Yield(0)print('yield(0) end frameCime: '..UnityEngine.Time.frameCount)local www = UnityEngine.WWW('http://www.baidu.com')Yield(www)print('yield(www) end time: '.. UnityEngine.Time.time)local s = tolua.tolstring(www.bytes)print(s:sub(1, 128))print('coroutine over')endfunction TestCo()            StartCoroutine(CoExample)                                   endlocal coDelay = nilfunction Delay()local c = 1while true doWaitForSeconds(1) print('Count: '..c)c = c + 1endendfunction StartDelay()coDelay = StartCoroutine(Delay)            endfunction StopDelay()StopCoroutine(coDelay)coDelay = nilend";protected override LuaFileUtils InitLoader(){return new LuaResLoader();}protected override void OnLoadFinished(){base.OnLoadFinished();luaState.DoString(script, "TestCoroutine2.cs");LuaFunction func = luaState.GetFunction("TestCo");func.Call();func.Dispose();func = null;}//屏蔽,例子不需要运行protected override void CallMain() { }bool beStart = false;string tips = null;void Start(){
#if UNITY_5 || UNITY_2017 || UNITY_2018Application.logMessageReceived += ShowTips;
#elseApplication.RegisterLogCallback(ShowTips);
#endif}void ShowTips(string msg, string stackTrace, LogType type){tips += msg;tips += "\r\n";}new void OnApplicationQuit(){
#if UNITY_5 || UNITY_2017 || UNITY_2018Application.logMessageReceived -= ShowTips;
#elseApplication.RegisterLogCallback(null);
#endifbase.OnApplicationQuit();}void OnGUI(){GUI.Label(new Rect(Screen.width / 2 - 300, Screen.height / 2 - 200, 600, 400), tips);if (GUI.Button(new Rect(50, 50, 120, 45), "Start Counter")){if (!beStart){beStart = true;tips = "";LuaFunction func = luaState.GetFunction("StartDelay");func.Call();func.Dispose();}}else if (GUI.Button(new Rect(50, 150, 120, 45), "Stop Counter")){if (beStart){beStart = false;LuaFunction func = luaState.GetFunction("StopDelay");func.Call();func.Dispose();}}}
}

2.1 LuaClient.CS

首先看第六行TestCoroutine2 继承自 LuaClient

public class TestCoroutine2 : LuaClient

LuaClient的159-177行可以看出其初始化时创建了LuaState对象,故TestCoroutine2中没有LuaState对象的创建,可以直接使用父类的

    protected void Init(){        InitLoader();luaState = new LuaState();OpenLibs();luaState.LuaSetTop(0);Bind();        LoadLuaFiles();        }protected void Awake(){Instance = this;Init();#if UNITY_5_4_OR_NEWERSceneManager.sceneLoaded += OnSceneLoaded;
#endif        }

再来看TestCoroutine2.CS的64-66行,执行Lua方法TestCo

        luaState.DoString(script, "TestCoroutine2.cs");LuaFunction func = luaState.GetFunction("TestCo");func.Call();

TestCoroutine2.CS的29-31行TestCo调用StartCoroutine

        function TestCo()            StartCoroutine(CoExample)                                   end

2.2 LuaCoroutine.CS

全局搜索function StartCoroutine可以看到其定义位于文件LuaCoroutine.CS中

在DoString处加入断点,可以看到其由LuaClient的Awake中间接调用

三.Lua代码分析

从StartCoroutine的Lua实现来看,其用的是Lua语言自身的coroutine

        function StartCoroutine(func)local co = coroutine.create(func)                       local flag, msg = coroutine.resume(co)if not flag thenmsg = debug.traceback(co, msg)error(msg)endreturn coend

http://www.dtcms.com/a/494392.html

相关文章:

  • CAD如何生成等高线
  • Java并发工具类详解:Semaphore、CyclicBarrier与CountDownLatch
  • 御剑问情_附带自动假人版_大型3D仙侠类剧情闯关手游_Linux服务端_通用视频架设教程_GM授权网页后台_运营网页后台_安卓苹果IOS双端
  • 基于信息保留与细粒度特征聚合的无人机目标检测
  • AINode部署全指南:从独立部署到Kubernetes集群部署
  • PYcharm——获取天气
  • Kafka多网卡环境配置
  • TypeScript 与淘宝 API:构建类型安全的商品数据查询前端 / Node.js 服务
  • 网站备案名称要求郴州网站排名优化
  • 百度做一个网站多少钱sns营销
  • List<map<String,Object>下划线转驼峰
  • List.subList() 返回值为什么不能强转成 ArrayList
  • phpcms网站转移网站关键词百度排名在下降
  • mac使用本地jdk启动elasticsearch解决elasticsearch启动时jdk损坏问题
  • 手机在初次联网的底层流程-关于EPC信令附着
  • 2025年红米手机上市了哪些款式,本别包含哪些版本,就上市时间、硬件参数、性能、价格等方面进行对比,加入横向竞品对比分析,按价位段划分推荐人群。
  • Go Web 编程快速入门 02 - 认识 net/http 与 Handler 接口
  • 成都网站建设网站制作济南网站制作哪家强
  • 广州做网站的网络公司网站建设美文
  • 云原生时代的数据库字段加密:在微服务与 Kubernetes 中实现合规与敏捷的统一
  • 虚拟机监控全攻略:从基础到云原生实战
  • fastgpt 社区版探究:mongo db 全文检索算法探秘
  • 防爆手机与普通手机有什么区别?防爆手机哪个牌子好?
  • 聊聊 Unity(小白专享、C# 小程序 之 日历、小闹钟)
  • 在vscode中全选后,同时在每行行尾,开始多行编辑(Mac版)
  • C4D域的重要修改层之延迟衰减和量化之解析
  • 建设银行网站网址是什么柳州电商网站建设
  • 记录WinFrom 使用 Autoupdater.NET.Official 进行软件升级更新,避免遗忘
  • 【汇编】RAX,eax,ax,ah,al 关系
  • 苍穹外卖 Day12 实战总结:Apache POI 实现 Excel 报表导出全流程解析