11. Using WebGL Templates

使用WebGL模板

当您构建WebGL项目时,Unity会将播放器嵌入HTML页面,以便在浏览器中播放。默认页面是一个简单的白色页面,在灰色画布上带有一个加载栏。或者,您可以在“播放器设置”检查器(菜单:Edit > Project Settings > Player)中选择最小化模板(只有必要的样板代码才能运行WebGL内容)。

image

内置的HTML页面对于测试和演示最小播放器很好,但出于生产的目的,通常需要将播放器托管在最终部署的页面中。例如,如果Unity内容通过外部调用接口与页面中的其他元素交互,那么它必须使用提供这些交互元素的页面进行测试。 Unity允许您通过使用WebGL templates(WebGL模板)来提供自己的页面以承载播放器。

Structure of a WebGL Template WebGL模板的结构

自定义模板通过在Assets文件夹中创建一个名为“WebGLTemplates”的文件夹添加到项目中 - 模板本身就是该文件夹中的子文件夹。每个模板文件夹都包含一个index.html文件以及该页面所需的任何其他资源,例如图像或样式表。

image

一旦创建,模板将出现在“播放器设置”检查器的选项中。(模板的名称将与其文件夹相同)。或者,该文件夹可以包含名为thumbnail.png的文件,该文件的尺寸应为128x128像素。缩略图图像将显示在检查器中,以提示完成的页面的外观。

该html文件需要至少包含以下元素:

  • Unity WebGL加载器的脚本标记:<script src="%UNITY_WEBGL_LOADER_URL%"></script>
  • 实例化游戏的脚本:<script> var gameInstance = UnityLoader.instantiate("gameContainer", "%UNITY_WEBGL_BUILD_URL%");</script>
  • 一个<div>标签,在实例化函数中使用该标识。这个div的内容将被游戏实例取代。

UnityLoader.instantiate(container, url, override)

UnityLoader.instantiate负责创建一个新的内容实例。

  • container(容器)可以是DOM元素(通常是<div>元素)或DOM元素的ID。如果DOM元素被提供,那么游戏将立即被实例化。如果提供了一个DOM元素的id,那么在解析整个文档之后,游戏将被实例化(这意味着你可以提供一个在 UnityLoader.instantiate() 调用时尚未创建的DOM元素的id )。
  • url 指定了json文件的地址,该文件包含关于构建的信息(您可以使用%UNITY_WEBGL_BUILD_URL%变量,该变量将在构建时自动解析)。
  • override是一个可选参数,可用于覆盖游戏实例的默认属性。例如,您可以重写onProgress和popup函数,因为这些是游戏实例的属性。请注意,Module也是游戏实例的属性,所以在实例化时可以覆盖模块的属性。考虑下面的例子:
UnityLoader.instantiate("MyContainer", “build/MyBuild.json”, {
    onProgress: MyProgressFunction,
    Module: {
        TOTAL_MEMORY: 268435456,
        onRuntimeInitialized: MyInitializationCallbackFunction,
    },
});

Template Tags 模板标签

在构建过程中,Unity将在页面文本中查找特殊的标记字符串,并用编辑器提供的值替换它们。这些包括名称,屏幕尺寸和关于玩家的其他各种有用信息。

标签由页面源中的百分号(%)分隔。例如,如果产品名称在播放器设置中被定义为“MyPlayer”: -
<title>%UNITY_WEB_NAME%</title>

...在模板的索引文件中将被替换为
<title>MyPlayer</title>

...为构建生成的主机页面。完整的标签集合如下: -

  • UNITY_WEB_NAME:玩家的姓名。
  • UNITY_WEBGL_LOADER_URL:执行构建实例化的UnityLoader.js脚本的Url。
  • UNITY_WEBGL_BUILD_URL:JSON文件的URL,包含有关构建的所有必要信息。
  • UNITY_WIDTHUNITY_HEIGHT:播放器的屏幕宽度和高度(以像素为单位)。
  • UNITY_CUSTOM_SOME_TAG:如果您将标记添加到UNITY_CUSTOM_XXX格式的索引文件中,那么当您选择模板时,此标记将出现在播放器设置中。例如,如果像<title> Unity Player | %UNITY_CUSTOM_MYTAG%</ title>已添加到源中,播放器设置将如下所示: -
image

标签名称旁边的文本框包含自定义标签在构建过程中将被替换的文本。

Example

为了说明模板标签的用法,下面是Unity用于其最小WebGL模板的HTML源代码。

<!DOCTYPE html>
<html lang="en-us">

 <head>
   <meta charset="utf-8">
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
   <title>Unity WebGL Player | %UNITY_WEB_NAME%</title>
   <script src="%UNITY_WEBGL_LOADER_URL%"></script>
   <script>
   var gameInstance = UnityLoader.instantiate("gameContainer", "%UNITY_WEBGL_BUILD_URL%");
   </script>
 </head>
 
 <body>
   <div id="gameContainer" style="width: %UNITY_WIDTH%px; height: %UNITY_HEIGHT%px; margin: auto"></div>
 </body>
 
</html>

最小化和默认模板都可以在Windows的Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\WebGLTemplates或Mac上的/PlaybackEngines/WebGLSupport/BuildTools/WebGLTemplates下的Unity安装文件夹中找到。

Adding a progress bar 添加进度条

加载时,Unity WebGL内容会自动为您呈现默认进度条。您可以通过提供您自己的进度函数作为附加实例化参数来覆盖默认加载栏。例如:

var gameInstance = UnityLoader.instantiate("gameContainer", "%UNITY_WEBGL_BUILD_URL%", {onProgress: UnityProgress});

UnityProgress是两个参数的函数:gameInstance(标识进度条所属的游戏实例)和progress(进度)(0.0到1.0的值,提供有关当前加载进度的信息)。

例如,默认WebGL模板中的进度函数看起来如下:

var gameInstance = UnityLoader.instantiate("gameContainer", "%UNITY_WEBGL_BUILD_URL%", {onProgress: UnityProgress});

例如,默认WebGL模板中的进度函数看起来如下:

function UnityProgress(gameInstance, progress) {
  if (!gameInstance.Module)
    return;
  if (!gameInstance.logo) {
    gameInstance.logo = document.createElement("div");
    gameInstance.logo.className = "logo " + gameInstance.Module.splashScreenStyle;
    gameInstance.container.appendChild(gameInstance.logo);
  }
  if (!gameInstance.progress) {    
    gameInstance.progress = document.createElement("div");
    gameInstance.progress.className = "progress " + gameInstance.Module.splashScreenStyle;
    gameInstance.progress.empty = document.createElement("div");
    gameInstance.progress.empty.className = "empty";
    gameInstance.progress.appendChild(gameInstance.progress.empty);
    gameInstance.progress.full = document.createElement("div");
    gameInstance.progress.full.className = "full";
    gameInstance.progress.appendChild(gameInstance.progress.full);
    gameInstance.container.appendChild(gameInstance.progress);
  }
  gameInstance.progress.full.style.width = (100 * progress) + "%";
  gameInstance.progress.empty.style.width = (100 * (1 - progress)) + "%";
  if (progress == 1)
    gameInstance.logo.style.display = gameInstance.progress.style.display = "none";
}

您可以按原样或作为自己模板的参考使用它。由于进度条完全以JavaScript实现,因此您可以自定义或替换它以显示任何您想要的进度指示。

11

Unity WebGL 中文文档 Unity 2018.1.b
1. WebGL
2. webGL Browser Compatibility
3. Building and running a WebGL project
4. WebGL: Deploying compressed builds
5. Debugging and trouble shooting WebGL builds
6. WebGL Graphics
7. WebGL Networking
8. Using Audio In WebGL
9. WebGL performance considerations
10. WebGL: Interacting with browser scripting
11. Using WebGL Templates
12. Cursor locking and full-screen mode in WebGL
13. Input in WebGL

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,290评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,107评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,872评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,415评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,453评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,784评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,927评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,691评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,137评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,472评论 2 326
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,622评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,289评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,887评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,316评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,490评论 2 348

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,629评论 18 139
  • 构建和运行WebGL项目 当您构建(buil)WebGL项目时,Unity将创建一个包含以下文件的文件夹: 一个i...
    tackor阅读 4,275评论 0 2
  • 最近这段时间连绵不断的小雨充斥着我的生活,而我的心情也随着“阴郁”的天气而持续不安躁动着,不安是因为我知道自己上半...
    7515b237f6ce阅读 378评论 0 1
  • “天下之势,合久必分,分久必合。”三国乱世最终由司马家族的司马炎统一,建立了大一统的王朝——晋,史称西晋。 西晋王...
    慕容读史阅读 976评论 0 0
  • ======记一次从创建仓库到上传代码的过程======项目地址:https://github.com/webxi...
    阿昕_阅读 1,242评论 0 1