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

ReactJS项目无法使用Unity类、调用Unity.call()方法该如何解决?

解决React项目中无法调用Unity.call()的问题

问题根因

原生JavaScript运行时,Unity实例会被直接挂载到window全局对象上,因此可以直接调用Unity.call()。但React是模块化运行环境,默认不会直接读取全局挂载的类,同时如果你使用了React专用的Unity集成包,调用逻辑和原生JS也有差异。


解决方法

方法1:直接读取全局Unity实例(适配原生script标签引入Unity的场景)

如果你是直接在React项目的public/index.html里通过script标签引入的Unity加载脚本,直接从window对象上取实例即可:

  • 调用前先做存在性判断,避免打包/运行时报错:
// 在需要调用的组件内书写逻辑
if (window.Unity) {
  window.Unity.call('目标方法名', '参数1', '参数2')
}
  • 如果是TypeScript项目,需要先给window扩展Unity类型声明,在项目的typings.d.ts全局声明文件中添加:
declare global {
  interface Window {
    Unity: {
      call: (methodName: string, ...args: any[]) => void
    }
  }
}
export {}

方法2:适配react-unity-webgl包的调用逻辑

如果你是用React生态常用的react-unity-webgl包集成的Unity,不存在全局Unity类,需要用包提供的上下文钩子调用:

  • 先通过useUnityContext拿到unity实例的send方法,替代原生Unity.call:
import { useUnityContext } from "react-unity-webgl";

function YourComponent() {
  const { send, isLoaded } = useUnityContext({
    loaderUrl: "build/你的应用.loader.js",
    dataUrl: "build/你的应用.data",
    frameworkUrl: "build/你的应用.framework.js",
    codeUrl: "build/你的应用.wasm",
  });

  // 调用Unity方法逻辑
  const handleCallUnityMethod = () => {
    // 确保Unity加载完成后再调用
    if (isLoaded) {
      send("挂载方法的游戏对象名", "目标方法名", "参数");
    }
  };

  return <button onClick={handleCallUnityMethod}>调用Unity方法</button>
}

注意:该包的send方法参数顺序是「挂载方法的游戏对象名称 → 要调用的方法名 → 参数」,和原生Unity.call的参数顺序可能有差异,需要对应调整


补充排查点

  • 确保Unity实例加载完成后再调用方法,避免调用时实例还未挂载
  • 如果你使用了SSR/SSG框架(比如Next.js),服务端渲染时没有window对象,需要把调用逻辑放在useEffect的客户端执行阶段,或者提前加typeof window !== 'undefined'的判断

内容的提问来源于stack exchange,提问作者zena

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:06:01