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
相关产品推荐
相关产品推荐

