《学Unity的猫》——第八章:Unity预设文件,无限纸团喷射机
文章目录
- 8.1 无限纸团喷射机
- 8.2 预设是什么
- 8.3 预设的制作
- 8.4 预设的修改
- 8.4.1 Open Prefab——进入神秘世界
- 8.4.2 退出神秘世界
- 8.4.3 Overrides——重载预设
- 8.5 预设的继承
- 8.5.1 为什么要设计预设的继承
- 8.5.2 如何制作变种预设
- 8.5.3 修改基预设
- 8.6 预设的嵌套
简介:我是一名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: 0m_CorrespondingSourceObject: {fileID: 0}m_PrefabInstance: {fileID: 0}m_PrefabAsset: {fileID: 0}serializedVersion: 6m_Component:- component: {fileID: 8079028440690224108}m_Layer: 0m_Name: PrefabTestm_TagString: Untaggedm_Icon: {fileID: 0}m_NavMeshLayer: 0m_StaticEditorFlags: 0m_IsActive: 1
--- !u!4 &8079028440690224108
Transform:m_ObjectHideFlags: 0m_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: 0m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
皮皮:“我看到了两个熟悉的东西:GameObject
和Transform
。”
我:“观察力不错哦。嘛,单看这个文件,我们就可以猜到它是一个带着Transform
组件的GameObject
,并且还可以知道具体的参数数据。”
皮皮:“文件开头的%%YAML 1.1
是什么意思,是压马路的意思吗?”
我:“哈哈哈哈,YAML
全称是Yet Another Markup Language
,直译就是另一种标记语言的意思,是人们发明的一种语言格式,用它很适合描述序列化信息。所以呢,预设文件本身是一个描述文件,记录了它所引用的资源、组件和数据。”
我们可以把这个预设拖到场景中(实例化),可以看到,它带着一个Transform
组件,其中Position
、Rotation
、Scaale
数据是从预设中解析出来的。
皮皮:“这个预设是怎么制作的呢?”
8.3 预设的制作
预设的制作很简单,以制作一个正方体的预设为例。
在Hierarchy
视图中右键点击菜单3D Object - Cube
。
得到一个正方体Cube
。
把它拖到Assets
目录中的某个文件夹中,比如Resources
文件夹。
这样,预设文件就制作成功了。
皮皮:“又是用鼠标拖动这样的操作。”
我:“你要多练习练习鼠标,身为一只猫,不能害怕鼠标。”
皮皮抓起鼠标一顿啃。
8.4 预设的修改
皮皮:“预设的制作我学会了,如果我想修改预设重新保存怎么办?”
我:“这个也很简单,现在带你进入神秘世界。”
8.4.1 Open Prefab——进入神秘世界
在Project
视图中,选中预设文件,然后在Inspector
视图中点击Open Prefab
。
此时会进入一个神秘的世界。
我们在这个世界里做的任何修改,都会立刻被序列化到.prefab
文件中。
比如修改一下Position
的x
坐标为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 预设的嵌套
除了预设继承,预设还可以嵌套。
皮皮:“这又是什么高级用法?”
我:“还是给你举个应用例子好了。假设现在我做了一个铃铛预设,然后我又做了一只猫、一只狗、一只熊三个预设,我给猫、狗、熊都戴上铃铛,事实上,就是把铃铛预设分别嵌套在它们预设里。此时,我想统一调整铃铛的大小,我只需调整铃铛预设本身即可,不需要分别去调整猫、狗、熊的铃铛,因为它们其实是直接引用了铃铛预设。”
下面实际操作一下。
先分别创建两个预设:Cube
、Sphere
。
打开Sphere
。
将Cube
拖到Sphere
子节点中。
此时便完成了预设嵌套:Cube
嵌套在Sphere
中。
退出Sphere
。
打开Cube
。
调整Scale
的y
为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协程,好奇猫与铁皮怪水管
《学Unity的猫》——第八章:Unity预设文件,无限纸团喷射机相关推荐
- 《学Unity的猫》——第十二章:使用Unity制作背包,皮皮的梦想背包
文章目录 12.1 皮皮的梦想背包 12.2 准备道具图片 12.3 UGUI打图集 12.3.1 设置图集模式:Always Enabled(Legacy Sprite Packer) 12.3.2 ...
- 《学Unity的猫》——第十一章:Unity猫咪救济管理系统,山岗的星光
文章目录 11.1 山岗的星光 11.2 Unity猫咪救济管理系统 11.3 设置UI摄像机 11.4 设置Canvas 11.5 制作登录界面预设 11.6 制作大厅界面预设 11.7 制作信息界 ...
- 《学Unity的猫》——第五章:规范Unity的工程目录结构
文章目录 5.1 不要把玩具乱丢 5.2 Unity工程目录结构 5.3 Resources.Load实战测试 5.3.1 资源下载与导入 5.3.2 目录整理 5.3.3 代码动态加载资源 5.3. ...
- 《学Unity的猫》——第十九集:皮皮猫上班第一天,认识游戏开发公司各个部门
文章目录 19.1 皮皮正式上班 19.2 部门职责 19.2.1 财务部 19.2.2 行政/人事部 19.2.3 运维部 19.2.4 市场部 19.2.5 策划部 19.2.6 美术部 19.2 ...
- 《学Unity的猫》——第一章:故事开始
文章目录 1.1 关于我 1.2 关于我的猫--皮皮 1.3 hello,喵 1.1 关于我 大家好,我是一名程序员,职业是Unity游戏开发工程师,每天上班下班,偶尔画画,弹弹吉他,写写博客.日子就 ...
- 《学Unity的猫》——第九章:状态机与Unity协程,好奇猫与铁皮怪水管
文章目录 9.1 会吐水的铁皮怪 9.2 状态机是什么 9.3 使用协程实现状态机 9.4 进程与线程 9.4.1 什么是进程 9.4.2 什么是线程 9.5 Unity的协程 9.5.1 Unity ...
- 《学Unity的猫》——第十八集:Unity3D游戏开发工程师笔试刷题,皮皮收到面试邀请
文章目录 18.1 皮皮收到面试邀请 18.2 面试题库相关网站 18.2.1 牛客网 18.2.2 领扣LintCode 18.2.3 力扣LeetCode 18.3 优质学习网站 18.3.1 菜 ...
- 【游戏开发创新】Unity+人工智能,让小朋友的画成真,六一儿童节一起来画猫猫吧(Unity | 人工智能 | 绘图 | 爬虫 | 猫妖)
文章目录 一.前言 二.一起来画猫猫 三.爬虫,无穷只猫 四.猫猫作品展 五.Unity制作讲解 1.界面素材 2.UGUI制作界面 3.分辨率适配 4.如何检测鼠标事件 5.世界坐标转局部坐标 6. ...
- Unity从零开始构建能力体系 Unity Ability System
从零开始构建能力体系 你会学到什么 如何实施能力体系 如何使用用户界面工具包创建用户界面 如何使用Unity的GraphView API 如何实现保存系统 MP4 |视频:h264,1280×720 ...
最新文章
- 机器学习知识点(三十)LDA话题模型Java实现
- 第15天学习Java的笔记(封装性,this,构造方法)
- ComboBox联动
- keras实例化model后,结果返回NoneType
- Zend Framework学习之Zend_Config
- oracle 日期 加一秒,Leap Second (闰秒) 在ORACLE环境的影响
- 在 Linux 命令行中使用和执行 PHP 代码(一)
- eoe·Android 开发门户 - android开发者的必备网站
- 编写kernel第一个Hello World
- red5流媒体服务器网站,[RED5]red5流媒体服务器(开源免费)的安装方法
- h3c 链路聚合测试_H3CSE学习之链路聚合
- Windows jdk下载与安装
- Hive | 用sort_array函数解决collet_list列表排序混乱问题
- 谷歌开发者被封 账号中的钱_Google GMC又被封?解锁谷歌广告账号运营新姿势
- 路由器默认账户密码大全
- 深度相机原理和优势对比
- 用c++图形库编写的双人打气球
- java计算机毕业设计新能源汽车租赁管理系统源程序+mysql+系统+lw文档+远程调试
- 深圳大数据培训技术分享:Hadoop集群同步
- 微信小微商户直连接口详解