Unity 之通过自定义协议从浏览器启动本地应用程序

news2025/1/18 6:43:28

内容将会持续更新,有错误的地方欢迎指正,谢谢!
 

Unity 之通过自定义协议从浏览器启动本地应用程序
     
TechX 坚持将创新的科技带给世界!

拥有更好的学习体验 —— 不断努力,不断进步,不断探索
TechX —— 心探索、心进取!

助力快速掌握 自定义协议 启动程序

为初学者节省宝贵的学习时间,避免困惑!


前言:

  当今,Web 应用程序已经成为我们日常生活和工作中不可或缺的一部分。然而,有时我们可能需要从 Web 浏览器直接启动本地安装的应用程序,以处理特定的任务或数据。这时候,自定义协议就显得尤为重要和便捷。

自定义协议允许我们定义一种新的 URL 方案,使得浏览器能够识别并直接与本地应用程序进行通信。这种技术不仅提升了用户体验,还增强了 Web 应用程序与本地环境的集成能力,使得用户可以更高效地完成工作任务。

在本文中,我们将探讨如何设置和利用自定义协议来处理特定的 URL,以便从浏览器中打开本地应用程序。我们将介绍如何注册和处理自定义协议,并演示如何在浏览器中触发本地应用程序的启动,以实现无缝的跨平台集成和工作流程优化。


文章目录

  • 一、注册自定义协议
  • 二、使用自定义协议打开应用程序
  • 三、在Unity中处理自定义协议传递的参数


一、注册自定义协议


自定义协议(Custom Protocol)是一种在操作系统级别定义的URL协议,可以让特定的URL模式触发特定的应用程序。通过自定义协议,你可以在浏览器中点击一个链接,然后启动一个本地应用程序。这在开发需要从网页启动本地应用的场景中非常有用,比如启动Unity生成的.exe文件。
@echo off
cd /d %~dp0

@REM echo "%cd%"

:: 创建一个注册表文件并写入头部信息
echo Windows Registry Editor Version 5.00 >regist.reg

:: 创建主键 PrimaryKey,用于自定义协议
echo [HKEY_CLASSES_ROOT\PrimaryKey] >>regist.reg

:: 指定这是一个 URL 协议
echo "URL Protocol"="" >>regist.reg

:: 设置协议的描述
echo @="Primary Key Protocol" >>regist.reg

:: 创建子键 DefaultIcon,用于设置协议的图标
echo [HKEY_CLASSES_ROOT\PrimaryKey\DefaultIcon] >>regist.reg

:: 使用当前目录下的 YourUnityGame.exe 作为图标
echo @="%cd:\=\\%\\YourUnityGame.exe,1" >>regist.reg

:: 创建子键 shell
echo [HKEY_CLASSES_ROOT\PrimaryKey\shell] >>regist.reg

:: 创建子键 shell\open
echo [HKEY_CLASSES_ROOT\PrimaryKey\shell\open] >>regist.reg

:: 创建子键 shell\open\command
echo [HKEY_CLASSES_ROOT\PrimaryKey\shell\open\command] >>regist.reg

:: 设置当协议被调用时执行的命令,将当前目录路径转义,并将第一个参数传递给 YourUnityGame.exe
echo @="\"%cd:\=\\%\\YourUnityGame.exe\" \"%%1\"" >>regist.reg

:: 静默地导入注册表文件
regedit /s regist.reg

:: 删除临时生成的注册表文件
del regist.reg

:: 输出注册成功的提示信息
echo 注册成功

:: 暂停批处理脚本的执行,等待用户按下任意键继续
pause

PrimaryKey为注册表文件中的主键,可以根据你的需要自行填写

YourUnityGame为你的程序名称

创建一个批处理文件(例如register_protocol.bat),将上面的脚本代码粘贴进去。

将YourUnityGame.exe放在与批处理文件相同的目录中。

以管理员身份运行register_protocol.bat,会自动完成协议注册。

在这里插入图片描述

使用命令符regedit命令,打开注册表,在计算机\HKEY_CLASSES_ROOT\PrimaryKey中可以查看到已经注册完成。


二、使用自定义协议打开应用程序


完成自定义协议之后,你可以在浏览器中使用形如:

PrimaryKey://{“param1”:“value1”,“param2”:“value2”,“param3”:“value3”}的URL来启动YourUnityGame.exe

并传递参数{“param1”:“value1”,“param2”:“value2”,“param3”:“value3”}到YourUnityGame.exe程序中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Open Application with Custom Protocol</title>
    <style>
        body {
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            font-family: Arial, sans-serif;
            background-color: #f0f0f0;
        }
        button {
            padding: 10px 20px;
            font-size: 16px;
            cursor: pointer;
            background-color: #4CAF50;
            color: white;
            border: none;
            border-radius: 5px;
            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
        }
        button:hover {
            background-color: #45a049;
        }
    </style>
</head>
<body>
    <button onclick="openApp()">Open YourUnityGame App</button>

    <script>
        function openApp() {
            window.location.href = 'PrimaryKey://{"param1":"value1","param2":"value2","param3":"value3"}';
        }
    </script>
</body>
</html>

点击按钮后会弹出这个窗口,说明你已经成功了,即将打开YourUnityGame 应用程序

在这里插入图片描述


三、在Unity中处理自定义协议传递的参数


当你从自定义协议中获取到参数链接后,通常是一个类似于

PrimaryKey://{“param1”:“value1”,“param2”:“value2”,“param3”:“value3”} 的字符串。

接下来的关键是如何从这个字符串中提取出每个参数的值。

在Unity中,可以通过使用Newtonsoft.Json 库来解析 JSON 格式的参数。

确保在 Unity 项目中导入了 Newtonsoft.Json 库,你可以通过 Unity 的 Package Manager 或手动导入 DLL 文件来实现或在Packages/mainifest.json中添加"com.unity.nuget.newtonsoft-json": “3.2.1”

using Newtonsoft.Json;
using System.Text.RegularExpressions;
using UnityEngine;

[System.Serializable]
public class ProtocolData
{
    public string param1;
    public string param2;
    public string param3;
}

public class ProtocolHandler : MonoBehaviour
{
    string protocolPattern = @"^(?<protocol>\w+)://(?<param>\{.+\})$";

    void Start()
    {
        // 获取启动时的参数
        string[] args = System.Environment.GetCommandLineArgs();

        // 如果有参数
        if (args.Length > 1)
        {
            //"PrimaryKey://{\"param1\":\"value1\",\"param2\":\"value2\",\"param3\":\"value3\"}"
            string protocolLink = args[1];

            // 使用正则表达式匹配自定义协议链接
            Match match = Regex.Match(protocolLink, protocolPattern);

            // 如果匹配成功
            if (match.Success)
            {
                // 获取协议名
                string protocol = match.Groups["protocol"].Value;

                // 获取 {} 中的 JSON 内容
                string jsonContent = match.Groups["param"].Value;

                // 输出协议名和 JSON 内容,方便调试
                Debug.Log("Protocol: " + protocol);
                Debug.Log("JSON Content: " + jsonContent);

                // 使用 Newtonsoft.Json 解析 JSON
                ProtocolData data = JsonConvert.DeserializeObject<ProtocolData>(jsonContent);

                // 现在可以访问 data 中的参数值
                Debug.Log("param1: " + data.param1);
                Debug.Log("param2: " + data.param2);
                Debug.Log("param3: " + data.param3);
            }
            else
            {
                Debug.Log("Received parameter does not match the custom protocol format.");
            }
        }
    }
}

Regex.Match(protocolLink, protocolPattern) 使用正则表达式匹配 protocolLink 中的自定义协议链接。

如果匹配成功 (match.Success),则从 match.Groups[“protocol”] 获取协议名称,从 match.Groups[“param”] 获取 JSON 内容。

使用 JsonConvert.DeserializeObject<>() 方法将 JSON 内容解析为 ProtocolData 类型的对象,然后可以访问其中的参数值。




TechX —— 心探索、心进取!

每一次跌倒都是一次成长

每一次努力都是一次进步

END
感谢您阅读本篇博客!希望这篇内容对您有所帮助。如果您有任何问题或意见,或者想要了解更多关于本主题的信息,欢迎在评论区留言与我交流。我会非常乐意与大家讨论和分享更多有趣的内容。
如果您喜欢本博客,请点赞和分享给更多的朋友,让更多人受益。同时,您也可以关注我的博客,以便及时获取最新的更新和文章。
在未来的写作中,我将继续努力,分享更多有趣、实用的内容。再次感谢大家的支持和鼓励,期待与您在下一篇博客再见!

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

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

相关文章

微信朋友圈的高级玩法:让你的动态更吸引人

微信朋友圈作为一个展示个人生活和分享观点的平台&#xff0c;已经深入人们的日常生活。然而&#xff0c;随着用户数量的增加&#xff0c;如何在众多朋友圈动态中脱颖而出&#xff0c;成为许多人追求的目标。本文将介绍四种高级玩法&#xff0c;帮助你提升朋友圈的吸引力&#…

【Unity】加速Unity编辑器模式启动时间

Unity每次Play之后都会Reload Script Assemblies&#xff08;重新加载脚本程序集&#xff09;。 如果我们没有使用很多Assem&#xff0c;则并不需要在播放前重新编译。 可以在设置中将此事的重新编译关闭。 在Edit > Project Settings > Editor 面板中 找到Enter Play…

127.0.0.1与本机IP地址的区别

大家好&#xff0c;今天我们来聊聊一个在网络世界中常常被提及&#xff0c;但可能对于非专业人士来说还有些模糊的概念——127.0.0.1与本机IP地址。这两个地址在网络通信中都扮演着重要的角色&#xff0c;但它们之间又有着怎样的区别呢&#xff1f;让我们一起来探究一下。 一、…

关于JS中的.this

什么是.this? 在JavaScript中&#xff0c;this是一个非常重要的概念&#xff0c;它指的是函数执行的上下文对象。this的值取决于函数是如何被调用的&#xff0c;而不是在哪里被定义的。 .this的指向 在不同的场景中&#xff0c;.this指向并不是唯一的&#xff0c;下面举几个…

Java基础——异常详解(Error 与 Exception )

Java异常主要分为 Error 和 Exception 两种 Error&#xff1a; Error 类以及他的子类的实例&#xff0c;代表了JVM本身的错误。错误不能被程序员通过代码处理。 EXception&#xff1a; Exception 以及他的子类&#xff0c;代表程序运行时发送的各种不期望发生的事件。可以被J…

禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》Chapter 10插图

禹晶、肖创柏、廖庆敏《数字图像处理&#xff08;面向新工科的电工电子信息基础课程系列教材&#xff09;》 Chapter 10插图

C# 索引器与迭代器分部类详情

文章目录 一、迭代器二、查看Foreach执行中间语言三、foreach实现过程总结四、实现迭代器最常用的方法五、分布类概述及其使用六、索引器概述及声明七、索引器在类中的使用八、索引器在接口中的使用九、总结 一、迭代器 1、迭代器&#xff08;iterator&#xff09;解决的是集合…

饮食中的隐形杀手,该如何避免?

塑料发明至今&#xff0c;口碑经历了过山车式的翻转。 上世纪&#xff0c;塑料曾被誉为20世纪最伟大的发明之一&#xff0c;围绕着塑料科学研究诞生出了好几位诺贝尔奖得主。 1953年&#xff0c;因在高分子化学方面的贡献&#xff0c;德国科学施陶丁格获诺贝尔化学奖&#xf…

Stable Diffusion 秋叶整合包v4.7 :解压即用,快速入门AI绘画

Stable Diffusion秋叶整合包&#xff0c;超简单一键安装Stable Diffusion&#xff0c;无任何使用门槛&#xff0c;完全免费使用&#xff0c;支持Nvdia全系列显卡&#xff0c;来自B站up秋葉aaaki&#xff0c;近期发布了Stable Diffusion整合包v4版本&#xff0c;一键在本地部署S…

中国各区域人口密度可视化图

原文链接https://mp.weixin.qq.com/s?__bizMzUyNzczMTI4Mg&mid2247674303&idx1&sn830304f80a0429406c4a5e38dc7750ec&chksmfa777682cd00ff9434e4660bb52ab2bf19913b6732083de061664401a9ac0fa46581cd9e5e86&token1445576002&langzh_CN&scene21#we…

【TB作品】MSP430G2553,单片机,口袋板,流量积算仪设计

题9 流量积算仪设计 某型流量计精度为0.1%, 满刻度值为4L/s&#xff0c;流量计输出为4—20 mA。 设计基于MSP430及VFC32的流量积算仪。 具体要求 (1) 积算仪满刻度10000 L&#xff0c;精度0.1 L; 计满10000 L&#xff0c;自动归零并通过串口&#xff08;RS232&#xff09;向上位…

Llama 3 大型语言模型到底是如何炼成的?

Meta 在今年 4 月开源了 Llama 3 大型语言模型&#xff0c;这是 Meta&#xff0c;也是整个行业迄今为止功能最强大的开源 LLM。 那么 Meta 是如何训练 Llama 3 大型语言模型的&#xff0c;又在训练过程中遇到了什么问题&#xff0c;提出了什么新的解决方案呢&#xff1f;近日&…

【Nodejs 日志库 】

总结了几个比较好用的Nodejs日志库&#xff0c;我认为一个 合格的日志库 需要 支持多种传输&#xff0c;如文件、控制台、HTTP 等。可定制的日志级别和格式。异步日志记录。 根据上述的需求&#xff0c;挑选出 几款比较好用的日志库&#xff0c; 1. Winston&#xff08;Gith…

如何灵活运用keil工具进行问题分析(2)— 定位FreeRTOS的栈溢出导致hardfault问题

前言 &#xff08;1&#xff09;如果有嵌入式企业需要招聘湖南区域日常实习生&#xff0c;任何区域的暑假Linux驱动实习岗位&#xff0c;可C站直接私聊&#xff0c;或者邮件&#xff1a;zhangyixu02gmail.com&#xff0c;此消息至2025年1月1日前均有效 &#xff08;2&#xff0…

防火墙中的NAT

防火墙的NAT NAT分类 源NAT 基于源IP地址进行转换。 我们之前接触过的静态NAT&#xff0c;动态NAT&#xff0c;NAPT都属于源NAT&#xff0c;都是针对源IP地址进行转换的。源NAT主要目的是为了保证内网用户可以访问公网。 先执行安全策略&#xff0c;后执行NAT 目标NAT 基于…

【归档】工作流审批初体验

title: 工作流审批初体验 typora-root-url: 工作流审批初体验 date: 2023-05-09 17:00:39 tags: 项目插件 文章目录 参考文档工作流审批 flowable设置工作流模型绑定用户 设计表单绑定表单 用户发起流程上传查看流程范围流程可视化 请假流程与OA流程子集关系 参考文档 迁移文…

Termius for Mac/Win:跨平台多协议远程管理利器

Termius for Mac/Win是一款备受瞩目的跨平台多协议远程管理软件&#xff0c;以其卓越的性能、丰富的功能和便捷的操作体验&#xff0c;赢得了广大用户的青睐。无论是在企业IT管理、系统维护&#xff0c;还是个人远程连接、文件传输等方面&#xff0c;Termius都展现出了出色的实…

webpack5入门,根据官方文档简单学习,简单总结

c.**loader加载器&#xff1a;**webpack 只能理解 JS文件和 JSON 文件&#xff0c;loader 让 webpack 能够去处理其他类型的文件&#xff0c;并将它们转换为有效 模块&#xff0c;以供应用程序使用&#xff0c;以及被添加到依赖图中。&#xff08;比如css&#xff0c;less&…

从理论到实践掌握UML

统一建模语言&#xff08;UML&#xff09;是软件工程师用来设计软件系统的一种工具&#xff0c;就像是一套图形化的说明书。它让开发团队能够以图形化的方式来理解、设计和开发软件系统&#xff0c;比起用文字来描述&#xff0c;更加直观易懂。本文通过UML实例化的理论和实践相…

小米HyperOS 澎湃os机型免答题 免社区等级 秒接bl锁操作步骤解析【二】

前面两期博文; 小米HyperOS 澎湃os机型免答题 免社区等级 秒接bl锁操作步骤解析 小米机型解锁bl 绕过社区等级5才可以解锁的限制的教程_没有五级社区怎么解锁bl-CSDN博客 小米对米粉解锁bl是越来越苛刻了。目前社区等级 答题 审核等等步骤越来越繁琐。而且通过率很低。知名开…