Daydream/Unity技術:
Unity动态加载R素材-- 使用ScriptableObject和AssetBoudle
by 高煥堂
一、背景说明:
如果您还不熟悉R素材与A素材,请您参阅:Real素材的有机次序。
大约半年前,我为了想参与与HTC 的Vive X加速器计划而设计了<VR+医疗MRI行业平台>。<R素材>概念和名词也是我当时提出的。这样的<VR行业平台>架构也适合于建立特性产业的素材和App平台。例如,台湾的莺歌镇是陶瓷/琉璃设计小城,台湾三义乡则是木雕艺术城市,这些木雕、陶瓷、琉璃设计的商业产品的虚拟化3D模型,都可以成为VR的R素材,管理在平台上,我又鼓励台北铭传大学传播系学生来帮忙做<VR+广告>的App以进行VR营销,就变成一个VR电商平台了。无意中,发现了很棒的校企产学合作机会,不亦乐乎。最近,台湾著名的IT杂志CTimes也专文报导这项VR行业平台的商业意义和经济价值。
这项平台技术方案也公布于HTC Vive官方论坛上。请参阅HTC Vive开发者论坛文章:" 如何在Vive上开发<VR+行业>应用"
--- https://www.vive.com/cn/forum/chat.php?type=developer
或者 --- https://www.vive.com/tw/forum/chat.php?type=general
二、<VR行业平台>的经济价值:
记得半年前,我把素材区分为两种:A素材与R素材。一开始,我并不是基于客户的方便性(Artificial)与需要性(Real)而区分的。而是从系统(产品)角度来区分的。因为平台最关键在于强势型API的制定权在谁手上,例如Android平台的SDK/API制定权在Google的OHA联盟手上,即使HTC把手机终端产品和UI做得再好,都会因API受制于人。
基于强势型API的制定权,就把素材分为两种,然后透过我定义的API在我的平台上自由组合成为VR App,也就俗称的VR内容(content)了。这就如同日光<灯座>与<灯管>之间的关系了。
从系统(产品)面来看,两者的区分在于:A素材是”Early-binding at development-time”就是在开发阶段就绑进去App(如房屋)里一起编译、连结,并和一起上传下载。而R素材是”Late-binding at run-time”,就是在App运行(房屋入住)阶段才透过API到平台上取得R素材来与装配上去。
把它对应到<VR+教育>领域上,就<VR教育平台>而言,教育只是手段,专业知识(如烘焙)才是R素材。同样一份R素材,搭配百花齐放的A素材和硬件设备,就呈现出多种表现了。例如,烘焙R素材可用古老(有框)AR呈现,可用Hololens新(无框)AR呈现,也可用Daydream VR呈现之。由于传统VR应用开发者大多力求讨好更多用户,包括2C、2B,都是在追求复制性。而在我的平台上,开创一个新的复制面向:复制到360行业!
所以我特别强调<行业>。帮行业的创作(R素材),找更多呈现,找更多客户群。也就是旧R素材(搭配A素材成新产品)、卖新客户。而不是传统上,在老掉牙的客户群,帮他找更多东东给他们(新产品卖旧客户)。因为VR的2C不行,C不会给更多$,我们却花更多成本,就赔$了,富贵远去了!
反之,我则鼓励大家寻求更多C群,分担精致R素材的高成本,给予C中价位,高质量VRAR内容。创业者从单一行业(R素材)出发,逐渐复制技术(及A素材)到不同行业,也分担了技术及A素材的成本。一方面,透过更多C群,分担R素材成本。另一方面,透过更多行业,分担技术及A素材成本。因而A、R素材和技术都高质量,成本因分担而下降,创造了物美价廉。若因物美占有市场,若因物美而价高,富贵相随矣!
三、实践技术:使用Unity的ScriptableObject和AssetBundle方法
其中,大家比较常问的是:R素材必须动态加载,而不能再开发段就绑入App里,如下:
其中,基本需求是:不要将红绿灯的构型绑入App,而直到用户运行VR App时才到伺服端实时取得红绿灯素材。那么,在实际的Daydream或HTC Vive体验平台上,又如何实现这项实实取得呢?
其实践方法有许多种,如果您使用Unity编辑器,最简单的途径就是使用Unity的ScriptableObject技术。我们可以使用 ScriptableObject 在 Project view 建立专用的 Asset 来做设定,并将它存放在Resources文件夹中。当VR App运行中,需要用到时,才调用 Resources.Load()函数来取到设定值,若有任何修改的话,只要打开 Project view 内的 Resources文件夹修改一下即可。
通常,一个行业的R素材资源是相当多的,而且会时常更新的,这些庞大资源全部绑入App里,本身就不合理。于是,就可以进一步将ScriptableObject打包成为AssetBundle。我们的VR App可以掌管主要逻辑或线程,当有需要某些资源(如R素材),才从外部的 AssetBundle 加载资源,这样我们常常只需要重新打包资源(R素材)的部份就能完成更新,而不需要重新编译App。
如果不是使用Unity编辑器,也可采用其他技术,例如运用Android/Linux平台上的*.SO,或者Windows平台上的DLL来实践动态加载。其技术细节,之后再来帮您解释了。
高煥堂 教您架构思维,富贵藏在...
==>请看内容
~ end ~