ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

微信小游戏 Unity 适配:underGameView 视频置底与透明画布实战指南

微信小游戏 Unity 适配:underGameView 视频置底与透明画布实战指南 游戏开发移动开发WebAssembly【免费下载链接】minigame-unity-webgl-transform微信小游戏Unity引擎适配器文档。项目地址https://gitcode.com/GitHub_Trending/mi/minigame-unity-webgl-transform点击查看免费下载导读在微信小游戏中使用wx.createVideo创建的视频默认层级最高会直接盖住整个游戏画面。但很多游戏场景需要在视频之上叠加交互元素例如跳过播放按钮、进度提示、玩法引导等。本指南基于minigame-unity-webgl-transform仓库中的 Demo/WX_Video 视频 Demo完整讲解如何通过underGameViewtrue将视频渲染到游戏画布之下让画布有内容的地方显示游戏画面没内容的地方透出视频同时配套 Unity 侧的相机清屏与透明画布配置帮助开发者在 Unity WebGL 转换到微信小游戏的工程中实现视频打底 游戏交互层叠的效果。读完本文你将掌握underGameView的底层实现原理、Unity 主相机与TransparentBackground.jslib的配套配置、小游戏运行时video.js的关键改动点以及完整的 C# 调用示例与常见坑位排查。一、实现原理为什么视频默认会盖住游戏画面微信小游戏的视频组件wx.createVideo本质上是原生渲染层组件它运行在小游戏 WebView/Canvas 渲染栈的最上层优先级高于 Unity 通过 WebGL 渲染出来的游戏画面。因此默认情况下无论游戏画面绘制了什么视频都会完整覆盖其上。要让跳过按钮等游戏 UI 显示在视频之上核心思路是改变视频与画布的层级关系创建视频时传入参数underGameViewtrue让视频在小游戏画布即游戏画面之下播放由于视频此时位于画布下方游戏画布必须是部分透明的——画布上有内容不透明像素的地方显示游戏画面画布上透明没有绘制内容的区域则透出底层的视频画面。这就形成了视频打底、游戏画面按需覆盖的合成效果交互按钮因为绘制在游戏画布上天然位于视频之上。从仓库中的 PlayVideo.cs 可以看到创建视频时只需显式声明underGameView true并配合controls false、autoplay true等参数即可var video WX.CreateVideo( new WXCreateVideoParam() { src http://wxsnsdy.tc.qq.com/..., // 视频地址CDN 或本地路径 controls false, // 隐藏系统控制条 showProgress false, // 不显示进度条 showProgressInControlMode false, autoplay true, // 自动播放 showCenterPlayBtn false, // 隐藏居中播放按钮 underGameView true, // 关键参数视频置于游戏画面之下 width ((int)systemInfo.screenWidth), // 铺满全屏 height ((int)systemInfo.screenHeight), } );二、Unity 侧配置相机清屏与透明画布仅仅把视频放到画布之下还不够游戏画面本身必须是可透明的否则一张不透明的黑色/彩色画面仍然会把视频完全挡住。因此需要在 Unity 工程中完成两处配置。2.1 主相机Clear Flags 改为 Solid Color颜色设为黑色将场景主相机的Clear Flags从Skybox/Solid Color默认值改为Solid Color并把背景颜色设置为黑色。这一步的目的是让相机清理屏幕时生成的是全透明的画布底而不是天空盒或其它不透明背景。透明区域会透出下层视频Unity 中正常渲染的 UI、模型、粒子等内容则按正常层级绘制在视频之上。仓库 Demo 的 SampleScene.unity 即按此规则配置。2.2 引入 TransparentBackground.jslib将 Demo 工程下的 Assets/Plugins/TransparentBackground.jslib 复制到你的 Unity 工程放置于Assets/Plugins下。它的作用是拦截 WebGL 的glClear调用跳过只清除 Alpha 通道的清屏操作var LibraryGLClear { glClear: function(mask) { if (mask 0x00004000) { var v GLctx.getParameter(GLctx.COLOR_WRITEMASK); if (GameGlobal.enableTransparentCanvas !v[0] !v[1] !v[2] v[3]) // We are trying to clear alpha only -- skip. return; } GLctx.clear(mask); } }; mergeInto(LibraryManager.library, LibraryGLClear);其逻辑可以这样理解0x00004000是 WebGL 中gl.COLOR_BUFFER_BIT的掩码值只有清除颜色缓冲时才进入判断通过glGetParameter(GL_COLOR_WRITEMASK)读取当前颜色写入掩码当恰好处于只写 Alpha、不写 RGB的状态!v[0] !v[1] !v[2] v[3]时说明引擎正在执行把 Alpha 清零这类操作配合全局开关GameGlobal.enableTransparentCanvas仅在视频需要置底透明画布开启时跳过这次清屏从而保留画布的透明区域让视频透出。需要注意该 jslib 在仓库中位于Assets/Plugins目录TransparentBackground.jslib同目录文件 API_V2 版本 内容一致。Unity 导出 WebGL 时会自动将Plugins目录下的.jslib编译进最终的unity.js无需额外注册。原文档特别强调修改了下清理规则否则可能导致正常情况下游戏画面异常即不能无脑跳过所有清屏调用必须严格限制在透明画布开启且仅清 Alpha的条件下否则会影响非视频场景下的正常渲染。三、小游戏侧配置修改 video.js 联动透明画布开关GameGlobal.enableTransparentCanvas这个全局开关需要在小游戏运行时中根据视频的创建/销毁时机自动打开和关闭。新版导出插件会自动完成该改动若你的工程使用的是旧版插件需要手动修改小游戏包内的minigame/unity-sdk/video.js改动点如下WXCreateVideo(conf) { const id new Date().getTime() .toString(32) Math.random().toString(32); // 增加这之间部分代码开始 const params JSON.parse(conf); if (params.underGameView) { GameGlobal.enableTransparentCanvas true; } videos[id] wx.createVideo(params); // 增加这之间代码结束 return id; }, WXVideoAddListener(id, key) { if (videos[id]) { videos[id]key { moduleHelper.send(OnVideoCallback, JSON.stringify({ callbackId: id, errMsg: key, position: e e.position, buffered: e e.buffered, duration: e e.duration, })); if (key onError) { GameGlobal.enableTransparentCanvas false; // 增加这行 console.error(e); } }); } else { console.error(msg, id); } }, WXVideoDestroy(id) { if (videos[id]) { videos[id].destroy(); } else { console.error(msg, id); } GameGlobal.enableTransparentCanvas false; // 增加这行 },三处改动的职责分别对应三个生命周期节点创建视频时WXCreateVideo解析conf参数若包含underGameView则开启GameGlobal.enableTransparentCanvas true激活透明画布此时 jslib 中的清屏拦截逻辑才会生效视频报错时WXVideoAddListener中key onError关闭透明画布开关避免视频加载失败后游戏画面持续处于透明状态而显示异常销毁视频时WXVideoDestroy同样关闭开关让画布恢复不透明保证后续正常游戏画面不受影响。从源码结构看GameGlobal是微信小游戏运行时的全局对象enableTransparentCanvas作为自定义扩展标志位被 Unity 侧注入的TransparentBackground.jslib读取从而在两套渲染逻辑小游戏原生视频层与 Unity WebGL 画布之间建立协同。四、完整调用链从 C# 到渲染层的落地仓库 Demo 给出了一个完整的可运行示例。在 PlayVideo.cs 中视频创建被放在WX.InitSDK的回调里保证微信小游戏 SDK 初始化完成后再调用视频 APIpublic class PlayVideo : MonoBehaviour { void Start() { var btn this.GetComponentButton(); btn.onClick.AddListener(OnClick); this.AutoPlayVideo(); } private void AutoPlayVideo() { WX.InitSDK((int code) { var systemInfo WX.GetSystemInfoSync(); var video WX.CreateVideo(new WXCreateVideoParam() { src http://wxsnsdy.tc.qq.com/..., controls false, showProgress false, showProgressInControlMode false, autoplay true, showCenterPlayBtn false, underGameView true, width (int)systemInfo.screenWidth, height (int)systemInfo.screenHeight, }); video.OnPlay(() Debug.Log(video on play)); video.OnError(() Debug.Log(video on error)); }); } }关键要点WX.InitSDK是微信小游戏 Unity SDK 的入口视频类 API 需在其回调中调用WXCreateVideoParam中underGameView true是本方案的核心开关它会通过 SDK 序列化传入小游戏侧wx.createVideo视频尺寸直接取GetSystemInfoSync()的screenWidth/screenHeight铺满全屏这样视频恰好作为底层背景Button组件挂在同一 GameObject 上验证了视频之下 游戏 UI 之上的交互层叠点击按钮时OnClick正常响应而视频位于画布之下不会遮挡按钮。更多视频 API 的完整参数说明可参考仓库 API_V2 示例中的 Video.cs其中underGameView对应CreateVideoOption.underGameView与x/y/width/height、controls、autoplay、loop、muted、poster、initialTime、playbackRate、live、objectFit、autoPauseIfNavigate、autoPauseIfOpenNative等 20 余个参数一同构成了wx.createVideo的完整配置面且支持OnEnded/OnError/OnPause/OnPlay/OnProgress/OnTimeUpdate/OnWaiting等回调绑定。五、常见问题与排查建议结合仓库 Design/AudioAndVideo.md 中关于 WXVideo 的实践记录使用underGameView置底方案时需特别注意以下几点iOS 设置underGameView后黑屏、有声音没画面需要在微信开发者工具/客户端开启高性能模式这是已知的平台渲染限制开发者工具无法播放真机正常开发者工具暂时存在异常可先主动切换到3.4.10版本基础库验证视频加载失败导致画面异常onError时必须关闭GameGlobal.enableTransparentCanvas避免画布一直保持透明销毁视频时同样需要关闭开关VideoPlayer 与 WXVideo 的选择如果只是单纯的全屏视频播放官方更推荐使用小游戏 API 视频播放能力wx.createVideoUnity 的VideoPlayer组件也已自动适配微信小游戏但其平台支持版本有门槛iOS 高性能 需 8.0.55、iOS 高性能需 8.0.41、安卓需 8.0.40、PC/开发者工具需基础库 3.2.1跨域与视频源iOS 上视频无法播放时优先排查服务端跨域配置微信小游戏运行环境要求服务端允许Origin weapp://wechat-game-runtime的跨域访问否则会报Access-Control-Allow-Origin错误。六、小结视频置底 交互层叠的本质是打通三个环节小游戏侧通过underGameViewtrue把原生视频层放到画布之下并用GameGlobal.enableTransparentCanvas控制透明画布的开关Unity 侧通过主相机 Solid Color 清屏黑色让画布具备透明底再借助TransparentBackground.jslib精确拦截仅清 Alpha的glClear调用以保留透明区域C# 侧只需在WX.InitSDK回调中创建带underGameView参数的视频即可。掌握这条调用链即可在微信小游戏中实现视频背景 跳过按钮等常见交互参考实现见仓库 Demo/WX_Video 工程。赞分享游戏开发移动开发WebAssembly【免费下载链接】minigame-unity-webgl-transform微信小游戏Unity引擎适配器文档。项目地址https://gitcode.com/GitHub_Trending/mi/minigame-unity-webgl-transform点击查看免费下载相关推荐微信小游戏 Unity 音视频适配全指南AudioAndVideo 实战详解微信小游戏 Unity 音视频适配全指南AudioAndVideo 实战详解 本指南围绕微信小游戏 Unity 引擎适配器的音视频适配方案展开核心覆盖 Un游戏开发移动开发WebAssemblyUnity游戏微信小游戏快速适配完整指南微信小游戏Unity WebGL适配方案简称Unity WebGL小游戏适配是一套专门为Unity游戏开发者设计的完整解决方案。该方案基于WebAssemb游戏开发移动开发WebAssemblyUnity游戏移植微信小游戏快速适配完整指南Unity游戏移植微信小游戏快速适配完整指南 想要将现有的Unity游戏快速移植到微信小游戏平台吗本指南为您提供一套完整的Unity游戏适配和微信小游戏转换游戏开发移动开发WebAssembly上一篇PaddleNLP XLM 模型建模模块深度解析多语言 Transformer 编码器与任务头实现下一篇Conky与其他开源项目集成打造全栈监控系统创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表