八、预制(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动态创建对象和创建Prefab三种方式的原型对象

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

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

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

  9. Unity3D ——强大的跨平台3D游戏开发工具(三)

    第四章 为地形添加水源.水流以及水下的模糊效果 制作好了地形的各种效果,接下来我们给场景添加一些水效果,使场景更加丰富. 第一步:添加水面 由于我在上一次的地形创作中就已经在山峰之间制作了一块洼地,它 ...

随机推荐

  1. HTML学习笔记之中的一个(input文件选择框的封装)

    方式一:直接透明隐藏 .file_button_container,.file_button_container input {background: transparent url(./img/BT ...

  2. WebGL自学教程——WebGL演示样例:開始

    最终開始WebGL的演示样例了,...... 開始 使用WebGL的步骤,非常easy: 1. 获得WebGL的渲染环境(也叫渲染上下文). 2. 发挥你的想象力,利用<WebGL參考手冊> ...

  3. Android网络编程http派/申请服务

    最近的研究Android网络编程知识,这里有一些想法,今晚学习.与您分享. 在实际的应用程序的开发非常需要时间appserver请求数据,那么app怎样发送请求呢?以下的代码就是当中的一种情况.使用H ...

  4. 本地或者服务器同时启动2个或多个tomcat

    一,修改配置文件server.xml的端口 C:\apache-tomcat-5.5.23-1\conf\server.xml用记事本什么的打开修改3个地方   第一: <Server port ...

  5. 大规模集群管理工具Borg

    Google的大规模集群管理工具Borg 概述 Google的Borg系统是一个集群管理工具,在它上面运行着成千上万的job,这些job来自许许多多不同的应用,并且跨越多个集群,而每个集群又由大量的机 ...

  6. 基于.net开发chrome核心浏览器【四】

    原文:基于.net开发chrome核心浏览器[四] 一: 上周去北京出差,给国家电网的项目做架构方案,每天都很晚睡,客户那边的副总也这样拼命工作. 累的不行了,直接导致第四篇文章没有按时发出来. 希望 ...

  7. JavaMail学习笔记(七)、帐号激活与忘记密码 实例(zhuan)

    一.帐户激活   在很多时候,在某些网站注册一个用户之后,网站会给这个用户注册时填写的email地址发送一封帐户激活邮件,这封邮件的内容就是一个激活帐户的链接和一段简短的文字描述,如果用户没有去邮箱将 ...

  8. SQL Server中的查询

          本博文简介一下SQL Server中经常使用的几类查询及相关使用的方法.       一.ExecuteScalar方法获取单一值       ExecuteScalar方法是SqlCom ...

  9. oracle一个用户密码管理多达同意三次企图登录

    假设一个用户登录连续失败三次.两日,锁定用户,两天后再次登录的用户的能力. 创建profile文件: 更新账户: 三次登录失败后用户就会被锁定: 用户锁住之后要怎么给他解锁: 解锁之后就能够正常登录了 ...

  10. JavaScript 内存

    JavaScript 中对内存的一些了解 在使用JavaScript进行开发的过程中,了解JavaScript内存机制有助于开发人员能够清晰的认识到自己写的代码在执行的过程中发生过什么,也能够提高项目 ...