如何在查询参数变更时不刷新页面,仅影响Unity WebGL应用?
可行,实现方案如下
完全可以做到,核心是利用Unity WebGL与浏览器的双向通信机制,结合页面参数监听来实现,不需要AJAX。
1. 监听页面参数变更(无刷新)
页面参数变更但不刷新页面的场景分两种,对应不同的监听方式:
- 处理浏览器前进/后退触发的参数变化:
window.addEventListener('popstate', () => { const currentParams = new URLSearchParams(window.location.search); sendParamsToUnity(currentParams); });
- 自己的代码主动修改URL参数(比如按钮触发):
function updateUrlParam(key, value) { const params = new URLSearchParams(window.location.search); params.set(key, value); // 修改URL但不刷新页面 history.pushState({}, '', `${window.location.pathname}?${params}`); // 主动通知Unity参数变更 sendParamsToUnity(params); }
2. 浏览器JS调用Unity函数
Unity WebGL提供了UnityInstance.SendMessage方法,可直接在浏览器JS中调用Unity内的指定函数:
// 注意:unityInstance是Unity WebGL加载完成后返回的实例 function sendParamsToUnity(params) { // 将参数转为JSON字符串,方便Unity解析 const paramJson = JSON.stringify(Object.fromEntries(params)); // 调用Unity中名为"ParamHandler"的GameObject上的"OnParamsUpdated"函数 unityInstance.SendMessage('ParamHandler', 'OnParamsUpdated', paramJson); }
3. Unity端接收并处理参数
在Unity中创建C#脚本,挂载到名为ParamHandler的GameObject上:
using UnityEngine; using System; public class ParamHandler : MonoBehaviour { public void OnParamsUpdated(string paramJson) { // 解析JSON为自定义数据类 var paramData = JsonUtility.FromJson<ParamModel>(paramJson); // 这里编写参数变更后的业务逻辑(比如修改游戏配置、切换场景等) Debug.Log("收到页面参数:" + paramJson); } } // 自定义参数模型,需与JS传递的参数结构对应 [Serializable] public class ParamModel { public string sceneId; public int difficulty; // 可根据需求添加更多字段 }
额外注意
- 确保Unity WebGL构建时,允许与浏览器脚本通信选项处于开启状态(默认开启)。
- 若用户手动修改地址栏参数并回车导致页面刷新,需在页面加载完成后,将初始参数传给Unity:
window.addEventListener('load', () => { const initialParams = new URLSearchParams(window.location.search); sendParamsToUnity(initialParams); });
内容的提问来源于stack exchange,提问作者Femidis
相关产品推荐
相关产品推荐

