八、预制(Prefab)

仅此一点提出,由于它使用过于频繁。

还Unity 一中的核心要素。原本Unity你拖放模型到场景中的一个对象,或者,创建一个几何。或浅的地形。个物体的偏移、旋转和缩放。然后绑定好脚本,设置好參数。假设想要第二个相同物体的话。复制一份。可是问题来了,假设有一个问题须要这n个物体都进行改动,那么就要操作n遍。这个时候预制就体现出威力了,你能够拖拽场景中的物体到下方的资源浏览窗体中,这样一个新的预制居创建出来了。

场景中的n个物体都是通过预制创建的,那么直接改动预制。场景中的这些物体就都会对应的进行改变。相同,改动完场景中的属性,然后点击属性窗体中的Applybutton,预制也会被改动。唯一例外的组件是Transform组件,它不会被预制改动。

除此之外的其它组件。包含脚本配置的參数都会被改动。

能够简单的理解为预制就是一个配置文件,记录了物体和相关的配置參数。

而非常多时候,我也确实拿它来做脚本配置,比方实现技能系统的时候。每一个技能都是一个预制,给它绑定好相应的脚本,配置好技能參数。然后游戏中释放技能的时候实例化这个预制就能够了。

之前有一个问题一直困扰着我,我想要预制支持这样一个功能,它当中的參数能够序列化到场景文件里。可是又不会受到Applybutton的影响。这样我就能够方便的把一个预制拖动到场景中,复制n份。分别做场景编辑的配置。并且不用操心我一不小心点了Applybutton把全部的场景全玩砸了。

只是如今想来。这个功能全然能够不用预制来实现,扩展一下菜单功能直接生成并组装好物体就能够了。

总之,Unity中尽量使用预制来载入模型和其它资源。而不要直接使用,这个是一个正确的思路和方向。

很方便,而且易于维护。

九、文件系统和AssetsBundle

既然讲到Prefab了。就顺带把Unity的文件系统也解说一下。

在手游兴起之前,Unity特长是页游开发。这个是虚幻等引擎不具备的功能。文件打包系统和AssetsBundle就是当中重要的一环。

Unity游戏执行的是一个场景,默认会载入一个场景,代码中能够通过Application.LoadLevel来载入其它场景。游戏执行时仅仅会存在一个场景。载入一个新的场景,旧的场景资源会被释放掉。

当然Application.LoadLevelAdditive能够把一个场景加入到当前场景上。每一个脚本都能够使用DontDestroyOnLoad函数。声明当前对象不会在场景载入的时候被销毁掉,经常使用于单例模式。

Unity打包游戏资源的时候会依据当前场景中依赖的资源进行筛选。没有被使用到的资源是不会被打包的。图片被打包的时候还会依据配置进行纹理压缩,这个功能很方便并且强大。借助于这个功能,你不须要各个平台维护一套资源,Unity自己主动帮助你搞定了。

当然Unity把转化后的文件缓存起来了,所以切换平台的时候这些文件会又一次压缩一遍。

所以我建议一个平台checkout一份project。这样就能够避免多平台切换时的时间消耗了。

Unity导出后的资源命名为level(N)和sharedassets(N).assets。你不能直接读取一个文件,全部文件必须存在于场景中,或者是被场景中的某一个物件的脚本引用到。

这样的模式在制作简单的游戏或者小游戏的时候非常方便。可是游戏大了就力不从心了。我们实际游戏开发中大多数碰到的还是动态载入的情况。

比方我如今的游戏就仅仅有一个场景,里面仅仅存放了几个简单的管理类。

全部须要的界面、场景都是执行时动态载入的。这个时候我们须要把资源(更确切的说是预制。Unity会自己主动依据依赖关系进行资源查找和打包)放到Resources目录下。放到这个目录下的资源不管场景有没有使用到都会被导出。而且代码中能够使用Resources.Load("文件路径")来载入这个物件。

载入好物件后再通过Instantiate函数实例化这个对象,然后就能够正常使用了。

最后再说一说AssetsBundle,这个也是一个小的文件系统。

我们为了降低安装包的体积,或者是为了自己主动更新资源,必需要使用AssetsBundle来打包资源。

我们能够通过扩展编辑器来写一个ExportResource的函数,将指定的文件打包成AssetsBundle,然后能够将这个包放到server上面,游戏执行的时候动态下载并载入。能够说一个mmo的实现必定要使用到这个功能。它是对Unity相对封闭的文件系统的一个开放接口。

十、物件属性的配置和编辑器扩展

这个是很出彩的功能,借助于反射机制。这个功能无比的便捷和强大。你仅仅要写一个脚本。然后加入一个public的变量。然后就能够在编辑器中设置这个值了。当然Unity仅仅识别内建类型。自定义的类要加上[System.Serializable]来声明。

Unity的编辑器扩展功能很强大,你能够轻易的重写属性窗体中的显示内容和显示方式,也能够加入一个button来实现某个特殊功能。Unity 的内建GUI最大的用途就是这里了。

十一、关于Editor目录的说明

假设你看下Unity自己主动生成的vsproject。会发现project数目有可能会达到七八个。 Unity全部编辑器相关的脚本文件都要放到Editor文件夹以下(是不是根文件夹无所谓,仅仅要名字叫Editor就能够了)。这些文件会单独生成一个Unity-Editor的project。全部包括UnityEditor的代码仅仅能在编辑器模式下执行,不能公布到windows或者android上面。

(第三部要点是关于Unity 实用,第四到实际的游戏解决方案的一部分,)

版权声明:本文博客原创文章,博客,未经同意,不得转载。

漫步Unity3D(三)的更多相关文章

  1. 漫步Unity3D(一)

    前言 采用Unity它已经将近半年的时间,虽然项目仅仅是一个半成品.但Unity熟几乎相同的游戏.在这里,在使用过程中遇到的问题,再梳.不涉及过于详细的功能和代码.但是,假设他们将参与开发一个在线知识 ...

  2. unity3d 三分钟实现简单的赛车漂移

    提到赛车游戏,大家最关心的应该就是漂移吧?! 从学unity开始,我就一直在断断续续的研究赛车 因为自己技术太烂.悟性太差等原因,我走了不少弯路 也许你会说,网上那么多资料,你不会查啊 是啊!网上一搜 ...

  3. 实现一个简单的Unity3D三皮卡——3D Picking (1)

    3D Picking 其原理是从摄像机位置到空间发射的射线.基于光线碰到物体回暖. 这里我们使用了触摸屏拿起触摸,鼠标选择相同的原理,仅仅是可选API不同. 从unity3D官网Manual里找到下面 ...

  4. Mono为何能跨平台?聊聊CIL(MSIL)

    前言: 其实小匹夫在U3D的开发中一直对U3D的跨平台能力很好奇.到底是什么原理使得U3D可以跨平台呢?后来发现了Mono的作用,并进一步了解到了CIL的存在.所以,作为一个对Unity3D跨平台能力 ...

  5. [Unity Shader]Shader分类

    Shader的分类: Shader按管线分类一般分为固定渲染管线与可编程渲染管线 (1)固定渲染管线 ——这是标准的几何&光照(Transforming&Lighting)管线,功能是 ...

  6. Unity3D脚本中文系列教程(三)

    http://dong2008hong.blog.163.com/blog/static/4696882720140302323886/ Unity3D脚本中文系列教程(二) 示,属性不被序列化或显示 ...

  7. Unity3D之空间转换学习笔记(三):3D数学

    3D数学基础 向量 向量可以看做具有方向和大小的一条线段. 比如:我们如果用点A减去点B,则可以得到一个向量,该向量的方向为点B面向点A的方向,而大小为两点的距离.这个方法在游戏开发中经常用到,比如我 ...

  8. 于Unity3D动态创建对象和创建Prefab三种方式的原型对象

    于Unity3D动态创建对象和创建Prefab三种方式的原型对象 u3d在动态创建的对象,需要使用prefab 和创建时 MonoBehaviour.Instantiate( GameObject o ...

  9. 【淡墨Unity3D Shader计划】五 圣诞用品: Unity在Shader三种形式的控制&混合操作编译

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/42060963 作者:毛星云(浅墨)  ...

随机推荐

  1. 3D 应用程序性能

    原文:3D 应用程序性能 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/m0_37591671/article/details/74595999 3 ...

  2. css3-10 css3中的边框样式有哪几种

    css3-10 css3中的边框样式有哪几种 一.总结 一句话总结:1.border-radius 2. box-shadow 3.border-image三种,box一种border两种 1.css ...

  3. thinkphp 3.2,引入第三方类库的粗略记录

    首先用第三方类库我是放到vendor里面的 根目录\ThinkPHP\Library\Vendor\Wxphp 例如创建了一个Wxphp文件夹,里面有个php文件叫做     zll.php    文 ...

  4. 我的前端规范——JavaScript篇

    相关文章 简书原文:https://www.jianshu.com/p/5918c283cdc3 我的前端规范——开篇:http://www.cnblogs.com/shcrk/p/9271561.h ...

  5. [AngularFire2] Building an Authentication Observable Data Service

    After successfully login, we want something help to check whether user has already login or not. And ...

  6. oracle 列授权相关测试

    create tablespace liangtbs datafile '/home/oradata/lgjdb/liangtbs01.dbf' size 50m autoextend on;crea ...

  7. php json字符串转为数组或对象

    从网上查到的方法是 用get_object_vars 把类类型转换成数组 然后在用foreach  遍历即可 $array = get_object_vars($test); $json= '[{&q ...

  8. tomcat 启动项目时出现 ZipException: error in opening zip file

    错误情况 项目用 maven 打好 war 包后放到 tomcat 下,启动 tomcat,出现以下错误 3-Nov-2017 12:21:44.346 严重 [localhost-startStop ...

  9. [RxJS] Use RxJS concatMap to map and concat high order observables

    Like switchMap and mergeMap, concatMap is a shortcut for map() followed by a concatAll(). In this le ...

  10. Nginx+uswgi+Django部署

    详情参考: http://blog.csdn.net/a_little_snail/article/details/78045636