踩坑:Unity导出WebGL发布到手机上竖屏时强制显示横屏

news/2024/7/15 21:08:45 标签: unity, webgl

具体的适配问题

公司的项目需要将游戏导出WebGL 发布到Web平台 本以为是个很简单的事情 谁知道却被个横竖屏适配搞的头晕 毕竟只有大学浅浅的学了下HTML这门语言 出来工作后基本上都是在跟C# Lua打交道 言归正传 看看具体问题吧

游戏如果从横屏进入 基本上不会有什么适配问题

但是现在人大多数手机都是开着 锁定屏幕方向 这就导致大部分人其实是以竖屏进入游戏的

像这样:

这样显然是不符合用户体验的 要用户先把屏幕锁定关了 在旋转成横屏 这一操作在游戏引流里都可以直接劝退一波用户了

解决方案

理论方案

理论上解决很简单 只需在index里进入时判断手机方向并监听手机旋转事件

<script>
    var orientation = window.orientation;
    if(orientation == 180 || orientation == 0 || orientation == -180){
        //竖屏
    }else{
        //横屏 orientation = 90 或者 orientation = -90 
    }

    window.onorientationchange = function () {
        //监听手机旋转事件
        if(orientation == 180 || orientation == 0 || orientation == -180){
            //竖屏 旋转-90度
        }else{
            //横屏 旋转90度
        }
    };
</script>

改变

<canvas id="unity-canvas"></canvas>

或者其他嵌套unity-container的标签通过CSS的旋转属性旋转90度就搞定了

transform: rotate(90deg)

但是实际上并没有那么快乐 经过你不断的努力调整标签终于实现了你就会发现

先不说比例问题 最致命的问题是 旋转后 按钮的碰撞监听并没有旋转 按钮的实际监听范围还是红框 这一下子就犯了难 研究许久后发现需要使用HTML中的<iframe>标签来解决

<iframe src="game.html"></iframe>

实际解决

新建一个新的index.html  将原本的index重命名为game 通过iframe标签引入到新的index里面

同时在新的index里面监听手机旋转事件 通过添加删除类来旋转页面

代码如下

<style>
    .landscape-screen{
	    transform-origin: top left;
	    transform: rotate(90deg) translateY(-100%)
    }
</style>
<iframe id="Frame" style="Frame"  src="game.html"></iframe>
<script>
    var orientation = window.orientation;
			
	//开始时调用
	var Frame = document.getElementById("Frame");
	if(orientation == 180 || orientation == 0 || orientation == -180){
		//注意竖屏时要把 iframe的宽设置为当前窗口的高度 高设置为当前窗口的宽度
		Frame.height = window.innerWidth;
		Frame.width = window.innerHeight;
				
		//通过css样式旋转90度
		Frame.classList.add("landscape-screen");
	}else{
		//横屏时则正常
		Frame.height = window.innerHeight;
		Frame.width = window.innerWidth;
				
		//通过移除类去掉css样式
		Frame.classList.remove("landscape-screen");
	}
			
	//监听手机旋转事件 根据旋转状态设置旋转的css样式
	window.onorientationchange = function () {
        if(orientation == 180 || orientation == 0 || orientation == -180){
			Frame.classList.add("landscape-screen");
		}else{
			Frame.classList.remove("landscape-screen");
		}
     };
</script>

 而我们的game.html(原本U3D导出的index.html) 只需要做好全屏适配即可

运行效果如下

竖屏进入→转横屏

横屏进入→转竖屏

至此适配方案结束

演示DEMO链接

GitHub - Wyleee/UnityWebGLMobileAdapter: 演示Unity导出的WebGL项目在手机上的横竖屏适配


http://www.niftyadmin.cn/n/5542678.html

相关文章

Github 2024-07-07 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-07-07统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4Rust项目2C项目2C++项目1JavaScript项目1HTML项目1Jupyter Notebook项目1非开发语言项目1免费编程书籍和学习资源清单 创建周期:37…

计算机网络编程和并发的知识

OSI七层协议 OSI&#xff08;Open Systems Interconnection&#xff09;模型是一个七层的网络通信模型&#xff0c;用于标准化不同层级的网络通信。从下到上分别是&#xff1a; 物理层&#xff08;Physical Layer&#xff09;&#xff1a;负责在物理媒介上传输原始的比特流。…

【JAVA多线程】线程池概论

目录 1.概述 2.ThreadPoolExector 2.1.参数 2.2.新任务提交流程 2.3.拒绝策略 2.4.代码示例 1.概述 线程池的核心&#xff1a; 线程池的实现原理是个标准的生产消费者模型&#xff0c;调用方不停向线程池中写数据&#xff0c;线程池中的线程组不停从队列中取任务。 实现…

学生管理系统(通过顺序表,获取连续堆区空间实现)

将学生的信息&#xff0c;以顺序表的方式存储&#xff08;堆区&#xff09;&#xff0c;并且实现封装函数 &#xff1a; 1】顺序表的创建&#xff0c; 2】判满、 3】判空、 4】往顺序表里增加学生信息、 5】遍历学生信息 6】任意位置插入学生信息 7】任意位置删除学生信…

【WebRTC实现点对点视频通话】

介绍 WebRTC (Web Real-Time Communications) 是一个实时通讯技术&#xff0c;也是实时音视频技术的标准和框架。简单来说WebRTC是一个集大成的实时音视频技术集&#xff0c;包含了各种客户端api、音视频编/解码lib、流媒体传输协议、回声消除、安全传输等。对于开发者来说可以…

【Linux进阶】文件系统6——理解文件操作

目录 1.文件的读取 1.1.目录 1.2.文件 1.3.目录树读取 1.4.文件系统大小与磁盘读取性能 2.增添文件 2.1.数据的不一致&#xff08;Inconsistent&#xff09;状态 2.2.日志式文件系统&#xff08;Journaling filesystem&#xff09; 3.Linux文件系统的运行 4、文件的删…

LeetCode 35, 242, 994

目录 35. 搜索插入位置题目链接标签思路代码 242. 有效的字母异位词题目链接标签思路代码 994. 腐烂的橘子题目链接标签思路代码 35. 搜索插入位置 题目链接 35. 搜索插入位置 标签 数组 二分查找 思路 本题与 704. 二分查找 十分相似&#xff0c;只不过本题在找不到 tar…

适合selenium的防自动化检测的方法

Selenium 是一个强大的自动化测试工具&#xff0c;能够模拟真实用户与网页的交互。针对您询问的适合在 Selenium 中实施的策略&#xff0c;以下是一些直接适用于或可以通过 Selenium 配置实现的方法&#xff1a; 修改User-Agent: 通过 Chrome 或 Firefox 的选项在启动时设置自…