You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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代码编译成插件:

  1. 编写Objective-C代码:
#import <AppKit/AppKit.h>

@interface DoubleClickPlugin : NSObject
@end

@implementation DoubleClickPlugin
+ (double)getSystemDoubleClickInterval {
    return [NSEvent doubleClickInterval];
}
@end
  1. 将代码编译成.bundle格式的插件,放入Unity项目的Plugins/macOS目录
  2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 23:35:03