unity打包网页版游戏

0

要将Unity项目打包成网页版游戏,你需要使用Unity的WebGL插件。以下是具体步骤:

1. 安装Unity: 确保你已经安装了Unity。你可以在Unity的官方网站上下载:https://unity.com/get-unity

2. 创建或打开Unity项目: 创建一个新的Unity项目,或者打开你想要打包的现有项目。

3. 启用WebGL支持: 在Unity编辑器的顶部菜单中,选择 "File" -> "Build Settings"。在弹出的窗口中,选择 "WebGL" 作为目标平台。

4. 设置构建选项: 在"Player Settings"中,你可以配置你的项目,包括游戏名称、图标、分辨率等。在"Other Settings"中,可以配置WebGL的构建选项,如压缩纹理等。

5. 打包项目: 在"Build Settings"窗口的底部,点击"Build and Run"按钮。Unity将开始构建你的项目,并在默认浏览器中打开。

6. 优化性能: WebGL性能可能会受到限制,特别是对于复杂的游戏。你可能需要优化你的资产、光照、阴影、粒子系统等来提高性能。

7. 部署到服务器: 构建完成后,你会在项目文件夹中看到一个名为 "Build" 的文件夹,里面包含所有构建的文件。将这些文件上传到你的Web服务器,或者使用如GitHub Pages等服务来托管你的游戏。

注意:Unity WebGL并不支持所有的Unity功能,如VR、AR、物理引擎的某些高级特性等。在开发时,请确保你的项目不依赖于这些不支持的功能。

另外,HTML5兼容性也是一个需要考虑的问题,确保你的游戏能在目标浏览器上正常运行。

一个游戏做出来,不可能就直接一劳永逸,肯定还有其他需要修改或者欠缺的地方,最少也会更新版本,不然的话,别人玩都玩腻了,比如DNF的活动,每个星期固定更新,就是为了保持游戏的热度,不然的话,早没人玩了。那么你们有没有想过,他每此更新的都不一样,是怎么做的呢?是整个游戏推到重来,还是只弄一部分。所以这里就涉及到了两方面,首先就是热更新,然后就是资源打包了。那么那个资源打包是用来干嘛的呢?当我们的游戏需要换一些东西的时候,或者需要重新加点新的花样的时候,那么我们就要打包一些你需要的东西(比如图片,材质等等),然后再去上传到服务器,让我们玩家下载最新的补丁。那么这unity的资源打包是怎么做的呢?

这个既然叫做build,很明显就是打包的一些设置了,在这里不多说,注释都在上图。至于第三个按钮的话。我们可以旋转文件夹可以选择里面的包,也可以看到它的路径等等。总体来说,这个插件还是可以的。来看看我打包后的效果吧。

左边是可以创建AB包的,刚开始我们是没有AB包的,然后我们右键空白地方,就可以创建新的AB包名,也可以删除包名,就和我们自己设置包名是一样的。比如我这里点击创建一个新的包名,不改名字的话,就是newbundle,然后有了包名,但是我们还没有指定谁在它里面,所以这里我又做一个预制体,然后直接把预制体拖入这个包名的下面,这样的话,这个cube就是放在这个包下面了。是不是很简单?右边是包里面内容的预测属性,比如包大小,在哪个文件夹等等。这个很简单,不多说。接下来我们来看看第二个模块:

unity打包网页版游戏

首先,unity5.6版本以上都可以用这个插件。然后现在的话,这个插件已经更新了成为3个模块了。可以看到,首先在Winodw窗口打开它ps4三国游戏单机回合,然后就会出现开场图片的一个窗口。它有三个按钮,大家也可以看到,分别是Configure,Build,Inspect。先来看第一个:

这个就是AssetsBundleBrowser插件了,我们在学会了AssetsBundle的制作后,就没有必要自己写一些代码了,完全可以使用插件搞定,但是如果你还不会自己写最基本的打包代码的时候,建议还是要先学会下,然后再用,毕竟插件是别人的技术,不是你的。好了,那么我们来看看这个插件吧。

游戏开发过程中,最重要的还是自己的编程能力了,但是当我们的编程能力达到一定的能力后,我们就需要尝试写一些插件来提高我们的工作效率了,当然,不会写的话,用我们还是需要会的。因为好的插件能大量提高工作效率,这样的话就会缩短制作周期了。要知道,游戏当然越早做完越好了。我们用unity来开发游戏,插件也是百花齐放,什么都有。那么我们今天就来看看一款打包插件:AssetsBundleBrowser。先看下它的庐山真面目。

还存在另外一种情况,当尝试加载N个带有依赖关系的AB包时,其实很难预先知道每一个AB包所依赖的其他资源列表,因此这部分依赖关系信息就需要在程序运行时动态获取。AssetBundle提供了一个名为GetAllDependencies的方法专门用于获取当前AB包所以来的资源列表,这样就可以在程序中预先加载所有依赖的AB包了。

如果要加载一个带依赖关系的AB包,那么必须首先加载它所依赖的所有其他AB包,否则此AB包中使用Load加载的对象将会丢失依赖的资源关联。

为了避免这种浪费,需要使用AssetBundle的包依赖关系来处理。正确做法是将共享的材质资源单独打包到一个独立的AssetBundle中,让两个模型所隶属的AB包分别依赖于该独立材质AB包,这样材质资源仅会被打包一次,节省了游戏资源空间。从Unity5.x开始,系统会自动判断所有AB包的资源之间的依赖关系,不需要开发者手动处理。

AssetBundle中不同的bundle的许多资源可能会同一时间依赖于相同的某个资源,例如不同模型可能会引用相同的材质,这称为AssetBundle资源之间的依赖。如果不考虑依赖关系,将两个资源分别打包到两个不同AB包中,那么它们共享的材质资源就会被打包两次,这就造成了资源的浪费。

不同于Unity5.x,Unity4.x没有方便的AssetBundle打包工具,只能通过在脚本中纯代码方式指定资源列表和依赖关系。

同脚本一样,场景资源也是一类极为特殊的游戏资源。在Unity中场景资源不能和其他普通资源混合打入同一个AssetBundle,必须单独打入AB包。而是当我们加载并使用AB包中的场景时(一般情况下是切换场景操作),不再需要预先将场景添加到Scens In Build场景构建列表,直接使用就可以了。

脚本资源是一种特殊资源,脚本本身代码内容不会被打入AB包,而是只会在AB包中维护一个脚本的引用,其直接指向Assets目录下的某一个具体名称脚本,加载AB包的时候就要求在Assets目录下必须存在所有此包中资源依赖的同名脚本,否则造成所有资源的脚本丢失(物体行为逻辑丢失)。

Unity中只有一个负责卸载AssetBundle的方法,需要传入一个布尔类型参数,取true和false两个值含义完全不同,具体如下:

正确的做法是对于程序中确定不再使用的AssetBundle资源包,我们要及时卸载调优化内存空间来保证可以顺利加载新的资源。

(2)AssetBundle.LoadAllAssets方法,无参一口气加载所有包中的资源到内存。使用泛型的方法那么返回的是一个特性类型的数组(前提是包中的资源都是相同数据类型),使用不带泛型的方法会返回Object数组(可以是不同类型对象)。

(1)AssetBundle.LoadAsset方法,参数传递具体资源名称,不带后缀。使用泛型的方法可以自动加载并返回相应资源类型,使用不带泛型方法会返回Object,需要手动转换。

使用AssetBundle.LoadFromFile(path),其中path是AB的路径,返回AssetBundle对象。

一个AB包对应两个文件,其中一个只包含资源内容本身,无后缀是一个二进制压缩文件,另外一个后缀为.manifest是对这个AB包的描述文件,其中描述了AB包中的资源列表以及依赖关系。

(2)在打包脚本中调用public static AssetBundleManifest BuildAssetBundles(string outputPath, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform)将标记的资源全部打入对应的AB包。

Unity编辑器扩展其实主要是指开发者通过编写C#脚本从而在Unity编辑器中添加一个新的工具菜单项来对现在的编辑器功能进行扩展或更为简单的实现管理资源的功能。这个C#脚本称之为编辑器扩展脚本。在使用编辑器扩展时需要注意以下3点:

然而无论使用哪种方式,开发者都需要在Unity编辑器中编写脚本来创建AB包,由于打包操作是在游戏非运行时,因此这个脚本一定能够在不运行游戏的前提下执行,Unity提供了编辑器扩展的功能来帮助开发者实现这个目的。

目前Unity提供了4.x与5.x两种AssetBundle资源包的创建方式。其中4.x是老版方式,相对比较麻烦,只能在打包脚本中通过纯代码的方式手工指定AB包与资源列表依赖关系。而5.x的方式做了很大改进,提供了AssetBundle创建工具,开发者可以通过该工具非常简单方便的进行编辑器操作指定AB包与资源依赖关系,可以大大提高开发效率。

Unity中的AssetBundle系统是对资源管理的一种扩展,可以动态地加载和卸载,并且大大节约了游戏包体所占空间并提高了加载效率。

AssetBundle是将资源用Unity的一种用于存储资源的压缩格式打包后的集合。它可以存储任意一种Unity引擎可以识别的资源。

制作一个Unity的资源格式标准,所有资源都采用这个相同的格式进行处理。传统格式如XML、JSON可以实现此功能,但是其安全性低、无任何加密并且打包加载速度非常慢因此并不是理想选择。

在Unity的Assets目录下的文件,在游戏运行过程中需要从此目录加载并显示到屏幕上的都可以称之为Unity资源,例如模型、材质、纹理、预制体、脚本、声音、数据文档、动画切片、控制器、着色器、场景等。

【官方干货】即点即玩,Unity 小游戏开发简介

我们拿了一款真实的小游戏进行测试。Timeline Profile可以看出原生APP耗时3.5毫秒左右,小游戏耗时10毫秒,所以整体来看WebGL的CPU性能与原生App相比相差3倍左右,其中既有WebGL单线程的原因,也有wasm本身执行效率的问题,印证了之前Benchmark结果。

我们看到WebGL相比原生APP也有一部分内存占用减少,比较显著的就是Native Heap中的IL2Cpp Runtime。通过延迟加载meta信息、使用Sparse HashTable等方式使内存从101MB降低到35.3MB。这里主要是针对WebGL平台进行优化,后面会详细介绍这些。Asset相关的部分也有降低,因为资源压缩格式进行了调整,来自引擎底层内存分配器的行为和策略在不同平台上也有不同。

还有一处值得注意的是Mono Heap和Emscripten malloc的空闲空间。WebGL上,Mono Heap由IL2Cpp分配管理,其他native内存(包括引擎Native Heap和其他第三方库如Lua分配的内存)由Emscripten的malloc分配管理(默认使用dlmalloc)。这两部分都是只增不减,而且相互独立,空闲空间无法共享,因此需要各自都注意控制峰值。

文件系统会多使用内存。浏览器的沙盒机制导致WebGL无法访问本地文件,为了浏览器安全,只能使用JavaScript + IndexedDB模拟一个文件系统。Wasm访问js层,js层再访问IndexedDB三国战纪单机通关解说游戏,这里js层会占用一定内存,不能像Native文件系统那样直接使用一小块内存访问大的文件。

接下来分析Unallocated的部分。Wasm heap的大小是从一个预设值开始,然后以一定步长逐步扩容,扩容的方式比较傻,需要复制整个ArrayBuffer。例如从400M扩容到500M,扩容的时候400M也在,500M也在,总共会有900M的峰值。我们建议开发者根据游戏实际内存峰值,刚开始设立一个比较大的预设值。但这样会带来另外一个问题,就是会在wasm heap的尾部留有一段尚未分配的部分,就是90M的地方。

由于CPU侧性能比较弱,游戏复杂度提高、计算量增大的时候,手机很容易过热。也会对网络API有限制,因为只支持websocket,所以需要开发者进行适配。由于以上这些限制,导致能使用的插件也比较有限。iOS对于WebGL的支持也不尽如人意,我们经常要为iOS平台做特殊优化、写特别的workaround。

WebGL在iOS平台上内存十分受限,低档机不能超过1GB,高档机大概1.4GB左右,超过这一限制可能就会触发操作系统OOM迫使进程重启。WebGL运行效率比原生APP慢3倍左右,目前只支持单线程不支持多线程,所以WebGL小游戏CPU性能比原生低不少。图形API只支持WebGL1/WebGL2,所以有些高级特性和优化没有办法使用,包括Compute Shader。没有文件系统,所以需要更大的内存模拟文件系统。这也导致Unity cache机制受到很大影响,cache文件无法被同步访问。

宿主客户端启动一个小游戏的时候会根据刚才提到的json文件描述拿到游戏首包。前面提到的共享引擎包,宿主通常都会提前下载和解压。然后客户端把首包解压到小游戏对应的沙盒文件夹,通过很小的InstantGame Launcher启动Unity小游戏子进程就可以了。

Unity基于NetWork的局域网对战游戏制作

我这里只打开一个,另一个一模一样的。然后你选择谁为主机,点击就可以了,就能出现像最前面那张图一样的情况。那么说明你就弄好了一个简单的局域网了。然后我们开始做局域网对战游戏。创建一个人物预制体,然后控制预制体。这里给预制体挂上脚本,然后就可以控制了。这里我直接给代码了,注释都有:

专题: 三国七单机游戏   打单机游戏三国   三国单机新游戏