学习开发VR需要掌握哪些知识

学习开发VR需要掌握哪些知识,第1张

以下是学习VR开发所要经历的阶段及其相关学习内容(龙图教育提供):

1、VR开发基础阶段:

C#基础语法,OPP面向对象,网络通信,算法与设计模式等。

2、VR开发初级阶段

Unity3d操作基础,光照系统、地形系统使用,物理系统、粒子系统的使用,常用插件、以及脚本绑定;GUI以及UGUI、插件NGUI介绍,虚拟演示项目制作。

3、VR开发高级阶段

VR物理系统高级部分;VR动画系统高级部分;VR内置寻路系统Navgattion计算图形学与Shader,单项项目讲解(飞行类),局域网对人在线项目讲解(飞行类)。

4、VR开发实战阶段

服务器:设计模式,通用协议;xml与sqlite socket;对象池技术,全局事件技术。

实战项目:虚拟演示(房产旅游);飞行类游戏,空间定位,fps射击游戏。

平台调试发布:项目调试,设备适配,平台发布项目。

总计4个阶段其他地方可能具体有所不同,学习周期为半年左右,一般具备一点开发编程基础更容易上手。龙图教育作为全球游戏50强教育品牌,是首家开设VR系统教学的,同时也是游戏研发运营兼备的教育机构,专注VR的产业化一体化教学。

如果对楼主有帮助,给个采纳好不,谢谢啦

Photon和KBEngineunity3d是最适用Unity3d游戏开发的两个服务器引擎,但它们还是有区别的,只有清楚地了解区别在哪才能正确使用,下面简单描述下两者的共同点和不同点。

语言

对于大部分的程序员语言简直就是宗教信仰。

Photon使用C#开发,当然使用者也是用C#进行各类游戏功能开发。前后端同种语言,这对使用Unity3d游戏开发也有很大的好处。

KBEngine使用C++开发,逻辑开发是用python,也是很不错很快速的。

开源与收费情况

Photon是Exit Games公司的产品,不开源,有好多种收费模式,官网上可以看到。开发阶段可以用免费的license,后期可以看流量用户活跃度来选择付费模式。后续的支持,似乎是免费的,你可以选择邮件或是到论坛发帖求助,当然是E文。

KBEngine是国人开发,开源免费,但从官网上并没有看到商业使用的案例。有中文论坛,你可以在论坛上向开发者求助。

虽然两者的模式不同,但作为一个Unity3d游戏开发者,我们最希望的其实是把游戏引擎当作一个安全稳定的黑箱。

操作系统

之前说了Photon使用C#开发很自然的,配套的工具也是使用C#,比如最重要的PhotonControl。所以开发环境和生产环境最好都是windows。

虽然在跨平台上有mono,在服务器代码部分是系统无关的,但是不管你信不信,我是不信它的一套窗体工具也能运行在Linux下。反正,官网说法是,开发和生产环境都是用windows。

KBEngine建议开发环境选择Windows,生产环境选择linux。毕竟你总不希望开一组服务器打开9个Console窗体,一不小心把哪个点X了吧~

协议

Photon有自己的序列化反序列化方式,你也可以使用protobuf这类的来做应用层传输协议。

KBEngine在这方面表示不支持自定义协议,它帮你选择了有效的方法来处理,如果你习惯了他规定的方式,会喜欢上的。

看法

在功能上,我毫无疑问地更喜欢KBEngine,脚本化和自动持久化是极富魅力的功能。而Photon几乎没做这方面的功能,可能和老外的观念有关系。就目前我对两者功能的理解看来,Photon其实是个和SuperSocket差不多的东西,而SS是作为轻量级服务器框架存在的,Photon却是说自己是Unity3d游戏引擎,除去提供的MMO示例代码(未解读),没看到什么游戏引擎的魅力。

Unity3D游戏引擎支持的平台:PC, Mac OS, Web, iOS, Android, XBOX360, PS3, Wii。这种跨平台能力,让人很难再挑剔了。特别要关注的是Web,iOS和Android平台,这几个平台的重要性不用多说了。

全新的授权、盈利模式

过去的游戏引擎都是通过卖license赚钱的,现在Unity3D打

破了这一常规,除了收费的license还提供了完全免费的简化版本,而且另外提供了Union和Asset

Store销售平台,任何游戏制作者都可以把自己的游戏放到Union平台销售,赚到的钱二八分成。Asset

Store更是为单个的美术资源提供了一个销售平台,一个模型或一个骨骼动画都可以拿到这里销售,为游戏开发者提供了一站式的销售、开发平台。

免费的license一方面扩大了用户群,另一方面也可以通过Union平台来为Unity3D带来额外的收入,可以说是一石二鸟。

开发:

脚本语言在Unit3D游戏开发中占据了主角的位置。Unity3D提供了三种脚本语言的支持:Javascript、C#、Boo,Boo是

Python在Net上的实现。值得注意的是Unity3D通过Mono实现了Net代码的跨平台。这样对数据库、xml、正则表达式等技术的支持都

因为采用了Net而得到完美的解决。

脚本语言的动态特性让我们可以方便的通过名称、层次结构、tags等方式访问所有的对象。当然更大的好处是脚本语言的跨平台性,绝大部分平台相关的代码都放到了引擎的内部,而游戏内容相关的代码都可以跨平台执行。游戏开发者终于可以不再为跨平台头疼了。

渲染:

支持100多种光照材质shader,20多种后期处理效果。Unity3D的surface

shader还是比较灵活的,可以非常自由的定制。不过不清楚后期处理有没有提供这么灵活的扩展能力。当然Unity3D提供的各种后期处理效果已经非常

优秀了,扩展能力更多的是体现架构的可扩展性。

Unity3D的渲染性能优化也是比较有自己的特色的。

其他:

Unity3D对网络通信的支持比较全面,不过开发MMO的话还是不能满足需求的。因此Unity3D推荐了几个MMO的服务器平台可以配合使用,

包括Electrotank Universe Platform, Photon Socket Server, Smartfox

Server。另外Unity3D可以直接运行在浏览器页面内也是未来的一个趋势。

Unity3D提供的Unit Asset Server方便了对游戏资源的管理和版本控制。

Unity3D提供了包括编辑器、beast渲染器、tree creator等大量的辅助工具。

最近被一个问题纠缠了好久,终于找到解决办法,这里做个记录。

我们做的一款游戏在编辑器里跑的好好的,一打包的手机上就各种崩溃;

而且是不确定什么时候出现,用logcat查看了系统日志,就看到是异常地址访问的log,没有什么有价值的信息。

重复试了好多次之后,发现每次进一个测试关卡的时候必闪退,于是一路上加日志,希望能知道是哪一句导致程序崩溃。

加到最后,场景加载完了,一切都正常。可以推断加载场景过程没问题,应该是在某一个组件脚本的update里面出问题的。

这下线索又断了,因为挂update的组件太多,而且不知道有哪些组件运行;这里就想到一个想法,我们以后的代码应该都由程序自己去调用update,

不要直接用u3d的update,这样我们可以很容易的知道哪些代码在运行,而且是可以保证调用次序的。

接着想了个办法,就是进场景后,逐个把有update的函数禁用,发现某个组件禁用后就不闪退了,于是问题定位到这个组件的update函数。

通过逐条的增加日志,最终定位到一个空引用访问上,导致程序在安卓机上闪退!怀疑是安卓sdk在运行时的jit直接变成了机器指令,导致可能的空异常。

这个问题让我很惊讶,原来以为会抛出空引用异常,没想到很c#的空指针访问一样会导致进程崩溃。于是组织大家把所有可能为空的地方排查可一遍。

另外在编辑器里没问题,是因为编辑器里加载资源是同步加载的,所以加载完直接使用加载后的对象是没问题的;

但是在手机上要从assertbundle中加载,使用了异步过程,会导致后续的访问可能存在访问空异常;

于是把编辑器里的加载也改成异步加载,编辑器中就能跟手机上一样的加载过程,尽量暴露手机上运行可能出现的问题

  Unity会下载Assetbundle本地中,它的工作原理是先通过(版本号和下载地址)先在本地去找看有没有这个Assetbundle,如果有直接返回对象,如果没有的话,在根据这个下载地址重新从服务器或者本地下载。这里版本号起到了很重要的作用,举个例子,同一下载地址版本号为1的时候已经下载到本地,此时将版本号的参数改成2 那么它又会重新下载,如果还保持版本号为1那么它会从本地读取,因为本地已经有版本号为1的这个Assetbundle了。你不用担心你的资源本地下载过多,也不用自己手动删除他们,这一切的一切Unity会帮我们自动完成,它会自动删除掉下载后最不常用的Assetbundle ,如果下次需要使用的话只要提供下载地址和版本后它会重新下载。

  我们在聊聊Assetbundle 中的脚本,在移动平台下Assetbundle里面放的脚本是不会被执行的,还记得我们打包前给两个Prefab挂上了脚本吗?在手机上将Assetbundle下载到本地后,加载进游戏中Prefab会自动在本地找它身上挂着的脚本,他是根据脚本的名来寻找,如果本地有这条脚本的话,Prefab会把这个脚本重新绑定在自身,并且会把打包前的参数传递进来。如果本地没有,身上挂的条脚本永远都不会被执行。

  在Prefab打包前,我在编辑器上给脚本中的变量 name 赋了不同值,当Prefab重新载入游戏的时候,它身上脚本的参数也会重新输出。

  如果你的Assetbundle中的Prefab上引用的对象,那么这样做就会出错了,你需要设定他们的依赖关系。或者运行时通过脚本动态的载入对象。

Unity3D中的多线程。线程是一个相当复杂的话题,但如果掌握了它,就可以从容的使用多个硬件处理器或处理很难划分管理数据块。

如在场景中用A算法进行大量的数据计算,变形网格中操作大量的顶点,持续的要运行上传数据到服务器,二维码识别等图像处理,如果同时你要处理很多事情或者与Unity的对象互动小可以用thread,否则使用coroutine。

线程是在程序中与其他线程同时运行的进行。在多处理器的计算机上可以做到多个线程的真正的同步,更多的线程取决于有多个处理核心。

Unity3D编程时,总有个主线程执行你的代码,也可以创建额外的线程和主线程同时运行。而Unity中,你仅能从主线程中访问Unity3D的组件,对象和Unity3D系统调用。任何企图访问这些项目的第二个线程都将失败并引发错误,这是一个要重视的一个限制。

所以当你写代码时,你认为一个函数开始并达到它执行的点后返回,同样你做的东西又在另外一个函数中执行,但又没有发生单龚厕夹丿蝗搽伟敞连相应的变化。操作系统决定你代码的执行,任何时候,你的代码只能暂时”休眠”掉,然后让另外的代码开始运行。

Unity3D中的多线程及使用多线程

在这个例子中,在第一个线程将A的值加载到CPU寄存器中准备+1后被中断,第二个线程来读取A的值,并减去1000,这时A应该是-950,现在第一个线程重新开始,它在寄存器中的50+1的结果存储于A,A变成了51,而-950已经丢掉了。

从根本上说,要在用多个线程在同时对变量或内存访问时,要采取很多预防措施来确保不会发生这样的事。所以Unity决定从另外线程访问这些变量或者内存是无效的,只是为了避免所有系统和框架对象出现问题。所以要确保一次只有一个线程来修改变量,这不意味着你不能用多线程工作,你可以用”排序”来解决这个问题。

C#中有lock这个关键字,以确保只有一个线程可以在特定时间内访问特定的对象,这里说对象是因为。法锁定一个类型值(value type)或原型(primitive)。

int a = 50;

object guard = new object();

void ThreadOneCode()

{

//一些代码在这

lock(guard)

{

a = a + 1;

}

//其余一些代码在这

}

void ThreadTwoCode()

{

//一些代码在这

lock(guard)

{

a = a - 1000;

}

复制代码

所有都锁定在guard内,保证同一个时间只有一个线程通过guard访问它,你可以使用任何合适的对象。现在你可能会有各种各样的问题,比如你要锁定的不止一件事,可能是互相嵌套的。那我们该怎么办呢

我们这个类叫Loom,让你可以轻松在另一个线程运行代码,这里有两个要注意的功能:

RunAsync(Action)-在另一个线程上运行的一组代码

QueueOnMainThread(Action,[可选]float time)-运行在主线程的语句(可选延迟)

用LoomCurrent访问Loom-创建一个看不见的GameObject用来处理游戏主线程的互动,下面这个例子用Loom来更新一个网格所有的顶点乘的结果。

//缩放一个网格在第二个线程

复制代码

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 学习开发VR需要掌握哪些知识

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情