unity小工具-非实时的值变化监听器

项目里有代码专门监听网络环境的变化,特别是在下载中,如果遇到断网或者切换为移动网络,可能需要触发提醒等等。这种需求可能是通用的,于是便写了一个通用的监听代码。是

using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using UnityEngine;public delegate T XValueGetter<T>();public interface IValueObserver
{long GetId();bool Check(long checkTime);bool ReachCheckTime(long checkTime);void NotifyChange();
}public class XValueObserve<T> : IValueObserver
{public T CurrentValue;public long LastCheckTime;public XValueGetter<T> Getter { get; set; }public Action<T> OnValueChangeCallback { get; set; }public long CheckInterval;public long Id;public XValueObserve(long id, XValueGetter<T> getter, Action<T> onValueChangeCallback, long checkInterval){Id = id;Getter = getter;OnValueChangeCallback = onValueChangeCallback;CheckInterval = checkInterval;LastCheckTime = 0;CurrentValue = getter();}public long GetId(){return Id;}public bool ReachCheckTime(long checkTime){return checkTime - LastCheckTime >= CheckInterval;}public bool Check(long checkTime){T currentValue = Getter();LastCheckTime = checkTime;if (!currentValue.Equals(CurrentValue)){CurrentValue = currentValue;return true;}return false;}public void NotifyChange(){OnValueChangeCallback?.Invoke(CurrentValue);}
}public class XValueObserveManager
{private static Stopwatch s_stopWatch;private static long s_observerId;private static List<IValueObserver> s_observers;public static void Init(){s_observers = new List<IValueObserver>();s_stopWatch = new Stopwatch();s_observerId = 0;}public static void Start(){s_stopWatch.Start();}public static void Update(){foreach (IValueObserver observer in s_observers){if (observer.ReachCheckTime(s_stopWatch.ElapsedMilliseconds)){if (observer.Check(s_stopWatch.ElapsedMilliseconds)){observer.NotifyChange();}}}}public static long AddObserve<T>(XValueGetter<T> getter, Action<T> onValueChangeCallback, long checkInterval){XValueObserve<T> observe = new XValueObserve<T>(s_observerId++, getter, onValueChangeCallback, checkInterval);s_observers.Add(observe);return observe.Id;}public static void RemoveObserve(long id){s_observers.RemoveAll(observe => observe.GetId() == id);}
}

 使用起来,也比较方便

void Start()
{XValueObserveManager.Init();XValueObserveManager.Start();int posObserverId = XValueObserveManager.AddObserve(() => transform.position, pos =>{Debug.Log(pos);}, 1000);int netObserverId = XValueObserveManager.AddObserve(() => Application.internetReachability, reach =>{Debug.Log(reach.ToString());}, 1000);
}

注意,这种变化观察都是非及时性质的,也就是并不会在变化发生的瞬间通知,而是最少要延迟一帧(基于Update执行)。

如果需要的是实时的,则需要另外的设计了,比如用事件管理器,但对于一些通用的数值则可能需要封装为属性,重载set方法,广播事件了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/696968.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++服务器开源项目Tinywebserver运行

c服务器开源项目Tinywebserver运行 一、Tinywebserver介绍二、环境搭建三、构建数据库四、编译Tinywebserver五、查看效果 Tinywebserver是github上一个十分优秀的开源项目&#xff0c;帮助初学者学习如何搭建一个服务器。 本文讲述如何在使用mysql跟该项目进行连接并将项目运行…

python 层次分析(AHP)

文章目录 一、算法原理二、案例分析2.1 构建指标层判断矩阵2.2 求各指标权重2.2.1 算术平均法&#xff08;和积法&#xff09;2.2.2 几何平均法&#xff08;方根法&#xff09; 2.3 一致性检验2.3.1 求解最大特征根值2.3.2 求解CI、RI、CR值2.3.3 一致性判断 2.4 分别求解方案层…

利用Ubuntu22.04启动U盘对电脑磁盘进行格式化

概要&#xff1a; 本篇演示利用Ubuntu22.04启动U盘的Try Ubuntu模式对电脑磁盘进行格式化 一、说明 1、电脑 笔者的电脑品牌是acer(宏碁/宏基) 开机按F2进入BIOS 开机按F12进入Boot Manager 2、Ubuntu22.04启动U盘 制作方法参考笔者的文章&#xff1a; Ubuntu制作Ubun…

【OpenAI官方课程】第五课:ChatGPT文本转换Transforming

欢迎来到ChatGPT 开发人员提示工程课程&#xff08;ChatGPT Prompt Engineering for Developers&#xff09;&#xff01;本课程将教您如何通过OpenAI API有效地利用大型语言模型&#xff08;LLM&#xff09;来创建强大的应用程序。 本课程由OpenAI 的Isa Fulford和 DeepLearn…

缓存篇—缓存雪崩

什么是缓存雪崩 通常我们为了保证缓存中的数据与数据库中的数据一致性&#xff0c;会给 Redis 里的数据设置过期时间&#xff0c;当缓存数据过期后&#xff0c;用户访问的数据如果不在缓存里&#xff0c;业务系统需要重新生成缓存&#xff0c;因此就会访问数据库&#xff0c;并…

QEMU源码全解析 —— virtio(22)

接前一篇文章&#xff1a;QEMU源码全解析 —— virtio&#xff08;21&#xff09; 前几回讲解了virtio驱动的加载。本回开始讲解virtio驱动的初始化。 在讲解virtio驱动的初始化之前&#xff0c;先要介绍virtio配置的函数集合变量virtio_pci_config_ops。实际上前文书也有提到…

c# HttpCookie操作,建立cookie工具类

HttpCookie 是一个在.NET Framework中用于管理和操作HTTP Cookie的类。它提供了一种方便的方式来创建、设置、读取和删除Cookie。 Cookie是一种在客户端和服务器之间传递数据的机制&#xff0c;用于跟踪用户的会话状态和存储用户相关的信息。它通常由服务器发送给客户端&#…

万字干货-京东零售数据资产能力升级与实践

开篇 京东自营和商家自运营模式&#xff0c;以及伴随的多种运营视角、多种组合计算、多种销售属性等数据维度&#xff0c;相较于行业同等量级&#xff0c;数据处理的难度与复杂度都显著增加。如何从海量的数据模型与数据指标中提升检索数据的效率&#xff0c;降低数据存算的成…

parallels配置centos虚拟环境

parallels Desktop M1/M2芯片Parallels Desktop 19虚拟机安装使用教程&#xff08;超详细&#xff09;-CSDN博客 下镜像记得找和mac芯片匹配的 安装就选第一个centos7不要选第二个 安装有问题就选回退重启 parallel desktop 18/19安装centos7.2009教程_parallels desktop 19…

echarts多y轴样式重叠问题

1、主要属性设置 yAxis: [{//y轴1nameTextStyle: {align: "right",padding: 0}},{//y轴2nameTextStyle: {align: "left",padding: 0}},{//y轴3axisLabel: {margin: 50},nameTextStyle: {align: "left",padding: [0, 0, 0, 50]},axisPointer: {l…

Python Web开发记录 Day2:CSS

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 二、CSS1、CSS-初始入门①快速了解②CSS应用方式…

【C语言】sizeof()函数

前言 sizeof函数用于获取数据类型或变量在内存中所占的字节数。 sizeof函数返回的是编译时确定的值&#xff0c;不会计算动态分配的内存大小。 sizeof函数可以用于多种类型的数据&#xff0c;包括数组、指针、结构体、枚举等。 1.数组 int arr[5];printf("%zu ", siz…

文件上传与下载

文件上传与下载 1. 文件上传 为了能上传文件&#xff0c;必须将表单的 method 设置为 POST&#xff0c;并将 enctype 设置为 multipart/form-data 。 有两种实现文件上传的方式&#xff1a; 底层使用 Apache Commons FileUpload 包 底层使用 Servlet 3.1 内置的文件上传功能…

如何计算文件哈希值(MD5值)

生成文件hash值的用途 哈希值&#xff0c;即HASH值&#xff0c;是通过对文件内容进行加密运算得到的一组二进制值&#xff0c;主要用途是用于文件校验或签名。正是因为这样的特点&#xff0c;它常常用来判断两个文件是否相同。 比如&#xff0c;从网络上下载某个文件&#xff0…

MySQL主从同步

MySQL主从同步&#xff08;复制&#xff09;是一种数据复制技术&#xff0c;用于将数据从一个MySQL数据库&#xff08;称为“主”&#xff09;复制到另一个或多个MySQL数据库&#xff08;称为“从”&#xff09;。这个过程通常用于负载均衡、数据备份、灾难恢复和其他类似场景。…

C++ Primer Plus 笔记(持续更新)

编译器的正解 数据&#xff0b;算法程序 赋值从右向左进行 cin&#xff0c;cout的本质也是对象 类和对象的解释

centerOS docker搭建flowable,流程引擎

1、准备一个mysql数据库&#xff0c;库名为flowable 2、mysql驱动下载&#xff0c;下载地址为&#xff1a; https://mvnrepository.com/artifact/mysql/mysql-connector-java此处使用的是8.0.22版本的驱动&#xff0c;且数据库必须使用版本8&#xff0c;否则第二次启动报错 3、…

OpenAI文生视频大模型Sora概述

Sora&#xff0c;美国人工智能研究公司OpenAI发布的人工智能文生视频大模型&#xff08;但OpenAI并未单纯将其视为视频模型&#xff0c;而是作为“世界模拟器” &#xff09;&#xff0c;于2024年2月15日&#xff08;美国当地时间&#xff09;正式对外发布。 Sora可以根据用户…

samber/lo 库的使用方法:type

samber/lo 库的使用方法&#xff1a;type samber/lo 是一个 Go 语言库&#xff0c;提供了一些常用的集合操作函数&#xff0c;如 Filter、Map 和 FilterMap。 这个库函数太多&#xff0c;因此我决定按照功能分别介绍&#xff0c;本文介绍的是 samber/lo 库中type相关的函数。汇…

Redis中的AOF重写到底是怎么一回事

首先我们知道AOF和RDB都是Redis持久化的方法。RDB是Redis DB&#xff0c;一种二进制数据格式&#xff0c;这样就是相当于全量保存数据快照了。AOF则是保存命令&#xff0c;然后恢复的时候重放命令。 AOF随着时间推移&#xff0c;会越来越大&#xff0c;因为不断往里追加命令。…