《学Unity的猫》——第八章:Unity预设文件,无限纸团喷射机

简介:我是一名Unity游戏开发工程师,皮皮是我养的猫,会讲人话,它接到了喵星的特殊任务:学习编程,学习Unity游戏开发。
于是,发生了一系列有趣的故事。
在这里插入图片描述

8.1 无限纸团喷射机

皮皮特别喜欢玩纸团,我也特意询问了几个养猫的朋友,发现貌似所有的猫都天生对纸团没有抵抗力。无聊时抽出一张纸,揉成一团,咻一声扔出去,皮皮就会变成一道闪电跟着飞出去,捡到纸团又叼回来。
时间久了,即使我手上没有纸团,只是用嘴发出咻咻咻的声音,皮皮也会两眼冒金光四处张望寻找纸团的踪迹,屡试不爽。
我:“老皮,家里没纸巾了,以后没有纸团玩了。”
皮皮瞪大了圆溜溜的双眼,半晌,挤出一句话:“你们公司不发纸巾吗?”
天雷一声响,我被眼前这只猫雷倒了。
我:“公司一个月就发一包纸巾,哪够你玩的!!!我一张纸巾撕成两半用都不够。”
皮皮跳到猫碗旁边疯狂扒拉空气。
我:“你这是干嘛?”
皮皮:“防止猫粮被偷,买不起纸巾了,猫粮要保住!”
我:“别扒拉了,我给你做了个无限纸团喷射机。”
我打开Unity,点击运行。
在这里插入图片描述
皮皮:“哇,我要学这个!”

8.2 预设是什么

我:“上面这个无限纸团喷射机的制作原理很简单,就是事先制作一个纸团模型预设(prefab),然后实例化这个预设得到纸团的GameObject,再给纸团一个速度,让纸团飞出去。”
皮皮:“之前听你提到过预设,预设到底是什么呀?”
我:“预设,单词叫prefab,其实从这个单词已经可以看出预设的含义。pre词根,是提前、预先的意思,fab,动词,是制造、制作的意思,所以从字面看,prefab就是预先制作的意思,也有人叫它预制体。”

预设文件,实质上是一个描述文件,它记录了它所引用的资源、组件和数据。加载预设时,Unity会帮我们解析它所依赖的资源、脚本和数据,载入到内存中,最终得到预设所包装的游戏对象,之后,我们就可以通过实例化预设重复使用这个游戏对象了。

皮皮:“有点抽象。”
我打开工程目录,“我先给你看个预设文件。”
使用文本编辑器(比如notepad++)打开.prefab文件。
在这里插入图片描述
打开后我们可以看到里面的内容,如下:

%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &3921411617931140026
GameObject:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  serializedVersion: 6
  m_Component:
  - component: {fileID: 8079028440690224108}
  m_Layer: 0
  m_Name: PrefabTest
  m_TagString: Untagged
  m_Icon: {fileID: 0}
  m_NavMeshLayer: 0
  m_StaticEditorFlags: 0
  m_IsActive: 1
--- !u!4 &8079028440690224108
Transform:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 3921411617931140026}
  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
  m_LocalPosition: {x: 0, y: 0, z: 0}
  m_LocalScale: {x: 1, y: 1, z: 1}
  m_Children: []
  m_Father: {fileID: 0}
  m_RootOrder: 0
  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}

皮皮:“我看到了两个熟悉的东西:GameObjectTransform。”
我:“观察力不错哦。嘛,单看这个文件,我们就可以猜到它是一个带着Transform组件的GameObject,并且还可以知道具体的参数数据。”
皮皮:“文件开头的%%YAML 1.1是什么意思,是压马路的意思吗?”
我:“哈哈哈哈,YAML全称是Yet Another Markup Language,直译就是另一种标记语言的意思,是人们发明的一种语言格式,用它很适合描述序列化信息。所以呢,预设文件本身是一个描述文件,记录了它所引用的资源、组件和数据。”

我们可以把这个预设拖到场景中(实例化),可以看到,它带着一个Transform组件,其中PositionRotationScaale数据是从预设中解析出来的。
在这里插入图片描述
皮皮:“这个预设是怎么制作的呢?”

8.3 预设的制作

预设的制作很简单,以制作一个正方体的预设为例。
Hierarchy视图中右键点击菜单3D Object - Cube
在这里插入图片描述
得到一个正方体Cube
在这里插入图片描述

把它拖到Assets目录中的某个文件夹中,比如Resources文件夹。
在这里插入图片描述
这样,预设文件就制作成功了。
在这里插入图片描述

皮皮:“又是用鼠标拖动这样的操作。”
我:“你要多练习练习鼠标,身为一只猫,不能害怕鼠标。”
皮皮抓起鼠标一顿啃。

8.4 预设的修改

皮皮:“预设的制作我学会了,如果我想修改预设重新保存怎么办?”
我:“这个也很简单,现在带你进入神秘世界。”

8.4.1 Open Prefab——进入神秘世界

Project视图中,选中预设文件,然后在Inspector视图中点击Open Prefab
在这里插入图片描述
此时会进入一个神秘的世界。
在这里插入图片描述
我们在这个世界里做的任何修改,都会立刻被序列化到.prefab文件中。
比如修改一下Positionx坐标为3
在这里插入图片描述
此时使用文本编辑器打开.prefab文件,即可看到刚刚的修改已经被序列化到文件中了。
在这里插入图片描述

8.4.2 退出神秘世界

皮皮:“怎么回到原来的世界呢?出口在哪里?”
我:“Hierarchy视图左上角那里有个小箭头,那里就是出口。”
在这里插入图片描述
我:“另外,也可以点击Scene视图左上角的Scenes。”
在这里插入图片描述
退出后,我们可以看到刚刚的修改是生效的。
在这里插入图片描述

8.4.3 Overrides——重载预设

修改预设,还有另外一种方式,就是Overrides
将物体拖到场景中(实例化),此时做一下修改,比如把Box Collider组件禁用。
在这里插入图片描述
然后点击Overrides
在这里插入图片描述
此时会显示所做的修改,点击Apply All即可重载预设(覆盖预设)。
在这里插入图片描述
皮皮:“Apply All按钮左边的Revert All是什么作用?”
我:“又要教单词啦,revert,看词根,re词根,是向后、相反、回的意思,vert词根,是转的意思,组合起来,就是转回来,就是恢复回原来的意思,两个字,还原。”
皮皮:“英语过六级的人都喜欢这样分析词根吗?”
我:“不管学什么,学习方法很重要,好的学习方法可以提升效率,缩短学习时间,我不能让你在一个月内学会游戏开发,但是我可以教你好的学习方法,让你终生受益。”
皮皮抢过鼠标,点击了Revert All,说:“真啰嗦,实践是检验真理的唯一标准,测试一下Revert All。”
此时,Box Collider回到了原来激活的状态。
在这里插入图片描述

8.5 预设的继承
8.5.1 为什么要设计预设的继承

我指着预设接着说,“Unity2018之后,预设引入了继承的概念,可以像类一样继承。”
皮皮:“为什么要弄预设继承呢?”
我:“举个应用的场景,假设我现在做了一只白猫预设,我想再做三只不同颜色的猫,他们只是颜色不同,其他都和白猫相同,我可以让这三只不同颜色的猫都继承白猫,然后分别修改颜色即可。当我给白猫加了个铃铛,这三只不同颜色的猫也会自动具有铃铛,因为它们都继承了白猫,我不需要挨个给这三只猫再加铃铛了。”
皮皮:“作为一只猫,我有权利告诉你,猫其实不大喜欢戴铃铛。”
我:“哈哈哈,平时也没让你戴铃铛。”

8.5.2 如何制作变种预设

实践一下预设的继承吧,以刚刚的Cube预设为例。我们把它再一次拖入Resources文件夹。
在这里插入图片描述
此时会弹出提示框询问是要创建一个新的原始预设(Original Prefab)还是一个变种预设(Prevab Variant),点击Prevab Variant
在这里插入图片描述
此时便成功创建了一个变种预设Cube Variant,它是继承Cube的。
在这里插入图片描述
如果此时你用文本编辑器打开Cube Variant.prefab,就会发现它的结构和Cube.prefab是有差异的。
在这里插入图片描述

8.5.3 修改基预设

现在,我们修改基预设,打开Cube.prefab
在这里插入图片描述
Cube加一个Sphere子节点。
在这里插入图片描述
调整Sphere的坐标到Cube的下面。
在这里插入图片描述
退出神秘世界。
在这里插入图片描述
此时拖动变种预设Cube Variant到场景中,看它是否也自动多了个Sphere子节点。
在这里插入图片描述
可以看到,Cube Variant也自动多了一个Sphere子节点。
在这里插入图片描述

8.6 预设的嵌套

除了预设继承,预设还可以嵌套。
皮皮:“这又是什么高级用法?”
我:“还是给你举个应用例子好了。假设现在我做了一个铃铛预设,然后我又做了一只猫、一只狗、一只熊三个预设,我给猫、狗、熊都戴上铃铛,事实上,就是把铃铛预设分别嵌套在它们预设里。此时,我想统一调整铃铛的大小,我只需调整铃铛预设本身即可,不需要分别去调整猫、狗、熊的铃铛,因为它们其实是直接引用了铃铛预设。”
下面实际操作一下。
先分别创建两个预设:CubeSphere
在这里插入图片描述
打开Sphere
在这里插入图片描述
Cube拖到Sphere子节点中。
在这里插入图片描述
此时便完成了预设嵌套:Cube嵌套在Sphere中。
在这里插入图片描述
退出Sphere
在这里插入图片描述
打开Cube
在这里插入图片描述
调整Scaley为3,此时变成了一个长方体。
在这里插入图片描述

退出Cube
在这里插入图片描述
实例化Sphere,可以看到,嵌套在Sphere中的Cube也自动变成长方体了。
在这里插入图片描述
皮皮:“如何这个时候调整Sphere中的Cube,会不会影响原来的Cube。”
我:“看操,如果直接调整Sphere中的Cube,再点击Overrides - Apply All的话,会影响到原来Cube,因为这个Cube是原来Cube的引用,如果想要不影响到原来的Cube,就要把Sphere中的Cube弄成变种预设。”
操作如下:
Sphere中的Cube拖到Resources文件夹中。
在这里插入图片描述
此时会弹出循环框,点击Prefab Variant(变种预设)。
在这里插入图片描述
此时Sphere中的Cube就是一个变种预设了Cube Variant,此时Sphere中的Cube只会影响Cube Variant,不会影响原来的Cube。当然,如果没有执行Overrides,那变种预设还是继承基预设的数值的。
在这里插入图片描述


《学Unity的猫》——第九章:状态机与Unity协程,好奇猫与铁皮怪水管

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林新发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值