zoukankan      html  css  js  c++  java
  • UNITY中有Timer

    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()即可。简单好用。

  • 相关阅读:
    pip install pli 提示:Could not find a version that satisfies the requirement PIL
    关于selenium部分元素定位不到的解决办法
    ERROR 1054 (42S22): Unknown column ‘password‘ in ‘field list‘
    通过Tomcat jpress连接不到数据库
    Navicat MySQL 连接出现 Authentication plugin ‘caching_sha2_password‘ cannot be loaded
    Selenium中核心属性以及方法
    selenium中定位frame中的元素
    selenium中截屏以及按照时间格式保存到相应文件夹
    Selenium中核心属性以及方法
    selenium中关于js脚本的一些操作
  • 原文地址:https://www.cnblogs.com/jiahuafu/p/6835635.html
Copyright © 2011-2022 走看看