漫步Unity3D(三)

八、预制(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 实用,第四到实际的游戏解决方案的一部分,)

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

原文地址:https://www.cnblogs.com/gcczhongduan/p/4750073.html