【Unity3D脚本与系统设计6】鼠标触摸超时待机实现

news2025/4/21 17:28:47

实现步骤

在Unity中实现一个功能,当鼠标或触摸超过一定时间没有操作时,自动返回待机界面。

检测输入

首先,我需要检测用户的输入,无论是鼠标还是触摸。Unity的Input系统可以检测到鼠标和触摸事件,比如Input.GetAxis(“Mouse X”)或者Input.touchCount。

  • 鼠标移动:通过 Input.GetAxis 检测光标移动。
  • 鼠标点击:检测左键(0)、右键(1)按下。
  • 触摸事件:识别触摸开始(Began)和移动(Moved),忽略静止(Stationary)。
// 检测鼠标或触摸输入
    private bool IsInputDetected()
    {
        // 鼠标移动检测
        if (Input.GetAxis("Mouse X") != 0 || Input.GetAxis("Mouse Y") != 0)
        {
            return true;
        }

        // 鼠标点击检测
        if (Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1))
        {
            return true;
        }

        // 触摸检测
        if (Input.touchCount > 0)
        {
            Touch touch = Input.GetTouch(0);
            if (touch.phase == TouchPhase.Began || touch.phase == TouchPhase.Moved)
            {
                return true;
            }
        }

        return false;
    }

计时器

当有输入的时候,我需要重置一个计时器。如果没有输入,计时器就会一直累加,直到超过设定的超时时间,比如30秒,这时候就触发返回待机界面的动作。

  • 设置超时时间:在Inspector面板中调整 timeoutDuration(默认为30秒)。
void Update()
    {
        if (IsInputDetected())
        {
            currentIdleTime = 0f; // 检测到输入,重置计时
        }
        else
        {
            currentIdleTime += Time.deltaTime; // 无输入,累计时间
            if (currentIdleTime >= timeoutDuration)
            {
                // 超时触发返回待机
            }
        }
    }

返回待机界面

  • 待机界面:根据项目需求选择加载场景或激活UI:
    • 场景切换:确保待机场景(如StandbyScene)在Build Settings中。
    • UI激活:取消注释UI相关代码,并在Inspector中绑定对应的UI对象。
// 返回待机界面
    private void ReturnToStandby()
    {
        // 示例:重新加载待机场景,替换为你的逻辑
        SceneManager.LoadScene("StandbyScene");
        
        // 或激活UI元素
        // standbyUI.SetActive(true);
    }

完整代码

using UnityEngine;
using UnityEngine.SceneManagement;

public class IdleDetector : MonoBehaviour
{
    [SerializeField] private float timeoutDuration = 30f; // 超时时间(秒)
    private float currentIdleTime;

    void Update()
    {
        if (IsInputDetected())
        {
            currentIdleTime = 0f; // 检测到输入,重置计时
        }
        else
        {
            currentIdleTime += Time.deltaTime; // 无输入,累计时间
            if (currentIdleTime >= timeoutDuration)
            {
                ReturnToStandby(); // 超时触发返回待机
            }
        }
    }

    // 检测鼠标或触摸输入
    private bool IsInputDetected()
    {
        // 鼠标移动检测
        if (Input.GetAxis("Mouse X") != 0 || Input.GetAxis("Mouse Y") != 0)
        {
            return true;
        }

        // 鼠标点击检测
        if (Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1))
        {
            return true;
        }

        // 触摸检测
        if (Input.touchCount > 0)
        {
            Touch touch = Input.GetTouch(0);
            if (touch.phase == TouchPhase.Began || touch.phase == TouchPhase.Moved)
            {
                return true;
            }
        }

        return false;
    }

    // 返回待机界面
    private void ReturnToStandby()
    {
        // 示例:重新加载待机场景,替换为你的逻辑
        SceneManager.LoadScene("StandbyScene");
        
        // 或激活UI元素
        // standbyUI.SetActive(true);
    }
}

优化

  • 在非活动界面暂停检测,减少不必要的计算。
  • 用UnityEvent实现超时触发
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.Events;

public class IdleDetector : MonoBehaviour
{
    [SerializeField] private float timeoutDuration = 30f; // 超时时间(秒)
    private float currentIdleTime;
	[SerializeField] private bool isDetector = false;
	[SerializeField] private UnityEvent onIdleEvent;
	//启用检测
	public void SetDetectorState(bool state)
	{
		isDetector = state;
	}
	//重置时间
	private void ResetTimer()
	{
		currentIdleTime = 0f; 
	}
    void Update()
    {
    	if(!isDetector)
    		return;
        if (IsInputDetected())
        {
            ResetTimer();// 检测到输入,重置计时
        }
        else
        {
            currentIdleTime += Time.deltaTime; // 无输入,累计时间
            if (currentIdleTime >= timeoutDuration)
            {
                onIdleEvent?.Invoke();
                ResetTimer();// 如果需要持续检测,可以重置计时器
            }
        }
    }

    // 检测鼠标或触摸输入
    private bool IsInputDetected()
    {
        // 鼠标移动检测
        if (Input.GetAxis("Mouse X") != 0 || Input.GetAxis("Mouse Y") != 0)
        {
            return true;
        }

        // 鼠标点击检测
        if (Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1))
        {
            return true;
        }

        // 触摸检测
        if (Input.touchCount > 0)
        {
            Touch touch = Input.GetTouch(0);
            if (touch.phase == TouchPhase.Began || touch.phase == TouchPhase.Moved)
            {
                return true;
            }
        }

        return false;
    }
}

测试

  • 挂载脚本:将脚本挂载到场景中一个持久存在的对象(如空对象 IdleDetector)。
    在这里插入图片描述

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

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

相关文章

C++学习之路:从头搞懂配置VScode开发环境的逻辑与步骤

目录 编辑器与IDE基于vscode的C开发环境配置1. 下载vscode、浅尝编译。番外篇 2. 安装插件,赋能编程。3. 各种json文件的作用。c_cpp_properties.jsontask.jsonlaunch.json 总结&&彩蛋 编辑器与IDE 上一篇博客已经介绍过了C程序的一个编译流程,从…

Web3与网络安全:如何确保去中心化应用的安全性

Web3与网络安全:如何确保去中心化应用的安全性 随着区块链技术的蓬勃发展,Web3的概念逐渐成为互联网发展的新趋势。Web3强调去中心化、用户主权和数据隐私,它的核心是构建一个更加开放、透明和安全的网络环境。然而,随着去中心化…

插值法笔记 ——武汉理工统计 周

第二章 插值法 插值法定义 插值函数定义 设函数 y f ( x ) y f(x) yf(x) 在区间 [a,b] 上有定义&#xff0c;且满足节点排列&#xff1a; a ≤ x 0 < x 1 < ⋯ < x n ≤ b a \leq x_0 < x_1 < \cdots < x_n \leq b a≤x0​<x1​<⋯<xn​≤b …

23种设计模式-命令(Command)设计模式

命令设计模式 &#x1f6a9;什么是命令设计模式&#xff1f;&#x1f6a9;命令设计模式的特点&#x1f6a9;命令设计模式的结构&#x1f6a9;命令设计模式的优缺点&#x1f6a9;命令设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是命令设计模式…

和鲸科技执行总裁殷自强受邀主讲华中附属同济医院大模型应用通识首期课程

当前&#xff0c;医学与人工智能的深度融合正迎来历史性发展机遇。华中科技大学同济医学院附属同济医院&#xff08;以下简称“同济医院”&#xff09;作为医疗人工智能应用的先行探索者&#xff0c;已在电子病历辅助书写、科研数据分析、医疗合同自动化审核等关键场景完成试点…

使用 Go 构建 MCP Server

一个互联网技术玩家&#xff0c;一个爱聊技术的家伙。在工作和学习中不断思考&#xff0c;把这些思考总结出来&#xff0c;并分享&#xff0c;和大家一起交流进步。 一、MCP 介绍 1. 基本介绍 MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;是…

C语言贪吃蛇实现

When the night gets dark,remember that the Sun is also a star. 当夜幕降临时&#xff0c;请记住太阳也是一颗星星。 ————《去月球海滩篇》 目录 文章目录 一、《贪吃蛇》游戏介绍 二、WIN32部分接口简单介绍 2.1 控制台窗口大小设置 2.2 命令行窗口的名称的变更 2…

利用zabbix自带key获取数据

获取数据的三种方法 1、链接模版 服务器系统自身的监控 CPU CPU使用率、CPU负载 内存 内存剩余量 硬盘 关键性硬盘的剩余量、IO 网卡 流量/IO&#xff08;流入流量、流出流量、总流量、错误数据包流量&#xff09; 进程数 用户数 2、利用zabbix自带的键值key 1&#xff09;监…

无人机数据处理系统设计要点与难点!

一、系统设计要点 无人机数据处理系统需要高效、可靠、低延迟地处理多源异构数据&#xff08;如影像、传感器数据、位置信息等&#xff09;&#xff0c;同时支持实时分析和长期存储。以下是核心设计要点&#xff1a; 1.数据采集与预处理 多传感器融合&#xff1a;集成摄像头…

最大异或对 The XOR Largest Pair

题目来自洛谷网站&#xff1a; 思路&#xff1a; 两个循环时间复杂度太高了&#xff0c;会超时。 我们可以先将读入的数字&#xff0c;插入到字典树中&#xff0c;从高位到低位。对每个数查询的时候&#xff0c;题目要求是最大的异或对&#xff0c;所以我们选择相反的路径&am…

基于SpringBoot + Vue 的汽车租赁管理系统

技术介绍&#xff1a; ①&#xff1a;架构: B/S、MVC ②&#xff1a;系统环境&#xff1a;Windows/Mac ③&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql ④&#xff1a;技术栈&#xff1a;Java、Mysql、SpringBoot、Mybatis、Vue 项目功能&#xff1a; 角色&am…

基于DrissionPage的TB商品信息采集与可视化分析

一、项目背景 随着电子商务的快速发展,淘宝作为中国最大的电商平台之一,拥有海量的商品信息。这些数据对于市场分析、用户行为研究以及竞争情报收集具有重要意义。然而,由于淘宝的反爬虫机制和复杂的页面结构,直接获取商品信息并不容易。尤其是在电商行业高速发展的今天,商…

电气、电子信息与通信工程的探索与应用

从传统定义来看&#xff0c;电气工程是现代科技领域的核心学科和关键学科。它涵盖了创造产生电气与电子系统的有关学科的总和。然而&#xff0c;随着科学技术的飞速发展&#xff0c;电气工程的概念已经远超出这一范畴。 电子信息工程则是将电子技术、通信技术、计算机技术等应…

Python备赛笔记2

1.区间求和 题目描述 给定a1……an一共N个整数&#xff0c;有M次查询&#xff0c;每次需要查询区间【L,R】的和。 输入描述: 第一行包含两个数&#xff1a;N,M 第二行输入N个整数 接下来的M行&#xff0c;每行有两个整数&#xff0c;L R&#xff0c;中间用空格隔开&…

Unity2022发布Webgl2微信小游戏部分真机黑屏

复现规律&#xff1a; Unity PlayerSetting中取消勾选ShowSplashScreen 分析&#xff1a; 在Unity中&#xff0c;Splash Screen&#xff08;启动画面&#xff09; 不仅是视觉上的加载动画&#xff0c;还承担了关键的引擎初始化、资源预加载和渲染环境准备等底层逻辑。禁用后导…

记一次线上SQL死锁事故

一、 引言 SQL死锁是一个常见且复杂的并发控制问题。当多个事务在数据库中互相等待对方释放锁时&#xff0c;就会形成死锁&#xff0c;从而导致事务无法继续执行&#xff0c;影响系统的性能和可用性。死锁不仅会导致数据库操作的阻塞&#xff0c;增加延迟&#xff0c;还可能对…

Axure项目实战:智慧城市APP(六)市民互动(动态面板、显示与隐藏)

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;市民互动 主要内容&#xff1a;动态面板、显示与隐藏交互应用 应用场景&#xff1a;AI产品交互、互动类应用 案例展示&#xff1a; 案例视频&am…

为何服务器监听异常?

报错&#xff1a; 执行./RCF后出现监听异常--在切换网络后&#xff0c;由于前面没有退出./RCF执行状态&#xff1b;重新连接后&#xff0c;会出现服务器监听异常 原因如下&#xff1a; 由于刚开始登录内网&#xff0c;切换之后再重新登录内网&#xff0c;并且切换网络的过程中…

1.认识Excel

一 Excel 可以用来做什么 二 提升技巧 1.数据太多 2.计算太累 3.提升数据的价值和意义 4.团队协作 三 学习目标 学习目标不是为了掌握所有的技能&#xff0c;追逐新功能。而是学知识来解决需求&#xff0c;如果之前的技能和新出的技能都可以解决问题&#xff0c;那不学新技能也…

光谱范围与颜色感知的关系

光谱范围与颜色感知是光学、生理学及技术应用交叉的核心课题&#xff0c;两者通过波长分布、人眼响应及技术处理共同决定人类对色彩的认知。以下是其关系的系统解析&#xff1a; ‌1.基础原理&#xff1a;光谱范围与可见光‌ ‌光谱范围定义‌&#xff1a; 电磁波谱中能被特定…