知道了……我的 CanvasScaler 放在父级,但是官方 Demo 的应该是就放在跟 RawImage 一起,我应该用 `GetComponentInParent<CanvasScaler>()` 的 void ShowOpenData() { // // 注意这里传x,y,width,height是为了点击区域能正确点击,x,y 是距离屏幕左上角的距离,宽度传 (int)RankBody.rectTransform.rect.width是在canvas的UI Scale Mode为 Constant Pixel Size的情况下设置的。 /** * 如果父元素占满整个窗口的话,pivot 设置为(0,0),rotation设置为180,则左上角就是离屏幕的距离 * 注意这里传x,y,width,height是为了点击区域能正确点击,因为开放数据域并不是使用 Unity 进行渲染而是可以选择任意第三方渲染引擎 * 所以开放数据域名要正确处理好事件处理,就需要明确告诉开放数据域,排行榜所在的纹理绘制在屏幕中的物理坐标系 * 比如 iPhone Xs Max 的物理尺寸是 414 * 896,如果排行榜被绘制在屏幕中央且物理尺寸为 200 * 200,那么这里的 x,y,width,height应当是 107,348,200,200 * x,y 是距离屏幕左上角的距离,宽度传 (int)RankBody.rectTransform.rect.width是在canvas的UI Scale Mode为 Constant Pixel Size的情况下设置的 * 如果是Scale With Screen Size,且设置为以宽度作为缩放,则要这要做一下换算,比如canavs宽度为960,rawImage设置为200 则需要根据 referenceResolution 做一些换算 * 不过不管是什么屏幕适配模式,这里的目的就是为了算出 RawImage 在屏幕中绝对的位置和尺寸 */ // 这里要注意 CanvasScaler 放在 RawImage 的哪里 // 官方 Demo 的是放在跟 RawImage 我的 CanvasScaler 在 RawImage 的父级 // CanvasScaler scaler = gameObject.GetComponent<CanvasScaler>(); CanvasScaler scaler = gameObject.GetComponentInParent<CanvasScaler>(); var referenceResolution = scaler.referenceResolution; var p = rankListBody.transform.position; var rect = rankListBody.rectTransform.rect; WX.ShowOpenData(rankListBody.texture, (int)p.x, Screen.height - (int)p.y, (int)((Screen.width / referenceResolution.x) * rect.width), (int)((Screen.width / referenceResolution.x) * rect.height)); }
微信排行榜渲染相关,每个标签的 class 的 width 和 height 都是相同的,但是被拉伸微信排行榜渲染相关。我在 css 的每一个标签相关的 class 中都设置了长宽是相等的,但是最终渲染出来的效果是所有标签都被拉伸了,请问这是为什么,除了把标签的长宽对应改成长方形这种 hack 的方法之外,还有什么解决方法? 渲染图: [图片] 样式代码: open-data\render\styles\friendRank.js /** * 定义一些样式,方便在 tpls 文件夹中的定义内容的文件来使用 */ export default function getStyle(data) { // let data = { width: 356, height: 400 }; let itemHeight = data.height / 2 / 3; let itemWidth = Math.ceil(data.width * 0.94); return { // 容器 container: { width: data.width, height: data.height, borderRadius: 12, paddingLeft: data.width * 0.03, paddingRight: data.width * 0.03, }, // 每一行排名的背景 rankBg: { position: 'absolute', top: 0, left: 0, width: itemWidth, height: itemHeight, }, // 列表中一个排名对象的大小 listItem: { position: 'relative', width: itemWidth, height: itemHeight, flexDirection: 'row', alignItems: 'center', marginTop: 2, }, // 每个列表对象的排名 listItemRank: { position: 'relative', width: itemHeight * 0.8, height: itemHeight * 0.8, fontSize: 12, fontWeight: 'bold', textAlign: 'center', //marginTop: itemHeight*0.4, //marginBottom: itemHeight*0.1, }, // 每个列表对象的头像 listItemAvatar: { position: 'relative', width: itemHeight * 0.8 , height: itemHeight * 0.8, //borderRadius: 15, //borderWidth: 5, borderColor: 'black', }, // 每个列表对象的名称 listItemName: { position: 'relative', // 除去其他 4 个元素,剩下的长度就是名字的长度 // 但是每一行排名的背景图本身占据的范围不一定是 itemWidth // 所以这个列表对象的名称的 width 还要稍微缩小一点 width: (itemWidth - 4 * itemHeight * 0.8) * 0.8, height: itemHeight*0.5, fontSize: 12, //marginLeft: 30, //marginTop: itemHeight*0.4, //marginBottom: itemHeight*0.1, }, // 超级动物的数量 listItemSuperAnimalCount: { position: 'relative', width: itemHeight * 0.8, height: itemHeight * 0.8, fontSize: 12, fontWeight: 'bold', textAlign: 'right', //marginRight: 30, //marginTop: itemHeight*0.4, //marginBottom: itemHeight*0.1, }, // 普通动物的数量 listItemNormalAnimalCount: { position: 'relative', width: itemHeight * 0.8, height: itemHeight * 0.8, fontSize: 12, fontWeight: 'bold', textAlign: 'right', //marginRight: 30, //marginTop: itemHeight*0.4, //marginBottom: itemHeight*0.1, }, }; } h5 转微信渲染引擎代码: open-data\render\tpls\friendRank.js export default function anonymous(it) { let out = '<view class="container" id="main"> <view class="rankList"> <scrollview class="list" scrollY="true"> '; const arr1 = it.data; if (arr1) { let item; let index = -1; const l1 = arr1.length - 1; while (index < l1) { item = arr1[(index += 1)]; out += ` <view class="listItem"> <image src="open-data/render/image/rankBg.png" class="rankBg"></image> <text class="listItemRank" value="${index +1 }"></text> <image class="listItemAvatar" src="${item.avatarUrl}"></image> <text class="listItemName" value="${item.nickname}"></text> <text class="listItemSuperAnimalCount" value="${item.superAnimCount || 0}"></text> <text class="listItemNormalAnimalCount" value="${item.normalAnimCount || 0}"></text> </view> `; } } out += ' </scrollview> </view></view>'; return out; } 排行榜使用的 RawImage 在场景树中的排布如图 [图片] RawImage 的每一个父节点我都看过了,Scale 都是 1 RawImage 的父节点中包含的与 Canvas 调整相关的组件也就是一个 Canvas Scaler,这个是用来适配不同尺寸的设备的,我也尝试禁用这个组件了,禁用了之后还是有这个被拉伸的问题
2023-05-18可以参考官方 Demo https://github.com/wechat-miniprogram/minigame-unity-webgl-transform/tree/1e1afae9c2bd65a205a6ca1fe176d031bc110d1e/Demo/Ranking 具体来说,如果你需要在排行榜里面自定义数据,首先需要在 Unity 项目里面设置好 `OpenDataMessage` [System.Serializable] public class OpenDataMessage { // type 用于表明时间类型 public string type; public string shareTicket; public int score; } 然后在需要设置这个自定义属性的时候,使用 `setUserRecord` 这是官方的用例,核心就在 `msgData.type = "setUserRecord";` 然后 `msgData.score = ...` OpenDataMessage msgData = new OpenDataMessage(); msgData.type = "setUserRecord"; msgData.score = Random.Range(1, 1000); string msg = JsonUtility.ToJson(msgData); Debug.Log(msg); WX.GetOpenDataContext().PostMessage(msg); 然后在你定义的排行榜 h5 中就可以使用这个数据了 <text class="listItemScore" value="${item.score || 0}"></text>
unity转微信小游戏,怎么把游戏里面的分数传到排行榜上面啊?用的官方的示例,但是分数不会显示在上面,需要在哪里改呀
2023-05-17上午发现的问题,下午重新一试又能加载了,期间啥代码也没改 好玄学……难道这取决于微信是否抽风……?
加载 AA 包失败,提示 Invalid URI, RuntimeData is null.1.问题描述 使用 Addressables.LoadSceneAsync 加载的场景 在 Unity Addressable 三种模式,直接加载资源,模拟加载资源包,真实使用构建的资源包,三种模式测试都没问题 确认在编辑器中构建到 WebGL 了 在微信转换小游戏插件中填写了微信云托管的 CDN 在构建得到文件夹中也确认了有 AA 包 在微信云托管上也确认了有 AA 包 但是在微信开发者工具中,当我使用 Addressables.LoadSceneAsync 加载场景,会报错 Invalid URI, RuntimeData is null. 等错误,看上去像是我链接有问题?但是我一路检查,唯一相关的就一个 CDN 了吧?真不知道哪错了 请问一般这种情况怎么解决?非常感谢! 2.版本信息 Unity Editor 版本:2021.2/china_support/instantgame/staging 8bd2ddd0516e 转换插件版本:minigame.202304281522 微信开发者工具版本:1.05.2204264 3.截图信息 转换插件设置截图: [图片] Unity 默认的 AA 包位置,没有修改过: [图片] 在转换成小游戏的文件夹的 minigame 文件夹中,查看导出的 game.js 中,也确认了 CDN 正确: [图片] 在转换成小游戏的文件夹的 webgl 文件夹中,也确认了 AA 包是存在的: [图片] 在微信云托管的对象存储中也在 CDN 路径下上传了 StreamingAssets 文件夹,也确认了确实有 AA 包 [图片] 虽然感觉微信云托管的服务和对象存储不是一回事,我也不太懂……但是由于微信云托管有一个一段时间后没有访问实例就关闭的功能,我第一次测试的时候他是关着的,我之后访问了一下,让他启动了,启动之后还是还是无法加载 AA 包的错误……或许服务和对象存储就是两个东西? [图片] 在微信开发者工具中,每次测试之前也试过清理全部缓存,之后重新加载项目了,也还是没用 [图片] 错误日志截图: [图片] 错误日志: plugin.js:77 System.UriFormatException: Invalid URI: The URI scheme is not valid. at System.Uri.CreateThis (System.String uri, System.Boolean dontEscape, System.UriKind uriKind) [0x00000] in <00000000000000000000000000000000>:0 (env: Windows,mg,1.05.2204264; lib: 2.27.2) plugin.js:77 RuntimeData is null. Please ensure you have built the correct Player Content. (env: Windows,mg,1.05.2204264; lib: 2.27.2) webgl.wasm.framework.unityweb.js:4 Addressables - Unable to load runtime data at location UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle`1[[UnityEngine.AddressableAssets.Initialization.ResourceManagerRuntimeData, Unity.Addressables, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]. plugin.js:77 OperationException : Addressables - Unable to load runtime data at location UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle`1[[UnityEngine.AddressableAssets.Initialization.ResourceManagerRuntimeData, Unity.Addressables, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]. (env: Windows,mg,1.05.2204264; lib: 2.27.2) plugin.js:77 UnityEngine.AddressableAssets.InvalidKeyException: Exception of type 'UnityEngine.AddressableAssets.InvalidKeyException' was thrown. No Location found for Key=Assets/Scenes/LoadingScene.unity (env: Windows,mg,1.05.2204264; lib: 2.27.2) OperationException : ChainOperation failed because dependent operation failed UnityEngine.AddressableAssets.InvalidKeyException: Exception of type 'UnityEngine.AddressableAssets.InvalidKeyException' was thrown. No Location found for Key=Assets/Scenes/LoadingScene.unity (env: Windows,mg,1.05.2204264; lib: 2.27.2)
2023-04-30