学习开发VR需要掌握哪些知识
以下是学习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来更新一个网格所有的顶点乘的结果。
//缩放一个网格在第二个线程
复制代码
0条评论