欢迎来到我的博客小站。  交流请加我微信好友: studyjava。  也欢迎关注同名公众号:Java学习之道

学Unity的猫之Unity预设(八)

  |   0 评论   |   0 浏览

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 预设的修改

皮皮:“预设的制作我学会了,如果我想修改预设重新保存怎么办?”

我:“这个也很简单,现在带你进入神秘世界。”

皮皮:“微信搜索公众号 [爱上游戏开发],回复 “资料”,免费领取 200G 学习资料!"

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.prefabCube加一个Sphere子节点。调整Sphere的坐标到Cube的下面。退出神秘世界。此时拖动变种预设Cube Variant到场景中,看它是否也自动多了个Sphere子节点。可以看到,Cube Variant也自动多了一个Sphere子节点。

8.6 预设的嵌套

除了预设继承,预设还可以嵌套。

皮皮:“这又是什么高级用法?”

我:“还是给你举个应用例子好了。假设现在我做了一个铃铛预设,然后我又做了一只猫、一只狗、一只熊三个预设,我给猫、狗、熊都戴上铃铛,事实上,就是把铃铛预设分别嵌套在它们预设里。此时,我想统一调整铃铛的大小,我只需调整铃铛预设本身即可,不需要分别去调整猫、狗、熊的铃铛,因为它们其实是直接引用了铃铛预设。”

下面实际操作一下。先分别创建两个预设:CubeSphere打开SphereCube拖到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预设(八)
作者:shirlnGame
地址:https://www.mmzsblog.cn/articles/2021/01/07/1610027740961.html
-----------------------------
如未加特殊说明,此网站文章均为原创。
网站转载须在文章起始位置标注作者及原文连接,否则保留追究法律责任的权利。
公众号转载请联系网站首页的微信号申请白名单!

个人微信公众号 ↓↓↓                 

微信搜一搜爱上游戏开发