博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UNITY中有Timer
阅读量:4326 次
发布时间:2019-06-06

本文共 3862 字,大约阅读时间需要 12 分钟。

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
();#if !ARTIST_BUILD UnityEngine.Object.DontDestroyOnLoad(g);#endif } } public struct NoDelayedQueueItem { public Action
action; public object param; } private List
_actions = new List
(); public struct DelayedQueueItem { public float time; public Action
action; public object param; } private List
_delayed = new List
(); List
_currentDelayed = new List
(); public static void QueueOnMainThread(Action
taction, object tparam) { QueueOnMainThread(taction, tparam, 0f); } public static void QueueOnMainThread(Action 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
_currentActions = new List
(); // 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()即可。简单好用。

 

转载于:https://www.cnblogs.com/jiahuafu/p/6835635.html

你可能感兴趣的文章
小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_37、分布式缓存Redis介绍...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第10节 SpringBoot整合定时任务和异步任务处理_42、SpringBoot常用定时任务配置实战...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_39、SpringBoot2.x整合redis实战讲解...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第14节 高级篇幅之SpringBoot多环境配置_59、SpringBoot多环境配置介绍和项目实战...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第10节 SpringBoot整合定时任务和异步任务处理_41、SpringBoot定时任务schedule讲解...
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第10节 SpringBoot整合定时任务和异步任务处理_43、SpringBoot2.x异步任务实战(核心知识)...
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_1_01课程简介
查看>>
小D课堂 - 零基础入门SpringBoot2.X到实战_第11节 Logback日志框架介绍和SpringBoot整合实战_45、SpringBoot2.x日志讲解和Logback配置实战...
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_1_02技术选型
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_汇总
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_2_01传统架构演进到分布式架构
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_2_02 微服务核心基础讲解
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_2_04微服务下电商项目基础模块设计...
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_3-01 什么是微服务的注册中心
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_3-03CAP原理、常见面试题
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_3-04 SpringCloud微服务核心组件Eureka介绍和闭源后影响...
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_3-05 服务注册和发现Eureka Server搭建实战...
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_3-06 服务注册和发现之Eureka Client搭建商品服务实战...
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_3-07 Eureka服务注册中心配置控制台问题处理...
查看>>
小D课堂 - 新版本微服务springcloud+Docker教程_4-01 常用的服务间调用方式讲解
查看>>