【总】Unity Mono
版本Unity 6000.3.19f1Debug 扩展using System; using System.IO; using System.Text; using System.Threading.Tasks; using UnityEngine; public class DebugExtend { /// summary /// 是否记录日志信息 /// /summary public static bool IsRecordLog true; /// summary /// 打印日志信息 /// /summary /// param namemessage日志内容/param public static async void Log(object message) { Debug.Log(message); await RecordLogInfo(message, DebugLogType.Log); } /// summary /// 打印日志警告信息 /// /summary /// param namemessage日志内容/param public static async void LogWarning(object message) { Debug.LogWarning(message); await RecordLogInfo(message, DebugLogType.Warning); } /// summary /// 打印日志错误信息 /// /summary /// param namemessage日志内容/param public static async void LogError(object message) { Debug.LogError(message); await RecordLogInfo(message, DebugLogType.Error); } /// summary /// 打印日志信息 /// /summary /// param namemessage日志内容/param /// param namelogType打印日志类型/param public static void Log(object message, DebugLogType logType) { switch (logType) { case DebugLogType.Log: Log(message); break; case DebugLogType.Error: LogError(message); break; case DebugLogType.Warning: LogWarning(message); break; } } /// summary /// 记录日志信息 /// /summary /// param namemessage日志内容/param /// param namelogType打印日志类型/param /// returns/returns private static async Task RecordLogInfo(object message, DebugLogType logType) { if (!IsRecordLog) return; // 若关闭日志输出则不再进行记录 if (!Debug.unityLogger.logEnabled) return; string filePath ; string fileName ${logType}.txt; string newLine Environment.NewLine; // 换行符处理保证跨平台兼容性 string time_stamp ${DateTime.Now:yyyy-MM-dd HH:mm:ss}; // 当前时间戳 string appendContent $[{logType.ToString().ToLower()}] {time_stamp}{newLine}{message}{newLine}{newLine}; #if UNITY_EDITOR filePath Path.Combine(Application.dataPath, Editor, fileName); #elif UNITY_ANDROID || UNITY_IOS || UNITY_WEBGL filePath Path.Combine(Application.persistentDataPath, fileName); #else filePath Path.Combine(Environment.CurrentDirectory, fileName); #endif #if UNITY_WEBGL !UNITY_EDITOR File.AppendAllText(filePath, appendContent, Encoding.UTF8); if (File.Exists(filePath)) Debug.Log($Save content\n{File.ReadAllText(filePath)}); await Task.Delay(1); #else Debug.Log(Save file path : filePath); // 确保目录存在 Directory.CreateDirectory(Path.GetDirectoryName(filePath)); // 异步追加文件内容避免主线程卡顿 await Task.Run(() { try { #if !UNITY_ANDROID !UNITY_IOS //// 方法一true表示追加模式 //using (StreamWriter writer new StreamWriter(filePath, true)) //{ // writer.Write(appendContent); //} #endif // 方法二追加文本如果文件不存在会自动创建指定编码格式 File.AppendAllText(filePath, appendContent, Encoding.UTF8); } catch (Exception e) { Debug.LogError($Unable to write log content{e.Message}); } }); #endif #if UNITY_EDITOR // 刷新资源数据刷新日志信息 UnityEditor.AssetDatabase.Refresh(); #endif } } public enum DebugLogType { Log, Warning, Error }获取本地IPusing System.Net.NetworkInformation; using System.Net.Sockets; public class MonoTools { public static string GetIP(AddressFAM addressFAM) { // https://blog.csdn.net/sinat_39291423/article/details/100733882 if (addressFAM AddressFAM.IPv6 !Socket.OSSupportsIPv6) { return null; } string output ; foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces()) { #if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN NetworkInterfaceType _type1 NetworkInterfaceType.Wireless80211; NetworkInterfaceType _type2 NetworkInterfaceType.Ethernet; if ((item.NetworkInterfaceType _type1 || item.NetworkInterfaceType _type2) item.OperationalStatus OperationalStatus.Up) #endif { foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses) { if (addressFAM AddressFAM.IPv4) { if (ip.Address.AddressFamily AddressFamily.InterNetwork) { output ip.Address.ToString(); } } else if (addressFAM AddressFAM.IPv6) { if (ip.Address.AddressFamily AddressFamily.InterNetworkV6) { output ip.Address.ToString(); } } } } } return output; } public enum AddressFAM { IPv4, IPv6 } }获取文件夹地址using UnityEngine; public class MonoTools { public static string GetPath(ProjectPath projectPath) { string path ; switch (projectPath) { case ProjectPath.Assets: path Application.dataPath; break; case ProjectPath.Data: path Application.persistentDataPath; break; case ProjectPath.Cache: path Application.temporaryCachePath; break; case ProjectPath.Project: path System.Environment.CurrentDirectory; break; case ProjectPath.StreamingAssets: path Application.streamingAssetsPath; break; } return path; } public enum ProjectPath { Project, Assets, Data, Cache, StreamingAssets } }关闭程序二次确定using System; using System.Runtime.InteropServices; using UnityEngine; public class ApplicationQuit : MonoBehaviour { #region variable /// summary 用于告诉Unity是否要退出 /summary private bool m_IsWantsToQuit false; /// summary 判断是否点击了退出程序按钮 /summary private bool m_IsClickCloseBtn false; /// summary 用于执行退出前的委托 /summary private Action m_WantsToQuitAction; #endregion [DllImport(User32.dll, SetLastError true, ThrowOnUnmappableChar true, CharSet CharSet.Auto)] public static extern int MessageBox(IntPtr handle, String message, String title, int type); private void Awake() { m_IsWantsToQuit false; m_IsClickCloseBtn false; Application.wantsToQuit WantsToQuit; } private void Start() { m_WantsToQuitAction () ShowMessageBox(); } private bool WantsToQuit() { if (!m_IsWantsToQuit !m_IsClickCloseBtn) m_WantsToQuitAction?.Invoke(); return m_IsWantsToQuit; } private void ShowMessageBox() { #if !UNITY_EDITOR m_IsClickCloseBtn true; int messageIndex MessageBox(IntPtr.Zero, 确定要退出程序吗, 提示, 1); if (messageIndex 1) { m_IsWantsToQuit true; Application.Quit(); // 杀死当前进程强制关闭 System.Diagnostics.Process.GetCurrentProcess().Kill(); } else { m_IsClickCloseBtn false; } #endif } }跳过启动Logo动画using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Scripting; /// summary /// 项目运行初始化 /// Preserve此特性用于防止在打包的时候这个脚本没有被打包进程序 /// /summary [Preserve] public class RuntimeInitialize { [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSplashScreen)] private static void BeforeSplashScreen() { #if UNITY_WEBGL Application.focusChanged Application_FocusChanged; #else // 跳过Unity的启动Logo System.Threading.Tasks.Task.Run(AsyncSkip); //Task.Run(() SplashScreen.Stop(SplashScreen.StopBehavior.StopImmediate)); #endif } [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] private static void BeforeSceneLoad() { Debug.Log(加载开始); } [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)] private static void AfterSceneLoad() { Debug.Log(加载完成); } #if UNITY_WEBGL private static void Application_FocusChanged(bool obj) { Application.focusChanged - Application_FocusChanged; SplashScreen.Stop(SplashScreen.StopBehavior.StopImmediate); } #else private static void AsyncSkip() { SplashScreen.Stop(SplashScreen.StopBehavior.StopImmediate); } #endif }

相关新闻

第六届上海理工大学ACM程序设计全国挑战赛

第六届上海理工大学ACM程序设计全国挑战赛

比赛很不错,都不是很难,主要靠思维吧,学东西多了,喜欢把问题复杂化了,反而看不懂题目的本质 目录 A 签到题 L 签到题 G hsq的群 D hsq的神秘序列 问题:unordered_map查找配对元素位置会T N hsq的计组…

2026/7/26 20:41:17 阅读更多 →
AM335x PRCM时钟模块寄存器实战:从原理到DVFS与低功耗配置

AM335x PRCM时钟模块寄存器实战:从原理到DVFS与低功耗配置

1. 项目概述与PRCM模块核心价值在嵌入式系统开发,尤其是基于复杂SoC(片上系统)的设计中,时钟和电源管理往往是决定系统稳定性、性能与功耗的基石。很多开发者初次接触底层驱动时,面对动辄上千页的技术参考手册&#xf…

2026/7/26 5:04:35 阅读更多 →
YOLOv11导出为NCNN格式:移动端和嵌入式平台的轻量化部署方案

YOLOv11导出为NCNN格式:移动端和嵌入式平台的轻量化部署方案

前言:为什么你的YOLO模型在手机上跑不动? 做目标检测的兄弟们一定都有过这样的经历——在服务器上用YOLO模型跑得飞起,mAP漂亮得不行,结果一部署到手机或嵌入式设备上,要么推理慢得像PPT,要么内存直接爆掉,要么干脆闪退。 这不是你一个人的问题。 根据Ultralytics官方…

2026/7/26 5:11:16 阅读更多 →

最新新闻

【问题已经解决】腾讯元宝,你欠用户一个稳定的解析管线——2026年7月16日起 smartcanvas 拉取崩溃纪实

【问题已经解决】腾讯元宝,你欠用户一个稳定的解析管线——2026年7月16日起 smartcanvas 拉取崩溃纪实

声明:本文所述内容,目前本人测试,已不在V2.78复现,感谢腾讯元宝团队,本文仅作为历史档案留存前言我是一个重度依赖腾讯文档 腾讯元宝的知识工作者。我的资料库、项目文档、团队协作笔记全部建立在腾讯文档的 smartcan…

2026/7/26 23:24:19 阅读更多 →
Debian服务器部署XFCE4+TigerVNC轻量远程桌面方案

Debian服务器部署XFCE4+TigerVNC轻量远程桌面方案

1. 项目背景与需求解析在Linux服务器管理领域,图形化远程桌面一直是运维人员和开发者的刚需。最近在部署Debian 13服务器时,发现很多同事不熟悉纯命令行操作,急需一套轻量级的图形化解决方案。经过多方案对比测试,最终选择了XFCE4…

2026/7/26 23:24:19 阅读更多 →
【SVM分类】基于花朵授粉算法优化最小二乘支持向量机实现数据分类matlab代码

【SVM分类】基于花朵授粉算法优化最小二乘支持向量机实现数据分类matlab代码

1 简介近年来,已有越来越多的建模方法被相关学者提出用来解决分类识别、风险预测、效能评估等问题,这些建模方法包括:时间序列分析、灰色理论、神经网络等。但是时间序列分析,方法复杂且预测精度较低;灰色理论需要规律…

2026/7/26 23:24:19 阅读更多 →
【元胞自动机】基于元胞自动机实现双车道靠右行驶交通流模型matlab代码

【元胞自动机】基于元胞自动机实现双车道靠右行驶交通流模型matlab代码

1 简介元胞自动机(Cellular Automata,简称CA)模型作为交通流理论的一种重要数学模型,具有时空离散、规则简单、计算效率高、易于实现等特点,一直都是交通流研究的一个热点,具有广阔应用前景。本文在现有元胞自动机交通流模型的基础上,建立双车道元胞自动机交通流模型。2 部分代…

2026/7/26 23:24:19 阅读更多 →
# 鸿蒙ArkTS实战:每日名言应用 — 随机格言展示与卡片式UI设计

# 鸿蒙ArkTS实战:每日名言应用 — 随机格言展示与卡片式UI设计

一、应用概述 每日名言(Daily Quote)是移动端最常见的内容展示类应用之一。在鸿蒙生态中,利用 ArkTS 构建一款随机展示中国经典谚语/名言的轻应用,不仅可以检验开发者对数据管理、组件封装、动画过渡等核心概念的理解&#xff0c…

2026/7/26 23:24:19 阅读更多 →
VC++实现二维图形变换:从矩阵原理到交互式程序开发

VC++实现二维图形变换:从矩阵原理到交互式程序开发

1. 项目概述:从理论到实践的图形学桥梁在计算机图形学的学习与实践中,二维图形变换是一个绕不开的经典课题。它不仅是理解三维图形学、游戏开发、计算机视觉等高级领域的基石,更是检验你是否真正掌握了图形学核心数学工具——矩阵运算——的绝…

2026/7/26 23:23:18 阅读更多 →

日新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/26 0:00:31 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/26 0:00:31 阅读更多 →

月新闻