目录
1.UnityPlayground小游戏
1.创建玩家
2.添加物品
3.添加背景
预制件
1.UnityPlayground小游戏
1.创建玩家
-
打开项目: 打开前面课程中已经准备好的 playground 项目
-
创建新场景: project 窗口 –> Assets/scenes 文件件,右键 create scene ,创建只带有一个 camera 对象的场景,重命名为 PlaneAsteroid
-
添加玩家飞船:
-
project 窗口 –> Assets/Images/SpaceShips/ 拖拽其中一个飞机到 Hierarchy 中,让飞船对象成为 PlaneAsteroid scene 的子对象;
-
选中飞船,在 inspector 窗口中,将对象命名为 Ship ,并将 Tag 选中为 Play
-
注意: 尽可能拖拽素材到 Hierarchy 中,可以直接确定对象间父子关系;当然,如果为了定位方便,将素材拖拽到 scene 中,也可以,但记住要调整对象嵌套关系
4.让飞船动起来:
-
-
添加组件,将脚本:Move with Arrows 绑定到飞船对象上
-
一旦你添加了 Move 脚本,还会自动添加一个 Rigidbody2D 组件。这是因为 Move 需要 Rigidbody2D 才能起作用。
-
调整 Gizmos 中的脚本图标大小,将其缩小:使用 Scene 视图中的下拉表单辅助图标进行缩小。将 3D Icons 滑动条向左拖动,直到图标大小合适。
2.添加物品
RigidBody2D 组件和移动脚本组件上,暴露出很多物理引擎相关的参数值,通过调整,可以改善游戏体验
-
在 RigidBody2D 组件上,我们要将 Gravity 修改为 0
-
Orient to direction:船头朝向移动方向
-
Friction :摩擦力,设置为 5 可以消除漂移
-
Speed : 更改速度
-
mass :质量,影响惯性
-
相关概念:
-
物理引擎: Unity 中,包含了完整的物理引擎,可以让开发者非常方便地模拟显示中的物理现象,比如:质量、惯性、重力、速度、加速度、碰撞、反弹等等。 物理系统 官方文档
-
RigidBody(刚体): 是实现游戏对象的物理行为的主要组件。如果想让一个游戏对像能被物理引擎所影响,就必须为其添加 RigidBody 组件,分为 2D 和 3D,分别针对不同的游戏类型。刚体可以接受力和扭矩(通过脚本编写代码来实现),向刚体施加力/扭矩实际上会改变对象的变换组件位置和旋转。 2D 刚体官方文档
-
碰撞体:Collider
3.添加背景
3.1 添加用户界面
通过用户界面(user interface)给玩家回馈信息
将 UserInterface 预制件从 /Prefabs 文件夹拖入到场景中。在你查看 Game 视图时,系统会自动显示一个 UI 弹出窗口,其中包含 Score 和 Health 属性。
3.2 用图片精灵作为背景
inspector 中drawMode 设置为频谱平铺
Visiblity Optition 中layer设置为 Backgound
预制件
多个相同对象配置值相同,设置模板
-
添加星星: 将这个星星从 /Images 文件夹拖入到场景中。
-
添加分数脚本: 为星星添加 Collectable 脚本,将星星变成一个可收集物品,收集到一个星星便会奖励玩家一个点数。
-
添加碰撞体,让星星能被飞船收集: 为星星添加 PolygonCollider2D 组件,并启用 Is Trigger 属性
相关概念:
触发器: 用于触发事件。如果启用 Is Trigger 属性,则该碰撞体将用于触发事件,并被物理引擎忽略。 触发后,可以让对象变为无形(比如:被吃掉的金币,被拾取的装备等),Unity 会检测到两个对象相互接触的情况,继而执行设定好的事件(执行事件函数)。
Playground 的核心是脚本,这些脚本位于按类别组织的 Scripts 文件夹中。大多数脚本应该是可以立即使用的,但某些脚本要求以特定的方式标记对象才能正常运行
基本概念
核心概念/01-GameObject游戏对象和Component组件.md · chutianshu/AwesomeUnityTutorial – Gitee.com
官方文档
Essential Unity Concepts – Unity Learn
GameObject 游戏对象
Scene 包含的所有对象都是游戏对象
游戏对象包含一个多个游戏组件
游戏对象是 Unity 中的基础对象,表示角色、道具和景物。它们本身并没有取得多大作为,但它们充当组件的容器,而组件可实现功能。
Component 组件
组件定义了包含它们的游戏对象的行为,是每个游戏对象的功能单元。
Transform 变换组件
Transform 变换组件用于存储游戏对象的位置、旋转、缩放和父子化状态,因此非常重要。游戏对象始终附加一个变换组件,无法删除变换组件或创建没有变换组件的游戏对象。
变换组件的位置、旋转和缩放值是相对于变换组件的父项测量的。如果变换组件没有父项,则按照世界空间来测量属性。
Inspector 中任何子游戏对象的 Transform 值都是相对于父项 Transform 值显示的结果。这些值称为“局部坐标”
所有游戏对象都有Transform组件
静态游戏对象
如果游戏对象在运行时未移动,则被称为静态游戏对象。如果游戏对象在运行时移动,则被称为动态游戏对象。
Unity 中的许多系统都可以在 Editor 中预计算有关静态游戏对象的信息。由于静态游戏对象不会移动,因此这些计算的结果在运行时仍然有效。
所以,恰当地使用静态游戏对象可以节省运行时计算成本,并可能提高性能。
预制件
”可重用的模板“
Unity 的预制件系统允许创建、配置和存储游戏对象及其所有组件、属性值和子游戏对象作为可重用资源。预制件资源充当模板,在此模板的基础之上可以在场景中创建新的预制件实例。
如果要在场景中的多个位置或项目中的多个场景之间重用以特定方式配置的游戏对象,比如非玩家角色 (NPC)、道具或景物,则应将此游戏对象转换为预制件。这种方式比简单复制和粘贴游戏对象更好,因为预制件系统可以自动保持所有副本同步。
预制件原件:预制件本身,再 project 窗口的 Assets 中 预制件对象:用预制件原件创建的实例对象,在 scene 里
可以使用预制件实习多个对象同步
特点:
-
一次制作,多次使用
-
更改 prefab 原件,所有 prefab 对象会跟着改变
-
更改 prefab 对象,覆盖原件属性,保留特性
-
可以创建预制件的变体,从而将一系列覆盖组合在一起成为有意义的预制件变化
-
支持嵌套
通常使用场景:
-
环境资源 – 例如,在一个关卡附近多次使用的某种树(如上面的截屏所示)。
-
非玩家角色 (NPC) – 例如,某种类型的机器人可能会在游戏的多个关卡之间多次出现。它们的移动速度或声音可能不同(使用覆盖)。
-
飞弹 – 例如,海盗的大炮可能会在每次射击时实例化炮弹预制件。
-
玩家主角 – 玩家预制件可能被放置在游戏每个关卡(不同场景)的起点。
编辑预制件
双击预制件(或者,在 Inspector 窗口中单击 Open Prefab 按钮),可以进入预制件的编辑模式,在预制件模式下所做的更改(除了 Transform 属性外)会影响该预制件的所有实例。
预制件模式在 Scene 视图的右上角有一个 Auto Save 设置。启用此设置后,Unity 会将对预制件进行的任何更改自动保存到预制件资源。默认情况下会启用 Auto Save。
编辑预制件实例对象
直接更改预制件实例的属性,只会更改这一个实例的值,并不会影响预制件原件或其他实例。
除非,使用 overrides 下的两个按钮:
-
Reveret all : 还原所有更改的属性值,与预制件原件相同
-
Apply All :将在此实例中更改的任意属性值,写入预制件原件,同时也会应用到所有实例
也可以在这个 Overrides 菜单中,选择单项,进行逐项操作
实例覆盖
预制件实例中,不同于预制件原件的属性,称为“实例覆盖”
有四种不同的实例覆盖类型:
-
覆盖属性的值
-
添加组件
-
删除组件
-
添加子游戏对象
在 Inspector 窗口中,实例覆盖的名称标签以粗体显示,左边距使用蓝线显示。向预制件实例添加新组件时,边距位置的蓝线将涵盖整个组件。
添加和删除的组件在 Inspector 中的相应图标上也有加减符号标示,而添加的游戏对象在 Hierarchy 窗口中的相应图标上有一个加号标示。
注意:
预制件实例上覆盖的属性值始终优先于预制件资源的值。这意味着,如果更改预制件资源的属性,对覆盖该属性的实例没有任何影响。
对齐值绝不会从预制件资源传递到预制件实例。这意味着对齐值始终可与预制件资源的对齐不同,而不是作为显式实例覆盖。具体而言,对齐表示预制件实例的根变换的 Position 和 Rotation 属性,对于矩形变换,还包括 Width、Height、Margins、Anchors 和 Pivot 属性。 这是因为要求预制件的多个实例采用相同的位置和旋转是极其罕见的情况。更常见的情况是希望预制件实例具有不同的位置和旋转,因此 Unity 不会将它们视为预制件覆盖。
预制件变体
预制件是基类,预制件变体就是各个不同的派生类,用来派生出多个组别的预制件实例对象
预制件变体继承另一个称为基础预制件的预制件的属性。对预制件变体进行的覆盖优先于基础预制件的值。预制件变体可以使用任何其他预制件作为其基础预制件(包括模型预制件或其他预制件变体)。
创建和编辑预制件变体
-
方式 1: 在 Project 视图中的预制件上右键单击,然后选择 Create > Prefab Variant。这样将创建所选预制件的变体,该变体最初没有任何覆盖。可以在预制件模式下打开预制件变体,然后开始为其添加覆盖。
-
方式 2: 还可以将预制件实例从 Hierarchy 窗口中拖动到 Project 窗口中。执行此操作时会出现一个对话框,询问是要创建新的原始预制件还是预制件变体。如果选择预制件变体,则会根据拖动的预制件实例创建新的预制件变体。先前位于该实例上的所有覆盖现在都位于新的预制件变体中。可以在预制件模式下打开该变体以添加更多覆盖或者是编辑或删除覆盖。
与任何预制件实例一样,可以在预制件变体中使用预制件覆盖,例如修改的属性值、添加的组件、删除的组件以及添加的子游戏对象。也存在相同的限制:无法更改预制件变体中来自基础预制件的游戏对象的父级。也无法从预制件变体中删除存在于基础预制件中的游戏对象。但是,可以停用游戏对象(作为属性覆盖)来达到与删除游戏对象相同的效果。
预制件嵌套
可以将预制件拖拽到hierachy中的预制件中进行嵌套
解压缩预制件
要将预制件实例的内容恢复到常规游戏对象,请解压缩预制件实例。此操作正是创建(打包)预制件的相反操作,不同之处在于此操作不会破坏预制件资源,而是仅影响预制件实例。
可通过在 Hierarchy 窗口中右键单击预制件实例并选择 Unpack Prefab 来解压缩预制件实例。场景中生成的游戏对象不再与其以前的预制件资源有任何关联。预制件资源本身不受此操作的影响。这个操作不会影响到嵌套的预制件
Unpack Prefab Completely,会影响到子层嵌套预制件,对子层也会进行 unpack ,但如果还有孙子层,或者更多级的嵌套,则不会影响到
注意: 只能解压缩实例,而不能解压缩原件。 可以解压缩场景中存在的预制件实例,或者存在于其他预制件中的预制件实例。