Unity微信小游戏小窗口模式点击适配
1. 问题描述
项目使用UGUI方案,以点击交互为主。
微信unity方案本身只能调PixelRatio,不能直接调整Unity的分辨率,(还没有测试过“自适应屏幕尺寸”会怎么样),不过看前段时间热门的unity小游戏项目《无尽冬日》也没有对分辨率进行适配,采用了分辨率拉伸的模式。
简单以我自己的手机举例,如果正常打开微信,再打开小游戏,分辨率是1080x2461,如果把小游戏的窗口单独拖到小窗口模式,WeChatWASM.WX.OnWindowResize()的回调给的分辨率是1080x1729,但因为不能调整Unity的分辨率,所以整个画面是拉伸的。反过来,如果先打开微信,把微信拉成小窗口,再打开小游戏,之后再把小游戏全屏,效果会反过来。
画面拉伸问题不算太大,但点击响应的问题比较严重,经过测试,以从左到右为x轴,从下到上为y轴,全屏启动小游戏再拉到小窗口模式后(1080x1729),左上角的输入坐标还是正确的(0,2461), 但左下角的坐标就是错误的(0,732)(2461-1729),导致的现象是越靠近上方的按钮越有可能点对,靠近下方的就点不到了。正确的坐标和输入坐标的关系是
Vector2 GetMousePosition()
{
var pos = Input.mousePosition;
int originalHeight = 2461; // 初始化时存储
int modifiedHeight = 1729; // OnWindowResize() 回调获取
if (originalHeight == modifiedHeight)
{
return pos;
}
float resolutionScale = 1; // 分辨率缩放
float y = pos.y;
pos.y = (y + (modifiedHeight - originalHeight) * resolutionScale) / modifedHeight * originalHeight;
return pos;
}
项目用的是旧输入系统,一开始尝试了继承StandaloneInputMoudle进行覆盖,但好像不起作用(也可能是没改对?),最后解决方法是换用了InputSystem,新的输入系统还是比较好用的。
2. 从UnityEngine.Input升级到UnityEngine.InputSystem
- 首先要更新UGUI源码(如果使用embbed模式), 虽然版本号一直是1.0.0, 但还是有多次修改的
- Window > PackageManager 安装 Input System (本文使用的是1.7.0版本)
- Editor > Project Settings > OtherSettings > Active Input Handling, 改为"Input System Package" (关闭旧的输入系统)
- UGUI的事件接入: 找到场景中的EventSystem, 把原本的StandaloneUIInputModule删掉, 挂一个InputSystemUIInputModule上去
3. 常用API的直接近似替换
需要注意判空
鼠标:
- Input.mousePosition -> Mouse.current.position.ReadValue()
- Input.GetMouseButton(index) -> Mouse.current.leftButton.isPressed | Mouse.current.rightButton.isPressed (下面省略)
- Input.GetMouseButtonDown(index) -> Mouse.current.leftButton.wasPressedThisFrame
- Input.GetMouseButtonUp(index) -> Mouse.current.leftButton.wasReleasedThisFrame
- Input.GetAxis("Mouse ScrollWheel") -> Mouse.current.scroll.ReadValue().y / 120f
键盘(实际只有编辑器在用):
- Input.GetKey(KeyCode.W) -> Keyboard.current.wKey.isPressed
- Input.GetKey(keyCode) -> switch case
- 键盘的Down\Up也是wasPressedThisFrame\wasReleasedThisFrame
另外鼠标的逻辑替换需要注意判断触屏,以Input.mousePosition为例
public static class Input
{
public static Vector2 mousePosition
{
get {
#if !UNITY_EDITOR && UNITY_WEBGL
var pos = TouchScreen.current?.primaryTouch.position.ReadValue() ?? Vector2.zero;
#else
var pos = Mouse.current?.position.ReadValue() ?? Vector2.zero;
#endif
return pos;
}
}
}
4. 添加作用到UGUI的坐标转换
为了方便修改,直接把InputSystem包改成embbed模式(包文件夹从Library/PackageCache移动到Packages文件夹)
新建Packages/com.unity.inputsystem@xxx/InputSystem/Controls/Processors/ResolutionVector2Processor.cs
namespace UnityEngine.InputSystem.Processors
{
public class ResolutionVector2Processor : InputProcessor<Vector2>
{
// 这些参数自行找时机传递过来即可
private static int s_OriginalHeight = 0;
private static int s_ModifiedHeight = 0;
private static float s_ResolutionScale = 1.0f;
public override Vector2 Process(Vector2 value, InputControl control)
{
// 和第一节的逻辑相同
if (s_OriginalHeight == s_ModifiedHeight) return value;
float y = value.y;
value.y = (y + (s_ModifiedHeight - s_OriginalHeight) * s_ResolutionScale) / s_ModifiedHeight * s_OriginalHeight;
return value;
}
public override string ToString()
{
return $"ResolutionVector2()";
}
}
}
到Packages/com.unity.inputsystem@xxx/InputSystem/InputManager.cs里面注册一下
internal void InitializeData()
{
// ...
processors.AddTypeRegistration("ResolutionVector2", typeof());
// ...
}
然后在unity中Project窗口选中Packages/com.unity.inputsystem@xxx/InputSystem/Plugins/PlayerInput/DefaultInputActions.inputactions
点击Inspector窗口的Edit asset
ActionMaps选择UI
Actions选择 Point > touch*/position [Touchscreen]
在Processors中添加刚才新建的ResolutionVector2,保存即可
5. Input.mousePosition的替换
回到第3节的代码,把转换逻辑加进去即可
Unity微信小游戏小窗口模式点击适配的更多相关文章
- 微信小游戏 小程序与小游戏获取用户信息接口调整 wx.createUserInfoButton
参考: 小程序•小故事(6)——微信登录能力优化 小程序•小故事(4)——获取用户信息 本篇主要是讲微信getUserInfo接口不再出现授权弹框 那么原来getUserInfo是怎么样?修改之后又是 ...
- 微信公众号关联(小游戏 小程序 跳转 盒子 wx.navigateToMiniProgram)
参考: 公众号关联小程序 关联公众号 关联后,登录小游戏,可在设置-关联设置中看到关联的公众号 在小游戏中使用wx.navigateToMiniProgram wx.navigateToMiniPro ...
- phaser小游戏框架学习中的屏幕适配
这篇博客主要讲一下上一篇博客的右侧和底部出现的问题.就是页面会有偏移量.说一下这个产生的原因吧. 一开始在构建html页面的时候,习惯性的在页面中加了 <meta name="view ...
- 用C#实现微信“跳一跳”小游戏的自动跳跃助手
一.前言: 前段时间微信更新了新版本后,带来的一款H5小游戏“跳一跳”在各朋友圈里又火了起来,类似以前的“打飞机”游戏,这游戏玩法简单,但加上了积分排名功能后,却成了“装逼”的地方,于是很多人花钱花时 ...
- 使用Laya引擎开发微信小游戏(上)
本文由云+社区发表 使用一个简单的游戏开发示例,由浅入深,介绍了如何用Laya引擎开发微信小游戏. 作者:马晓东,腾讯前端高级工程师. 微信小游戏的推出也快一年时间了,在IEG的游戏运营活动中,也出现 ...
- 用Kotlin破解Android版微信小游戏-跳一跳
前言 微信又更新了,从更新日志上来看,似乎只是一次不痛不痒的小更新.不过,很快就有人发现,原来微信这次搞了个大动作——在小程序里加入了小游戏.今天也是朋友圈被刷爆的缘故. 看到网上 有人弄了一个破解版 ...
- 如何临时发布部署Cocos小游戏到Linux服务器,让别人能在微信打开
两个星期前,我们发布了第一个小游戏教程: 教程:制作一个小游戏送给喜欢的TA(不会编程也能学会哦) 上周有好几位小伙伴在b站催更,呃,作为小透明,收到催更信息后还是很激动的!竟然有同学在看我们的小教程 ...
- Gameframework之微信小游戏
Gameframework之微信小游戏 这两天测试了一个Gameframework框架游戏及资源转微信小游戏,在这里记录一下踩过的坑,望避之! 材料: 小游戏Dome用的StarForce项目. 环境 ...
- 原生javascript开发仿微信打飞机小游戏
今天闲来无事,于是就打算教一个初学javascript的女童鞋写点东西,因此为了兼顾趣味性与简易程度,果断想到了微信的打飞机小游戏.. 本来想用html5做的,但是毕竟人家才初学,连jquery都还不 ...
- 【转】微信小游戏接入Fundebug监控
在SegmentFault上看到Fundebug上线小游戏监控,刚好最近开始玩微信小游戏,于是尝试接入试了一下. 接入方法 创建项目的时候选择左下角的微信小游戏图标. 点击继续进入接入插件页面. 第三 ...
随机推荐
- 痞子衡嵌入式:在含多个i.MXRT的主从系统中共享一颗Flash启动的方法与实践(上篇)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是多个i.MXRT共享一颗Flash启动的方法. 有些特殊的客户应用会采用多颗 i.MXRT 芯片设计一主多从的硬件架构(目的不一,或仿多 ...
- ragflow k8s部署详细过程
一.概述 ragflow官方提供的安装方式是docker-compose方式部署的,单机运行. k8s部署方式,暂未提供. 不过我们可以通过工具,结合docker-compose.yaml,来推演出对 ...
- Swiper.js滑动插件使用教程
几乎每个前端开发都应该用过这个滑动组件库吧?这就是大名鼎鼎的swiper.js 一.Swiper及其功能 Swiper.js 是一个流行的开源的移动端触摸滑动库,用于创建响应式.可触摸滑动的轮播图.滑 ...
- 462.Minimum Moves to Equal Array Elements II——LeetCode进阶路
原题链接https://leetcode.com/problems/minimum-moves-to-equal-array-elements-ii/ 题目描述 Given a non-empty i ...
- mp4文件下载,而不是在线播放
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 第2讲、Tensor高级操作与自动求导详解
1. 前言 在深度学习模型中,Tensor是最基本的运算单元.本文将深入探讨PyTorch中两个核心概念: Tensor的广播机制(Broadcasting) 自动求导(Autograd)机制 这些知 ...
- Java11 ThreadLocal的remove()方法源码分析
1. ThreadLocal实现原理 本文参考的java 版本是11. 在讲述ThreadLocal实现原理之前,我先来简单地介绍一下什么是ThreadLocal.ThreadLocal提供线程本地变 ...
- jdk exe安装包如何自制zip解压版
前言 jdk8 oracle官方下载页面 https://www.oracle.com/java/technologies/downloads/#java8-windows 可以看到,只有exe安装包 ...
- 【2020.11.25提高组模拟】太空漫步(walking) 题解
[2020.11.25提高组模拟]太空漫步(walking) 题解 题目描述 Do not go gentle into that good night. Old age should burn an ...
- ChatMoney让你不再恋爱脑!
本文由 ChatMoney团队出品 你是否曾经想过,为什么我们会在恋爱中变得如此"上头",仿佛整个世界都围绕着那个TA旋转? 恋爱脑,通常是指一个人在恋爱中过度投入.过度依赖对方, ...