using UnityEngine;
using System.Collections;
using System.Timers; public class NewBehaviourScript : MonoBehaviour { // Use this for initialization
void Start () { Timer t = new Timer(100);
t.Elapsed += T_Elapsed_Handle;
t.Start(); } private void T_Elapsed_Handle(object sender, ElapsedEventArgs e)
{
Debug.Log("T_Elapsed_Handle" + this.gameObject.name);
}

  输出:

get_gameObject can only be called from the main thread.

看来Coroutin的出现就是为了解决这个问题,方便大家使用,

当然往主线程里Enqeue消息也是可以的

百度了一下,找到了Loom这个插件。感觉真的很好用,错误不见了。

这里做下记录。

Loom插件就一个脚本导入到Unity中就行了。具体脚本内容如下

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
using System.Threading;
using System.Linq; public class Loom :MonoBehaviour
{
public static int maxThreads = 8;
static int numThreads; private static Loom _current;
//private int _count;
public static Loom Current
{
get
{
Initialize();
return _current;
}
} void Awake()
{
_current = this;
initialized = true;
} static bool initialized; public static void Initialize()
{
if (!initialized)
{ if (!Application.isPlaying)
return;
initialized = true;
var g = new GameObject("Loom");
_current = g.AddComponent<Loom>();
#if !ARTIST_BUILD
UnityEngine.Object.DontDestroyOnLoad(g);
#endif
} }
public struct NoDelayedQueueItem
{
public Action<object> action;
public object param;
} private List<NoDelayedQueueItem> _actions = new List<NoDelayedQueueItem>();
public struct DelayedQueueItem
{
public float time;
public Action<object> action;
public object param;
}
private List<DelayedQueueItem> _delayed = new List<DelayedQueueItem>(); List<DelayedQueueItem> _currentDelayed = new List<DelayedQueueItem>(); public static void QueueOnMainThread(Action<object> taction, object tparam)
{
QueueOnMainThread(taction, tparam, 0f);
}
public static void QueueOnMainThread(Action<object> taction, object tparam, float time)
{
if (time != 0)
{
lock (Current._delayed)
{
Current._delayed.Add(new DelayedQueueItem { time = Time.time + time, action = taction, param = tparam });
}
}
else
{
lock (Current._actions)
{
Current._actions.Add(new NoDelayedQueueItem { action = taction, param = tparam });
}
}
} public static Thread RunAsync(Action a)
{
Initialize();
while (numThreads >= maxThreads)
{
Thread.Sleep(100);
}
Interlocked.Increment(ref numThreads);
ThreadPool.QueueUserWorkItem(RunAction, a);
return null;
} private static void RunAction(object action)
{
try
{
((Action)action)();
}
catch
{
}
finally
{
Interlocked.Decrement(ref numThreads);
} } void OnDisable()
{
if (_current == this)
{ _current = null;
}
} // Use this for initialization
void Start()
{ } List<NoDelayedQueueItem> _currentActions = new List<NoDelayedQueueItem>(); // Update is called once per frame
void Update()
{
if (_actions.Count > 0)
{
lock (_actions)
{
_currentActions.Clear();
_currentActions.AddRange(_actions);
_actions.Clear();
}
for (int i = 0; i < _currentActions.Count; i++)
{
_currentActions[i].action(_currentActions[i].param);
}
} if (_delayed.Count > 0)
{
lock (_delayed)
{
_currentDelayed.Clear();
_currentDelayed.AddRange(_delayed.Where(d => d.time <= Time.time));
for (int i = 0; i < _currentDelayed.Count; i++)
{
_delayed.Remove(_currentDelayed[i]);
}
} for (int i = 0; i < _currentDelayed.Count; i++)
{
_currentDelayed[i].action(_currentDelayed[i].param);
}
}
}
}

  

代码也就100多行,主要是两个比较主要的方法

RunAsync(Action a)和QueueOnMainThread(Action<object> taction, object tparam)

开启一个线程然后在Loom.RunAsyn()中调用需要回到Unity主线程更新界面时调用QueueOnMainThread()即可。简单好用。

最新文章

  1. php curl ftp上传 下载
  2. MFC的类层次结构图
  3. svn 检出 Check out 请求的名称有效,但是找不到请求的类型的数据。
  4. Failed to allocate the network(s), not rescheduling
  5. JS调用PHP 和 PHP调用JS的方法举例
  6. 测试驱动 ASP.NET MVC Type Aliase
  7. Web项目或WCF发布IIS后,如何通过VS2010调试
  8. java之web开发过滤器
  9. 弄懂promise
  10. Mac pip install mysql-python
  11. Myeclipse 添加插件
  12. Memcache分布式锁 转发 https://www.cnblogs.com/li150dan/p/9529090.html
  13. nmcli工具详解
  14. Java面试之五大框架的理解
  15. MacTex TexStudio Configuration 配置
  16. 3 字节的 UTF-8 序列的字节 3 无效 解决
  17. 基于CRF的中文分词
  18. Executors提供的四种线程池和自定义线程池
  19. onInterceptTouchEvent 与 onTouchEvent 分析与MotionEvent在ViewGroup与View中的分发
  20. CSS3,transform3D立体可拖拽正方体实现原理

热门文章

  1. Mysql5.7的gtid主从半同步复制和组复制
  2. wbr 视机而动
  3. Java并发编程之三:volatile关键字解析 转载
  4. sql中的一些通用函数
  5. endnote x7 破解版 关联word2010/2013
  6. 1106 1014 C语言文法定义与C程序的推导过程 冒泡程序语法树
  7. 使用promise方式来获取网络数据
  8. Spring线程池ThreadPoolTaskExecutor配置及详情
  9. MyEclipse部署项目到Tomcat上,但是classes文件夹下没有编译项目
  10. column count of mysql.proc is wrong. expected 20,found 16. the table is probably corruptd.