87周报:OPPO发布新AR眼镜;苹果高管称AR拥有巨大潜力

87周报:OPPO发布新AR眼镜;苹果高管称AR拥有巨大潜力,第1张

本周(1116-1122)热点:戴尔与HTC Vive签署分销协议,为欧洲企业提供VR一站式解决方案;知名线下VR品牌The Void因无力偿还贷款而出售资产;腾讯音乐宣布投资VR演唱会平台Wave并达成战略合作;TGA 2020 游戏 大奖提名公布,VR大作《半衰期:爱莉克斯》再次上榜;《星球大战:银河边缘传说》正式登陆Quest和Quest 2等。

行 业 动 态

爱立信调查报告:AR/VR工作社交或在2030年成为常态

在爱立信早前发布的一项研究报告中,我们在未来或许能够在一个完全虚拟化的空间进行工作和社交。在这里,触觉、味觉、嗅觉和冷热感觉等感官体验都可以通过数字方式传递。完全虚拟化的办公室很可能在2030年之前出现,而且绝大多数受访者表示,感官网络化能够提高企业的可持续发展性。如果隐私问题得到解决,这将能进一步促进虚拟化办公的普及。

苹果高管表示AR设备在现在与未来都拥有巨大的潜力

在最近接受CNET的采访时,苹果VR/AR计划负责人Mike Rockwell表示,AR在今天存在的设备和明天可能存在的设备中都有巨大的潜力。

戴尔与HTC Vive签署分销协议,为欧洲企业提供VR一站式解决方案

HTC Vive于上个月宣布了其远程协作工具Vive XR套件,旨在帮助企业适应员工在家办公。如果你拥有硬件设备,那简直太好了,但对于那些还没有并正在寻找投资的企业来说,HTC Vive和戴尔现在已经合作为欧洲的企业客户提供简单的一站式解决方案。据了解,这项分销协议将使戴尔的客户能够使用各种Vive设置和配件,以及Vive企业保修和服务,比如XR Suite。

2020谷歌开发者大会:AR软件工程总监介绍ARCore最新动态

Google开发者大会是谷歌面向开发者展示最新产品和平台的年度盛会。2020 Google开发者大会于11月16日至21日举行,这是谷歌首次以全线上大会的形式与中国开发者相聚。本次大会以“代码不止”为主题,介绍了相关产品更新以及一系列面向本地开发者的技术支持内容,旨在赋能开发者高效创新、持续不断地创造愉悦的产品体验。在大会首日,谷歌软件工程总监王启文发表了关于“ARCore为用户创造有效的AR体验”的主题演讲。

Unity线上技术大会正式开幕,四款全新技术产品落地中国

中国Unity线上技术大会于11月16日晚开幕,在主题演讲中,Unity正式宣布MARS、ArtEngine、Plastic SCM等全新技术产品落地中国,并讲述了Unity实时3D技术与解决方案如何驱动更多行业领域的变革与创新。

知名线下VR品牌The Void因无力偿还贷款而出售资产

据外媒Protocol报道,连锁线下VR品牌The Void因拖欠贷款,不得不向债权人Jim Bennett转移包括专利、商标在内的资产。同时,The Void陷入财务困境也导致迪士尼终止与其建立的长期合作,这意味着The Void将失去对于基于迪士尼IP的VR内容的使用权,比如:《无敌破坏王:大闹VR》、《星球大战:帝国的秘密》等。

Oculus Quest 2重大更新:增加90Hz刷新率、健身追踪功能等

日前,Oculus正式发布了v23软件更新(支持Quest 1和Quest 2),包括纳入健身跟踪应用Oculus Move,原生支持90Hz刷新率,以及允许向朋友赠送 游戏 和体验等等。

SteamVR 115版更新:修复了Reverb G2控制器绑定问题

SteamVR推送115版更新,本次更新涵盖了前几周陆续推出的多个beta版更新内容,包括:修复在惠普Reverb G2上玩《半衰期:爱莉克斯》时遇到的控制器绑定问题、为Valve Index头显加入麦克风反馈功能、调整自动分辨率功能的性能预测算法等等。

Facebook发布VR开发者中心ODH 12版本

Facebook最初在今年9月发布了旨在提升VR开发体验的开发者中心Oculus Developer Hub(ODH)。例如,现在开发者可以通过一个优化的统一界面访问防护系统,接近传感器,投屏,以及性能信息工具OVR Metrics等等。现在ODH已经来到12版本。团队根据开发者社区的反馈纳入了一系列的新功能,同时进行了错误修复,提高了ODH中常用功能的可靠性。

融 资 收 购

腾讯音乐宣布投资VR演唱会平台Wave并达成战略合作

近日,腾讯音乐宣布已与VR演唱会平台Wave达成战略合作,并将对其进行股权形式投资。具体财务细节暂未披露。根据合作协议,双方将进一步共同 探索 虚拟演唱会蓝海市场。

VR培训解决方案商TransfrVR完成1200万美元A轮融资

总部位于纽约的VR培训解决方案商TransfrVR宣布完成1200万美元A轮融资,本轮融资由Firework Ventures领投。据悉,新的资金将主要用于开发Transfr的VR模拟课程。

沃尔玛旗下印度电商Flipkart收购VR/AR内容创作平台Scapic

沃尔玛旗下印度电商Flipkart宣布已收购总部位于班加罗尔的VR/AR内容创作平台Scapic。通过此次收购,Flipkart将提升其在电商领域的沉浸式购物服务。

Epic Games收购面部表情捕捉厂商Hyprsense

不断的迭代已经令《堡垒之夜》从单纯的吃鸡 游戏 变成了一个与朋友共度时光的热门社交空间。然而,用于虚拟角色的表情始终没有太大变化。针对这个问题,Epic刚刚收购了一家名为Hyprsense的公司。据介绍,Hyprsense的技术可以通过一个简单的网络摄像头将玩家的面部表情直接映射到 游戏 角色。

硬 件 快 讯

OPPO第二代AR眼镜概念机OPPO AR Glass 2021正式亮相

在11月17日下午举办的OPPO未来 科技 大会2020上,OPPO正式发布了第二款AR眼镜概念产品OPPO AR Glass 2021。

约翰·卡马克暗示Quest 2未来将支持120Hz刷新率

Oculus在本周正式发布了v23软件更新(支持Quest 1和Quest 2),包括纳入健身跟踪应用Oculus Move、原生支持90Hz刷新率,以及允许向朋友赠送 游戏 和体验等。而在Oculus官方推特的更新公告下,Oculus前首席技术官约翰·卡马克则跟帖建议开发者不要将帧率默认设置为最高。约翰·卡马克表示“不要将帧率默认设置为最高,否则如果我们发布120 FPS支持,你的应用程序可能会运行不佳。如果有两个头显,你应该测试不同的分辨率、帧率、渲染功能。”

外媒评测惠普Reverb G2:优秀的头显,糟糕的控制器

作为一款新上市的VR头显,惠普Reverb G2的硬件规格十分亮眼,同时为一些用户提供了无需Facebook账户即可体验PC VR相当多内容的选择。对于大部分PC VR的老用户而言,惠普Reverb G2是一款在清晰度上有大幅度改进的升级产品。近日,外媒UploadVR上手体验了这款VR头显。

日本硬件厂商JVC Kenwood将于下月初展示最新VR头显原型

日本硬件厂商JVC Kenwood宣布将于12月2日在神奈川县举行线下产品演示会议,届时将展示其最新VR头显原型机。

Quest版VR鞋Cybershoes开启Kickstarter众筹

鉴于玩家对晕动症的各种敏感性,因此VR中的移动问题总是很棘手,而VR硬件厂商Cybershoes想要解决这一问题。该公司已经于2018年成功为其PC VR兼容产品进行了众筹活动,现在,Cybershoes又为其Oculus Quest和Quest 2版产品开启了Kickstarter众筹。据了解,Kickstarter众筹将于2021年1月结束,目标金额为30000美元。

康奈尔大学研究员用可伸缩分布式光纤传感器研制低成本触觉手套

康奈尔大学的研究人员日前发明了一种结合低成本发光二极管和染料的光纤传感器,并带来成一种可以检测压力、弯曲和应变等变形的可伸缩“皮肤”。这种传感器可以用于机器人系统和XR等领域,并为其提供人类在自然界生存所依赖的丰富触觉感受。

意法半导体联手广达电脑研发AR智能眼镜参考设计

意法半导体和广达电脑日前宣布,将结合各自在激光扫描技术和生产制造技术方面的优势,共同研发AR智能眼镜的参考设计。

游 戏 快 讯

TGA 2020 游戏 大奖提名公布,VR大作《半衰期:爱莉克斯》再次上榜

The Game Awards(TGA)是由索尼、微软、任天堂以及Valve赞助的新活动,取代了以往的VGA以及VGX,被喻为 游戏 界的奥斯卡。近日,The Game Awards 2020的各大 游戏 奖项提名正式公布,包括年度最佳 游戏 、年度最佳VR/AR 游戏 、最佳动作 游戏 等24个类别,其中,由Valve制作发行的VR独占动作冒险 游戏 《半衰期:爱莉克斯》是被提名最多的。

卡普空机密被泄露!《生化危机4》或推出VR版本

据外媒报道,RAGNAR LOCKER黑客组织又放出了更多卡普空的内部资料(未经证实),据流传出的来看,包含《生化危机8:村庄》的实体版详细信息,显示 游戏 预计在明年4月发售。《逆转裁判123+大逆转裁判1&2 合集》PS4和NS版。《生化危机4》VR版以及《怪物猎人:崛起》的PC版。

《星球大战:银河边缘传说》正式登陆Quest和Quest 2

ILMxLAB与Oculus工作室联手打造的VR 游戏 《星球大战:银河边缘传说》正式登陆Oculus Quest和Oculus Quest 2。

VR 游戏 《Elite Dangerous》将在Epic Games商店免费发售

《Elite Dangerous》是英国 游戏 开发商Frontier Developments开发的一款VR太空模拟 游戏 ,该 游戏 将于11月19日在Epic Games商店免费发售。

EA为《星球大战:战机中队》发布两个免费更新

VR 游戏 《度假模拟器》增加实验性手势识别功能

《Vacation Simulator(度假模拟器)》是美国 游戏 工作室Owlchemy Labs开发的一款VR休闲 游戏 ,该 游戏 在近日为Oculus Quest增加了实验性手势识别功能。

VR冒险 游戏 《神秘博士:时间的边缘》发布最新更新

英国 游戏 工作室Maze Theory曾在去年发布了VR冒险 游戏 《神秘博士:时间的边缘》,使所有的《神秘博士》粉丝都可以通过“TARDIS”时光机穿越 游戏 世界进行冒险。近日,这款 游戏 推出了最新更新,该更新包含了“Time Lord Victorious”主题内容。

庆祝Link一周年,Quest新激活用户将获赠VR大作《Asgard’s Wrath》

在Oculus Link推出的一周年之际,Oculus为购买激活新Oculus Quest的用户准备了一份周年礼物。Oculus表示,从11月20日起(北京时间11月21日4:00)至2021年1月31日(北京时间2021年2月1日15:59),期间激活全新Oculus Quest 2并且使用了Oculus Link的用户将免费获得《Asgard’s Wrath》一份。任何兼容的Oculus Link线缆都可以(没有限定一定要官方的Oculus Link线缆)。

《精灵宝可梦Go》大更新:增加四季活动,提高玩家等级

Niantic在近日宣布了《精灵宝可梦Go》的最新更新。在此次更新中,玩家的等级上限将从40级提高到50级,最值得注意的是新赛季要开始了。四季庆典活动将于当地时间12月1日上午8点开始,其中包括新的天气动态,每个季节可捕获的不同宝可梦,以及更多地区性 游戏 活动等。

手游《动物之森:口袋营地》增加AR模式,提供一个月免费套餐

近日消息,任天堂EAD开发的电子 游戏 《动物之森:口袋营地》近日更新新增AR模式。《动物之森:口袋营地》在AR镜头模式与AR Cabin模式下,玩家能以不同方式将 游戏 中的角色带入现实。

上海的上班时间一般是从上午9点到下午6点,中午12点到13点是午休时间,但具体时间可能会根据公司的不同而有所不同。一般来说,上班时间会有一定的灵活性,但也要求员工按时准时到岗。上班时间外的时间,员工可以根据工作需要安排加班,但要按照劳动法规定的加班时长和费用来安排。在节假日期间,大多数公司都会放假,但也会有一些公司安排员工上班,一般情况下,员工会有一定的报酬。

参照 风宇冲Unity3D教程宝典之Shader篇:第四讲制作一个美丽的地球 和 Unity3D教程宝典之Shader篇:第五讲LOGO闪光效果

这两篇文章都是引入时间这一因素,进行shader的移动达到的效果

一、 风宇冲Unity3D教程宝典之Shader篇:第四讲制作一个美丽的地球

Shader "Custom/earth" {

Properties {

_MainTex ("Texture", 2D) = "white" { }

_Cloud ("_Cloud", 2D) = "white" { }

}

SubShader {

Tags{"Queue" = "Transparent" "RenderType"="Transparent"}

Pass {

CGPROGRAM

#pragma vertex vert

#pragma fragment frag

#include "UnityCGcginc"

float4 _Color;

sampler2D _MainTex;

sampler2D _Cloud;

struct v2f {

float4  pos : SV_POSITION;

float2  uv : TEXCOORD0;

} ;

float4 _MainTex_ST;

v2f vert (appdata_base v)

{

//和之前一样

v2f o;

opos = mul (UNITY_MATRIX_MVP, vvertex);

ouv = TRANSFORM_TEX (vtexcoord, _MainTex);

return o;

}

half4 frag (v2f i) : COLOR

{

//地球的贴图uv, x即横向在动

float u_x = iuvx + -01_Time;

float2 uv_earth=float2( u_x , iuvy);

half4 texcolor_earth = tex2D (_MainTex, uv_earth);

//云层的贴图uv的x也在动,但是动的更快一些

float2 uv_cloud;

u_x = iuvx + -02_Time;

uv_cloud=float2( u_x , iuvy);

half4 tex_cloudDepth = tex2D (_Cloud, uv_cloud);

//纯白 x 深度值= 该点的云颜色

half4 texcolor_cloud = float4(1,1,1,0) (tex_cloudDepthx);

//地球云彩颜色混合

return lerp(texcolor_earth,texcolor_cloud,05f);

}

ENDCG}}}

二、 Unity3D教程宝典之Shader篇:第五讲LOGO闪光效果

Shader "Custom/logo" {

Properties {

//_Color ("Color", Color) = (1,1,1,1)

_MainTex ("Albedo (RGB)", 2D) = "white" {}

//_Glossiness ("Smoothness", Range(0,1)) = 05

//_Metallic ("Metallic", Range(0,1)) = 00

}

SubShader {

Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}

Blend SrcAlpha OneMinusSrcAlpha

AlphaTest Greater 01

pass

{

CGPROGRAM

#pragma vertex vert

#pragma fragment frag

#include "UnityCGcginc"

sampler2D _MainTex;

float4 _MainTex_ST;

struct v2f {

float4  pos : SV_POSITION;

float2  uv : TEXCOORD0;

};

//顶点函数没什么特别的,和常规一样

v2f vert (appdata_base v)

{

v2f o;

opos = mul(UNITY_MATRIX_MVP,vvertex);

ouv =    TRANSFORM_TEX(vtexcoord,_MainTex);

return o;

}

//必须放在使用其的 frag函数之前,否则无法识别。

//核心:计算函数,角度,uv,光带的x长度,间隔,开始时间,偏移,单次循环时间

float inFlash(float angle,float2 uv,float xLength,int interval,int beginTime, float offX, float loopTime )

{

//亮度值

float brightness =0;

//倾斜角

float angleInRad = 00174444 angle;

//当前时间

float currentTime = _Timey;

//获取本次光照的起始时间

int currentTimeInt = _Timey/interval;

currentTimeInt =interval;

//获取本次光照的流逝时间 = 当前时间 - 起始时间

float currentTimePassed = currentTime -currentTimeInt;

if(currentTimePassed >beginTime)

{

//底部左边界和右边界

float xBottomLeftBound;

float xBottomRightBound;

//此点边界

float xPointLeftBound;

float xPointRightBound;

float x0 = currentTimePassed-beginTime;

x0 /= loopTime;

//设置右边界

xBottomRightBound = x0;

//设置左边界

xBottomLeftBound = x0 - xLength;

//投影至x的长度 = y/ tan(angle)

float xProjL;

xProjL= (uvy)/tan(angleInRad);

//此点的左边界 = 底部左边界 - 投影至x的长度

xPointLeftBound = xBottomLeftBound - xProjL;

//此点的右边界 = 底部右边界 - 投影至x的长度

xPointRightBound = xBottomRightBound - xProjL;

//边界加上一个偏移

xPointLeftBound += offX;

xPointRightBound += offX;

//如果该点在区域内

if(uvx > xPointLeftBound && uvx < xPointRightBound)

{

//得到发光区域的中心点

float midness = (xPointLeftBound + xPointRightBound)/2;

//趋近中心点的程度,0表示位于边缘,1表示位于中心点

float rate= (xLength -2abs(uvx - midness))/ (xLength);

brightness = rate;

}

}

brightness= max(brightness,0);

//返回颜色 = 纯白色 亮度

float4 col = float4(1,1,1,1) brightness;

return brightness;

}

float4 frag (v2f i) : COLOR

{

float4 outp;

//根据uv取得纹理颜色,和常规一样

float4 texCol = tex2D(_MainTex,iuv);

//传进iuv等参数,得到亮度值

float tmpBrightness;

tmpBrightness =inFlash(75,iuv,025,5,2,015,07);

//图像区域,判定设置为 颜色的A > 05,输出为材质颜色+光亮值

if(texColw >05)

outp  =texCol+float4(1,1,1,1)tmpBrightness;

//空白区域,判定设置为 颜色的A <=05,输出空白

else

outp =float4(0,0,0,0);

return outp;

}

ENDCG

}

}

}

动画

Unity-timeline(时间线)

莉萝爱萝莉

原创

关注

1点赞·430人阅读

1 简介

Timeline是一套基于时间轴的多轨道动画系统,它支持可视化编辑,实时预览。

这一个技术相对于其他动画系统,最大的区别就是,Timeline可以针对多个游戏物体做出的一系列动画,主要用于过场动画的制作,实现**级的那种分镜效果。

简单来说,它用于模拟类似pr的演出效果。

2 基本使用

1 安装

打开Package Manager安装,Unity2020默认安装TimeLine,可以通过Package Manager进行更新。

2 使用

在项目目录中右键创建Timeline文件

使用组件Playable Director来应用Timeline文件。

你也可以在Timeline面版中直接选择对象,为对象添加组件。

3 创建轨道

右键菜单,可以创建多种轨道

名称 功能

Track Group 将不同的轨道进行分类,相当于文件夹功能

Activation Track 控制物体的显示和隐藏

Animation Track 为物体加入动画,可以在场景中方便地录制动画,也可以是已经制作好的Animation Clip

Audio Track 为动画添加音效,并可对音效进行简单的裁剪和 *** 作

Control Track 在该轨道上可以添加粒子效果,同时也可以添加子Timeline进行嵌套

Signal Track 信号轨道,可以发送信号,触发响应信号的函数调用

Playable Track 在该轨道中用户可以添加自定义的播放功能

你也可以通过拖拽对象到面板来创建轨道

4 使用轨道

按下 F 聚焦当前选中轨道中的选中项。

按下 A 缩放整体到适应大小。

右键编辑或按 S 可对当前轨道元素进行分割。

按下 L 可锁住/解锁该轨道,防止误触。

按下 M 可禁用/启用该轨道。

将后一个轨道元素前推到前一个轨道元素中,可实现轨道元素的融合切换、渐入渐出。

1 动画轨道

可直接拖入动画文件或右键添加动画文件

点击红点在Timeline中创建动画。可双击创建出的动画或右键Edit in Window进行进一步编辑

右键创建的动画区域,点击Convert To Clip Track可将其封装为动画片段(Clip)

若动画后角色到(0,0,0)位置,点击轨道右侧的三个点进行设置->Track Offsets->Apply Scene Offsets

2 动画轨道

使用右键添加启用对象的动画区域

3 信号轨道

Signal Asset信号资源:是发射器和接收器之间的联系,可以在多个Timeline实例中复用。

Signal Emitter信号发射器:通过标记来显示,信号发射器包含对信号资源的引用。可以在Markers区域、Signal Track、或者其他轨道上添加信号发射器。

Signal Receiver信号接收器:带有一组反映(Reactions组件) 关联到信号资源。

创建信号轨道,或点击此按钮编辑信号。

右键 Add Signal Emitter 添加标记,创建或设定信号资源。

在任意对象中添加 Timeline Receiver,如果是信号轨道,需将其作为接收器。

为信号资源指定行为函数。

unity

动画

游戏引擎

i53470怎么样

精选推荐

广告

unity timeline控件

44下载·0评论

2018年11月29日

unity时间轴学习

1152阅读·0评论·0点赞

2021年4月4日

Unity中的Timeline

1059阅读·0评论·0点赞

2022年11月1日

Unity TimeLine实用功能讲解

65W阅读·8评论·30点赞

2019年3月16日

Unity Timeline下添加AnimationClip导致角色transform变化问题

669阅读·1评论·0点赞

2020年5月27日

Unity Timeline从入门到精通(四):片段详述

714阅读·0评论·1点赞

2021年6月23日

什么是学籍档案?怎么办理?

精选推荐

广告

Unity Timeline的使用

6682阅读·0评论·5点赞

2022年4月11日

unity代码控制Timeline的加载与播放

8417阅读·5评论·1点赞

2020年5月29日

Unity TimeLine使用教程

1953阅读·0评论·3点赞

2022年7月18日

Unity-Timeline制作动画(快来制作属于你的动画吧)

3374阅读·115评论·74点赞

2022年8月13日

Unity3D引擎中的Timeline使用方法

3520阅读·1评论·0点赞

2021年10月13日

Unity3D使用Cinemachine配合Timeline实现运镜效果

1142阅读·0评论·0点赞

2020年8月31日

Unity中的动画系统和Timeline(1) 普通动画创建

904阅读·0评论·1点赞

2018年10月14日

制作Unity的二维时间轴编辑器界面

5121阅读·4评论·0点赞

2018年8月22日

Unity2020新增的插件Cinemachine在timeline中的作用

688阅读·3评论·0点赞

2021年11月6日

Unity Timeline从入门到精通(一):理论概述

1463阅读·0评论·2点赞

2021年6月21日

Unity学习笔记——TimeLine的简单使用方法(一)

4485阅读·0评论·2点赞

2021年4月28日

Unity TimeLine使用详解 (自认为)

1293阅读·0评论·3点赞

2022年4月20日

UnityTimeLine系列教程——编排剧情!

304阅读·0评论·1点赞

2022年11月24日

去首页

看看更多热门内容

Unity的资源加载及管理,基础很重要。此篇文章作为近期梳理项目内资源管理器的一个小总结,尝试尽量用人话将Unity对资源管理的关键点梳理清楚,个人觉得比较适合像我这样刚入门且对AssetBundle还不甚了解的家伙。

我理解的资源管理

举一个不恰当的例子来描述我所理解的资源管理(因为我实在想不出更合适的例子了),想象一个画面:一个表演者,站在一个台子后面,面向观众,按照规定的剧本, *** 作着台子后面不被观众看到的箱子,从里面不断的取出和放回各种新鲜的玩意儿,一会这么组合,一会那么拆散,博观众的眼球,最终完成表演。

我没有当表演者的经历,虽然我很想尝试,但想想也觉得这肯定不容易:

1、如果箱子里的东西都太大,拿起来会很费劲。

2、如果太小呢?恐怕会拿很多次。

3、不用的道具不收?放在台子上会影响接下来的表演。

4、用过的道具收了吧。万一收了后面需要的道具,一会儿用的时候还要再费劲拿一次,不拿的话吧还容易导致表演失败。

带着问题看文章

是选择合适的时间取出资源,并在合适的时候释放它们,尽可能保持较低的内存占用;还是选择让资源常驻内存,换取更快的读取和计算速度?如何在时间和空间上做出平衡,才能最大的提升游戏体验?我以为这些就是资源管理的目标和意义。可惜这并非易事。这不仅需要结合项目的实际情况,更需要丰富的实战经验。

但是在这里,你将不会看到任何可以参考的经验或建议,因为我也不知道啊。

无论你是否单身,在Unity的世界里,你都不愁找不到对象,因为一切都是对象。

无论是纹理、音乐还是预制体,在进入Unity的世界后,都变成了各种对象供我们使用,例如纹理转变为Texture2D或Sprite,音效文件转变为AudioClip,预制体变成了GameObject等等。这个由Asset(资源文件)转变为Object(对象),从磁盘进入内存的过程,就是实例化。而对资源进行的管理,本质上是对Object的管理。

“小当家,这个黄金炒饭是怎么加载出来的?”

简单介绍一下Unity加载资源的流程

在介绍Unity的资源加载机制之前,先举一个生活中的例子,来辅助我们了解Unity是如何工作的。

因为我从小热爱欧洲文学,所以在这就拿我最喜欢的《三国演义》做例子,我们都知道书中多次提到 “集齐七颗龙珠,就可以召唤神龙,并帮你实现一个愿望” 这种说法。

咸鱼都有梦想,何况一个上了岁数的程序员呢?但是很可惜,我们一颗龙珠都没有,为了凑齐这七颗龙珠,我们首先要知道它们分别在哪。一摸左兜,哎?发现了一本《召唤神龙的小诀窍》,里面记录了召唤神龙所必须七颗龙珠的 所在位置、大小、颜色以及如何使用等非常关键的信息 。

根据《召唤神龙的小诀窍》指引,我们知道原来第一颗龙珠藏在了素有小巴黎之称的北京通县,可是通县在哪儿呢?一摸右兜,原来这还有一本1986年出版的《中国地图》。那就放心了,出发吧!

终于,历经了81难,我们来到了目的地并最终找到了这颗龙珠。费这么大劲找到的龙珠,当然应该认真记录下来,于是我们马上掏出一个黑皮小本本,认真的记下: “第一颗龙珠放在背后小书包的左边缝有一个机器猫的侧兜里” 。

最终,经历了无数艰难险阻,我们凑齐了七颗龙珠(所以说人只要肯努力,老天就一定回馈你,至少让你知道你浪费了时间啊)。金光一闪,我们召唤出了神龙 后面实现了什么愿望我们不谈,因为谁没有点小秘密呢。

现在,让我们来回顾一下整个过程

1、这条召唤出来的神龙,就好比我们想要实例化的对象,就比如游戏对象吧,因为它相对复杂些。而这七颗龙珠呢,就好似组成这个游戏对象所必须的各种组件(Component)、纹理(Texture)、网格(Mesh)等等。

2、《召唤神龙的小诀窍》就好比我们读取的这个prefab文件,它记录了组成这个GameObject所必须的其他对象以及它们的位置。

重点来了:File GUID 及 Local ID。

File GUID

Unity会为每一个加入到Assets文件夹中的文件,创建一个同级同名的meta文件,虽然文件类型的不同会影响这个meta的具体内容,但它们都包含一个用来标记文件身份的File GUID。

例如,如果一个资源引用了另一个外部资源,比如一个Prefab引用了其他脚本、纹理或Prefab等,则一定会标明引用资源文件的File GUID。

Local ID

如果说File GUID表示为文件和文件之间的关系,那么Local ID表示的就是文件内部各对象之间的关系,打开一个Prefab文件可以很清晰的看到:

(点击上图,可放大查看)

一个对象通常是由 一个或多个 对象构成,每个记录在&符号后面的数字都是一个Local ID,每一个Local ID也表示这它将来也会被实例化成一个对象。也就是说,当一个prefab文件要实例化成一个GameObject时,它会自动尝试获取其内部Local ID所指的那个对象。如果这个所指的对象当前还没有被实例化出来,那么Unity会自动实例化这个对象,如此递归,直到所有涉及的对象都被实例化。

3、我们可以发现手中没有龙珠,是因为我们手中的黑色小本本,并没有记录龙珠装在书包的那个位置里;同样,Unity通过 Instance ID ,来获取或判断一个对象是否已经被加载完毕。 Instance ID由File GUID和Local ID转换而成,可以简单理解成是记录了资源所在内存地址的写着数字的钥匙牌。

每当Unity读入一个File GUID和LocalID时,就会自动将其转换成一个简单好记的数字牌,因为通过File GUID和Local ID定位资源的效率并没有直接解引用一个地址那么快。

如果发现这个牌上并没有挂着一把钥匙,表示当前这个这个资源还在磁盘中,尚不在内存里(没有加载);相反,如果这个牌子上有一把钥匙,表示这个资源已经被加载完毕,你可以快速的找到并使用它。

Unity会在项目启动后,创建并一直维护一张“映射表”,这张映射表记录的就是File GUID、Local ID以及由它们转换而成的Instance ID之间的关系,这样下次在请求资源时就可以快速的通过查看钥匙牌来获取资源了。

4、刚才的例子里,因为没有龙珠(资源没有加载),因此我们必须经历一场前往小巴黎的历险(LoadingAsset),而能够帮助我们准确定位北京通县的86版《中国地图》,可以近似理解成是 Unity维护的一套将GUID和FileID解析为数据源地址的机制, 这套机制中的信息,来自于:

(1) 场景加载时,Unity收集了与该场景关联的资源信息。

(2) 项目启动时,Unity收集了所有Resources文件夹下的资源信息。

(3) 读取AssetBundle时,Unity获取了AssetBundle文件的头部信息(Header)。

可以理解为:随着Unity知道更多的信息,这套机制将能够解析并定位更多的GUID和FileID。

5、当我们费劲千辛万苦找到龙珠后,记录在小本本上的7条位置,就好比7个能帮助够准确定位内存位置的Instance ID。想象一下,当我们下次再看到诸如《三颗龙珠召唤小神龙》这样的小诀窍( 另外一个prefab ),便可直接打开小本本( 查询映射表中的Instance ID ),对着编号及位置从书包里掏出龙珠( 对InstanceID所指的内存地址进行解引用 ),啪啪啪一 *** 作,小神龙这个游戏对象就能很快被召唤出来了,再也不用去什么通县了,可以节省大把时间,想想就觉的美滋滋呢。

AssetBundle

AssetBundle(阿赛特邦豆)是Unity官方推荐的资源加载方式,网上对AssetBundle的介绍有很多,且在了解了Unity对资源的加载机制后,其本身没有什么特别难以理解的地方了,因此在这不过多介绍,仅挑选几个关键点进行阐述。

AssetBundle的生成

生成AssetBundle有很多种方式,在此仅简单说一下比较常用的方式,使用BuildPipeline生成AssetBundle文件。

每一次调用BuildPipleLineBuildAssetBundles时,将会生成一批AssetBundle文件,具体数量根据传递AssetBundleBuild数组决定, 每一个AssetBundleBuild对象将对应一个AssetBundle及一个同名+manifest后缀文件 。其中AssetBundle文件的后缀用户自行设置,比如"unity3d","ab"等等;而manifest文件是给人看的,里面有这个AssetBundle的基本信息以及非常关键的资源列表。

除了AssetBundleBuild数组所定的AssetBundle外,还将额外在output路径下生成的一对与output文件夹同名的文件及一个同名manifest后缀文件。这个同名文件可厉害了,它记录了这批次AssetBundle之间的相互依赖关系。当然manifest文件还是给人看的,我们可以用它分析资源间的依赖关系,但是在项目实际运行时,Unity并不会关心它。

(点击上图,可放大查看)

可以通过这张图来看一下每次Build后资源的对应关系,当然这都不如你自己亲自Build一次看的清楚。

AssetBundle的加载

根据AssetBundle文件所在的位置(本地、远端),AssetBundle有不同的加载方式,在此仅总结最常用的本地AssetBundle文件加载。

我个人将AssetBundle拆分理解为: Bundle加载 和 Asset加载 两部分。因为AssetBundle文件可以从功能上分为两大块:

1、记录文件标记、压缩信息、文件列表的Header部分;

2、记录资源实际内容的Data部分。

当使用AssetBundleLoadFromFile或LoadFromFileAsync时,在pc平台及移动平台上,unity 仅会为我们读取AssetBundle的header部分,并不会将bundle的data部分整个读入内存。

当调用上一步生成的AssetBundle对象读取具体资源时(LoadAsset, LoadAssetAsync, LoadAllAssets),Unity会参考已经缓存的文件列表,找到目标资源在data部分的位置并读入到内存中。

如果一个资源引用到了其他资源,则必须要先读入被引用资源的AssetBundle文件,否则就会发生引用Miss。 这就好似召唤神龙时,通过《召唤神龙的小诀窍》得知第一颗龙珠在北京通县,但是当打开《中国地图》时,北京的地方被抠了一个窟窿,我去,这样我们就无法通过它准确定位龙珠位置了,只有六颗龙珠召唤出的神龙,当然有一部分是Miss喽。

为了避免上面Miss的情况,在加载资源时, 首先需要将该资源的依赖项全部加载完毕,不过仅需加载依赖资源的AssetBundle文件。 也就是说,我们只要将该依赖AssetBundle的Header部分加载(AssetBundleLoadFromFile或LoadFromFileAsync)就可以,这样在真正读取Asset时,Unity会自动处理好真实依赖的Asset,我们不用 *** 心。

AssetBundle的依赖关系如何读取呢?加载上面提到的那个很厉害的文件就可以了。

(点击上图,可放大查看)

非常简单的获取依赖关系的方法,通常会在项目启动时将全部依赖关系保存下来。

AssetBundle的使用

当AssetBundle被成功加载后,调用该Assebbundle对象的LoadAsset、LoadAllAssets或对应的异步版本即可加载资源,也就是实例化对象。如果这个对象已经被加载过,Unity并不会重复加载,还记得之前所说的映射表么,被加载过的资源就好比挂上了数字牌的钥匙,直接对地址解引用即可。

AssetBundle的卸载

如果说AssetBundle真的有什么容易出问题的地方,那恐怕就是卸载了。

在这里只说最常用的这个卸载方法吧:

public void Unload(bool unloadAllLoadedObjects);

一个被加载过的AssetBundle可以通过调用Unload来卸载这个Bundle下所有的Asset。但是调用这个函数时传入的参数 对卸载结果影响甚大。

Unity官方对这个函数的讲解非常详细,配图也非常直观,因此我只是简单总结一下。

相同点:

无论传入参数为 true 或是 false,调用Unload都可以Destroy当前AssetBundle对象,释放之前从AssetBundle文件中的Header部分所获取的信息。当然,被释放的AssetBundle对象无法再使用诸如LoadAsset、LoadAllAssets等函数加载资源。

不同点:

unloadAllLoadedObjects == true:

不仅Destroy了AssetBundle这个对象,而且 这个AssetBundle下包含的所有对象,只要实例化了,有一个算一个,统统释放掉。

感觉就像

foreach(Object  asset in assets)

if(asset != null)

delete asset;

asset = null;

比如你通过abLoadAsset(apple)后,将apple设置给go_0的一个Renderer,如果这时候abUnload(true),那go_0就傻了,咋回事儿啊,图咋没了呢?WTF啊。

它的好处是: 不会有重复资源问题的情况发生,每次都处理的干干净净。

unloadAllLoadedObjects == false:

仅仅Destroy了AssetBundle这个对象,但是并没有释放这个AssetBundle下的任何Asset,因此如果有对象引用了这些Asset,也不会有问题。

它的风险(代价)是:下次再Load这个AssetBundle,并且通过这个AssetBundle重新读取了这个Asset,会在内存中重新创建一份,这样如果之前的Asset没有被释放,那么现在内存中就有两份Asset了。

这种情况如果频繁发生,便意味着内存中有很多资源将“不受控制”,容易引发内存占用过高的问题,而释放这种不受控的资源,仅有两种方式:

1、当没有对象引用到这些不受控资源时,每次调用ResourcesUnloadUnusedAssets,回收之。

2、加载场景时,如果加载模式没有设置为LoadSceneModeAdditive,则会自动调用ResourcesUnloadUnusedAssets。

同样,再举一个生活中的小例子以阐述这两种释放的差异吧:

小A交女朋友时喜欢送心形的石头给对方,这天小A认识了一个女孩,并确定了关系,送了一个精心挑选的心形石头给她,海誓山盟又云雨一番后,第二天由于感情不和等原因两人分手了。小A是个暖男,他为了女孩能彻底忘记优秀的自己并开始一段新的感情,约见了女孩,将之前送给女孩的石头拿(搬)走了,从此注销了微信消失在茫茫人海中。

确实,小A喜欢强壮的女孩,因为这样比较有安全感。

小B交女朋友时也喜欢送石头给对方,周一小B认识了一个女孩,并确定了关系,送了一个精心挑选的石头给她,海誓山盟又云雨一番后,第二天由于感情不和等原因两人分手了。但是小B家里是开石材加工场的,他并不关心这块石头,”送了就送了吧,至少我经历了浪漫的爱情“,小B这么想。并注销了微信消失在茫茫人海中达1天之久。

周二的时候小B重出江湖,并认识了一个新的女孩,确定了关系,第三天第四天啪啪啪第七天,第二周的时候,江湖上就出现了一个传说,集齐小B凑齐的七颗石头,便可以召唤神龙,于是就回到了文章开头我们提到的那个故事。

没错,小A对应的就是Unload(true),而小B对应的则是Unload(false)。

补充三点

1、移动Unity资源时,要在Unity编辑器内拖动,不要在 *** 作系统下剪切粘贴。因为这样Unity会为这个文件生成一个新的File GUID及meta文件,它会打破之前建立好的关系,让所有引用过这个文件的prefab出现miss的情况。

2、实际上在项目build完成后,就已经不存在File GUID和Local ID的概念了,转而用相对简单方式建立映射,这也是为什么我们在项目运行的过程中无法获取到File GUID的原因,不过原理上它们是一样的。

3、尽管一个AssetBundle的Header部分非常小,通常只有几十KB,但是Unity并不能保证读入大量AssetBundle的Header部分后资源的加载效率。因此还是按需读取AssetBundle吧。

以上就是关于87周报:OPPO发布新AR眼镜;苹果高管称AR拥有巨大潜力全部的内容,包括:87周报:OPPO发布新AR眼镜;苹果高管称AR拥有巨大潜力、unity上海上班时间、unity 随时间变化的shader(20170301)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/9613943.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存