vue3与ue5通信-工具类

工具

ue5-simple.js

js 复制代码
/**
 * UE5 通信工具
 * 两个核心方法:发送消息和接收消息
 */

// 确保全局对象存在
if (typeof window !== 'undefined') {
  window.ue = window.ue || {};
  window.ue.interface = window.ue.interface || {};
}

/**
 * 生成 UUID
 */
function generateUUID() {
  return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, function (t) {
    return (t ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (t / 4)))).toString(16);
  });
}

/**
 * 方法1:发送字符串给 UE5
 * @param {string} message - 要发送的字符串消息
 * @param {string} eventName - 事件名称(可选,默认为 'web_message')
 */
export function send2Ue(message, eventName = 'web_message') {
  try {
    console.log('发送消息给UE5:', message);
    
    // 检查是否在 UE5 环境中
    if (typeof window !== 'undefined' && 
        typeof window.ue === 'object' && 
        typeof window.ue.interface === 'object' && 
        typeof window.ue.interface.broadcast === 'function') {
      
      // 直接使用 UE5 的 broadcast 接口
      window.ue.interface.broadcast(eventName, message, '');
      return true;
      
    } 
    return false
    
    
  } catch (error) {
    console.error('发送消息给UE5失败:', error);
    return false;
  }
}

/**
 * 方法2:接收 UE5 发送的消息
 * @param {Function} callback - 接收到消息时的回调函数
 * @returns {Function} 取消监听的函数
 */
export function receiveFromUe(callback) {
  if (typeof callback !== 'function') {
    console.error('receiveFromUe: callback 必须是一个函数');
    return () => {};
  }

  console.log('开始监听UE5消息');

  // 创建一个唯一的监听器ID
  const listenerId = generateUUID();
  
  // 将回调函数注册到全局对象
  if (typeof window !== 'undefined') {
    window.ue.interface = window.ue.interface || {};
    window.ue.interface[listenerId] = callback;
  }

  // 监听 URL hash 变化(兼容模式)
  const hashChangeHandler = (event) => {
    try {
      const hash = window.location.hash.substring(1);
      if (hash) {
        const decodedHash = decodeURIComponent(hash);
        const data = JSON.parse(decodedHash);
        
        // 如果是来自UE5的消息
        if (Array.isArray(data) && data.length >= 2) {
          const [eventName, message] = data;
          callback({
            eventName,
            message,
            timestamp: Date.now()
          });
        }
      }
    } catch (error) {
      // 忽略解析错误,可能不是UE5的消息
    }
  };

  // 添加事件监听器
  if (typeof window !== 'undefined') {
    window.addEventListener('hashchange', hashChangeHandler);
  }

  // 返回取消监听的函数
  return function unsubscribe() {
    console.log('停止监听UE5消息');
    
    // 移除全局回调
    if (typeof window !== 'undefined' && window.ue.interface) {
      delete window.ue.interface[listenerId];
    }
    
    // 移除事件监听器
    if (typeof window !== 'undefined') {
      window.removeEventListener('hashchange', hashChangeHandler);
    }
  };
}

/**
 * 检查是否在 UE5 环境中
 * @returns {boolean}
 */
export function isInUE5() {
  return typeof window !== 'undefined' && 
         typeof window.ue === 'object' && 
         typeof window.ue.interface === 'object' && 
         typeof window.ue.interface.broadcast === 'function';
}

// 默认导出
export default {
  send2Ue,
  receiveFromUe,
  isInUE5
};

使用

send2Ue('这里是发送的内容-只能是字符串', '发送的事件');

js 复制代码
import { send2Ue, receiveFromUe, isInUE5 } from '@/utils/ue5-simple.js'

// 发送 token 给 UE5
function sendTokenToUE5(token) {
  try {
    console.log('准备发送 token 给 UE5:', token);

    // 发送 token
    const success = send2Ue(token, 'user_login_token');

    if (!success) {
      proxy.$modal.msgError('连接 UE5 失败');
    }
  } catch (error) {
    proxy.$modal.msgError('发送 token 给 UE5 时出错:');
  }
}


// 检查 UE5 环境
onMounted(() => {
  isInUE5();

  // 开始监听来自 UE5 的消息
  const unsubscribe = receiveFromUe((data) => {
    console.log('收到来自UE5的消息:', data);
    
    
  });

  // 组件卸载时清理监听器
  onUnmounted(() => {
    unsubscribe();
  });
});
相关推荐
子兮曰1 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰1 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万1 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝1 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋1 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁1 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄1 天前
JavaScript 隐式全局变量解析
javascript
汉堡大王95271 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大1 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师1 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端