通过上一期的学习,我们知道为了如何向场景中添加一个物体。问题来了,如果需要对这个立方体进行修改应该怎么做呢?那我们肯定就得修改这段代码,能不能将立方体本身从我们的开发中单独提出来呢?这就涉及到我们今天要学习的一个的概念——Prefab。

Prefabs

Prefab是一种可以重复使用的asset,一旦一个Prefab创建出来,它就是一种存储在ProjectView的GameObject,在游戏开发中,我们可以在任意多个场景中去创建已经生成的GameObject实例对象,或者在同一个场景中创建多个。

 

不论是上面提到的哪种,我们需要做的是将创建的GameObject类型实例化就好了。所有实例化的Prefab都是与原始的Prefab相关联的,我们可以把实例化的Prefab看做原始Prefab的一个拷贝,也就是说,无论场景中存在多少个Prefab的实例,如果我们对原始的Prefab进行修改,那么所有有关它的拷贝都会被修改。

 

Prefab的创建

在使用Prefab之前,我们必须创建它,如下图所示,在Project窗口右键点击选择create,子菜单中选择Prefab即可。这样我们就创建了一个空得Prefab,接下来需要的就是把我们之前编辑好的GameObject拖拽到该空Prefab上松开鼠标即可,这个时候,空的Prefab就会变成蓝色。当然我们可以按照自己的需要修改该Prefab的名字。

【Unity开发】Prefabs

图 1

Prefab的实例化

       有了创建好的Prefab,就可以在以后的开发中直接使用了。

创建Prefab实例的一种方式是直接向场景中目标节点拖拽创建好的Prefab即可,这样就在场景中完成了实例化。

可能有人就会说,如果我要在程序运行中动态创建一个Prefab的实例,应该怎么做呢?这就涉及到我们这里要提到的第二种创建方式——通过Script(C#、JavaScript等等)动态创建Prefab的实例。

例子一——这里我们考虑一种情况,我们需要向场景中添加一个立方体,并且为这个立方体添加一些属性(比如刚体、碰撞等等)。

如果我们直接通过代码来实现,应该怎么做呢?

【Unity开发】Prefabs

图 2

如图所示,运行之后我们可以看到,一个立方体开始向下降落。表明我们已经创建成功了。

好的,那现在我们通过创建Prefab的方式来实现这个效果。方法很简单,就像前面说的那样,创建一个cube并对它进行编辑,然后在Project窗口中创建一个空的Prefab并将之前创建的cube拖拽到这个空的Prefab上完成Cube的Prefab创建。有了创建好的Prefab,接下来呢我们就在需要的时候通过代码将Prefab实例化到场景中即可。如图3所示,按照上面的步骤,我们可以得到一个立方体的Prefab(注意:动态加载Prefab需要存放在一个名为Resources的目录下,否则load会找不见)

【Unity开发】Prefabs

图 3

下图是我们使用代码来动态加载一个Prefab的代码清单。

【Unity开发】Prefabs

图 4

运行之后,我们可以看到窗口中有一个立方体(这个立方体就是我们之前创建编辑的一个Prefab的实例)向下掉落直到掉出屏幕,有了这种方式我们就可以在游戏需要的时候去动态加载一个已经创建的好的Prefab实例了。

【Unity开发】Prefabs

图 5

Prefab的编辑

       当然,我们在实际开发中也会面临Prefab需要修改的问题。这就涉及到Prefab的继承属性,Unity允许我们对已存在的Prefab进行修改,然后只要我们点击Inspector中的Apply按钮,我们所做的修改都会被该Prefab的实例所继承。(如下图所示)

【Unity开发】Prefabs

图 6

OK,关于Prefab的学习就结束了~~

Unity Prefabs的更多相关文章

  1. 从Unity引擎过度到Unreal4引擎(最终版)

    原文地址:http://demo.netfoucs.com/u011707076/article/details/44036839 前言 寒假回家到现在已经有十多天了,这些天回家不是睡就是吃....哎 ...

  2. 转:Oculus Unity Development Guide开发指南(2015-7-21更新)

    http://forum.exceedu.com/forum/forum.php?mod=viewthread&tid=34175 Oculus Unity Development Guide ...

  3. Unity -- 材质-Material和预设体-Prefabs

    材质(Materials)用来把网格(Mesh)或粒子渲染器(Particle Renderers)贴到游戏对象上.他们在定义对象怎么被显示发挥重要组成部分.材质包括用于呈现网状或颗粒着色器的参考,所 ...

  4. Unity 最佳实践

    转帖:http://www.glenstevens.ca/unity3d-best-practices/ 另外可以参考:http://devmag.org.za/2012/07/12/50-tips- ...

  5. 在Unity环境下使用抽象和接口

    http://gamasutra.com/blogs/VictorBarcelo/20131217/207204/Using_abstractions_and_interfaces_with_Unit ...

  6. Unity进阶技巧 - 动态创建UGUI

    前言 项目中有功能需要在代码中动态创建UGUI对象,但是在网上搜索了很久都没有找到类似的教程,最后终于在官方文档中找到了方法,趁着记忆犹新,写下动态创建UGUI的方法,供需要的朋友参考 你将学到什么? ...

  7. Gvr SDK for Unity 分析(一)

    Gvr SDK概述 通过谷歌VR SDK for unity 为Android和iOS 构建虚拟现实应用程序 unity SDK在Android上支持构建应用程序for daydream 和 card ...

  8. Unity Standard Assets 简介之 Utility

    决定写这个系列起因于刚才的偶然所见,我发现当前版本的Unity有一个 Utility 标准资源包,里面有一个 FPSCounter 脚本提供了显示游戏运行帧率的基本功能,而我几周前刚刚写过一个同样功能 ...

  9. unity htc vive使用

    本文介绍如何在Unity中使用HTC vive设备,当前VR作为市场比较火热的热点,HTC VIVE设备作为三大供应商之一,许多人购买了该设备,却不知道如何使用,本文通过图文并茂的形式,进行手把手的讲 ...

随机推荐

  1. BitMapFactory.decodeFile 总是返回NULL的原因之一

    之前碰到过,顺便记录下来,如果出现这种情况,首先看看是否有对这个文件的读权限.

  2. selenium2 python范例

    selenium2 python范例 下面脚本的功能是:打开谷歌浏览器-->跳转到某个网址-->输入用户名和密码登录-->读取页面内的数据并求和. # coding=utf-8 #编 ...

  3. Block和inline元素对比

    所有的HTML元素都属于block和inline之一.block元素的特点是:总是在新行上开始:高度,行高以及顶和底边距都可控制:宽度缺省是它的容器的100%,除非设定一个宽度<div>, ...

  4. ps 图层混合模式

  5. html5--3.15 textarea元素

    html5--3.15 textarea元素 学习要点 掌握textarea元素的使用 textarea元素 用来建立多行输入文本框 元素标签中的内容将一文本框默认值的形式呈现 不仅可以用在表单中,也 ...

  6. Can't locate Log/Dispatch.pm in @INC /Makefile out-of-date with respect to Makefile.PL

    mha check的时候报错问题解决:   # masterha_check_ssh --conf=/data/mha/app1.cnf Can't locate Log/Dispatch.pm in ...

  7. AQS共享锁应用之Semaphore原理

    我们调用Semaphore方法时,其实是在间接调用其内部类或AQS方法执行的.Semaphore类结构与ReetrantLock类相似,内部类Sync继承自AQS,然后其子类FairSync和NoFa ...

  8. POI实现DOC/DOCX转HTML

    1.使用HWPF处理DOC public class DocToHtml { private static final String encoding = "UTF-8"; pub ...

  9. HDU1203(01背包变形)

    I NEED A OFFER! Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   D ...

  10. php字符编码转换中的iconv与mb_convert_encoding用法

    iconv ( 'UTF-8' , 'GBK' , $str ); //将$str字符串 utf-8 编码转换成 gbk: 另外,5.4.0 这个版本起,字符非法时候会返回 FALSE,除非在输出字符 ...