Unity中webgl使用避雷要素指南

目录
  • 1.不支持ios设备播放音频(无论是MP3还是ogg格式)
  • 2.在ios设备的浏览器(无论是Safari 还是微信浏览器)
  • 3.发布到webgl的时候注意所有Text都需要使用自定义的字体
  • 4.若要更改loading界面
  • 5.如果想做微信小程序可以通过laya进行后期制作
  • 6.在本地iis服务器运行没有问题
  • 7.在webgl中使用对象池模式可能会出现莫名其妙的状况
  • 8.在webgl中调用接口动态生成元素还有个坑

1.不支持ios设备播放音频(无论是MP3还是ogg格式)

目前是通过unity调用html的Audio标签播放来实现跨平台音频播放的。

首先在Assets文件夹下创建Plugins文件夹,在其中创建externFunction.jslib文件用于调用js方法,文件内容如下:

mergeInto(LibraryManager.library, {
PlayAudios: function (audioname) {
	PlayAudio(Pointer_stringify(audioname));
}
});

之后再Scripts目录下创建一个C#脚本用于调用

    /// <summary>
    /// 按照音频名播放音频
    /// </summary>
    /// <param name="audioname"></param>
    [DllImport("__Internal")]
    private static extern void PlayAudios(string _audioName);
    /// <summary>
    /// 播放js音频
    /// </summary>
    /// <param name="_audioName"></param>
    public void PlayJsAudio(string _audioName,bool _play)
    {
         PlayAudios(_audioName,_play);
    }

之后再unity场景中想要播放音频的时候直接调用PlayJsAudio(_audioName,true)播放音频(false为暂停)。

打包到webgl后,在html中添加如下脚本

	function PlayAudio(audioid,isplay) {
		var player = document.getElementById(audioid)
		if(isplay)
		{
			player.play();
		}
		else
		{
			player.pause();
		}
	}

当然也需要添加对应的audio标签想要同时播放几段音频就需要创建几个audio标签(比如背景音乐一个,触发音频如按钮一个)

<audio id="bg" preload="auto"><source src="Audios/bg.mp3" type="audio/mpeg"></audio>
<audio id="button" preload="auto"><source src="Audios/button.mp3" type="audio/mpeg"></audio>

完成以上配置后不要忘记在发布出来的webgl目录下创建一个Audios文件夹,并将音频放进去,之后如果要播放背景音乐,则在C#中调用PlayJsAudio("bg",true),暂停为PlayJsAudio("bg",false);

注意IOS设备的浏览器不支持音频自动播放,为此没被需求方少抱怨╮(╯▽╰)╭

2.在ios设备的浏览器(无论是Safari 还是微信浏览器)

都会出现ui自适应的问题,安卓设备及pc都无问题。

可将Canvas物体上CanvasScalerde UIScaleMode设置为“ScaleWithScreenSize”,将ReferenceResolution设置为目标设备的分辨率(比如x:1440,y:2540),如下图

若不起作用,将Canvas做如下配置,注意将UI摄像机拖入RenderCamera中

3.发布到webgl的时候注意所有Text都需要使用自定义的字体

否则所有中文都不会显示,这里推荐使用思源字体或阿里巴巴字体,这些字体中都有免费商用的,不用担心版权问题。

4.若要更改loading界面

可以直接替换打包后TemplateData文件夹中的图片,如下所示

若要修改背景颜色,需要更改Build文件夹下面的json文件

若要改成背景图片,需要将此处改为"backgroundUrl": "图片相对路径",如下图所示,图片最好放在Build目录下

​​​​​​​

5.如果想做微信小程序可以通过laya进行后期制作

或者通过下方工具转换(当前版本不支持videoplayer)

https://github.com/wechat-miniprogram/minigame-unity-webgl-transform

6.在本地iis服务器运行没有问题

在线上服务器运行出现Wasm Memory access out of range 问题,建议换一台服务器,应该是线上服务器抽了~~这是真实项目遇到过的情况,在我本地的iis服务器和腾讯的存储桶中运行都一点问题没有,但是发布到客户的服务器后触发某button的时候就会报这个错误,我当时就提出是服务器的问题,但是形式比人强,客户硬是让我想办法解决,折腾到凌晨2点多,最后还是换了一台服务器,问题立马就没了···时隔5天,我再打开一开始发布到有问题的服务器上的项目,这个问题已经没有了···

7.在webgl中使用对象池模式可能会出现莫名其妙的状况

比如根据接口返回的数据生成一批元素的时候,在Editor或者本地测试都没有问题,但是发布到服务器后可能会出现部分元素未生成的情况,经过排查接口返回的数据是没有问题的,对象池的逻辑也是没有问题的;最后停用了对象池,而是每次结束后都destroy掉所有元素,然后重新生成,这样就不再出现问题。

8.在webgl中调用接口动态生成元素还有个坑

就是如果用户的网速够慢、手机购卡,用户可以连续触发生成功能,导致场景中的元素是设计中的两倍,所以涉及到网络的触发功能最好加一个状态字段防止用户多次触发。

以上就是Unity中webgl使用避雷要素的详细内容,更多关于Unity中webgl使用指南的资料请关注我们其它相关文章!

(0)

相关推荐

  • Unity工具类之生成文本验证码

    本文实例为大家分享了Unity生成文本验证码的具体代码,供大家参考,具体内容如下 文本验证码 由于我经常使用Unity进行webgl版本的开发,看到网站上面用户登录有很多的验证码验证.借鉴相关博客,写了Unity的工具类文本验证码,代码如下: 工具类:VerificationCode using System.Collections; using System.Collections.Generic; using System.Text; /// <summary> /// 该工具类为:生成验

  • unity与vue交互(无第三方插件)

    vue与unity交互最终版本 不需要安装任何第三方插件 请大家安心看完,写的比较详细,并且绝对有效,所以篇幅比较大,也可以直接看图解,看不懂图解后再看文档也可 因为之前我使用的vue-unity-webgl 后来发现使用过程中容易出现各种问题,也可能是我们菜吧,没弄懂插件如何使用,下面先说一下我遇见的问题 问题1:unity为了解决无法输入中文问题,使用了网上的解决方案,因为vue-unity-webgl会将unity的东西完全融入到vue,所以unity的操作也会导致vue页面出现异常,例如

  • Unity中webgl使用避雷要素指南

    目录 1.不支持ios设备播放音频(无论是MP3还是ogg格式) 2.在ios设备的浏览器(无论是Safari 还是微信浏览器) 3.发布到webgl的时候注意所有Text都需要使用自定义的字体 4.若要更改loading界面 5.如果想做微信小程序可以通过laya进行后期制作 6.在本地iis服务器运行没有问题 7.在webgl中使用对象池模式可能会出现莫名其妙的状况 8.在webgl中调用接口动态生成元素还有个坑 1.不支持ios设备播放音频(无论是MP3还是ogg格式) 目前是通过unit

  • AngularJS 中的指令实践开发指南(一)

    指令(Directives)是所有AngularJS应用最重要的部分.尽管AngularJS已经提供了非常丰富的指令,但还是经常需要创建应用特定的指令.这篇教程会为你讲述如何自定义指令,以及介绍如何在实际项目中使用.在这篇文章的最后(第二部分),我会指导你如何使用Angular指令来创建一个简单的记事本应用. 概述 一个指令用来引入新的HTML语法.指令是DOM元素上的标记,使元素拥有特定的行为.举例来说,静态的HTML不知道如何来创建和展现一个日期选择器控件.让HTML能识别这个语法,我们需要

  • C#使用Protocol Buffer(ProtoBuf)进行Unity中的Socket通信

    首先来说一下本文中例子所要实现的功能: 基于ProtoBuf序列化对象 使用Socket实现时时通信 数据包的编码和解码 下面来看具体的步骤: 一.Unity中使用ProtoBuf 导入DLL到Unity中, 创建网络传输的模型类: using System; using ProtoBuf; //添加特性,表示可以被ProtoBuf工具序列化 [ProtoContract] public class NetModel { //添加特性,表示该字段可以被序列化,1可以理解为下标 [ProtoMem

  • 在Unity中捕捉Android的常用按钮返回事件

    在Unity开发中捕捉Android的常用事件其实很简单 Input.GetKey(KeyCode.Escape) Input.GetKeyDown(KeyCode.Home) // 返回键 if ( Application.platform == RuntimePlatform.Android &&(Input.GetKeyDown(KeyCode.Escape))) { //.... } // Home键 if ( Application.platform == RuntimePlat

  • 在Unity中实现简单的伪时间同步

    在Unity中实现简单的伪时间同步,只是读取数据库所在电脑的当前时间 复制代码 代码如下: using UnityEngine; using System.Collections; using System.Runtime.InteropServices; using System.Data; using System.Data.SqlClient; public class ChangeTime {     //Kernel32.dll在32位系统和64位系统有区别,64位系统中需要设置为以管

  • 浅谈Unity中IOS Build Settings选项的作用

    Run in Xcode as:分Release选项和Debug选项,分别对应的是Xcode中Scheme编辑的BuildConfiguration的Debug和Release选项 Symlink Unity libraries:这是专为IOS平台用的,是一个全名叫做Symbolic Link Unity Libraries的runtime库,勾选后,xcode工程会直接在Unity的安装路径下引用Unity ios runtime library,不勾选,这些ios动态库会直接copy到xco

  • Unity中C#和Java的相互调用实例代码

    1.通过C#调用Java的方法: 在C#中添加调用的一些代码,利用Unity提供的一些接口实现调用Java! private const string JAVA_CLASS_Name = "com.unity3d.player.UnityPlayer"; private void CallJavaFunc(string javaFuncName, params object[] args) { try { //获取到AndroidJavaClass,至于这里为什么调用这个类,我也不是很

  • Go Web 编程中的模板库应用指南(超详细)

    如果你有过Web编程的经验,那么或多或少都听说过或者使用过模板.简而言之,模板是可用于创建动态内容的文本文件.例如,你有一个网站导航栏的模板,其中动态内容的一部分可能是根据当前用户是否登录显示登录还是退出按钮. Go提供了两个模板库 text/template和 html/template.这两个模板库的使用方式是相同的,但是 html/template包在渲染页面模板时会在后台进行一些编码以帮助防止造成代码注入(XSS 攻击). 因为两个模板库都使用相同的接口,因此本文中介绍的所有内容均可用于

  • 如何在Unity中检测死循环和卡死

    当游戏在手机/模拟器上卡死,logcat没有日志输出,也没有卡死堆栈信息或者bugly也没有捕获到异常,你是否很焦急?本文介绍一下我们项目中检测Unity卡死的方法,也许适合你使用. 实现原理 在绝大多数情况下我们可以认为Unity是单线程的,基于这点我们在Unity的系统函数FixedUpdate中统计游戏运行期间的总帧数,如果Unity没有卡死,那么TotalFrame是会一直累加的,如果在某一段时间内TotalFrame都不会变化了,则可以认为Unity已经卡死了 既然Unity的主线程已

  • Unity中Instantiate实例化物体卡顿问题的解决

    本文实例为大家分享了Unity中Instantiate实例化物体卡顿问题的解决方法,供大家参考,具体内容如下 一.前言 当在执行多次Instantiate实例化物体时,会卡顿严重甚至在移动端会导致程序崩溃 因为Instantiate会产生大量的GC,使CPU过高,导致崩溃 下面是一段测试代码:当我们按下按键时实例化100000个预制体 using UnityEngine; public class Test : MonoBehaviour { public GameObject prefab;

随机推荐