Unity5和WebGL移植指南的一些总结

 

对于手游开发者来说,更新版本往往意味着非常复杂的过程,你需要根据反馈做更新、测试、提交然后等待审核,而由于不需要客户端依赖,页游往往是快速测试游戏版本的最佳途径,很多人可能都知道Unity 5可以再不用Unity Web Player的情况下把手游移植到页游平台测试,再加上谷歌决定放弃对NPAPI的支持,未来WebGL对于页游移植是非常重要的。

很多人长期以来都用Unity研发手游,那么你们可能都听说过使用过Unity 5可以在不使用Unity Web Player的情况下把游戏移植成页游。听起来很不错对吗?但是,在使用WebGL做你的页游之前,有一些事情是有必要知道的,接下来我们就逐个回答以下的几个问题:

1.WebGL对于游戏研发如此重要?

对于新手开发者来说,网页游戏是一个拥有固定玩家数量的强大平台,在写本稿件的时候,WebGL可以在所有带有现代浏览器的桌面平台不用安装任何额外插件就能让你的游戏运行。

但除此之外,做页游版本最重要的优势在于,你可以控制游戏的分销。别想着把你的版本送去审核或者通过后台上传并等待几个小时测试,网页技术需要的只是让你通过FTP上传文件并且能够实时看到游戏的改变。

 

这对于快速调整游戏并且测试最新版本来说是很大的优势,还有一点值得提到的是,Google Chrome最近放弃了对(Flash Player)NPAPI的支持,意味着用Unity Web Player之类插件研发的游戏可能都不会在网页游戏平台留存太久,未来其他的浏览器也很可能做出这种决定,所以作为开发者最好是早作准备。

但是,介绍就到此结束,我们不妨探讨更有趣的话题。和所有的平台一样,当你用Unity 5为WebGL做游戏的时候,还是需要考虑一些事情。

以下是我们的首款游戏从安卓/iOS平台移植到Facebook Unity文档的时候遇到的问题:

重要的事情先说:不支持的命名空间(Unsupported Namespaces)

所有在System.Net(特别是System.Net.Socket)命名空间下的东西都无法在WebGL中使用。据Unity文档,这种原因是:由于安全问题,JavaScript代码无法直接通过IP Sockets进行网络连接。

如果你需要在WebGL里使用网络,目前可以选择使用WWW或者Unity引擎里的UnityWebRequest classes,或者使用新的Unity Networking功能。这可能会因为CORS(也就是跨域资源共享)而带来一些让人头疼的问题,因为这基本上意味着只要没有和你的游戏的服务器在同一个域名内,就没办法登上其他的URL。这或许是你在把游戏移植到WebGL的时候遇到最大的问题

如果你想要知道的话:同样的问题也适用于UnityEngine.Network classes,也不能在WebGL里使用。

我们需要澄清的是,这并非Unity的错,毕竟网页平台本来就不是这么工作的。WebGL是一个AOT(ahead of time)平台,所以是不允许使用System.Reflection.Emit生成动态代码的。基本来说,System.Threading命名空间里的所有东西都是不被支持的。

目前我们已经解决了不支持命名空间的问题,对我们来说,解决这个问题的方法就是使用Visual Studio 2015的搜索工具在我们文件的的Entire Solutions,随后我们会直接给!UNITY_WEBGL增加一个预处理器,并且找到解决所有在命名空间冲突而被移除的时候解决所有错误。

比如:

#if !UNITY_WEBGL
using System.Threading;
#endif

第二:资源包

在WebGL平台使用AssetBundles的时候需要考虑以下这些问题:

当你要在AssetBundle里使用主版本没有用过的class类型的时候,这可能会让Unity直接把这些代码从版本中移除,所以从AssetBundle里加载资源的时候就会失败,你可以在这里找到英文版的解决办法。

由于WebGL并不支持Threading,而且http下载只有在完成的时候才能使用,当下载完成的时候,Unity WebGL版本需要在主线程上解压缩AssetBundle,所以要屏蔽主线程。为了避免这种问题,你可能想要避免为你的AssetBundle使用默认的LZMA格式,转而使用LZ4进行压缩,该工具解压缩的效率比较高。如果你需要比LZ4更小的压缩尺寸,可以把网页服务器设置成在http协议层面用gzip压缩文件。

第三:Building与测试

这或许是使用WebGL最糟糕的一部分,还不清楚每个设置对于最终版本的影响,也无法确定如何对游戏进行测试和debug,你可以通过这里的链接(英文)找到答案(拿好不谢)。

在大多数的浏览器里,你都可以通过直接打开index.html文件的方式浏览WebGL播放器。出于安全考虑,Chrome对于从本地文件://URLs打开的脚本都设了限制,所以该技术也是不能使用的。如果你使用Unity的Build&Run指令(menu:File>Build & Run),随后文件会被暂时放在本地网页服务器上,并且从localhost URL打开(这样可以避开安全限制)。你还可以运行Chrome并且执行—disable-web-security命令选择允许从file:urls加载内容。
在我们的案例中,我们创作了一个简单的*.bat脚本并且只用了下面这一行代码(如果你的Chrome安装路径不同可以做修改):

“C:\Program Files (x86)\Google\Chrome\Application\chrome.exe” –disable-web-security

至少在Windows系统下,你可以在桌面系统运行脚本并且双击打开一个允许CORS的Chrome窗口,我们发现这是随时测试版本最简单的方式并且在我们研发过程中使用了该方法,它甚至对于在服务器上的版本也可以运用。

building建议:

这些都是从Unity文档里引用的话,但我们标记了在最终版本大小和表现方面最有效的部分。

根据项目的不同,在Texture Importer里给所有压缩纹理定义Crunch纹理压缩格式;不要调用Development版本,它们是未经压缩或者最小化的,所以它们的文件会大很多;把优化等级(Optimization Level)设置成最快;如果你的版本不需要例外情况的话,在玩家设置中把Enable Exceptions(允许例外)设置成None;在玩家设置中把Strip Engine Code设置为启用(对于版本大小很重要);当使用第三方dll的时候要小心谨慎,因为者可能会带来大量的dependency并且明显增加代码大小(对我们没有什么影响),需要补充的是,如果你的代码需要取决于Exceptions才能正常执行,把例外设置成none就可能带来不少的问题,不如调用服务器,你必须亲自测试并且找到适合你游戏的最佳方法。

Profiling WebGL

你可以在WebGL里使用Unity profiler,就像和其他平台一样。不过一个重要的区别之处在于,WebGL里你不能链接运行的播放器,因为WebGL使用WEbSockets作为通信方式,所以不会允许来自浏览器方面的链接。相反,你应该在版本设置里使用Autoconnect profile复选框,还需要注意的是,目前draw call还不能为WebGL做profile。

Debugging WebGL

这方面就祝你好运了。目前WebGL版本还没办法做debug,我们在做的时候采取了旧式的方法,并且为所有遇到问题的地方增加了Debug.log calls,每个浏览器都有自己的开发者后台,通常按F12就可以开启。

浏览器兼容性

你可以在这里看到所有浏览器和版本的最新消息。

也就是说,最好是考虑一些不兼容WebGL的老浏览器,比如IE,这时候最好使用Unity Web Player并且加载一个或者根据浏览器的支持程度选择另外一个。

另一方面,Google Chrome完全放弃了Unity Web Player支持,所以唯一的选择就是为IE之外的所有浏览器使用WebGL。需要注明的是,这种方式非常适合Edge浏览器,据我的体验,Chrome浏览器用起来还行,火狐浏览器是使用WebGL效果最差的。

内存问题

这是另一个大问题,如果你分配了太多的内存,浏览器就会出问题,但如果你分配的内存不足,它又会直接崩溃,所以基本上来说,找到合适的内存分配量是靠实践的,但与此同时我们还不能在run-time期间导致崩溃。

在启动的时候,有两种方式可以改变游戏内存:第一种方法是使用Unity编辑器里的玩家设定。在WebGL设定中,选择发行设定并且输入内存大小,默认是256MB,在我们的案例中,这对于发布版本已经足够了(90MB),但对于开发版本来说还不够用(大约需要300MB左右)。

这时候火狐对我们来说就是最难用的,所有其他的浏览器都可以在研发版本中为研发版分配512MB的内存。当然,也并不是那么差,不过如果你的游戏比我们的还大,那么很可能你的发布版本都没办法运行。我们目前在这方面还在研究,如果有新发行会更新文章。

更新:据有人在Reddit评论中提到,这是因为火狐在其他标签中已经使用了太多的内存,而不是因为它不能分配512MB的内存,关闭并重新开启火狐浏览器就可以解决了。

第二种方式就是通过打开Unity生成的index.html文件内存大小的方式进行。代码如下:

5

TOTAL_MEMORY的值来反映你的游戏内存的需求(以字节为单位),比如268435456意味着256MB。

第四,Facebook Canvas

如果你希望FB登录像在iOS和安卓平台的那样,你就需要进入FB应用里的高级设置,激活Web OAuth Login设置。然后你需要增加一个Valid OAuth更改URL(可以喝你的安全URL相同),否则Facebook不会允许你保存更改的。

 

Canvas.Pay:Bigfoot Games的小伙伴们专门发博客讲述了这个问题,你们可以点击查看。

对于你希望销售的产品,一定要投入特别的注意力确定*.html文件配置。

当你再次使用Unity的时候,需要记住的是自他们发布了博客之后,FB sdk已经做了些许改动,结果中不会再出现一个response.txt field

参考Facebook更新指南:https://developers.facebook.com/docs/unity/upgrading-7.x

简单总结一下:

现在Method callback已经输入,而且有差异明显的result classes。比如:FB.API将会返回一个IGraphResult,而FB.Canvas.Pay则会返回一个IPayResult。

在7.X SDK中,你将必须替换所有反response.txt串行序列化的代码,然后进入status field,使用更简单的方式:

response.ResultDictionary[“status”]

这是处理Buy按钮点击活动的method里的C#代码:

7

这份博客中还有些没提到的是,你需要进入Facebook开发者便携版的应用配置页面,在Canvas Payments左边菜单选项创造一个新的公司,遵循这些步骤,你很快就可以掌握。

有用的资源:

Unity文档: http://docs.unity3d.com/Manual/webgl.html

Facebook文档:https://developers.facebook.com/docs/unity/getting-started/canvas

转载于:https://www.cnblogs.com/zhairan/p/6251411.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/489255.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java indexof方法_【3-14】Java中集合类list的增删改查

Hello,大家好,我是大家最亲爱的siki老师,每天都会在这里为大家带来一个Java语法中有趣的知识点,Q群175158287,欢迎同大家多多交流哈!今天给大家带来的是Java中list类的使用,java.util 包提供了l…

清华大学孙富春教授:基于知识智能的机器人技能学习

来源:学术通在刚结束的2019中国人工智能产业年会分论坛——“知识智能及其产业应用论坛”上,清华大学计算机科学与技术系教授、中国人工智能学会副理事长、国家杰青孙富春教授发表了题为《基于知识智能的机器人技能学习》的报告。孙富春教授报告聚焦人工…

图书管理系统可行性分析报告范例_会做可行性分析报告贺州专家团队*金

金兰8564ertyu-03会做可行性分析报告贺州专家团队*金不满意全额,三年内免费提供修改服务,目前,金兰企划已为上万家客户及伙伴提供了专业、精准的商业策划服务,并得到了客户及行业的一致好评。会做可行性分析报告贺州专家团队*金金…

java开发项目实例_Alibaba内部出品Java突击手册,大量开发实战项目分享

前言Java作为目前最受欢迎的语言,每年都会有很多转行、跨行等等地人加入到开发大军中来,但是Java开发也是会遇到瓶颈的,当我们遇到瓶颈的时候就会去寻求发展突破,尤其是从Java开发高级工程师向架构师迈进的时候,需要大…

快递下单后取消订单_网约车定位地点不动,男子别的平台下单,没取消订单要付6.6元...

众所周知,在平台上网约车的时候,要是超出一定时间放鸽子,通常都是要扣除乘客部分钱,反之是司机取消了订单,平台同样会给司机处罚,在路程近的单子上,有些司机是接了后就不想跑,但是也…

5G概述和基本原理

来源:电子万花筒 未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能,互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测;开展互联网&am…

以下选项中python用于异常处理结构_《Python 程序设计》复习题

目录 填空题 一、基础知识 二、序列 三、选择结构与循环结构和函数及面向对象、文件 选择题 一、Python 基础语法 二、基本数据类型 三、程序的控制结构 四、函数和代码复用 五、组合数据类型 六、面向对象: 七、文件 判断题 一、基础知识 二、序列 三、选择结构与循…

去掉边框_安卓也有堪比 VOUN 的加边框应用了,素材丰富到没朋友

iOS 系统中有一款可以给照片加边框的应用 VOUN,里面的相框档次很高,调整后的效果也很不错,但是安卓却没有一款类似的应用。开发者 Joey 尝试找了很多款相似的应用,结果不是广告就是骗流量的辣鸡应用,所以最后独自开发了…

物联网趋势下的边缘计算发展解析

来源:《NXP客栈》家居或商业应用,到互联车辆,边缘计算贯穿整个物联网。随着数据量的增加,这种计算需要具有最优网络安全功能与最高功能安全级别的强大互联边缘计算平台。创新通常成波出现(图1)。一些创新浪…

docker php 一键部署_Java开发提升十倍生产力:Idea远程一键部署springboot到Docker

IDEA是Java开发利器,springboot是Java生态中最流行的微服务框架,docker是时下最火的容器技术,那么它们结合在一起会产生什么化学反应呢?一、开发前准备1.Docker安装可以参考:https://docs.docker.com/install/2.配置do…

四个人过桥的题目_云南的几种“勾魂”特产,舌尖上的美味,让人回味无穷,你吃过吗...

云南,彩云之南,说到云南美食,大家可能第一反应都是“米线呀!”害!大云南的美食可多了,你可不能只知道这一个,号称花城的云南,这里的美食也是“遍地开花”。过桥米线一碗过桥米线&…

逐!帧!揭!秘!终于能看清波士顿动力机器人的细节了

来源:乾明;发自 凹非寺;量子位报道波士顿动力,逆天机器人的代名词。每一次新的视频放出,机器人做出各种充满视觉冲击力动作,都会引起疯狂传播。凭借敏捷的身姿和动物般的反应能力,它们做出了各种…

数学建模matlab画图操作大全

数学建模matlab画图操作大全 1.画图及一些基本设置 clear%清空工作区 clc%清空命令行窗口 close all%关闭所有图窗 x-40:0.1:40 f(x) x.^2-110;%函数句柄 x0fzero(f,15)%找15附近的零点 x0fminsearch(f,-11)%找-11附近的最小值%% 画图及其基本操作 %画图,默认格式…

python语言的产生_Python生成器是什么(超级详细)

之前我们讨论了高效的推导式。通过推导式,我们可以直接创建一个列表、字典或集合。但是,由于受到内存的限制,这些可迭代对象(列表、字典或集合)的容量是有限的。 比如,创建一个包含 10 万个元素的列表&…

俄罗斯“木船”机器人系统将于2020年部署部队

来源:国防科技要闻据悉,俄罗斯地面部队已完成“木船”(Kungas)机器人系统样机的国家试验,将于2020年开始部署部队,用于作战试验。发展背景自2010年以来,俄罗斯机器人系统进入快速发展时期。2014…

线程停止继续_晓龙吊打面试官系列: 如何优雅的停止一个线程

一、什么时候我们需要中断一个线程在实际的开发中,有很多场景需要我们中断一个正在运行的线程,就比如:当我们使用抢票软件时,其中某一个通道已经抢到了火车票,这个时候我们就需要通知其他线程停止工作。当我们希望在一…

hive读取hdfs存放文件_数据获取层之Flume快速入门(一) 实时监控单个追加文件

实时监控 Hive 日志,并上传到 HDFS 中实现步骤1、Flume 要想将数据输出到 HDFS,必须持有 Hadoop 相关 jar 包commons-configuration-1.6.jar、hadoop-auth-2.7.2.jar、hadoop-common-2.7.2.jar、hadoop-hdfs-2.7.2.jar、commons-io-2.4.jar、htrace-core…

2019-2020中国趋势报告,203页PPT解读16大机会

来源:企鹅智库 报告如下未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能,互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测;开展互联…

行程单图片python预处理_GCC编译过程(预处理-gt;编译-gt;汇编-gt;链接)

前言如果你使用集成环境开发。那么你点击编译按钮就可生成可执行文件。但是C程序从源代码到二进制行程序都经历了那些过程?你知道吗?这些过程集成开发环境在点击编译按钮后都做完了,如果编译没有出错,即可生成可执行文件。本文将以…

sqlite查询乘以某列如果是null就换成_大数据之Hive group by with cube/rollup分组查询...

group bysql 查询时,我们常将聚合函数和group by 结合起来对某一个或多个字段进行分组查询,例如:select addcode,count(distinct sbtid)uv from tb_hive_window group by addcode;---------------| addcode | uv |---------------| 0002 …