Coroutine

CoroutineTest.cs

  1. using UnityEngine;
  2. using XLua;
  3. public class CoroutineTest : MonoBehaviour {
  4. LuaEnv luaenv = null;
  5. // Use this for initialization
  6. void Start()
  7. {
  8. luaenv = new LuaEnv();
  9. luaenv.DoString("require 'coruntine_test'");
  10. }
  11. // Update is called once per frame
  12. void Update()
  13. {
  14. if (luaenv != null)
  15. {
  16. luaenv.Tick();
  17. }
  18. }
  19. void OnDestroy()
  20. {
  21. luaenv.Dispose();
  22. }
  23. }

coroutine_test.lua.txt

  1. local util = require 'xlua.util'
  2. local yield_return = (require 'cs_coroutine').yield_return
  3. local co = coroutine.create(function()
  4. print('coroutine start!')
  5. local s = os.time()
  6. yield_return(CS.UnityEngine.WaitForSeconds(3))
  7. print('wait interval:', os.time() - s)
  8. local www = CS.UnityEngine.WWW('http://www.qq.com')
  9. yield_return(www)
  10. if not www.error then
  11. print(www.bytes)
  12. else
  13. print('error:', www.error)
  14. end
  15. end)
  16. assert(coroutine.resume(co))

cs_coroutine.lua.txt

  1. local util = require 'xlua.util'
  2. local gameobject = CS.UnityEngine.GameObject('Coroutine_Runner')
  3. CS.UnityEngine.Object.DontDestroyOnLoad(gameobject)
  4. local cs_coroutine_runner = gameobject:AddComponent(typeof(CS.Coroutine_Runner))
  5. local function async_yield_return(to_yield, cb)
  6. cs_coroutine_runner:YieldAndCallback(to_yield, cb)
  7. end
  8. return {
  9. yield_return = util.async_to_sync(async_yield_return)
  10. }

Coroutine_Runner.cs

  1. using UnityEngine;
  2. using XLua;
  3. using System.Collections.Generic;
  4. using System.Collections;
  5. using System;
  6. [LuaCallCSharp]
  7. public class Coroutine_Runner : MonoBehaviour
  8. {
  9. public void YieldAndCallback(object to_yield, Action callback)
  10. {
  11. StartCoroutine(CoBody(to_yield, callback));
  12. }
  13. private IEnumerator CoBody(object to_yield, Action callback)
  14. {
  15. if (to_yield is IEnumerator)
  16. yield return StartCoroutine((IEnumerator)to_yield);
  17. else
  18. yield return to_yield;
  19. callback();
  20. }
  21. }
  22. public static class CoroutineConfig
  23. {
  24. [LuaCallCSharp]
  25. public static List<Type> LuaCallCSharp
  26. {
  27. get
  28. {
  29. return new List<Type>()
  30. {
  31. typeof(WaitForSeconds),
  32. typeof(WWW)
  33. };
  34. }
  35. }
  36. }

?