Unity编辑器扩展开发:如何在macOS系统获取双击间隔?
获取跨平台(Windows/macOS)的操作系统双击间隔(Unity编辑器扩展)
Windows 已有实现
Windows平台可直接通过P/Invoke调用系统API获取双击间隔,代码如下:
[DllImport("user32.dll")] static extern uint GetDoubleClickTime();
调用该方法会返回毫秒单位的系统双击间隔值。
macOS 实现方案
macOS系统的双击间隔由AppKit框架中NSEvent类的doubleClickInterval属性提供,在.NET(Unity使用的Mono/.NET环境)中可通过以下两种方式调用:
方式1:直接通过Objective-C Runtime P/Invoke调用
无需额外编译插件,直接借助Objective-C运行时API实现跨语言调用:
using System; using System.Runtime.InteropServices; #if UNITY_EDITOR_OSX public static class MacOSDoubleClickHelper { [DllImport("/System/Library/Frameworks/Foundation.framework/Foundation")] private static extern IntPtr objc_getClass(string className); [DllImport("/System/Library/Frameworks/Foundation.framework/Foundation")] private static extern IntPtr sel_registerName(string selectorName); [DllImport("/System/Library/Frameworks/Foundation.framework/Foundation")] private static extern double objc_msgSend(IntPtr receiver, IntPtr selector); /// <summary> /// 获取macOS系统双击间隔(单位:秒) /// </summary> public static double GetDoubleClickInterval() { IntPtr nseventClass = objc_getClass("NSEvent"); IntPtr selector = sel_registerName("doubleClickInterval"); return objc_msgSend(nseventClass, selector); } } #endif
注意:返回值为秒单位,若需要和Windows统一的毫秒值,乘以1000转换即可。
方式2:自定义macOS原生插件(可选)
如果觉得Runtime调用过于底层,可编写简单的Objective-C代码编译成插件:
- 编写Objective-C代码:
#import <AppKit/AppKit.h> @interface DoubleClickPlugin : NSObject @end @implementation DoubleClickPlugin + (double)getSystemDoubleClickInterval { return [NSEvent doubleClickInterval]; } @end
- 将代码编译成
.bundle格式的插件,放入Unity项目的Plugins/macOS目录 - 在C#中通过P/Invoke调用:
#if UNITY_EDITOR_OSX [DllImport("DoubleClickPlugin.bundle")] static extern double getSystemDoubleClickInterval(); #endif
跨平台整合调用
在Unity编辑器扩展中,通过平台宏区分不同系统的调用逻辑,实现统一的接口:
public static class SystemDoubleClickUtility { /// <summary> /// 获取系统双击间隔(单位:毫秒) /// </summary> public static uint GetDoubleClickIntervalMs() { #if UNITY_EDITOR_WIN return GetDoubleClickTime(); #elif UNITY_EDITOR_OSX double seconds = MacOSDoubleClickHelper.GetDoubleClickInterval(); return (uint)(seconds * 1000); #else // 其他平台返回默认值 return 500; #endif } [DllImport("user32.dll")] static extern uint GetDoubleClickTime(); }
内容的提问来源于stack exchange,提问作者Meister der Magie
相关产品推荐
相关产品推荐

