精华内容
下载资源
问答
  • layaair2-cmd.rar

    2020-06-23 18:18:05
    本文件是在vscode中运行layaair2-cmd -v出现Error: Cannot find module 'C:\Users\Administrator\AppData\Roaming\npm\node_modules\layaair2-cmd\layaair2-cmd.js'错误,下载解压后放到C:\Users\Administrator\App...
  • layaair2-cmd.zip

    2021-06-19 16:17:34
    运行layaair2-cmd -v 提示找不到layaair2-cmd.js
  • LayaAir导出插件的基础上做了扩展,使得导出更为简便和高效,具有一些主要的特点: 1.支持一键批量导出场景和预设; 2.支持自动压缩动作文件,Mesh文件 3.合并重复的文件 对于个人小游戏开发或者企业开发者来说这...
  • Layaair 3D场景使用

    2018-11-29 17:18:25
    介绍 Layaair 3D场景使用,包含unity3D 和 Layaair 工程 使用介绍 https://blog.csdn.net/nicepainkiller/article/details/84636112 https://blog.csdn.net/nicepainkiller/article/details/84636112
  • Cannot find module Roaming\npm\node_modules\layaair2-cmd\layaair2-cmd.js
  • 打开即可运行,正常运行无报错。如果出现莫名其妙的报错,重新导出资源,选择清理导出即可,或者清理缓存。
  • layaair排行榜demo

    2019-07-31 10:44:05
    layaair微信排行榜程序示例,详情可参考我的博客。如果有问题可以在博客下方留言。共同学习,共同进步。
  • LayaAir是开源2D / 3D引擎 LayaAir使用WebGL1.0 / WebGL2.0作为图形API并由TypeScript编写。 LayaAir专为高性能游戏而设计,并支持TypeScript和JavaScript编程语言。 一次开发并发布多目标平台(HTML5,Android,iOS...
  • 介绍下LayaBox网页游戏开发引擎 H5网页游戏引擎LayaAir_最全使用教程_极品.zip 腾讯的页游游戏都是用它开发的!
  • LayaAir 开发抽奖程序 演示地址 http://42.56.70.252:9090/video/prize/ 这个抽奖程序的主要功能就是 1. 打开欢迎页面 单击进入抽奖程序 2. 规则是 被抽中的人员将无法继续参加抽奖 希望这个例子能够帮助大家研究...
  • 利用LayaAir引擎+FairyGUI编辑器+TypeScript语言 制作的打地鼠游戏
  • LayaAir系列教程-TS-IDE篇 源代码 LayaAir系列教程-TS-IDE篇 源代码
  • LayaAirIDE 编辑器UI表现类库 使用方式: 引用ide-api类库 https://github.com/layabox/layaair-ide-api/ (目录:layaair-ide-api/ide/src/) 引用LayaAir类库 https://github.com/layabox/layaair/ ...
  • 这个是LayaAir打地鼠的官方示例,不过修改了一些不能运行的代码,以及在lib中添加了需要引用的swc包.请导入项目后,引用lib中的swc,即可运行.
  • layaair开发的跑酷小程序源码,代码为js,可以发布在微信小程序上
  • LayaAir飞机大战小游戏详细代码+图片声音资。可运行,可调节难度,有生命,等级,得分等功能。
  • A Docker image for creation protobuf files compatible with LayaAir(Layabox). 说明   支持Laya 2.x的版本请访问   随着Html5游戏行业的发展,H5游戏的类型慢慢地从单机小游戏、轻交互休闲游戏到重交互竞技类...
  • protobuf3-layaair_AS3-master

    2017-06-02 14:12:22
    layaair_AS3版本可用的protobuf3协议,亲测可用。官方目前为止没有提供AS3版本的protobuf3的API哟~!
  • SFramework_LayaAir 基于Laya的微信小游戏框架核心 该工程只更新Framework相关内容 2021/1/6 本工程可以结合另外一个工程直接运行 SFramework_LayaAir_Example url: 1、将克隆下的文件夹 【SFramework_LayaAir】 ...
  • LayaAirIDE Chrome扩展API
  • layaAir工具

    2018-06-25 11:14:29
    layaAir工具,layaAir工具,layaAir工具,中文版,破解
  • 这篇是学习LayaAir3D引擎的入门级必读文章,也可以作为使用LayaAir引擎开发3D项目美术同学随时查阅的手册。 由于LayaAir引擎当前是依托于Unity工具编辑3D场景并导出资源的,那Unity中到底是哪些功能可.

    本篇文章为本人记录笔记,如果有需要,请查看原始文章:https://blog.csdn.net/m0_38013911/article/details/108271607

     

    关于3D的学习文章,算上本篇,我一共写了两篇。上一篇是面向零3D基础的《科普:零基础了解3D游戏开发》。这篇是学习LayaAir3D引擎的入门级必读文章,也可以作为使用LayaAir引擎开发3D项目美术同学随时查阅的手册。

    由于LayaAir引擎当前是依托于Unity工具编辑3D场景并导出资源的,那Unity中到底是哪些功能可以用,哪些功能不可用,本文会进行全面和系统的介绍。

    建议:

    1、如果是零3D基础,建议先去看看上一篇《科普:零基础了解3D游戏开发

    2、建议点开本篇左下角的 阅读全文,把本文对应的官网文档收藏起来。如果后续引擎和插件版本更新了。会直接在官网文档中进行修改丰富。

    一、3D场景编辑器的研发规划


    有开发者问过LayaAir引擎是否会有自己的3D场景编辑器,首先可以肯定的讲,一定会有。3D编辑器是LayaAir3.x引擎规划的基础组成部分(3.x正在研发中)。

    采用Unity插件方案的主要原因,一是可以让有Unity经验的优质开发者可以更低学习成本进入HTML5和小游戏产业中来。二是1.x和2.x引擎还处于功能丰富的阶段,引擎功能与Unity还有差距,所以这个阶段以完善引擎功能为主,让小游戏产业的众多3D游戏开发者可以使用更多3D渲染能力,让3D产品的表现更自由、更丰富、更炫酷。因此我们把更多精力先放到引擎功能的研发上。工具方面保障不影响开发者的开发工作流即可。

    随着引擎功能越来越丰富,当前甚至拥有大量Unity也不具有的特色引擎功能,所以自有3D编辑器也在研发进行中,未来与LayaAir 3.x引擎一起推出。

    本篇,我们将全面学习Unity的插件工具使用,以及LayaAir引擎支持Unity中的哪些功能。由于Unity的学习资料非常丰富,即便是没有用过Unity的开发者,在阅读本篇遇到不能理解的地方,也可以通过本篇中的关键字百度搜索答案。

    如果是没有使用过Unity的开发者,不需要系统学习全部Unity工具功能与引擎。仅需通过本篇文档的支持列表,来了解LayaAir引擎支持的功能使用即可。

    二、LayaAir的3D场景编辑环境配置

    在当前,创建LayaAir引擎项目和编辑UI是基于自研的工具LayaAirIDE。而编辑3D场景是基于第三方工具Unity以及我们自研的LayaAir引擎Unity插件。所以本小节先引导大家安装好这些基础的工具与开发环境。

    2.1、下载Unity编辑器工具

    LayaAir引擎的Unity插件不会支持导出Unity所有的功能,毕竟不是同一个引擎,具体支持哪些后面会详细介绍。

    因此,我们的插件工具也不需要支持Unity所有的版本,开发者要根据引擎的版本来选择安装不同的Unity版本。

    2.1.1 Unity 5.6.x版本

    在LayaAir 2.3版本之前(不含2.3)支持采用Unity5.6.x的版本进行3D场景的编辑。

    国内下载地址:https://unity.cn/releases?signup=true

    国际下载地址:https://unity3d.com/get-unity/download/archive

    需要登陆,再找到对应的历史版本(国内打开国际地址需要翻墙)

    2.1.2 Unity 2018.4.7版本

    从LayaAir 2.3版本开始(含2.3)支持采用2018.4.7进行3D场景的编辑。

    有的开发者会问其他版本的行不行,例如Unity 2019或者2018的其他版本。

    如果是小版本的差别,例如2018.4.x的其他系列版本,理论上是没有问题的,但是建议采用2018.4.7。因为2018.4.7版本是经过我们每次的插件发版测试的版本。

    但是,开发者要是采用了例如2019.x等其他版本,则可能会使用到一些2018.4.7不支持的功能,这样就会在导出时报错,或者出现LayaAir引擎运行效果与unity编辑效果不一致的情况。所以开发者尽可能采用我们推荐的Unity版本2018.4.7。

    国内下载地址:https://unity.cn/releases?signup=true

    国际下载地址:https://unity3d.com/get-unity/download/archive

    需要登陆,再找到对应的历史版本(国内打开国际地址需要翻墙)

    2.2 、下载LayaAir的unity插件

    2.2.1 下载地址

    LayaAir引擎unity插件下载地址:

    https://ldc2.layabox.com/layadownload/?type=layaairide

    2.2.2 要对应的版本

    LayaAir引擎unity插件在下载时,一定要对应好引擎的版本号

    例如,引擎采用的是2.6.1,那插件也需要去LayaAirIDE 2.6.1版本下载页面中去下载对应的Unity3D插件版本,如下图所示。否则可能因为引擎与插件的功能支持没有对应,导致运行报错。

    format,png

    这里需要重点提醒的是

    插件对应的是引擎版本,不是IDE版本。

    有些开发者,以为升级了LayaAirIDE的版本,就是对应了引擎版本,并不是这样。

    切换引擎版本,是在LayaAirIDE里点开左上角IDE图标,打开菜单项目 -> 类库管理 -> 下载(并选中引擎库版本) -> 应用切换引擎类库。

    2.3、 导入LayaAir的Unity插件

    Unity里有一个导入自定义包的功能,通过这个功能,可以在Unity里导入LayaAir引擎提供的专属功能包,用来导出Unity里编辑好的场景和资源,然后再用以LayaAir引擎3D的开发。在Unity里导入这个自定义的LayaAir功能包的过程,我们可以视为安装了一个LayaAir引擎资源导出的Unity插件。本小节会针对这个过程进行详细介绍。

    2.3.1 创建一个空项目 

    除非是在已经安装过LayaAir3D插件的Unity项目上进行升级安装,否则,

    我们建议去创建一个新的空项目。

    因为直接打开一个Unity已有项目,可能会有冲突,会导致插件安装不成功。

    如果想使用已有Unity项目的场景资源和编辑好的场景,建议在Unity空项目里安装好LayaAir引擎的插件,然后再把旧项目的资源目录(也就是Unity项目中的Assets目录)复制到新建的项目里。

    Tips: 旧项目中的其他文件对于导出插件而言都用不上,只复制Assets目录即可

    2.3.2 两种插件导入方式(项目中首次安装)
    菜单式导入

    在资源菜单Assets或者资源面板的Assets,右键import Package-> custom Package,如下图所示。

    format,png

    (上图为从菜单导入)

    format,png

    (上图为从资源面板导入)

    以上的两种导入方式,任选一种点开后,选择之前下载好的LayaAir引擎unity插件(xx.unitypackage)打开,如下图所示。

    format,png

    点击打开后,会有插件包含的内容列表展示,如果有我们不想要的功能,比如在Unity里直接预览这个功能不想要,也可以把相关默认的勾选去掉,但是我们建议全部导入(默认就是)。

    所以,我们直接点击Import按钮,开始全部导入,即可。

    format,png

    导入完成后,我们可以看到菜单栏多出一个LayaAir3D,如下图所示。此时说明,已经导入成功。

    format,png

    拖拽式导入

    拖拽式安装的操作方式是把下载好的插件(xx.unitypackage)直接拖拽到Assets面板下,如下图所示。其他后续操作与菜单式安装一样。就不重复介绍了。

    format,png

    插件导入安装的提醒

    对于Unity还不太熟悉的开发者,需要提醒的是,LayaAir引擎Unity插件,不是一次导入所有项目通用,本质上这并不是真的为Unity安装工具插件,而是为项目导入自定义的功能包,虽然我们可以理解为工具插件,但要明白这个插件的本质。所以,在每次创建新的项目工程后,都要重复上面导入LayaAir插件包的过程。

    2.3.3 升级版本的安装

    当LayaAir引擎与Unity插件出现了新版本,我们打算在已导入插件的项目上进行升级的时候,不仅要升级引擎,还要下载对应引擎版本的LayaAir引擎Unity插件。

    然后,将资源目录(Assets)下的 LayaAir3D 与 StreamingAssets 文件夹删除,如下图所示。然后再按照首次安装的方式,去安装下载的新版本Unity插件。

    format,png

    三、初识LayaAir的Unity插件功能模块

    当LayaAir的Unity插件导入成功(安装)后,在Unity中能见到的主要是三个组成模块,我们先对这几个组成模板进行初步的了解。

    3.1、LayaAir3D菜单

    成功导入插件包后,会在菜单栏看到LayaAir3D的菜单列表项,如下图所示。

    format,png

    3.1.1 帐号 Account

    插件工具的功能,一部分是免费的常用与通用功能,另一部分是不影响开发者使用,或者是可以自己找到第三方替代方案,但使用插件集成更方便或者效果更好的增值(VIP)功能。

    当要使用VIP(增值)功能时,需要从LayaAir3D菜单项的Account登录帐号,购买或使用VIP功能。

    关于VIP的具体功能,在后面会有详细介绍的部分,这里重点介绍帐号(Account)

    点击LayaAir3D菜单项的Account,弹出登录界面如下图所示。如果已有社区(ask.layabox.com)开发者帐号的开发者可以直接登录,否则也可以点击这个界面的文本链接注册,跳转到注册网页。

    format,png

    当开发者登录后,界面如下图所示,如果是已购买VIP的帐号,在帐号名下会显示VIP到期时间。否则,会不显示到期时间,皇冠图标也是灰色的。

    format,png

    充值按钮用来购买VIP授权时间,或者续费延长时间。

    首次充值,如果因网络原因,帐号权限未能即时刷新时,可以通过点击刷新或者退出重新登录来解决。

    发票按钮可以跳转到发票申请的网页。

    VIP功能的描述,为了不占用空间,显示的并不全,可以点击了解更多,跳转到全面介绍的文档(https://ldc2.layabox.com/doc/?nav=zh-ts-0-3-3)进行查看。

    绑定设备是插件自动识别的,无需手动绑定,但如果设备绑定达到帐号上限,需要切换设备时,需要点击解绑,才能在其它的设备上登录该帐号。此时当前设备则无法再登录成功。

    3.1.2 导出工具 Export Tool

    点击菜单 LayaAir3D —> Export Tool,会弹出如下图所示的导出工具面板。这个面板可以拖拽到我们习惯的位置上,这是开发者导出Unity中场景与资源的最核心面板,后面会有详细的介绍,这里就不多做阐述。

    format,png

    3.1.3 快捷功能 shortcut

    LayaAir3D 的菜单项Shortcuts是快捷功能,当前有两个快捷功能,如下图所示:

    format,png

    Switch to LayaAir3D BlinnPhongMateria Shader

    可以将Unity的材质一键转换成为LayaAir引擎BlinnPhong材质。

    Switch to LayaAir3D PBRStandardMaterial Shader

    可以将Unity的材质一键转换成为LayaAir引擎PBRStandard材质。

    一键转换材质的重要提示:

    Unity的材质是不能在LayaAir引擎中使用的,所以,开发者必须要使用LayaAir引擎中提供的材质。如何切换LayaAir的材质,本文后面还会有介绍,这里提供两种常用材质的一键转换功能,比较方便实用。在资源导出前,如果以上的材质符合项目需求,可以在这里快速的切换为LayaAir引擎的材质。

    3.1.4 帮助 help

    帮助菜单项里,下级菜单有示例Demo学习文档Study问答社区Answsers这些外链菜单项,方便开发者快速进入对应的官网页面中。还有插件导出功能说明Tutorial插件版本About LayaAir,如下图所示。

    format,png

    帮助菜单项的下级菜单,这里就不去详细介绍了,基本上点开就能理解,其中的插件导出功能说明Tutorial是介绍了当前插件支持哪些Unity功能导出,如果不能理解的也没关系,在本文中还会有相关的介绍。

    3.1.5 设置 Setting

    设置项,当前只有一个可配置功能,就是插件的语言(Language),默认是中文,如下图所示。

    format,png

    习惯了英文界面的开发者,可以在这里配置成为English语言。

    3.2、 资源面板Assets

    插件导入成功后,开发者可以在Unity的Assets(资源)面板中,看到新增了两个目录,LayaAir3DStreamingAssets 。如下图所示。

    format,png

    这两个目录开发者都不需要动,这里简单概述一下,开发者知道即可。

    3.2.1 LayaAir3D 目录
    LayaShader

    LayaShader目录下是LayaAir引擎下的材质等Shader。

    LayaSupoortList

    LayaSupoortList目录下是插件支持的功能列表文档,不过建议看我的这篇,更全更细。

    LayaTool

    LayaTool目录是插件功能操作面板的功能实现目录。

    3.2.2 StreamingAssets 目录

    StreamingAssets目录下,只有一个LayaDemo目录,这里不是示例目录,是效果预览的anywher(本地Server)等环境目录。如果不需要在Unity里直接预览LayaAir引擎运行效果,该目录也可以删除,但建议保留。

    新手注意:

    对于刚接触LayaAir引擎新手,这里要重点强调一下,预览功能必须要先全局安装Node环境(推荐安装Node 10.x版本),我们看到上一个图中的StreamingAssets目录结构就可以看出,正常的目录结构需要node_modules,如果没有安装Node环境,目录结构与上图结构不符,预览功能也就无法正常使用。

    当然,如果没有安装Node环境就直接预览(Run),插件工具也会提示下载安装Node环境,安装后需要重启Unity才会重生效,如果遇到重启Unity仍未生效的情况,建议重启电脑。

    3.3、导出工具操作面板

    之前的小节有介绍过,通过顶部菜单的Export Tool,可以弹出一个导出工具面板,如下图所示。

    之前是中文界面,下图换成了英文界面。

    format,png

    上图这个面板,就是插件最核心的导出操作模块,日常的插件导出资源或场景操作,VIP功能的使用等,全是通过这里完成,在这个小节里,我们先对主要的功能,有个概括的认知,在后续的章节里,我们再分别详细介绍。

    3.3.1 场景预览 Run、QRcode

    在Unity中编辑好场景后,可以在不导出的情况下,直接基于LayaAir引擎快速预览,方便美术直接在Unity中查看运行效果。

    预览功能有两个,一个是PC上查看运行效果的Run(预览),另一个是在手机上查看运行效果的QRCode(二维码)。如下图所示。

    format,png

    场景中需要至少有一个Camera,调整好角度位置,在符合LayaAir引擎插件使用规范的情况下,基于LayaAir引擎的预览运行效果将会与Unity运行结果一致,如果不一样,需要检查是否使用了引擎不支持的功能。

    3.3.2 导出 Export

    在符合LayaAir引擎插件使用规范的情况下,可以直接使用Export(导出)按钮,将Unity中编辑好的场景或者模型直接导出来。

    设置导出路径

    在首次使用导出功能前,需要先在插件的底部,在Save Path(导出路径)这一栏,点击Browse(浏览)选择好要导出的根目录位置。然后再点Export(导出)。如下图所示。

    format,png

    无论是导出场景还是导出预设,这里的操作都是一样的。

    导出成功与导出信息

    当点击Export(导出)后,要注意Console面板,导出过程完成后,可以在Console面板内看到LayaAir3D UnityPlugin: Exporting Success这样的文字,此时,说明Export(导出)完成了,如下图所示。

    format,png

    导出完成并不是终点,是不是真的成功导出,还要留意Console面板中,在导出时是否有报错或者警告,如果有,需要解决好报错和警告中提示的问题后再重新导出。否则运行效果可能与Unity中不同。

    自定义导出目录的名称

    插件功能的下方有一个Other Setting(其它设置),如果按从上至下的顺序介绍,应该最后讲。这里因为与导出设置关联紧密,我们就先来介绍一下。

    Other Setting(其它设置)里,当前只有一个选项,叫Customize Export Root Directory Name(自定义导出目录名称),如下图所示,我们的根目录Save Path(导出路径)这里设置的是E:/Game/3D,当自定义目录名为test时,最终导出的资源全路径实际为E:/Game/3D/test

    format,png

    如果不勾选Customize Export Root Directory Name(自定义导出目录名称),默认的资源目录名称为插件按“LayaScene_ + 场景名”这个规则自动生成。比如我们的场景名为AAA,那么最终导出的资源全路径实际为E:/Game/3D/LayaScene_AAA

    3.3.3 场景导出与预设导出的区别

    Scene3D与Sprite3D分别是场景导出的配置项和预设导出的配置项。如下图所示。

    format,png

    场景Scene3D 

    采用Scene3D(场景)选项导出,会导出整个3D场景,无论场景中的模型、材质、贴图、动画、还是光照贴图全部导出。主要用于整个场景的制作导出和直接使用,导出后的文件扩展名是.ls。在LayaAir引擎中,需要用Scene3D类或它的继承类加载。

    预设Sprite3D

    Sprite3D选项,是指的Unity中的预设导出,中文语言版本这里显示的就是预设,由于该项导出后需要以LayaAir引擎的Sprite3D类来加载,所以英文语言版一直采用Sprite3D来表示Unity中的预设导出项。

    Sprite3D选项的导出,相比场景的导出,没有了光照贴图的导出,常用于角色或游戏中活动物品的单独资源导出,文件扩展名的是.lh,需要用Sprite3D类或它的继承类加载。

    3.3.4 导出配置项说明

    导出配置中根据功能分成几个配置模块,分别是导出时需要进行配置的一些基础功能以及VIP功能的配置。下面分别进行说明。

    3.3.4.1 节点设置 GameObject Setting

    format,png

    忽略未激活节点 Ignore Not Active Game Objects

    导出时,当如上图一样,勾选了Ignore Not Active Game Objects 之后,将不再导出Unity中未激活的节点,下图是在Unity中未勾选激活的节点对象。

    format,png

    批量导出一级节点 Batch Make The First Level Game Objects

    Batch Make The First Level Game Objects只有在预设(Sprite3D)配置里才有这个选项。

    不勾选这个功能,会把所有的节点,合并生成一个.lh后缀的文件,

    勾选这个功能后,会按一级节点分别生成多个.lh后缀的文件。

    3.3.4.2 模型设置 Mesh Setting

    format,png

    Mesh Setting(模型设置)是指模型网格数据的导出设置,功能翻译过来比较容易理解,分别是:

    English中文
    Ignore Vertices UV忽略顶点UV(忽略模型的UV贴图)               
    Ignore Vertices Color忽略顶点颜色(忽略模型的顶点颜色信息)
    Ignore Vertices Normal忽略顶点法线(忽略模型的法线信息)
    Ignore Vertices Tangent忽略顶点切线信息(忽略模型的切线信息)
    Compress模型压缩(VIP功能,降低3D模型文件尺寸约60%)

    勾选以上的任意选项后,会根据勾选忽略的顶点数据来节省模型资源大小。VIP专属的模型压缩功能,可以降低3D模型文件尺寸约60%。

    以上这些功能都起到了减小模型网格文件(XX.lm)尺寸的作用,在当前网速环境下,减少游戏的加载尺寸,加快玩家进入游戏的速度,还是多数开发者比较常用的功能。

    3.3.4.3 地形设置 Terrain Setting

    format,png

    地形设置是指Unity中的地型导出设置,勾选Convert Terrain To Mesh后,如果场景中有地型,会转换地型为网格。

    3.3.4.4 动画设置 Animation setting

    Animation setting(动画设置)当前有两个功能,分别是动画压缩Compress和预烘焙骨骼动画Previously Skeletal Animation 。

    动画压缩 Compress  

    format,png

    当勾选动画压缩Compress后,插件导出Animator动画时会压缩动画文件,会降低3D动画文件尺寸约40%。用于加快玩家进入游戏的速度。该功能属于VIP增值功能,需要购买授权才可以使用。

    预烘焙骨骼动画 Pre Baked Bone Animation  

    在使用普通的骨骼动画模式时,骨骼动画会受到设备性能的限制,比如在不支持JIT的iOS设备环境下,每24块骨骼就需要分mesh来渲染,否则会就出现发黑现象。

    所以,插件中提供了Pre Baked Bone Animation(预烘焙骨骼动画)功能,如下图所示。

    format,png

    预烘培动画是把预先计算好的动画文件烘培到贴图以及instance动态合批等技术来减少GPU的性能压力,对比常规的骨骼动画模式,预烘焙骨骼动画模式从CPU到GPU性能都有显著的优化效果,尤其是CPU计算方面更为明显。由于减少了渲染批次,比如骨骼动画上,再也不需要通过分mesh来处理了。

    尽管预烘焙骨骼动画模式优势明显,但是开发者也需要了解该方案的几个问题,再决定是否勾选使用。首先是该方案暂时还不支持动画融合;另外,当前也不支持多个Animator控制多个Mesh的动画;最后就是GPU显存的占用会明显多于原有的骨骼动画模式。上图中的Bake FPS烘焙帧数就会影响显存有占用,该值越大,相应的GPU显存占用也会越大。不过,值越大,动画数据保存的也越完整,开发者可根据自己项目的情况去取舍。

    另外,在上图中,Keep Skeletal Add Point(保留骨骼挂点)如果勾选后,由于插件会对骨骼进行精简。所以要想保留必要的动画数据,需要在导出前确定挂点位置,并在相应的挂点骨骼下添加非空节点,进行占位。

    关于预烘焙骨骼动画模式的使用,与普通的骨骼动画模式完全相同,注意文件后缀即可。

    3.3.4.5 发布平台 Assets platform

    format,png

    Assets platform(发布平台)是指纹理资源的发布配置。

    默认的情况下,Conventional是必须勾选的。这里不允许取消,其作用是把没有透明通道需求的.png纹理资源自动转换成为.jpg纹理资源。这样可以避免浪费掉的文件尺寸。JPG质量(JPG quality)比较容易理解,100为最高质量,75是默认值,开发者可以根据项目需求自行调节。值越大需要加载的文件体积越大,但质量损失越少。

    AndroidiOS是指输出对应系统平台的纹理压缩格式文件,Android系统这里采用的是ETC1压缩方式,iOS采用的是PVR压缩方式。在使用时,要判断不同系统平台来分别加载对应的纹理压缩资源文件。如果勾选了这两个选项,默认的Conventional选项可以不用勾选。iOS质量(iOS quality)表示压缩级别,值越大需要加载的文件体积越大,但质量损失越少。

    纹理压缩功能,勾选Android输出的是.ktx后缀文件,勾选iOS输出的是.pvr后缀文件。

    对于一些新手,我们这里顺便普及一下纹理压缩的作用。

    游戏中常见的纹理图片文件格式通常是PNG和JPG,这种类型的纹理图片需要先经过CPU解码,然后传送到GPU进行使用。图片资源的像素宽高是影响GPU内存占用大小的直接因素。而采用了纹理压缩的格式文件,无需解码即可直接被GPU读取并显示。所以,一方面是节省了大量的显示内存,另一方面也可以减少图片解码带来的CPU计算压力。

    经过测试,这里的纹理压缩功能,大概会减少显存约75%,但是可能会增加文件的体积,所以这也是一种牺牲资源文件加载体积换取显存占用减少和CPU对于资源解码性能消耗的有损压缩方式。开发者可根据项目需要来选择使用。该功能属于VIP增值功能,需要购买授权才可以使用。

    3.3.5 多配置保存与重置

    以上介绍的导出配置项,默认是存到config 1中,其实插件一共提供了5个配置列表项,如下图所示。

    format,png

    通过切换列表项,开发者可以将不同的导出勾选配置,分别存在不同的配置列表项内。当项目资源存在多种导出配置需求时,该功能就比较实用。

    配置项右侧的Revert Config(恢复配置),点击后会重置当前配置列表项下的导出勾选配置,将其恢复为默认的初始配置。

    四、LayaAir引擎插件导出支持列表

    除了LayaAir引擎插件自身面板上的导出设置项,我们还要注意并且必须要了解Unity的功能面板有哪些是可以导出使用,哪些是不支持的。

    因为LayaAir引擎的Unity插件并非是将Unity所有的功能全都支持导出。毕竟我们的LayaAir引擎设计与结构与Unity的引擎并不相同,虽然3D场景基于Unity编辑器进行编辑和导出,但我们需要按LayaAir引擎插件的支持规则来使用。

    在本小节,我们就全面介绍LayaAir引擎与插件支持哪些Unity中的功能。如果在本小节支持清单中未提及的,都是当前不支持的。所以,如果是刚接触Unity的开发者,在学习Unity工具使用的时候,也不必要全部学习,可以把本小节中所涉及的支持内容,作为关键字搜索学习即可。

    LayaAir引擎插件也会不断在更新,当升级新的引擎版本后,可以关注版本更新日志以及该文档的变化。

    4.1 Inspector面板的基础属性

    在Unity的Inspector面板中,可以查看和编辑Unity编辑器中几乎所有内容,下面我们先了解一下Inspector面板的基础通用属性。

    format,png

    在上图的基础属性里,LayaAir导出支持情况如下:

    Unity的Inspector基础属性LayaAir是否支持导出的说明
    GameObject Name(节点名称)支持
    Static(静态)只支持勾选 或 不勾选
    Layer(层)只支持层的序号导出,开发者也可以在LayaAir引擎中设置Layer
    Position(位置)支持(包括:X、Y、Z)
    Rotation(旋转)支持(包括:X、Y、Z)
    Scale(缩放)支持(包括:X、Y、Z)

    对比上面的图和表格,我们看到Tag是不支持的。StaticLayer是部分支持。后续将不再提醒,关注表格中的支持状态即可。

    这里特别说一下,静态Static勾选后是全选,也就是Everything,如下图所示。但实际上LayaAir引擎只支持了Lightmap Static和Batching Static,那开发者不选Everything,只勾选这两个行不行。当然是不行的,我们其实只认Static勾选或不勾选这个状态,如果此处单独选择,导出并没有效果。

    format,png

    4.2 相机的属性

    format,png

    在上图中的Unity相机属性里,LayaAir导出支持情况如下:

    Unity的相机属性LayaAir是否支持导出的说明
    Clear Flags(清除标志)支持 (包括:Skybox天空盒、Solid Color纯色、Depth only仅深度、Don’t Clear不清除)
    Background(背景)支持
    Projection(投射方式)支持(包括:Perspective透视(Field of View),Orthographic正交(size))
    Clipping Planes(剪裁平面)支持(包括:Near近点、Far远点)
    Viewport Rect(标准视图矩形)支持(包括:X、Y、W、H)
    Allow HDR(允许渲染高动态色彩画面)支持

    4.3 灯光的属性

    format,png

    在上图中的Unity灯光属性里,LayaAir导出支持情况如下:

    Unity的灯光属性                          

    LayaAir是否支持导出的说明
    Type(灯光类型)部分支持(包括:Spot聚光(Range照射范围、Spot Angle聚光灯锥形角度)、Directional平行光、Point点光(Range照射范围))
    Color(灯光颜色)支持
    Mode(灯光模式)部分支持(包括:Realtime实时灯光、Baked烘焙光照贴图)
    Intensity(灯光强度)支持

    灯光的阴影不支持从Unity中导出使用,但是LayaAir引擎中有灯光阴影的API,具体阴影的使用,可以查阅LayaAir引擎相应的官方文档与API。

    4.4 模型相关的属性

    关于模型的属性,分别支持普通模型和骨骼模型。

    4.4.1 普通模型

    普通模型需要Mesh Filter组件Mesh Render组件,下面分别进行介绍。

    Mesh Filter 网格过滤器

    format,png

    在上图中的Unity网格过滤器属性里,LayaAir导出支持情况如下:

    Unity的蒙皮网格渲染属性LayaAir是否支持导出的说明
    Mesh(网格)支持
    Mesh Renderer 网格渲染器

    format,png

    在上图中Unity的Mesh Render组件属性里,LayaAir导出支持情况如下:

    Unity的网格渲染属性LayaAir是否支持导出的说明
    Materials(材质)支持(包括:Size大小、Element材质球元素)
    Lightmap Static( 静态光照贴图)部分支持(包括:Lightmaps贴图(Baked Lightmap烘焙光照贴图(Lightmap Index、Tiling X、Tiling Y、Offset X、Offset Y)))

    对于新手,需要提醒的是,勾选这里的Lightmap Static,需要先勾选之前介绍的基础属性Static,同时还要将场景环境光的配置里的Amblent Mode(环境光照明模式)设置为Baked(烘焙),然后Generate Lighting获得烘焙光照贴图。

    4.4.2 骨骼模型

    骨骼模型的Mesh与Mesh Renderer不再分开,合并在组件Skinned Mesh Renderer里,如下图所示:

    format,png    

    在上图中Unity的Skinned Mesh Renderer组件属性里,LayaAir导出支持情况如下:

    Unity的蒙皮网格渲染属性LayaAir是否支持导出的说明
    Mesh(网格)支持
    Root Bone(骨骼根节点)支持
    Bounds(包围盒)支持(包括:Center中心(X、Y、Z)、Extent范围(X、Y、Z))
    Materials(材质)支持(包括:Size大小、Element材质球元素)
    4.4.3 材质

    对于模型的材质,之前的小节中有提到过,必须要使用LayaAir引擎提供的材质,而且提供了两个一键切换Unity材质为LayaAir材质的快捷功能。这里我们介绍一下,如何在Unity界面中去手动切换LayaAir材质。

    format,png

    当在Assets(资源)面板中选中mat后缀的材质球后,Inspector面板中,Shader选项栏那里如果不是LayaAir3D的材质或者想改变材质,需要点开选项栏,在LayaAir3D里找到对应的材质然后点击切换。比如上图的箭头示意中,是将mesh(模型网格)材质BlinnPhon切换为为Unlit(不受光)材质。

    除了LayaAir3D里提供的材质Shader外,Unity里的所有材质,都不能在LayaAir引擎中使用。

    并且材质的分类都要对应起来,比如粒子材质就要使用粒子分类下的shurikenParticle,错用了Mesh的材质shader,导出的时候不会报错,实际运行是错的。

    4.5 纹理的属性

    Assets(资源)面板里,找到2D图片资源,可以为其设置纹理的属性。如下图所示。

    format,png

    在上图中的Unity纹理属性里,LayaAir导出支持情况如下:

    Unity的纹理属性LayaAir是否支持导出的说明
    Generate Mip Maps(生成Mipmap)部分支持(仅支持是否勾选的状态)
    Wrap Mode(循环模式)部分支持(包括:Repeat重复、Clamp强制拉伸)
    Filter Mode(过滤模式)支持(包括:Point点过滤、Bilinear双线性过滤、Trilinear三线性过滤)
    Aniso Level(各向异性等级)支持

    4.6 动画的属性

    在动画方面,LayaAir支持Animator组件和关联的Animator Controller面板的部分属性导出和使用。

    Aniamtor组件

    format,png

    在上图中的Unity动画属性里,LayaAir导出支持情况如下:

    Unity的动画属性LayaAir是否支持导出的说明
    Controller(动画控制器)支持
    Culling Mode( 剔除模式)部分支持(包括:Always Animate 总是播放、Cull Completely完全剔除)
    Animator Controller State

    在Aniamtor组件属性中双击Controller打开动画控制器的面板,选中State(状态),可以看到下图面板。

    format,png

    在上图中的Unity动画控制器State属性里,LayaAir导出支持情况如下:

    Unity的动画控制器State属性LayaAir是否支持导出的说明
    Motion(选定动画)支持
    Speed(动画播放速度)支持

    4.7 拖尾的属性

    format,png

    在上图中的Unity拖尾属性里,LayaAir导出支持情况如下:

    Unity的拖尾属性LayaAir是否支持导出的说明
    Materials(材质)支持(包括:Size大小、Element材质球元素)
    Time(拖尾效果持续时间)支持
    min Vertex Distance(最小顶点距离)支持
    Width(拖尾宽度)支持
    Color(拖尾渐变颜色)部分支持(包括:Mode模式(Blend渐变色、Fixed固定色)、Color颜色值、Alpha透明度、Location颜色位置)
    Alignment(对齐)支持(包括:View朝向相机、Transform Z朝向自身局部坐标Z)
    Texture Mode(纹理模式)部分支持(包括:Stretch拉伸)

    4.8 地形的属性

    关于地形,我们正在丰富,近期会完善。当前仅支持部分Terrain组件属性(支持地表,不支持植被),导出时会转换为静态模型Mesh。

    format,png

    当前地形仅支持上图中Terrain组件的Mesh Resolution属性导出,具体在LayaAir中的支持情况如下:

    Unity的Terrain组件Mesh Resolution属性LayaAir是否支持导出的说明
    Terrain Width(地形宽)支持
    Terrain Length(地形长)支持
    Terrain Height(地形高)支持
    Detail Resolution(细节分辨率)支持
    需要重点说明的地形材质

    地形的材质不支持LayaAir引擎当前自带的材质Shader,导出的地形的静态网格(模型Mesh)后,开发者需要通过LayaAir的接口自定义材质shader来为地形网格添加材质。

    4.9 物理相关的属性

    在3D物理方面,当前支持刚体Rigidbody组件、盒形碰撞体Box Collider组件、球形碰撞体Sphere Collider组件、胶囊碰撞体Capsule Collider组件、网格碰撞体Mesh Collider组件、固定关节Fixed Joint组件、可配置关节Configurable Joint组件。下面我们分别进行介绍。

    4.9.1 刚体组件 Rigidbody

    format,png

    在上图中的Unity刚体属性里,LayaAir导出支持情况如下:

    Unity的刚体属性LayaAir是否支持导出的说明
    Mass(质量)支持
    Use Gravity(使用重力)支持
    Is Kinematic(是运动学刚体)支持
    Constraints(约束)支持(包括:Freeze Position冻结位置(X、Y、Z)、Freeze Rotation冻结旋转(X、Y、Z))
    4.9.2 盒形碰撞体组件Box Collider

    format,png

    在上图中的Unity盒形碰撞体属性里,LayaAir导出支持情况如下:

    Unity的盒形碰撞体属性LayaAir是否支持导出的说明
    Is Trigger(是触发器)支持
    Center(中心点位置)支持(包括:X、Y、Z)
    Size(大小)支持(包括:X、Y、Z)
    4.9.3 球形碰撞体组件Sphere Collider

    format,png

    在上图中的Unity球形碰撞体属性里,LayaAir导出支持情况如下:

    Unity的球形碰撞体属性LayaAir是否支持导出的说明
    Is Trigger(是触发器)支持
    Center(中心点位置)支持(包括:X、Y、Z)
    Radius(半径)支持
    4.9.4 胶囊碰撞体组件Capsule Collider

    format,png

    在上图中的Unity胶囊碰撞体属性里,LayaAir导出支持情况如下:

    Unity的胶囊碰撞体属性LayaAir是否支持导出的说明
    Is Trigger(是触发器)支持
    Center(中心点位置)支持(包括:X、Y、Z)
    Radius(半径)支持
    Height(高度)支持
    Direction(高度的方向)支持(包括:X-Axis、Y-Axis、Z-Axis)
    4.9.5 网格碰撞体组件Mesh Collider

    format,png

    在上图中的Unity网格碰撞体属性里,LayaAir导出支持情况如下:

    Unity的网格碰撞体属性LayaAir是否支持导出的说明
    Is Trigger(是触发器)支持
    Mesh(网格)支持
    4.9.6 固定关节组件Fixed Joint

    format,png

    在上图中的Unity固定关节属性里,LayaAir导出支持情况如下:

    Unity的固定关节属性LayaAir是否支持导出的说明
    Connected Body(连接的刚体)支持
    Break Force(断开力)支持
    Break Torque(断开扭矩)支持
    4.9.7 可配置关节组件Configurable Joint

    format,png

    在上图中的Unity可配置关节属性里,LayaAir导出支持情况如下:

    Unity的可配置关节属性LayaAir是否支持导出的说明
    Connected Body(连接的刚体)支持
    Anchor(锚点)支持(包括:X、Y、Z)
    Axis(主轴)支持(包括:X、Y、Z)
    Connected Anchor(连接锚点)支持(包括:X、Y、Z)
    Secondary Axis(副轴)支持(包括:X、Y、Z)
    X Motion(沿X轴平移运动)支持(包括:Locked锁定、Limited受限、Free自由)
    Y Motion(沿Y轴平移运动)支持(包括:Locked锁定、Limited受限、Free自由)
    Z Motion(沿Z轴平移运动)支持(包括:Locked锁定、Limited受限、Free自由)
    Angular X Motion(绕 X 轴旋转的角运动)支持(包括:Locked锁定、Limited受限、Free自由)
    Angular Y Motion(绕 Y 轴旋转的角运动)支持(包括:Locked锁定、Limited受限、Free自由)
    Angular Z Motion(绕 Z 轴旋转的角运动)支持(包括:Locked锁定、Limited受限、Free自由)
    Linear Limit Spring(弹簧线性限制)支持(包括:Spring弹簧、Damper阻尼)
    Linear Limit(线性限制)部分支持(包括:Limit限制、Bounciness弹力)
    Angular X Limit Spring(弹簧X轴旋转限制)支持(包括:Spring弹簧、Damper阻尼)
    Low Angular X Limit(X轴旋转的下限)部分支持(包括:Limit限制、Bounciness弹力)
    Hight Angular X Limit(X轴旋转的上限)部分支持(包括:Limit限制、Bounciness弹力)
    Angular YZ Limit Spring(弹簧Y轴和Z轴旋转限制)支持(包括:Spring弹簧、Damper阻尼)
    Angular Y Limit(Y轴旋转的限制)部分支持(包括:Limit限制、Bounciness弹力)
    Angular Z Limit(Z轴旋转的限制)部分支持(包括:Limit限制、Bounciness弹力)
    Target Position(目标角度)支持(包括:X、Y、Z)
    Target Velocity(目标速度)支持(包括:X、Y、Z)
    Break Force(断开力)支持
    Break Torque(断开扭矩)支持

    4.10 粒子系统的属性

    粒子系统的属性比较多,我们在这个小节,分成主模块、Emission模块、Shape模块、Velocity over Lifetime模块、Color over Lifetime模块、Size over Lifetime模块、Texture Sheet Animation模块、Render模块分别进行介绍。

    4.10.1 粒子系统主模块

    format,png

    在上图中的Unity粒子系统主模块属性里,LayaAir导出支持情况如下:

    Unity的粒子系统主模块属性LayaAir是否支持导出的说明
    Duration(粒子持续时间)支持
    Looping(是否循环播放)支持
    Start Delay(延迟多久开始)支持(包括:Constant固定值、Random between Two Constant随机在两个常量之间)
    Start Lifetime(生命周期)部分支持(包括:Constant 固定值、Random between Two Constants随机在两个常量之间)
    Start Speed(初始速度)部分支持(包括:Constant 固定值、Random between Two Constants随机在两个常量之间)
    3D Start Size(3D初始大小)部分支持(包括:X、Y、Z、Constant 固定值、Random between Two Constants随机在两个常量之间)
    Start Size(初始大小)部分支持(包括:Constant 固定值、Random between Two Constants随机在两个常量之间)
    3D Start Rotation(3D初始旋转方向)部分支持(包括:X、Y、Z、Constant 固定值、Random between Two Constants随机在两个常量之间)
    Start Rotation(初始旋转方向)部分支持(包括:Constant 固定值)
    Flip Rotation(随机翻转的概率)支持【特别说明:这里和Unity效果不同,LayaAir中是指随机翻转的概率,随机种子是0和1,0不翻转,1翻转】
    Start Color(开始颜色)部分支持(包括:Color固定颜色、Random between Two Colors随机在两个颜色之间)
    Gravity Modifier(重力修正)部分支持(包括:Constant 固定值)
    Simulation Space(模拟空间)部分支持(包括:Local本地、World世界)
    Scaling Model(缩放模式)部分支持(包括:Hierarchy受节点层级关系的缩放影响、Local仅受自身缩放影响)
    Play On Awake(唤醒时播放)支持
    Max Particls(最大粒子数量)支持
    Auto Random Seed(自动随机种子)支持
    4.10.2 发射 Emission

    format,png

    在上图中的Unity粒子发射属性里,LayaAir导出支持情况如下:

    Unity的粒子发射属性LayaAir是否支持导出的说明
    Rate Over Time(发射速率 [个/秒])部分支持(包括:Constant 固定值、Random between Two Constants随机在两个常量之间)
    Bursts(粒子爆裂)部分支持(Time时间、Count数量(Constant 固定值、Random between Two Constants随机在两个常量之间))
    4.10.3 发射的形状 Shape

    关于Shape形状当前支持Sphere、Hemisphere、Cone、Box、Circle,由于选项的不同,会导致属性的不同,我们分别截图说明。

    球体、半球 (Sphere、Hemisphere)

    format,png

    在上图Unity粒子形状的球体与半球属性里,LayaAir导出支持情况如下:

    Unity粒子形状的球体与半球属性LayaAir是否支持导出的说明
    Shape(粒子发射形状)部分支持(包括:Sphere球体、Hemisphere半球、Cone锥体、Box盒子、Circle圆形)
    Radius(发射的半径)支持
    Radius Thickness(半径厚度)支持【注:LayaAir中只支持 0 / 1 两种数值】
    Randomize Direction(是否随机方向)支持
    锥体 Cone

    format,png

    在上图Unity粒子形状的球体与半球属性里,LayaAir导出支持情况如下:

    Unity粒子形状的球体与半球属性LayaAir是否支持导出的说明
    Shape(粒子发射形状)部分支持(包括:Sphere球体、Hemisphere半球、Cone锥体、Box盒子、Circle圆形)
    Angle(发射锥体的角度)支持
    Radius(发射的半径)支持
    Radius Thickness(半径厚度)支持【注:LayaAir中只支持 0 / 1 两种数值】
    Length(长度)支持
    Emit form:(发射自:)支持(包括:Base从底部随机点发射、Volume锥体内部圆底上方随机点发射)
    Randomize Direction(是否随机方向)支持
    盒子Box

    format,png

    在上图Unity粒子形状的盒子属性里,LayaAir导出支持情况如下:

    Unity粒子形状的盒子属性LayaAir是否支持导出的说明
    Shape(粒子发射形状)部分支持(包括:Sphere球体、Hemisphere半球、Cone锥体、Box盒子、Circle圆形)
    Emit form:(发射自:)部分支持(包括:Volume内部随机点发射)
    Scale(改变发射器形状的大小)支持(X、Y、Z)
    Randomize Direction(是否随机方向)支持
    圆形Circle

    format,png

    在上图Unity粒子形状的圆形属性里,LayaAir导出支持情况如下:

    Unity粒子形状的圆形属性LayaAir是否支持导出的说明
    Shape(粒子发射形状)部分支持(包括:Sphere球体、Hemisphere半球、Cone锥体、Box盒子、Circle圆形)
    Radius(发射的半径)支持
    Radius Thickness(半径厚度)支持【注:LayaAir中只支持 0 / 1 两种数值】
    Arc(环形弧度)支持【注:LayaAir中只支持 0 / 360 两种数值】
    Randomize Direction(是否随机方向)支持
    4.10.4 生命周期内的速度 Velocity over Lifetime

    format,png

    在上图Unity粒子生命周期内的速度属性里,LayaAir导出支持情况如下:

    Unity粒子生命周期内的速度属性LayaAir是否支持导出的说明
    linear(线性运动速度)支持(X、Y、Z、Constant固定值、Curve 曲线、Random between Two Constants随机在两个常量之间、Random between Two Curves随机在两个曲线之间)
    Space(速度空间)支持(Local本地、World世界)
    4.10.5 生命周期内的颜色与大小 Color over Lifetime、Size over Lifetime

    format,png

    在上图中的Unity生命周期内的颜色与大小属性里,LayaAir导出支持情况如下:

    Unity的生命周期内的颜色与大小属性                   

    LayaAir是否支持导出的说明
    Color(生命周期颜色 )支持(包括:Gradient渐变色、Random form Two Gradients随机在两个渐变色之间)
    Separate Axes(分离轴)支持
    Size(大小)支持(包括:Curve曲线、Random between Two Constants随机在两个常量之间、Random between Two Curves随机在两个曲线之间)【注:默认是Size,勾选Separate Axes后Size项变为XYZ】
    4.10.6 纹理动画 Texture Sheet Animation

    format,png

    在上图中的Unity粒子纹理动画属性里,LayaAir导出支持情况如下:

    Unity的粒子纹理动画属性                                 

    LayaAir是否支持导出的说明
    Tiles(纹理平铺 )支持(包括:X、Y)
    Animation(动画类型)支持(包括:Whole Sheet整层、Single Row单行)
    Random Row(随机行)支持【注:选中单行类型才有此选项】
    Frame over Time(时间帧)支持(包括:Constant常量、Curve曲线、Random between Two Constant随机在两个常量之间、Random between Two Curves随机两个曲线之间)
    Start Frame(开始帧)支持(包括:Constant常量、Random betweem Two Constants随机在两个常量之间)
    Cycles(循环次数)支持
    Affected UV Channels(受影响的UV通道)部分支持(包括:Everything)【注:此处Everything只代表一种默认值状态,不代表UV0-3的选项勾选】
    4.10.7 粒子渲染器 Renderer

    format,png

    在上图中的Unity粒子渲染器属性里,LayaAir导出支持情况如下:

    Unity的粒子渲染器属性                                                     

    LayaAir是否支持导出的说明
    Render Mode(渲染模式)部分支持(包括:Billboard广告牌、Stretched Billboard拉伸广告牌(Speed Scale速度缩放、Length Scale长度缩放)、Horizontal Billboard水平广告牌、Vertical Billboard垂直广告牌、Mesh网格)
    Sorting Fudge(排序校正)支持

    4.11 场景渲染配置的属性

    在3D场景的渲染配置里,目前支持导出的主要是环境相关的(例如,环境光照,环境反射等)以及场景雾效等。下面我们分别进行介绍。

    4.11.1 环境相关配置 Environment

    format,png

    在上图中的Unity环境相关配置属性里,LayaAir导出支持情况如下:

    Unity的环境相关配置属性                                         LayaAir是否支持导出的说明
    Skybox Material(天空盒材质)支持
    Sun Source(太阳光照来源)支持
    Environment Lighting(环境光照)部分支持(包括:Source环境光来源(Skybox天空盒、Color单色)、Ambient Color环境光颜色值、Ambient Mode环境光照明模式(Realtime实时光、Baked烘焙到光照贴图))
    Environment Reflections(环境反射)部分支持(包括:Source环境反射来源(Skybox天空盒、Custom自定义)、Resolution环境反射贴图分辨率、Intensity Multiplier环境反射强度强化)

    自定义的立方体纹理需要重点说明一下,当我们创建的新Cubemap,除了六张纹理外,只支持Face Size与 Readable这两个属性的设置与生效。

    format,png

    4.11.2 场景雾效 Fog

    format,png

    在上图中的Unity场景雾效属性里,LayaAir导出支持情况如下:

    Unity的环境相关配置属性LayaAir是否支持导出的说明
    Color(雾效颜色)支持
    Mode(雾效衰减模式)部分支持(包括:Linear线性模式)
    Start(开始)支持
    End(结束)支持

    特别提醒:
    如果用到了不在以上导出清单中的功能,可能会引起报错,或者效果无效,可以通过查看导出的报错信息,对照以上的功能清单进行修改。

    以上清单仅代表着可以在Unity中进行编辑设置和导出使用的功能属性,并不代表引擎的全部功能,更多引擎的能力可以通过查看官网的文档和引擎API进行使用。

    五、模型的导出文件与加载显示

    当了解完插件的功能和使用规则后,我们就可以在Unity中进行编辑并导出了,但是导出后的文件名分别代表着什么,又是怎么进行加载使用的。本小节开始为大家介绍。

    5.1 导出文件类型的说明

    文件的后缀                                                                               导出文件类型的说明
    .ls场景文件,选择导出场景Scene3D类别时生成的文件类型。会导出完整的场景信息,其中包含了场景需要的各种数据、光照贴图、模型、位置等。所以,需要导出场景相关的设置时,必须要使用Scene3D类别导出,就可以看到.ls后缀的文件。
    .lh预设文件,选择导出预设Sprite3D类别时生成的文件类型。相对于.ls后缀的场景文件,会缺少环境光、环境反射、场景雾效等等与场景渲染相关的信息。
    .lm模型数据文件,通常是FBX格式的转换而成。
    .lmat材质数据文件,是在unity中为模型设置的材质信息。加载.ls.lh文件时会自动加载.lmat文件来产生材质。可以使用 BaseMaterial 类来加载。
    .lani动画数据文件,如果模型上有动画,导出后将生成的动画配置文件,其中包含了动画帧数据。加载可以使用 AnimationClip 类来加载。
    .ltc天空盒文件,文件中记录了六张图片,分别对应天空盒的六个面。
    .ltcb.ls特效文件,纪录了场景的反射信息。在插件2.8以前的版本导出.ltcb后缀,为了兼容小游戏平台,2.8版本开始改为了.ltcb.ls后缀。
    .lanit.ls预烘焙骨骼文件,纪录了骨骼动画的预烘焙信息。
    .jpgJPEG格式的纹理图片文件。
    .pngPNG格式的纹理图片文件。
    .ktx采用ETC1格式进行纹理压缩图片文件(在Android平台下使用)。
    .pvr采用PVR格式进行纹理压缩图片文件(在iOS平台下使用)。

    5.2 加载显示

    导出的Unity资源,在不考虑其它逻辑的情况下,要通过LayaAir引擎显示出来,就需要先加载资源再显示了。

    下面我们就分别就常用的导出加载进行介绍。

    5.2.1 场景加载与使用 (.ls)

    加载场景,也就是加载.ls后缀的场景文件,我们需要通过Scene3D.load()方法去加载场景文件,然后整个导出的场景中相关模型、环境等文件也会自动加载进来。无需逐个进行加载。

    场景加载的示例代码如下:

     
    1.  
      //3d场景加载
    2.  
      Laya.Scene3D.load("xx/xx.ls",Laya.Handler.create(null,function(scene){
    3.  
      //加载完成后,把加载回调中返回的完整场景scene添加到舞台
    4.  
      Laya.stage.addChild(scene);
    5.  
      //获取摄像机
    6.  
      var camera = scene.getChildByName("Main Camera");
    7.  
      /**
    8.  
      ** 省略其它代码若干,可前往Layabox官网示例或相关文档中查看
    9.  
      */
    10.  
      }));
     
    5.2.2 预设的加载与使用(.lh)

    有一些模型或者动画,不想一开始就显示在场景中,这时候,通常会通过预设的方式导出,再依据游戏逻辑动态添加到舞台上。对于单个预设的加载,也就是.lh后缀的预设文件加载,我们需要使用Sprite3D.load()方法。

    预设加载的示例代码如下:

     
    1.  
      //加载3D预设(3D精灵)
    2.  
      Laya.Sprite3D.load("xx/xx.lh",Laya.Handler.create(null,function(sp){
    3.  
      //加载完成后,把加载回调中返回的预设sp添加到Scene场景的子节点
    4.  
      var layaMonkey = scene.addChild(sp);
    5.  
      /**
    6.  
      ** 省略其它代码若干,可前往Layabox官网示例或相关文档中查看
    7.  
      */
    8.  
      }));
     
    5.2.3 批量预加载

    虽然加载.ls场景后会自动把其它相关的都加载好,或者我们可以按需动态加载预设等资源。但是,如果这些资源不大还好,如果比较大,并且数量多,那进入场景或者打开资源,就会需要加载等待。

    通常开发者会把比较大的资源在进入游戏之前,就批量预加载,通过进度条让开发者对加载有一个统一的感知,然后在游戏过程中畅快的体验游戏本身玩法,避免因加载问题打断游戏本身的体验。

    在加载2D资源的时候,通常使用Laya.loader.load()方法预加载,而预加载3D资源必须要用Laya.loader.create()方法。在加载完成后,可以直接使用Laya.loader.getRes()这个方法来获取加载完成的资源。

    批量预加载的示例代码如下:

     
    1.  
      var resource:Array<any>=[
    2.  
      "xx.ls",
    3.  
      "xx/xx.lh",
    4.  
      "xx/xx.lmat",
    5.  
      "xx/xx.png",
    6.  
      "xx/xx.lm",
    7.  
      "xx/xx.ltc",
    8.  
      "xx/xx.lani",
    9.  
      ];
    10.  
      //批量预加载
    11.  
      Laya.loader.create(resource,Laya.Handler.create(this,this.onLoaded));
    12.  
      onLoaded():void{
    13.  
      //加载完成后的处理逻辑……
    14.  
      }
     

    使用预加载资源的示例代码如下:

     
    1.  
      //获取预加载的3D场景资源对象
    2.  
      var_Scene3D:Laya.Scene3D=Laya.Loader.getRes("xx.ls");
    3.  
      //把场景添加到舞台
    4.  
      Laya.stage.addChild(_Scene3D);
    5.  
      /**
    6.  
      ** 省略其它代码若干,可前往Layabox官网示例或相关文档中查看
    7.  
      */
    8.  
      //获取预加载的3D预设资源对象
    9.  
      var sp:Laya.Sprite3D=Laya.Loader.getRes("xx/xx.lh");
    10.  
      //添加预设对象到_Scene3D场景的子节点
    11.  
      var layaMonkey2 =_Scene3D.addChild(sp);
    12.  
      layaMonkey2.transform.localScale =newLaya.Vector3(4,4,4);
    13.  
      layaMonkey2.transform.translate(newLaya.Vector3(-20,13,0));
    14.  
      //获取动画组件
    15.  
      var xxAni = layaMonkey2.getChildAt(0).getComponent(Laya.Animator);
    16.  
      //获取动画资源对象
    17.  
      var xxClip =Laya.Loader.getRes("xx/xx.lani");
    18.  
      //创建动作状态
    19.  
      var state1 =newLaya.AnimatorState();
    20.  
      //动作名称
    21.  
      state1.name ="hello";
    22.  
      //动作播放起始时间
    23.  
      state1.clipStart =0/581;
    24.  
      //动作播放结束时间
    25.  
      state1.clipEnd =581/581;
    26.  
      //设置动作
    27.  
      state1.clip = xxClip;
    28.  
      //设置动作循环
    29.  
      state1.clip.islooping =true;
    30.  
      //为动画组件添加一个动作状态
    31.  
      xxAni.getControllerLayer(0).addState(state1);
    32.  
      //播放动作
    33.  
      xxAni.play("hello");
    34.  
      /**
    35.  
      ** 省略其它代码若干,可前往Layabox官网示例或相关文档中查看
    36.  
      */
     
    5.2.4 不常用的3D资源加载

    通常,预加载,场景加载,预设加载,可以满足日常加载使用需求。当然,开发者也可能需要动态加载替换网格、材质、纹理等需求,最后再简单介绍一下这些不常用的3D资源加载。

    网格Mesh加载

    单个网格加载使用 Mesh.load() 方法,示例代码如下:

     
    1.  
      //加载Mesh
    2.  
      Laya.Mesh.load("xx/xx.lm",Laya.Handler.create(null,function(mesh){
    3.  
      var layaMonkey = scene.addChild(newLaya.MeshSprite3D(mesh));
    4.  
      /**
    5.  
      ** 省略其它代码若干,可前往Layabox官网示例或相关文档中查看
    6.  
      */
    7.  
      }));
     
    材质Material加载

    单个材质加载使用BaseMaterial.load()方法,示例代码如下:

     
    1.  
      //加载材质,省略若干代码,仅为加载示例
    2.  
      Laya.BaseMaterial.load("xx/xx.lmat",Laya.Handler.create(null,function(mat){
    3.  
      //获取相机的天空渲染器
    4.  
      var skyRenderer:Laya.SkyRenderer= camera.skyRenderer;
    5.  
      //创建天空盒的mesh
    6.  
      skyRenderer.mesh =Laya.SkyBox.instance;
    7.  
      //设置天空盒材质
    8.  
      skyRenderer.material = mat;
    9.  
      }));
     
    纹理Texture加载

    单个纹理加载使用Texture2D.load()方法,示例代码如下:

     
    1.  
      //加载纹理,省略若干代码,仅为加载示例
    2.  
      Laya.Texture2D.load("xx/xx.png",Laya.Handler.create(null,function(Texture){
    3.  
      //使用纹理
    4.  
      var earth1 = scene.addChild(newLaya.MeshSprite3D(PrimitiveMesh.createSphere(5,32,32)));
    5.  
      earth1.transform.translate(newLaya.Vector3(10,20,-8));
    6.  
      var earthMat =newLaya.BlinnPhongMaterial();
    7.  
      earthMat.albedoTexture =Texture;
    8.  
      earthMat.albedoIntensity =1;
    9.  
      earth1.meshRenderer.material = earthMat;
    10.  
      }));
     

    写在最后

    各位看官,如果觉得写的还可以,欢迎点赞和转发分享,下一篇技术文章还在酝酿中,有想看哪些方面的,也可以留言。

    END

    引擎案例分享:

    推荐阅读:

    引擎版本更新说明:

    format,png

     
    展开全文
  • 基于layaair引擎下的使用TypeScript开发的俄罗斯方块小游戏DEMO 基本功能完善
  • LayaAIR 开发格斗游戏

    2019-07-30 16:20:33
    LayaAIR 开发格斗游戏 这是一个小实验。实验证明laya可以开发格斗游戏。 欢迎下载检验实验效果。
  • LayaAir ts 飞机大战

    2018-07-18 11:52:49
    LayaAir ts 飞机大战 简单易入手学习.每一步都有具体到注释.
  • LayaAir 简单飞机大战

    2019-03-26 20:56:53
    流畅的飞机移动,敌方飞机的生成与摧毁,帧循环与计时器的应用。
  • 这是自己用 LayaAir 2.0 写的一个 2048 小游戏,多多交流。演示地址: https://blog.csdn.net/wangmx1993328/article/details/86620450
  • 还有好多不完善的地方,但基本可以玩。操控数据层与显示层,下一个方块显示的是当前的方块,希望有大神完善一下。
  • 昨天,我们分享了一篇2D物理文档《LayaAirIDE的可视化2D物理使用文档》。今天,我们针对LayaAir引擎的初学者,以及对物理引擎使用不熟悉的开发者,再来分享一篇3D物理文档,本...

    昨天,我们分享了一篇2D物理文档《LayaAirIDE的可视化2D物理使用文档》。

    今天,我们针对LayaAir引擎的初学者,以及对物理引擎使用不熟悉的开发者,再来分享一篇3D物理文档,本篇文档全面介绍了3D物理引擎使用的基础能力。方便开发者快速上手。

    LayaAir 3D引擎集成了世界三大物理引擎之一的Bullet引擎,当在Unity中使用了物理组件,用LayaAir的Unity插件导出后,默认就是采用的Bullet引擎。当然,LayaAir引擎也支持使用比较轻量的Cannon.js物理引擎的基础功能。

    阅读本篇时,除非是Cannon物理引擎的专属章节,或者注明是cannon物理引擎,默认介绍都是基于LayaAir封装的Bullet引擎。

    一、刚体

    1.1 什么是刚体

    无论是2D,还是3D,物理的开篇,都需要先了解刚体,这是物理引擎的基础之一。

    大家都知道,自然界一切有形体的物质,都可以叫物体。

    刚体是力学中为了体现物体特性的一种科学抽象概念,也是一种理想状态的力学表达模型,是指在运动中和受到力的作用后,形状和大小不变,而且内部各点的相对位置不变的物体。

    然而,现实中不可能存在这种理想模型,物体在受力之后,会根据力、材料、弹性、 塑性等综合因素,决定是否改变或改变多少。如果物体本身的变化不影响整个运动过程,为使被研究的问题简化,仍将该物体当作刚体来处理而忽略物体的体积和形状,这样所得结果仍与实际情况相当符合。

    1.2 常用的刚体属性

    isKinematic是否为运动刚体

    3D的刚体,默认是动力学刚体。会受力的影响,可以位移。

    一旦我们把刚体设置为运动刚体类型后,即将isKinematic的值设置为true。

    那么运动刚体可以触发第三方的物理反馈,自己却不受物理影响。例如,运动刚体与动力学刚体发生撞击,动力学刚体会受力反弹,但运动刚体却不会受力的影响,不会产生受力位移,运动刚体的位移只能通过transform改变节点坐标。

    与2D的运动学类型刚体不同,LayaAir 3D的运动刚体脱离了物理引擎运动,即使设置速度也不可以使其位移。这样做的好处是减少了物理运算,节省了性能。

    mass质量

    质量是物质的量的量度,Bullet引擎中的质量单位为kg。

    刚体的质量越大,运动状态改变越难,比如,不同质量的两个物体相撞,质量大的一方改变更小一些,如动图1的右侧所示:

    (动图1)

    静态刚体和运动刚体就相当于无限大质量,所以不受力的影响。

    gravity 重力

    自然界中物体受地心吸引的作用而受到的力叫重力,物理引擎中也同样模拟了重力,

    动力学刚体在同等的质量下,重力越大,下落的加速度越大。对比效果如动图1-1。

    (动图1-1)

    linearVelocity 线性速度

    刚体的linearVelocity属性称为线速度或者线性速度,是指物体的直线运动速度。

    动力学刚体的线速度是3维向量Vector3类型值,向量的方向即速度的方向,向量的长度即速度的大小。

    动图1-2,是动力学刚体在同样重力值为0的情况下,没有设置线速度和y轴设置了线速度值的对比效果。

    (动图1-2)

    linearDamping 线性阻尼

    刚体的linearDamping属性,是指线性速度的阻尼系数,使得线性速度衰减。

    动图1-3,是动力学刚体在重力为0并且y轴设置了同样为-1的线速度值情况下,左侧为0.9线性阻尼值和右侧为1线性阻尼值的对比效果。

    (动图1-3)

    angularVelocity 角速度

    刚体的angularVelocity属性是角速度, 角速度简单理解就是单位时间的角位移,以弧度每秒进行旋转 。当我们设置动力学刚体angularVelocity属性为正值的时候,则按顺时针旋转位移。angularVelocity属性为负值的时候,则按逆时针旋转位移。属性值的绝对值越大,旋转位移速度越快。

    (动图1-4)

    angulaVelocity属性的值是3维向量Vector3类型值,Bullet使用欧拉角来描述物体的旋转,3D向量的每个分量代表绕x、y、z轴旋转的速度,单位是弧度/秒。动图1-4,就是在x轴分别设置了3.14与31.4的对比效果。

    angularDamping 角阻尼

    刚体的角阻尼相当于是为角速度旋转方向施加了相反的力,使得旋转速度衰减。动图1-5,是在同样的31.4角速度下,左侧为1的的角阻尼值,右侧为0.9的角阻尼值,对比效果。

    (动图1-5)


    二、物理碰撞

    碰撞是物理引擎中最基础、最常用的功能。在这个小节里,我们对3D物理碰撞进行全面的认知。

    2.1 碰撞器与触发器

    对于检测3D物理碰撞的方式,有碰撞器与触发器两种。我们先从概念认知开始。

    2.1.1 碰撞器

    在LayaAir引擎2D物理的时候,通过封装的不同形状的碰撞体,就可以直接实现带范围的物理碰撞。

    而LayaAir引擎的3D物理,形状不再是最主要的特征,只是碰撞器用于检测碰撞范围的三维形状区域。

    完整的3D碰撞器,由碰撞器和碰撞器形状两部分组成。

    3D碰撞器根据特点的不同,分为静态碰撞器、刚体碰撞器、角色碰撞器。

    这些碰撞器必须要添加三维碰撞器形状(例如:盒形、球形、圆锥形、圆柱形、胶囊形、平面、混合、模型网格),才可以实现有范围的物理碰撞。

        

    (图2)

    图2是胶囊形状角色碰撞器的编辑预览效果。

    2.1.2 触发器

    LayaAir 3D物理的触发器相当于2D物理里的传感器。

    触发器是碰撞器的一个属性,任何碰撞器的触发器属性设置生效后,当前的碰撞器即转变为触发器(比如,刚体碰撞器设置触发器后可称为刚体触发器)。即使发生物体接触,也不会产生碰撞的物理反馈。例如,动图3-1右侧所示。下落的盒子无视物理引擎,直接穿透而过。

    (动图3-1)

    设置触发器后,虽然失去了物理引擎反馈,但是可以激活触发器的事件生命周期方法,用于检测物体间碰撞接触的发生。

    激活触发器生命周期也有特定的情况除外,具体规则会在下面的物理生命周期章节介绍

    当触发器isTrigger设置为true时,或者在Unity的碰撞体组件那里勾选Is Trigger并导出使用时,如图3-2所示。触发器即可设置生效。

    (图3-2)

    通过LayaAir引擎代码设置触发器的方式:

    /*
    ……省略若干代码
    */
    //创建盒型MeshSprite3D
    let box = scene.addChild(newLaya.MeshSprite3D(Laya.PrimitiveMesh.createBox(sX, sY, sZ)))asLaya.MeshSprite3D;
    //创建静态碰撞器
    let staticCollider:Laya.PhysicsCollider= box.addComponent(Laya.PhysicsCollider);
    //设置为触发器,取消物理反馈
    staticCollider.isTrigger =true;
    /*
    ……省略若干代码
    */
    

    2.2 理解各种碰撞器

    2.2.1 静态碰撞器 PhysicsCollider

    LayaAir的3D物理碰撞器类是PhysicsCollider,为了便于记忆和理解,我们叫他静态碰撞器类。因为它的特性是不受力,不会产生物理移动。

    当其与动力学刚体碰撞器或角色碰撞器发生物理碰撞后,可以触发物理碰撞生命周期方法,但不会产生物理的受力位移。

    这种碰撞器可以用于不需要物理受力位移的物体,只需要触发碰撞逻辑的应用场景。例如墙体,撞墙后判定游戏结束。

    在Unity中,如果我们添加了某种Collider组件,但并没有添加Rigidbody组件,那导出后就是PhysicsCollider

    2.2.2 刚体碰撞器 Rigidbody3D

    LayaAir的2D物理刚体与碰撞体是分开的,而3D物理的刚体与碰撞器是整合的,Rigidbody3D类即是刚体也是碰撞器,我们可称为刚体碰撞器。

    默认情况下,Rigidbody3D动力学类型的刚体碰撞器,这是可以受力影响的刚体类型碰撞器,所以我们通常用动力学刚体碰撞器进行受力的交互反馈。例如,撞击后的反弹、飞出或者倒下,放在空中会受重力影响而掉落,等等。

    当我们将刚体Rigidbody3DisKinematic设置为true后,那么默认的动力学刚体碰撞器就转变为运动刚体碰撞器。

    运动刚体碰撞器从表象上看,与静态碰撞器基本上没有什么区别。都是不受重力、不受速度、不受其它力的影响,在物理世界中永远处于静止,只能通过transform去改变节点坐标来移动。

    但实质上,运动刚体有物理特性,它可以是施力物体,可以对非运动刚体产生力,例如通过控制节点去移动运动刚体,会推着挡在前面的动力学刚体移动。而静态碰撞器的应用场景则是要永远不动,也无法施加力。并且,通过节点去移动静态碰撞器,也比较消耗性能。如果有移动的碰撞器需求,例如来回移动的跳板或障碍,使用运动刚体碰撞器就可以了。

    通过代码设置运动刚体的方式:

    /*
    ……省略若干代码
    */
    //创建刚体碰撞器
    let _rigidBody = sphere.addComponent(Laya.Rigidbody3D)asLaya.Rigidbody3D;
    //开启运动类型刚体
    _rigidBody.isKinematic =true;
    /*
    ……省略若干代码
    */
    

    在Unity中设置运动类型刚体的方式,如图4所示:

    (图4)

    由于LayaAir的3D物理中有了静态碰撞器PhysicsCollider,所以并没有在Rigidbody3D中去实现静力学类型的刚体碰撞器。有静止的碰撞反馈需求,直接使用静态碰撞器即可。

    2.2.3 角色碰撞器 CharacterController

    角色控制器类CharacterController常用于对第一人称和第三人称游戏角色的控制,可以方便的控制角色的跳跃、跳跃速度、降落速度、行走、等。

    由于角色控制器继承于PhysicsComponent,也具有碰撞器的特性,可以添加三维碰撞形状,产生碰撞的反馈,因此也称为角色碰撞器,属于碰撞器之一。

    与静态碰撞器和刚体碰撞器都继承自物理触发器组件PhysicsTriggerComponent不同,角色控制器直接继承于物理组件的父类PhysicsComponent。所以,角色控制器是无法设置为触发器的。但是,角色碰撞器与触发器进行接触,仍然可以激活触发器事件的生命周期方法。

    2.3 碰撞形状

    碰撞形状是用于检测碰撞接触的范围,只有添加了形状,碰撞器和触发器才能触发物理反馈和生命周期。

    LayaAir引擎支持8种3D碰撞形状,分别为:

    盒形BoxColliderShape
    球形SphereColliderShape
    圆柱形CylinderColliderShape
    胶囊形CapsuleColliderShape
    圆锥形ConeColliderShape
    平面形状StaticPlaneColliderShape
    复合形状CompoundColliderShape
    网格形状MeshColliderShape

    2.3.1 Unity中可导出的碰撞形状

    Unity中的盒形碰撞体Box collider、球形碰撞体Sphere Collider、胶囊形碰撞体Capsule Collider、网格碰撞体 Mesh Collider,这4种组件是可以通过LayaAir导出插件直接导出使用的。

    这些组件包括了碰撞形状,无需通过引擎代码添加碰撞形状,所以对于盒形、球形、胶囊形、网格形、以及由以上基础形状碰撞体组合而成的复合碰撞形状。都建议在Unity里编辑导出使用。

    需要注意的是,这些碰撞体组件的节点如果没有添加刚体组件,那导出后在LayaAir引擎属于静态碰撞器,加上Rigidbody组件后,在LayaAir引擎属刚体碰撞器。

    下面我们简单介绍一下这些碰撞体形状的基础属性设置

    盒形碰撞形状

    盒形碰撞形状是通过设置XYZ调整长宽高的长方体(含立方体)形状。常用于盒子外形的长方体物体,如图5-1所示。

    (图5-1)
    在Unity中,为物体节点对象添加Box Collider组件,设置XYZ各轴的大小,如图5-2所示,导出后即可使用。

    (图5-2)

    球形碰撞形状

    球形碰撞形状是通过设置半径调整球体大小的碰撞形状。常用于球形外观的物体,如图6-1所示。

    (图6-1)

    在Unity中,为物体节点对象添加Sphere Collider组件,设置半径,如图6-2所示,导出后即可使用。

    (图6-2)

    胶囊形碰撞形状

    胶囊形碰撞形状是由两个半球和一个圆柱体组成,需要通过设置球体半径和圆柱体的高来组成胶囊形状。常用于角色碰撞器。如图7-1所示。

    (图7-1)

    在Unity中,为物体节点对象添加Capsule Collider组件,设置半径和高,如图7-2所示,导出后即可使用。

    (图7-2)

    网格形碰撞形状

    网格形碰撞形状是利用模型网格资源构建的形状,如图8-1的蜥蜴所示。相对于其它固定规则的碰撞形状(LayaAir内置的3D碰撞基础形状),网格形碰撞形状属于自定义任意外观的碰撞形状,可以适用于任何模型网格。

    (图8-1)

    在Unity中,为物体节点对象添加Mesh Collider组件,设置模型网格,如图8-2所示,导出后即可使用。

    (图8-2)

    复合碰撞形状

    复合碰撞形状是由多个基础形状组合而成的碰撞器形状。例如桌子或者凳子等,可以由多个盒形碰撞形状组成,如图8-3所示。

    (图9-1)

    LayaAir引擎的复合碰撞形状,其实Unity中并没有直接对应的组件。但是,开发者在Unity中,对同一个节点对象添加多个基础的碰撞体,例如同时添加Box Collider组件和Sphere Collider组件,如图8-4所示,那通过LayaAir的导出插件导出后,会自动识别为复合碰撞形状。

    (图9-2)

    2.3.2 Unity没有的LayaAir碰撞形状

    除了Unity碰撞体组件支持的一些形状外,LayaAir引擎中还内置了一些基础的3D碰撞形状。这些只能通过代码的方式进行添加。

    分别是:圆柱形、圆锥形、平面形状。

    圆柱形碰撞形状

    圆柱形碰撞形状是由两个大小相等、相互平行的圆形(底面)以及连接两个底面的一个曲面(侧面)围成的几何体形状,通过设置底面半径和连接高度来调整碰撞形状的大小。常用于场景的柱子等圆柱形外观的物体碰撞。如图10-1所示。

    (图10-1)

    项目代码里,通过创建一个CylinderColliderShape实例的方式,传入半径和高,即可返回一个圆柱形碰撞形状对象,将这个对象添加给碰撞器的colliderShape属性即可。API说明如图10-2所示。

    (图10-2)

    圆锥形碰撞形状

    圆锥形碰撞形状是以直角三角形的直角边所在直线为旋转轴,其余两边旋转360度而成的曲面所围成的几何体形状。需要设置底面半径和锥体高来调整碰撞形状大小。常用于锥体外观的物体碰撞。如图11-1所示。

    (图11-1)

    项目代码里,通过创建一个ConeColliderShape实例的方式,传入半径和高,即可返回一个圆锥形碰撞形状对象,将这个对象添加给碰撞器的colliderShape属性即可。API说明如图11-2所示。

    (图11-2)

    平面碰撞形状

    平面碰撞形状,是一种无限大的2D平面碰撞形状。通常用于整个场景地面的碰撞形状。通过法线来确定在3维世界的平面朝向,可以通过偏移值来调整距离原点的偏移多少。API说明如图12-1所示。

    (图12-1)

    通过API,我们可以看到normal是一个3维向量值,表示着平面的法线。例如这个值为Vector3(0, 1, 0),则表示法线位于Y轴正方向,平面碰撞形状就是处于其垂直的X轴无限大水平面。

    图12-2是法线同样位于Y轴正方向,偏移值offset分别为0(左侧)和为1(右侧)的效果对比。

    (图12-2)

    2.3.3 碰撞器的形状添加示例
    使用Unity导出的碰撞组件

    Unity导出的碰撞组件使用起来最简单,由于组件已经整合了碰撞器和碰撞形状,直接加载就可以使用了。某些情况下甚至可以不写代码,所以我们介绍一下使用Unity的节点对象和刚体,通过代码添加碰撞形状的示例。

    在Unity中,是可以直接创建圆柱体这种基础3D对象的,但是Unity没有圆柱形碰撞组件,创建的圆柱体默认是胶囊碰撞体组件Capsule Collider,所以,我们删除圆柱体对象的胶囊碰撞体组件,添加刚体组件(Rigidbody)导出,编写代码如下所示:

    /*
        ……省略若干代码
       */
    Laya.Scene3D.load("Conventional/SampleScene.ls",Laya.Handler.create(null,function(_Scene3D:Laya.Scene3D){
    //添加3D场景到舞台
    Laya.stage.addChild(_Scene3D);
    let _camera = _Scene3D.getChildByName("Main Camera") as Laya.Camera;
                _camera.clearFlag = Laya.CameraClearFlags.Sky;
    //从场景中找到圆柱对象
    let _cylinder = _Scene3D.getChildByName("Cylinder");
    //从圆柱对象上获得刚体碰撞器(对应Unity的刚体组件)
    let cyRigid = _cylinder.getComponent(Laya.Rigidbody3D) as Laya.Rigidbody3D;
    //创建圆柱体形状(通常与圆柱对象的大小保持一致)
    let cyShape = new Laya.CylinderColliderShape(0.5,2);
    //为刚体碰撞器添加碰撞形状
                cyRigid.colliderShape = cyShape;
    }));
    /*
        ……省略若干代码
       */
    
    LayaAir内置的基础碰撞形状使用示例

    内置的碰撞器使用思路为,创建节点对象,创建碰撞器,创建碰撞器形状,为碰撞器添加碰撞形状。

    我们以创建圆锥形刚体碰撞器为例,编写代码如下所示:

    /*
        ……省略若干代码
       */
    /**增加圆锥形刚体碰撞器 */
    private addCone():void{
    //生成随机值半径和高
    let raidius =Math.random()*0.2+0.2;
    let height =Math.random()*0.5+0.8;
    //创建圆锥形3D模型节点对象
    let cone =newLaya.MeshSprite3D(Laya.PrimitiveMesh.createCone(raidius, height));
    //把圆锥形3D节点对象添加到3D场景节点下
    this.newScene.addChild(cone);
    //设置随机位置
    this.tmpVector.setValue(Math.random()*6-2,6,Math.random()*6-2);
            cone.transform.position =this.tmpVector;
    //为圆锥形3D节点对象创建刚体碰撞器
    let _rigidBody =<Laya.Rigidbody3D>(cone.addComponent(Laya.Rigidbody3D));
    //创建圆锥形碰撞器形状(使用节点对象的值,保持一致性)
    let coneShape =newLaya.ConeColliderShape(raidius, height);
    //为刚体碰撞器添加碰撞器形状
            _rigidBody.colliderShape = coneShape;
    }
    /*
        ……省略若干代码
       */
    

    其它基础形状的创建可参考官网的引擎示例

    复合碰撞形状的使用示例

    虽然可以通过Unity导出复合的碰撞形状,这里也有必要单独介绍一下复合碰撞形状如何通过代码添加。

    复合碰撞形状主要就是可以添加多个不同的子形状,理解后其实也是非常简单。

    创建复合碰撞形状的方式并不复杂,先实例化复合碰撞形状CompoundColliderShape(),再通过复合碰撞形状对象的addChildShape方法添加基础碰撞形状子对象即可。

    我们继续通过代码和注释来理解。编写代码如下所示:

    /*
        ……省略若干代码
       */
    Laya.Mesh.load("res/threeDimen/Physics/table.lm",Laya.Handler.create(this,function(mesh:Laya.Mesh){
    //读取Unity导出的桌子模型节点对象,添加到3D场景节点下,
    var table = scene.addChild(newLaya.MeshSprite3D(mesh))asLaya.MeshSprite3D;
    //给桌子节点对象添加刚体碰撞器
    var rigidBody = table.addComponent(Laya.Rigidbody3D)asLaya.Rigidbody3D;
    //实例化一个复合碰撞形状对象
    var compoundShape:Laya.CompoundColliderShape=newLaya.CompoundColliderShape();
    //创建盒形碰撞形状
    var boxShape:Laya.BoxColliderShape=newLaya.BoxColliderShape(0.5,0.4,0.045);
    //获取本地偏移
    var localOffset:Laya.Vector3= boxShape.localOffset;
    //修改偏移
        localOffset.setValue(0,0,0.125);
        boxShape.localOffset = localOffset;
    //为复合碰撞形状对象添加子形状(刚刚创建的盒形碰撞形状)
        compoundShape.addChildShape(boxShape);
    //后面的代码都是类似,把一个个的子形状都添加到复合碰撞形状对象上。子形状也可以是别的形状,例如球形、圆柱形等,根据模型节点的实际情况来。
    /*
        ……省略若干boxShapeXX类似的代码,只保持到boxShape4
       */
    var boxShape4:Laya.BoxColliderShape=newLaya.BoxColliderShape(0.1,0.1,0.3);
    var localOffset4:Laya.Vector3= boxShape4.localOffset;
        localOffset4.setValue(0.2,0.153,-0.048);
        boxShape4.localOffset = localOffset3;
        compoundShape.addChildShape(boxShape4);
    //把组合好的复合碰撞形状添加给刚体碰撞器的碰撞器形状属性
        rigidBody.colliderShape = compoundShape;
    }));
    /*
        ……省略若干代码
       */
    

    2.4 碰撞生命周期方法

    生命周期是从开始到结束的完整周期过程,有主动触发的主干生命周期方法,例如onAwake()onEnable()、等。也有被动触发的事件类生命周期虚方法,这种只有在某个条件达到时才会自动激活,例如,本小节要讲的物理事件相关的方法。

    2.4.1 物理事件的生命周期方法说明

    前文介绍过,检测物理碰撞的方式有两种,那物理事件的方法,也对应着两种。分别是碰撞事件生命周期方法和触发事件生命周期方法。

    碰撞事件生命周期方法说明:

    碰撞器之间发生碰撞后,自动激活的事件虚方法。

    (点击放大查看高清图)

    触发事件生命周期方法说明:

    设置为触发器之后,因物体接触而自动激活的事件虚方法。

    (点击放大查看高清图)

    特别说明:
    • 碰撞事件的生命周期方法永远不会与触发事件的生命周期方法同时激活,只能是碰撞事件或者是触发事件。并且,如果有一方是触发器,那两方一定无法进入碰撞事件,只有进入触发事件的可能。

    • 无论是碰撞事件还是触发事件的生命周期方法,从进入到离开的顺序皆为“Enter,Stay,Stay,……,Exit”。

    2.4.2 碰撞事件生命周期方法的触发条件

    根据碰撞器的类型不同,并不是所有碰撞器之间,都会触发碰撞的反馈,以及激活相应的生命周期方法。

    下面通过表格的方式,对应了各碰撞器之间是否可触发碰撞事件的生命周期虚方法。

    (点击放大查看高清图)

    总结:

    通过上面的表格,我们发现,静态碰撞器和运动刚体碰撞器,只能与动力学刚体碰撞器或者是角色碰撞器碰撞才可以触发碰撞器生命周期方法,静态碰撞器和运动刚体碰撞器彼此之间,是无法触发碰撞器生命周期的。

    而动力学刚体碰撞器和角色碰撞器,和任意的碰撞器发生碰撞都可以触发碰撞器生命周期方法。

    2.4.3 触发事件生命周期方法的触发条件

    碰撞器是只能与碰撞器之间碰撞,才有可能进入碰撞器的生命周期,

    而触发器则不然,触发器不仅与触发器之间有可能进入触发器的生命周期,当触发器与碰撞器之间接触,也有可能进入触发器的生命周期,所以,我们分成两个表来理解。

    触发器与触发器之间:

    (点击放大查看高清图)

    触发器与碰撞器之间:

    (点击放大查看高清图)

    总结:

    通过上面的两个表格,我们发现,无论是触发器与触发器之间,还是触发器与碰撞器之间,只有静态碰撞器与静态触发器彼此之间碰撞或者接触,是无法进入物理触发事件的。

    而其它类型之间接触,哪怕碰撞器没有开启触发器,甚至没有触发器属性(角色碰撞器),只要有任意一方是触发器,那也会自动进入触发器的生命周期。

    2.4.4 使用生命周期方法
    创建Script3D脚本

    生命周期的方法,只能在脚本类里使用,所以,我们需要创建一个脚本,3D游戏必须要继承3D的脚本Script3D。空脚本的示例代码如下:

    /**
     * TypeScript语言的3D脚本示例
     */
    export default class TSDemo extends Laya.Script3D{
        constructor(){super();}
    }
    

    2D脚本与3D脚本不要混用,如果是用IDE创建的脚本模板,需要将继承的2D脚本类(Laya.Script)改为3D脚本类(Laya.Script3D),

    添加物理脚本

    只有为节点添加了我们自定义的脚本,我们才可以让该节点使用生命周期方法。

    添加的方式很简单,直接在代码中,用节点的addComponent()方法,就可以轻松的把继承了脚本类的3D脚本添加到节点上。

    例如,我们创建一个3D盒子,并为其绑定刚刚创建的TSDemo脚本。示例代码如下:

    //引入自定义脚本TSDemo
    import TSDemo from"./TSDemo";
    /**
     * TypeScript语言示例
     */
    export default class GameUI extends ui.TestSceneUI{
    /*
        ……省略若干代码
        */
    private addBox():void{
    //创建盒型MeshSprite3D
    let box =this.newScene.addChild(new Laya.MeshSprite3D(Laya.PrimitiveMesh.createBox(0.75,0.5,0.5))) as Laya.MeshSprite3D;
    //设置材质
            box.meshRenderer.material =this.mat1;
    //设置空间位置
    let transform = box.transform;
    let pos = transform.position;
            pos.setValue(1,6,0);
            transform.position = pos;
    //创建刚体碰撞器
    let _rigidBody = box.addComponent(Laya.Rigidbody3D) as Laya.Rigidbody3D;
    //创建盒子形状碰撞器
    let boxShape =new Laya.BoxColliderShape(0.75,0.5,0.5);
    //设置盒子的碰撞形状
            _rigidBody.colliderShape = boxShape;
    //添加自定义脚本组件TSDemo
            box.addComponent(TSDemo);
    }
    /*
        ……省略若干代码
        */
    }
    
    重写物理生命周期方法

    之前介绍过,物理事件的生命周期方法分别为三个碰撞事件方法和三个触发事件方法。我们在使用的时候,重写这些虚方法即可,当物理行为触发了对应的物理事件就会自动执行。

    重写生命周期方法的示例代码如下:

    /**
     * TypeScript语言的3D脚本示例
     */
    export default class TSDemo extends Laya.Script3D{
        constructor(){super();}
        onTriggerEnter():void{
     /*
                ……省略若干逻辑代码
            */
            console.log("触发器物理事件onTriggerEnter");
    }
        onTriggerStay():void{
    /*
                ……省略若干逻辑代码
            */
            console.log("触发器物理事件onTriggerStay");
    }
        onTriggerExit():void{
    /*
                ……省略若干逻辑代码
            */
            console.log("触发器物理事件onTriggerExit");
    }
        onCollisionEnter():void{
    /*
                ……省略若干逻辑代码
            */
            console.log("碰撞器物理事件onCollisionEnter");
    }
        onCollisionStay():void{
    /*
                ……省略若干逻辑代码
            */
            console.log("碰撞器物理事件onCollisionStay");
    }
        onCollisionExit():void{
    /*
                ……省略若干逻辑代码
            */
            console.log("碰撞器物理事件onCollisionExit");
    }
    }
    

    2.5 碰撞分组与过滤碰撞组

    当我们产生复杂的碰撞需求时,例如,想碰哪个,不碰哪个。这时候就需要进行分组,并指定可以与哪个碰撞组进行碰撞。另外,设置碰撞组过滤,还会优化性能。

    各种碰撞器从物理组件父类PhysicsComponent那里继承了collisionGroup与canCollideWith属性,用以实现碰撞分组和指定碰撞组。

    2.5.1 碰撞组 collisionGroup

    碰撞组的值,我们通常设置为2的N次幂值。如果应用场景比较复杂,需要用到的碰撞分组比较多,记不住太多2的N次幂值,也可以直接使用LayaAir引擎内置的碰撞组工具类。

    LayaAir引擎内置了17个碰撞组属性值,用于过滤不需要的碰撞。

    引擎内置的碰撞组工具类为Physics3DUtils

    全部可碰撞的组

    由于碰撞组之间的碰撞依据是位运算的按位与,按位与的计算结果非0则可以碰撞,为0则不可碰撞。

    Physics3DUtils工具类的COLLISIONFILTERGROUP_ALLFILTER属性值为-1,-1与任何2的幂值进行按位与都非0,所以取该属性值为分组时,则所有的碰撞组都可碰撞。
    使用示例为:

    //指定xxx碰撞器所属哪个碰撞组(-1组与LayaAir任何内置组都可碰撞)
    xxx.collisionGroup =Laya.Physics3DUtils.COLLISIONFILTERGROUP_ALLFILTER;
    
    自定义碰撞分组

    LayaAir内置的碰撞组,不包括刚刚讲的-1(COLLISIONFILTERGROUP_ALLFILTER),我们可以用的还有10个,分别是COLLISIONFILTERGROUP_CUSTOMFILTER1......10。全都是2的幂,从64到32768。

    为了方便记忆,我们可以不记实际值,记住CUSTOMFILTER后1到10的ID号区别即可。

    使用示例为:

    //指定xxx碰撞器所属哪个碰撞组(COLLISIONFILTERGROUP_CUSTOMFILTER2对应的值为128)
    xxx.collisionGroup =Laya.Physics3DUtils.COLLISIONFILTERGROUP_CUSTOMFILTER2;
    
    特定的碰撞分组

    除了以上的分组外,LayaAir也对接了一些Bullet物理引擎预留的特定分组,用于比较简单的碰撞过滤需求。

    例如,当前场景我们只有动态刚体碰撞器,静态碰撞器,运动学刚体碰撞器,只是对这几种碰撞器之间作碰撞过滤,那么我们就可以分别使用对应的默认碰撞组、静态碰撞组、运动学刚体碰撞组。

    具体的预留分组属性说明如下:

    以上的属性是原样对接了Bullet物理引擎,例如碎片碰撞组和字符过滤器的概念,当前的引擎版本还没有。开发者想用也可以,但建议不采用,推荐使用自定义碰撞分组,以ID为分组标记更便于记忆。

    2.5.2 过滤碰撞组 canCollideWith
    指定碰撞单个组

    碰撞器的canCollideWith属性可以用于指定与哪个组碰撞,指定哪个,就可以与哪个碰撞。其它的都不可以碰撞,起到了过滤其它碰撞组的效果。

    使用示例为:

    //指定xxx碰撞器可以与其发生碰撞的碰撞组(本例只与自定义组1碰撞)
    xxx.canCollideWith =Laya.Physics3DUtils.COLLISIONFILTERGROUP_CUSTOMFILTER1;
    
    指定碰撞多个组

    如果我们想碰撞多个组,可以采用位运算的按位或| ,去指定多个可以与其发生碰撞的碰撞组。

    使用示例为:

    //指定xxx碰撞器可以与其发生碰撞的碰撞组(本例只与自定义组1、2、5进行碰撞)
    xxx.canCollideWith =Laya.Physics3DUtils.COLLISIONFILTERGROUP_CUSTOMFILTER1 |Laya.Physics3DUtils.COLLISIONFILTERGROUP_CUSTOMFILTER2 |Laya.Physics3DUtils.COLLISIONFILTERGROUP_CUSTOMFILTER5;
    

    关于位运算用于碰撞的基础原理,可以点击阅读《物理引擎的碰撞分组,适用2D和3D

    指定不可碰撞的组

    在多个碰撞分组的情况下,如果我们只想排除掉某个或者某几个碰撞组不与其发生碰撞,与其它所有的碰撞组发生碰撞如何处理呢?

    这时候可以通过异或运算符^来实现。用 -1去异或^任何2的幂值,那该值的碰撞组就不会被碰撞。

    使用示例为:

    //指定不可以与其发生碰撞的碰撞组(本例将不与自定义组2、5进行碰撞,除自定义2与5组之外,都可以发生碰撞)
    xxx.canCollideWith =Laya.Physics3DUtils.COLLISIONFILTERGROUP_ALLFILTER ^Laya.Physics3DUtils.COLLISIONFILTERGROUP_CUSTOMFILTER2 ^Laya.Physics3DUtils.COLLISIONFILTERGROUP_CUSTOMFILTER5;
    

    三、物理约束

    在物理世界中,有些物体的运动会受到其它物体的影响,例如:人体关节、钟摆、链条、滑轮组、等等。

    这种限制物体运动,避免其运动超出一定限度的物理方法就是约束。由于其还具有着关节的特性表现,所以有些引擎也称为关节。

    3.1 LayaAir支持哪些约束

    目前在LayaAir引擎中只支持两种,分别是固定约束Fixed Constraint和可配置约束Configurable Constraint

    Unity里的固定关节组件Fixed Joint可导出对应固定约束Fixed Constraint,可配置关节组件Configurable Joint可导出对应可配置约束Configurable Constraint

    固定约束是比较常用的约束,而可配置约束可以模拟任意约束的效果,所以这两种约束可以满足绝大多数的常用需求。

    3.2 固定约束Fixed Constraint

    固定约束将对象的移动限制为依赖于另一个对象,一个物体产生位移变化 ,另一个与其约束的物体也会随之变化 。有些类似父子节点关系,但它与父子节点不同,位移不是通过transform实现,而是基于物理引擎。

    固定关节类似2D物理(Box2D)里的焊接关节,适用于游戏中的物体对象永久或暂时粘在一起的需求,最好是两个没有父子关系的物理一起运动。好处是不必通过脚本更改对象的层级视图来实现所需的效果。代价是所有使用固定关节的对象都必须使用刚体。

    LayaAir引擎支持Unity中固定关节Fixed Joint的三个属性(Connected Body、Break Force、Break Torque)是支持导出使用的。如下图12所示。

    (图12)

    3.2.1 设置连接刚体 setConnectRigidBody

    Unity中的Connected Body对应LayaAir的设置连接刚体setConnectRigidBody

    setConnectRigidBody用于指定固定约束要连接的刚体,若不指定,则该约束连接到世界。

    3.2.2 断开力 breakForce

    Unity中的Break Force对应LayaAir的断开力breakForce

    breakForce用于设置破坏固定约束需要施加的最大力。

    3.2.3 断开力矩 breakTorque

    Unity中的Break Torque对应LayaAir的断开力矩 breakTorque

    breakTorque用于设置破坏固定约束需要施加的最大力矩。

    3.3 可配置约束Configurable Constraint

    可配置约束可实现各种约束类型的所有功能,比如上文介绍过的固定约束,也可以通过可配置约束来实现,并且提供更强大的角色移动控制。

    当开发者想要自定义布娃娃的运动并对角色强制实施某些姿势时,这种约束特别有用。使用可配置约束还可以将约束修改为开发者自行设计的高度专业化约束。

    LayaAir引擎支持Unity中可配置关节的属性如图13的红框中所示。下面将逐一详细介绍。

    (图13)

    Unity的可配置关节Configurable Joint里的断开力Break Force和断开力矩Break Torque在LayaAir中也是支持的,由于上个小节已介绍,本小节不再重复介绍。所以图14中也没有体现。

    3.3.1 设置连接刚体 setConnectRigidBody

    Unity中的Connected Body对应LayaAir的设置连接刚体setConnectRigidBody

    setConnectRigidBody用于指定固定约束要连接的刚体,若不指定,则该约束连接到世界。

    3.3.2 锚点 anchor

    Unity中的Anchor对应LayaAir的锚点anchor ,

    锚点anchor 是用于定义自身刚体约束中心的点。物理模拟会使用此点作为计算的中心点。

    3.3.3 主轴 axis

    Unity中的Axis对应LayaAir的主轴 axis ,

    主轴 axis用于基于物理模拟来定义对象自然旋转的局部轴,该轴决定了对象在物理模拟下自然旋转的方向。

    3.3.4 连接锚点 connectAnchor

    Unity中的Connected Anchor 对应LayaAir的连接锚点connectAnchor ,

    连接锚点connectAnchor 用于设置所连接刚体的约束锚点。

    例如自己是车轮,连接的刚体是车身。那锚点就是车轮的约束中心点,连接锚点就是所连接的车身约束中心点。

    3.3.5 副轴 secondaryAxis

    Unity中的Secondary Axis 对应LayaAir的副轴secondaryAxis,

    副轴secondaryAxis的作用是与主轴axis共同定义了约束的局部坐标系。第三个轴会与这两个轴所构成的平面相垂直。

    3.3.6 沿XYZ轴平移约束模式 (X\Y\Z)Motion

    Unity中的X Motion, Y Motion, Z Motion 对应LayaAir的 XMotion, YMotion, ZMotion,

    (X\Y\Z)Motion是表示沿 X、Y 、Z 轴平移约束的模式,根据属性设置的不同,约束的模式也不同。可以设置的值分别是:自由移动Free、锁定移动 Locked、限制性移动 Limited

    自由移动Free就是不作限制的沿某轴移动。

    锁定移动 Locked是没有运动,完全固定住。

    限制性移动 Limited是平移运动受限于用户定义的约束。

    3.3.7 绕XYZ轴旋转的角运动约束模式angular (X\Y\Z)Motion

    Unity中的Angular X Motion, Angular Y Motion, Angular Z Motion 对应LayaAir的 angularXMotion, angularYMotion, angularZMotion

    angular (X\Y\Z)Motion是表示绕X、Y 、Z 轴旋转的角运动约束模式,也是根据自由移动Free、锁定移动 Locked、限制性移动 Limited三种值的设置来区别约束模式,与(X\Y\Z)Motion类似,只是运动形式的线性平移和角运动旋转的区别。

    3.3.8 弹簧线性限制 (linearLimitSpring、linearDamp)

    Unity中的 Linear Limit Spring 是当对象超过了限制位置时要拉回对象而施加的弹簧力。该项有两个配置参数,弹簧力Spring与阻尼Damper

    弹簧力Spring

    其中的弹簧力Spring 在LayaAir引擎中对应线性限制的弹簧力linearLimitSpring,如果此处的值设置为零,则无法逾越限制;零以外的值将使限制变得有弹性。

    阻尼Damper

    其中的阻尼Damper在LayaAir引擎中对应线性阻尼linearDamp,设置为大于零的值可让约束抑制振荡(否则将不断的进行振荡)。

    3.3.9 线性移动限制(minLinearLimit、maxLinearLimit、linearBounce)

    Unity中的Linear Limit 是关节线性移动的限制,LayaAir导出插件只支持该项的限制Limit与反弹力Boundciness设置。

    限制Limit

    其中的Limit是从原点到限制位置的距离。在LayaAir引擎中需要分别设置线性移动限制的最小值minLinearLimit和线性移动限制的最大值maxLinearLimit

    反弹力Boundciness

    其中的反弹力 Bounciness 是当对象达到限制距离时,要将对象拉回而施加的弹力。在LayaAir引擎中对应线性反弹力linearBounce

    3.3.10 弹簧角运动限制(angularLimitSpring、angularDamp)

    在Unity中,弹簧的角运动旋转限制分为X轴旋转限制Angular X Limit Spring以及Y轴和Z轴旋转限制Angular YZ Limit Spring。这些限制都是当对象超过了约束的限制角度时要反向旋转对象而施加的弹簧力矩,只是轴的区别。而且他们都有弹簧力Spring与阻尼Damper两个配置项,

    弹簧力Spring

    其中的弹簧力Spring 在LayaAir引擎中对应角运动旋转限制的弹簧力angularLimitSpring,如果此处的值设置为零,则无法逾越限制;零以外的值将使限制变得有弹性。

    阻尼Damper

    其中的阻尼Damper在LayaAir引擎中对应角运动旋转阻尼angularDamp,设置为大于零的值可让约束抑制振荡(否则将不断的进行振荡)。

    3.3.11 角运动限制(minAngularLimit、maxAngularLimit、angularBounce)

    在Unity中,关于角运动旋转的限制有X轴旋转的下限Low Angular X Limit、X轴旋转的上限Hight Angular X Limit、Y轴旋转的限制Angular Y Limit、Z轴旋转的限制Angular Z Limit。这些限制项,LayaAir导出插件只支持限制Limit与反弹力Boundciness设置。

    限制Limit

    其中的Limit是限制旋转角度,设置对象旋转角度的下限值。在LayaAir引擎中需要分别设置旋转角度限制的最小值minAngularLimit和旋转角度限制的最大值maxAngularLimit。这两个值都是3D向量值。

    旋转限制最小值的X对应X轴旋转的下限Low Angular X Limit值,Y对应Y轴旋转的限制Angular Y Limit值取负,Z对应Z轴旋转的限制Angular Z Limit值取负。

    旋转限制最大值的X对应X轴旋转的上限Hight Angular X Limit值,Y对应Y轴旋转的限制Angular Y Limit值,Z对应Z轴旋转的限制Angular Z Limit值。

    反弹力Boundciness

    其中的反弹力 Bounciness 是当对象的旋转达到限制角度时在对象上施加的反弹力矩。在LayaAir引擎中对应角度反弹力矩angularBounce

    四、物理射线

    4.1 什么是物理射线

    射线的定义是只有一个端点无限延长形成的直的线。LayaAir引擎的数学对象Laya.Ray()就是只有起点和方向的射线。

    在LayaAir引擎中,射线常用于基础的碰撞检测,所以具有射线的发射特性,用于碰撞检测功能的射线称为物理射线。

    需要注意的是,射线可以用于物理射线检测,但是物理射线并不等同于射线。

    4.2 创建射线

    LayaAir引擎提供了创建3D空间射线的类Laya.Ray(),以及通过摄像机从屏幕空间点去生成这个射线的方法viewportPointToRay()

    示例代码如下所示:

    /*
    ……省略若干代码
    */
    //创建一个屏幕点
    let point =newLaya.Vector2();
    //创建一个射线 Laya.Ray(射线的起点,射线的方向)
    let ray =newLaya.Ray(newLaya.Vector3(0,0,0),newLaya.Vector3(0,0,0));
    //以鼠标点击的点作为原点
    point.x =Laya.stage.mouseX;
    point.y =Laya.stage.mouseY;
    //计算一个从屏幕空间生成的射线
    _camera.viewportPointToRay(point, ray);
    /*
    ……省略若干代码
    */
    

    4.3 使用物理射线

    在LayaAir 3D中实现射线检测是使用物理模拟器类PhysicsSimulation

    射线检测的方法有4个,分别为射线检测第一个碰撞物体的方法raycast 和 raycastFromTo以及射线检测所有碰撞物体的方法raycastAllraycastAllFromTo

    检测一个和所有的区别比较容易理解,就是碰到第一个物体后射线立即结束,和射线可穿透所有碰撞物体一直不结束,这两种区别。如图14所示。

    (图14)

    那为什么同样的功能名称还有带FromTo和不带FromTo两种,又有什么区别呢?

    与数学对象的射线所不同的是,用于检测碰撞的物理射线是有长度的,或者是需要设置世界空间的结束位置。

    带FromTo的是使用两个点(射线的起始位置点和结束位置点)作为参数。

    而不带FromTo的则是直接使用已经创建好的射线,不需要设置射线的结束位置点,但需要设置长度,如果我们不设置长度,则采用默认值长度2147483647

    如果是不带FromTo的射线检测,我们可以沿用上个小节创建射线的示例,稍加补充一下,具体代码如下所示:

    /*
    ……省略若干代码
    */
    //创建一个屏幕点
    let point =new Laya.Vector2();
    //创建一个射线 Laya.Ray(射线的起点,射线的方向)
    let ray =new Laya.Ray(new Laya.Vector3(0,0,0),new Laya.Vector3(0,0,0));
    //以鼠标点击的点作为原点
    point.x =Laya.stage.mouseX;
    point.y =Laya.stage.mouseY;
    //计算一个从屏幕空间生成的射线
    _camera.viewportPointToRay(point, ray);
    //拿到3D场景中射线碰撞的物体
    _scene3D.physicsSimulation.rayCastAll(ray,this.outs);
    //如果射线碰撞到物体
    if(this.outs.length !==0){
    for(let i =0; i <this.outs.length; i++){
    //在射线击中的位置添加一个立方体
    this.addBoxXYZ(this.outs[i].point.x,this.outs[i].point.y,this.outs[i].point.z );
    }
    }
    /*
    ……省略若干代码
    */
    

    带FromTo的射线检测使用示例,具体代码如下所示:

    /*
    ……省略若干代码
    */
    /*进行射线检测,检测所有碰撞的物体
    //_scene3D.physicsSimulation.raycastAllFromTo(this.from, this.to, this.outs);
    //检测所有物体的射线使用与上个示例类似
    */
    //进行射线检测,检测第一个碰撞物体
    _scene3D.physicsSimulation.raycastFromTo(this.from,this.to,this.out);
    //将射线碰撞到的物体设置为红色
    ((this.out.collider.owner asLaya.MeshSprite3D).meshRenderer.sharedMaterial as Laya.BlinnPhongMaterial).albedoColor =new Laya.Vector4(1.0,0.0,0.0,1.0);
    /*
    ……省略若干代码
    */
    

    4.4 使用异形物理射线

    常规的物理射线是用一条射线来检测碰撞,LayaAir引擎中也提供了与物理射线检测类似的功能,但采用的是自定义碰撞器形状检测来代替物理射线,相当于异形的射线检测功能。

    与普通的射线检测一样,异形射线也是有检测第一个和检测所有两个检测方法,分别是shapeCastshapeCastAll

    (图15)

    图15的示例,就采用球形射线来实现碰撞检测,具体代码如下所示:

    //创建球型碰撞器
    var sphereCollider:Laya.SphereColliderShape=new Laya.SphereColliderShape(0.5);
    //通过按钮this.castAll状态切换是采用检测全部还是检测第一个
    if(this.castAll){
    //采用球形碰撞器进行形状检测,检测所有碰撞的物体
    this.scene.physicsSimulation.shapeCastAll(sphereCollider,this.from,this.to,this.outs);
    for(let i =0; i <this.outs.length; i++){
    ((this.outs[i].collider.owner as Laya.MeshSprite3D).meshRenderer.sharedMaterial asLaya.BlinnPhongMaterial).albedoColor =new Laya.Vector4(1.0,0.0,0.0,1.0);
    }else{
    //采用球形碰撞器进行形状检测,检测第一个碰撞物体
    if(this.scene.physicsSimulation.shapeCast(sphereCollider,this.from,this.to,this.out))
    ((this.out.collider.owner as Laya.MeshSprite3D).meshRenderer.sharedMaterial as Laya.BlinnPhongMaterial).albedoColor =new Laya.Vector4(1.0,0.0,0.0,1.0);
    }
    

    4.5 设置射线碰撞组

    无论是普通射线还是异形射线,都可以设置碰撞组,以及指定射线可碰撞的组。

    设置碰撞组值collisonGroup和指定可发生碰撞的组值canCollideWith在前文中已经介绍过,

    我们将值带入射线检测对应的方法参数即可实现射线的选择性碰撞。

    五、Cannon.js物理引擎的使用

    之前的章节一直在介绍LayaAir基于Bullet物理引擎封装的物理引擎API。Bullet虽然强大,但是有些开发者对于物理精度要求不高,物理功能的使用也比较基础,只对物理引擎库的体积有要求(Cannon物理引擎库不足200k)。那或许Cannon.js可以考虑。

    5.1 如何切换使用Cannon.js物理引擎库

    如果想使用Cannon.js物理引擎库,要引入物理引擎库cannon.js以及LayaAir引擎封装的物理API库laya.cannonPhysics.js

    采用LayaAirIDE创建项目的开发者,可以直接在IDE中通过F9打开项目设置的类库设置,如图16进行勾选即可。


    (图16)

    如果不打算使用Bullet物理引擎,Physics3D相关的物理库不需要勾选。

    引用了cannon.jslaya.cannonPhysics.js引擎库后,就可以直接使用Cannon.js物理引擎的API了。

    在LayaAir封装的物理API的设计上,基本上与Bullet引擎保持了一致,只是在命名前增加了Cannon标识,例如3D刚体Rigidbody3D在Cannon物理引擎的使用时变为了CannonRigidbody3D

    毕竟Cannon.js物理引擎与Bullet物理引擎本身存在差异,以及对于Cannon.js的基础物理功能使用的定位,Bullet中有很多API,在Cannon.js中是没有的。关于这些,开发者可以通过下一小节进行详细了解。

    5.2 Cannon.js物理引擎中可以使用的API

    Cannon.js物理引擎与Butllet的使用方式基本相同,只是类名称会有所不同,本小节列出常用的API供开发者参考。

    5.2.1 碰撞器

    (点击放大查看高清图)

    5.2.2 常用的刚体物理属性

    (点击放大查看高清图)

    5.2.3 碰撞器形状

    5.2.4 常用的碰撞器属性

    (点击放大查看高清图)

    5.2.5 射线检测

    射线检测基于Cannon物理模拟器类CannonPhysicsSimulation

    (点击放大查看高清图)

    5.2.6 碰撞生命周期

    LayaAir引擎的3D物理碰撞生命周期,适用于Cannon.js引擎与Bullet引擎,参考前文的碰撞生命周期方法即可。

    END

    引擎案例分享:

    推荐阅读:

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,332
精华内容 532
关键字:

layaair

友情链接: debug.rar