找回密码
 立即注册
首页 业界区 业界 Unity微信小游戏小窗口模式点击适配

Unity微信小游戏小窗口模式点击适配

旁拮猾 2025-7-19 15:26:10
1. 问题描述

项目使用UGUI方案,以点击交互为主。
微信unity方案本身只能调PixelRatio,不能直接调整Unity的分辨率,(还没有测试过“自适应屏幕尺寸”会怎么样),不过看前段时间热门的unity小游戏项目《无尽冬日》也没有对分辨率进行适配,采用了分辨率拉伸的模式。
简单以我自己的手机举例,如果正常打开微信,再打开小游戏,分辨率是1080x2461,如果把小游戏的窗口单独拖到小窗口模式,WeChatWASM.WX.OnWindowResize()的回调给的分辨率是1080x1729,但因为不能调整Unity的分辨率,所以整个画面是拉伸的。反过来,如果先打开微信,把微信拉成小窗口,再打开小游戏,之后再把小游戏全屏,效果会反过来。
画面拉伸问题不算太大,但点击响应的问题比较严重,经过测试,以从左到右为x轴,从下到上为y轴,全屏启动小游戏再拉到小窗口模式后(1080x1729),左上角的输入坐标还是正确的(0,2461), 但左下角的坐标就是错误的(0,732)(2461-1729),导致的现象是越靠近上方的按钮越有可能点对,靠近下方的就点不到了。正确的坐标和输入坐标的关系是
  1. Vector2 GetMousePosition()
  2. {
  3.     var pos = Input.mousePosition;
  4.     int originalHeight = 2461; // 初始化时存储
  5.     int modifiedHeight = 1729; // OnWindowResize() 回调获取
  6.     if (originalHeight == modifiedHeight)
  7.     {
  8.         return pos;
  9.     }
  10.     float resolutionScale = 1; // 分辨率缩放
  11.     float y = pos.y;
  12.     pos.y = (y + (modifiedHeight - originalHeight) * resolutionScale) / modifedHeight * originalHeight;
  13.     return pos;
  14. }
复制代码
旧的输入系统(InputManager)也能达成效果,需要继承GraphicRaycaster类,修改UI的点击检测逻辑
另外业务逻辑中获取Input.mousePositon的地方也需要覆盖一下
  1. public class CustomGraphicRaycaster : GraphicRaycaster
  2. {
  3.     public override void Raycast(PointerEventData eventData, List<RaycastResult> resultAppendLit)
  4.     {
  5.         var pos = eventData.position;
  6.         // 修改位置
  7.         event.position = pos;
  8.         base.Raycast(eventData, resultAppendList);
  9.     }
  10. }
复制代码
那其实直接改UGUI源码就行....

换用了新的输入系统InputSystem,是因为当时没试出来
来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除

相关推荐

您需要登录后才可以回帖 登录 | 立即注册