Unity-Unity编辑器Part5

场景(Scene

场景包含游戏对象。它们可以用来创建主菜单或者其他任何东西。将每个独特的场景文件视为一个独特的层次。在每一个场景中,你会把你的环境、障碍和装饰都放置在你的游戏中。

一个新的空白场景,带有默认的3D对象 - 一个摄像头和一个定向光源(Light)。

当您创建一个新的Unity项目时,场景视图将显示一个新的场景。这是一个无标题未保存的场景。除了默认对象之外,这个场景将是空的——要么是一个正交相机和一个定向光,要么是透视相机和一个定向光,这取决于你是在2D还是3D模式下启动这个项目。

保存场景

要保存当前正在处理的场景,请从菜单中选择File > Save Scene,或按Ctrl + S.

场景将作为素材保存到项目的资产文件夹中。因此,它们就像任何其他资产一样出现在项目(project)窗口中。

一些场景资产,在项目视图中保存并可见

打开场景

要打开场景,要在该场景中开始或继续工作,请双击项目窗口中的场景资产。

如果您当前的场景包含未保存的更改,系统将提示您保存或放弃更改。

GameObject(游戏对象)

游戏对象(GameObject是在Unity编辑器中最重要的概念。

游戏中的每个对象都是一个GameObject。这意味着你在游戏中想到的一切都必须是一个GameObject。但是,GameObject不能自己做任何事情您需要在它成为字符、环境或特殊效果之前赋予它属性。

四种不同类型的GameObjects; 动画角色,光,树和音频源

一个游戏物体(GameObject)是一个容器您将添加到GameObject容器中的部分,使其成为一个字符,一个光,一棵树,一个声音,或者你想要的任何东西。您添加的每个部分都称为组件(component)

根据要创建的对象类型,您可以向GameObject添加不同的组件(component)组合。您可以将GameObject视为一个空的烹饪锅,并将组件作为不同的成分组成您的游戏配方。Unity有许多不同的内置组件类型,您还可以使用Unity Scripting API制作自己的组件

接下来将介绍GameObject组件(component)(script)脚本API如何组合在一起,以及如何创建和使用它们。

简介

GameObjectsUnity中基本的对象,它们代表人物,道具和风景。它们本身并没有完成什么工作,但是它们作为组件(component)的容器,实现了真正的功能。

例如,通过将Light(光源)组件附加到GameObject来创建Light(光源)对象。

一个立体的立方体物体有一个网格过滤器(Mesh Filter)和网格渲染器(Mesh Renderer)组件,来绘制立方体的表面,以及一个盒子碰撞器(Box Collider)组件来代表物体的固体体积。

一个简单的Cube GameObject与几个组件

一些细节

GameObject始终具有附加的Transform(坐标变换)组件(以表示位置和方向),并且不可能删除它。可以从编辑器的" component(组件)"菜单或脚本中添加赋予对象其功能的其他组件。在GameObject> 3D Object菜单中还有许多有用的预构造对象(原始形状,相机等),请参阅基本对象

脚本:GameObject(游戏对象)

Namespace: UnityEngine Parent class(父类): Object

描述

是Unity场景里面所有实体的基类。

变量

activeInHierarchy


场景中的游戏对象是否激活?

activeSelf


该游戏对象的局部激活状态。(只读)

isStatic


编辑器只指定游戏对象是否为静态的API。

layer


游戏对象所在的层,层的范围是在[0…31]之间。

scene


是哪个场景的一部分?

tag


这个游戏对象的标签。

transform


附加于这个游戏对象上的坐标变换组件。

构造器

GameObject


创建一个新的游戏物体,命名为name。

函数

AddComponent


添加组件:添加一个名称为<组件名(类名)> 到游戏对象上。

BroadcastMessage


广播函数:对此游戏对象及其子对象的所有的MonoBehaviour类中调用你想调用的方法。

CompareTag


此游戏对象是否被标记为tag标签?

GetComponent


如果这个游戏对象附件了一个类型为<组件名(类名)>的组件,则返回该组件,否则返回null。

GetComponentInChildren


返回此游戏对象或者它的所有子对象上以深度优先的查找方式返回第一个类型为<组件名(类名)>的组件。

GetComponentInParent


从父对象查找组件, 向上递归直到找到一个有效的组件,否则返回空。

GetComponents


返回该游戏对象所有<组件名(类名)>类型的组件列表。

GetComponentsInChildren


返回此游戏对象与其子对象所有<组件名(类名)>类型的组件。

GetComponentsInParent


返回此游戏对象与其父对象所有<组件名(类名)>类型的组件。

SampleAnimation


用于任何动画剪辑在给定的时间采样动画。

SendMessage


在这个游戏物体上的所有MonoBehaviour类上调用你想调用的的方法。

SendMessageUpwards


在这个游戏物体及其祖先物体的所有MonoBehaviour中调用你想调用的方法。

SetActive


激活/停用此游戏对象。

静态函数

CreatePrimitive


创建一个带有原型网格渲染器和适当的碰撞器的游戏对象。

Find


找到并返回一个名字为(你输入的名字)的游戏物体。

FindGameObjectsWithTag


返回具体tag标签的激活的游戏对象列表,如果没有找到则为null。

FindWithTag


返回标记为tag的一个游戏对象,如果没有找到对象则为null。

:关于查找的方法如果没有找到都返回null

使用组件(Component

组件是游戏中对象和行为的坚果和螺栓。它们是每个GameObject的功能块。

GameObject是许多不同组件的容器。默认情况下,所有GameObject都会自动有一个Transform Component(组件)。这是因为"transform)坐标变换"指示GameObject所在的位置,以及如何旋转和缩放。没有变换组件,GameObject将不能存在于游戏世界上的任何一个位置。现在尝试创建一个空的GameObject作为例子。单击GameObject> Create Empty菜单项。选择新的GameObject,然后查看Inspector(检查器)

即使空的GameObjects也有一个变换组件(transform)

请记住,您可以随时使用检查器(inspector)来查看哪些组件附加到所选的GameObject。在添加和删除组件时,检查器将始终显示当前附加的组件。您将使用检查器(inspector)更改任何组件(包括脚本)的所有属性。

添加组件(component

您可以通过组件菜单将组件添加到所选的GameObject。我们将尝试通过在刚刚创建的空的GameObject中添加一个Rigidbody(刚体)来实现。选择它,然后从菜单中选择Component(组件)> Physics(物理)> Rigidbody(刚体)。当你这样做时,你会看到Rigidbody(刚体)的属性出现在Inspector(检查器)中。如果您仍然选择空的GameObject,则按Play键,您可能会有一点意外。尝试一下,注意刚体如何将功能添加到一个空的GameObject。(游戏对象的transform(坐标变换)的Y值开始减少。这是因为,Unity的物理引擎导致GameObject在重力下下降。)

附有刚体(rigidbody)组件的空的GameObject

另一个选项是使用组件浏览器,它可以通过inspector(检查器)中的(Add component添加组件按钮来打开。

组件(component)浏览器

浏览器允许您按类别方便地浏览组件,并且还具有可用于按名称查找组件的搜索框。

您可以将任何数量或组合的组件附加到单个GameObject。一些组件与其他组件最好地结合使用。例如,Rigidbody(刚体)与Collider(碰撞器)一起工作。Rigidbody(刚体)通过物理引擎控制Transform Collider(碰撞器)允许Rigidbody与其他Collider(碰撞器)进行碰撞和交互。

编辑组件

组件的一个重要方面是灵活性。当您将组件附加到GameObject时,组件中有不同的值或 属性,可以在编译器中在构建游戏时进行调整,也可以在运行游戏时使用脚本。属性有两种主要类型:引用

看下面的图片。它是一个带有音频源组件的空的GameObject 。检查器中的音频源的所有值都是默认值。

此组件包含一个引用属性和七个值属性。Audio Clip(音频剪辑)是引用属性。当此音频源开始播放时,它将尝试播放Audio Clip(音频剪辑)属性中引用的音频文件。如果没有引用,则会发生错误,因为没有要播放的音频。您必须在检查器中引用该文件。将一个音频文件从项目(project)视图拖到引用属性或使用对象选择器(右边带点的小圈)即可。

现在音频剪辑(audio clip)属性中引用一个声音效果文件

音频剪辑上的其余属性都是Value属性。这些可以在检查器中直接调整。音频剪辑中的值属性都是复选框、数值、下拉框等,但是值属性也可以是文本字符串、颜色、曲线和其他类型。

组件上下文菜单命令

组件的上下文菜单有许多有用的命令。

组件上下文菜单

检查器(inspector)组件(component)面板右上角的"齿轮"图标可以打开。

重设(Reset

此命令可恢复组件属性在最近的编辑会话之前所具有的值。

删除组件(remove component

一个删除组件(remove component可删除您不再需要连接到GameObject的组件。注意,有一些组合相互依赖的组件(例如,铰链关节(Hinge Joint)只在有刚体(rigidbody)时起作用)如果您尝试删除其他GameObject依赖的组件,您将看到一条警告消息。

/下移动(Move Up/Down)

使用上(up)下移(Down)命令来重新排列检查器中GameObject的组件顺序。

复制(copy)/粘贴(paste)

Copy component(复制组件)命令存储组件的类型和当前属性设置。然后可以使用" (paste component values)粘贴组件值"将这些粘贴到相同类型的另一个组件。您还可以通过使用"(paste component as new)粘贴为一个新的组件"将对象复制的值创建为新组件

测试属性

当您的游戏处于游戏模式时,您可以随意更改任何GameObjectInspector(检查器)中的属性。当您退出游戏模式时,您的属性将恢复为其播放前模式值,因此您不会丢失您的任何工作。

坐标变换(Transform)

所述变换组件确定的位置(position)旋转(rotation),和缩放(scale)场景中的每个对象的。每个GameObject都有一个Transform(坐标变换)

属性

属性:

功能:

位置(position)

变换在XYZ坐标中的位置。

旋转(rotation)

围绕XYZ轴的旋转,以度为单位。

缩放(scale)

沿XYZ轴的缩放尺度。值"1"是原始大小(导入对象的大小)。

Transform的位置,旋转和缩放值是相对于Transform的父节点进行测量的。如果Transform没有父项,则属性是在世界空间中测量的。

脚本:transform(坐标变换)

场景中的每一个对象都有一个Transform(坐标变换)。用于储存并操控物体的位置、旋转和缩放。每一个Transform可以有一个父级,允许你分层次应用位置、旋转和缩放。可以在Hierarchy(层次结构)面板查看层次关系。它实现了IEnumerable(枚举接口),因此你可以使用循环(foreach)遍历其子对象。

变量

childCount


该坐标变换的子对象数量。

eulerAngles


欧拉角。

forward


在世界空间的坐标变换的蓝轴(也就是z轴)。

hasChanged


自从上一次将标记(flag)设置为"false"之后,坐标转换发生了变化吗?

localEulerAngles


相对于父级坐标变换的欧拉角。

localPosition


相对于父级坐标变换的位置。

localRotation


该坐标变换相对于父级坐标变换的旋转(四元数)。

localScale


相对于父级坐标变换的缩放。

localToWorldMatrix


从局部空间转换到世界空间的矩阵(只读)。

lossyScale


该对象的整体缩放(只读)。

parent


该坐标变换的父对象。

position


在世界空间坐标变换的位置。

right


在世界空间的坐标变换的红轴(也就是x轴)。

root


返回最顶层级的坐标变换。

rotation


在世界坐标空间的旋转(四元数)。

up


在世界空间的坐标变换的绿轴(也就是y轴)。

worldToLocalMatrix

Matrix that transforms a point from world space into local space (Read Only).
变换点的矩阵从世界坐标到局部坐标(只读)。

Functions 函数

DetachChildren


所有子对象解除父子关系。

Find


通过名字查找子对象并返回。

GetChild

通过索引返回一个子对象的坐标变换。

GetSiblingIndex

Gets the sibling index.
获取该对象的同级索引。

InverseTransformDirection


变换的方向从世界坐标转换到局部坐标。和Transform.TransformDirection的功能相反。

InverseTransformPoint


变换位置从世界坐标到局部坐标。和Transform.TransformPoint功能相反。

InverseTransformVector


变换一个向量从世界坐标空间到局部坐标空间。和Transform.TransformVector功能相反。

IsChildOf


这个变换是(您填入变量)的子对象吗?

LookAt


旋转此坐标变换,让(forward(Z轴))向前向量指向(填入一个transform变量)的当前位置。(照相机的视口对准目标)

Rotate


应用一个欧拉角,eulerAngles.z度围绕z轴,eulerAngles.x度围绕x轴,eulerAngles.y度围绕y轴(这样的顺序)。

RotateAround


把坐标变换围绕世界坐标的point(点)的axis(轴——旋转该变换angle(度)。

SetAsFirstSibling


移动该变换到此局部变换列表的开头。

SetAsLastSibling


移动该变换到此局部变换列表的末尾。

SetParent


设置该变换的父级。

SetSiblingIndex


设置该变换的同级对象的索引。

TransformDirection


变换方向从局部坐标转换到世界坐标。

TransformPoint


变换位置从局部坐标到世界坐标。

TransformVector

变换一个向量从局部坐标空间到世界坐标空间。

Translate


把变换移动(填入一个vector3)的方向和距离。

 

欧拉角与四元数

欧拉角(euler Angles)和旋转(rotation)都是基于local(局部)坐标系的旋转,不同的是角度的表示方式前者是用欧拉角度表示的,而后者是用四元数表示的。

停用GameObject

可以通过将GameObject标记为非激活状态来临时从场景中移除GameObject。这可以使用脚本中的activeSelf属性或检查器(inspector)中的激活复选框来完成。

GameObject的激活时复选框

停用父GameObject的效果

当父对象被禁用时,禁用也将应用于其所有子对象上的activeSelf,因此从父向下的整个层次结构(hierarchy)将被禁用。请注意,这并不会改变子对象activeSelf属性的值,所以一旦父母被重新激活,他们将返回到原来的状态。这意味着您无法通过读取其activeSelf属性来确定子对象当前是否处于激活状态。所以,您应该使用activeInHierarchy属性,它将考虑父进程的覆盖效果。

//使用递归给一个GameObject和其所有的下层对象设置激活状态

void DeactivateChildren(GameObject g, bool a)

{

g.SetActive(a);

 

foreach (Transform child in g.transform)

{

DeactivateChildren(child.gameObject, a);

}

}

标签(Tag)

标签(Tag)是一个引用词,你可以分配给一个或多个游戏对象。例如,你可以为玩家控制的字符定义"玩家"标签和非玩家控制字符的"敌人"标签。你可以定义玩家可以在一个带有"收藏"标签的场景中收集的物品。

标签(tag)帮助您识别用于脚本的游戏对象。它们确保您不需要使用拖放来手动地将GameObject添加到脚本的public属性中,从而节省了在多个游戏对象中使用相同的脚本代码的时间。

标签在碰撞器(Collider)控制脚本中对会触发器很有用他们需要确定玩家是否与敌人,道具或收集品进行交互。

创建新标签

检查器(inspector)显示标签(Tags)下拉菜单。

要创建一个新的标签,选择添加标签...。这将在检查器员(inspector)中打开标签管理器。请注意,一旦你命名一个标签,它将不能被重命名。

提示

  • 一个GameObject只能分配一个Tag
  • Unity包含一些内置的标签,不会出现在标签管理器中:
  • 未标记(Untagged)
  • 重生点(respawn)
  • 完成(Finish)
  • EditorOnly
  • (主摄像机)MainCamera
  • 玩家(Player)
  • GameController(游戏控制器)
  • 你可以使用任何你喜欢的词作为标签。

     

    静态(Static)GameObjects

    许多优化需要知道对象是是否会在游戏过程中改变。关于静态(static)(即不改变)对象的信息通常可以在编辑器中预先计算,因为它不会因对象位置的变化而失效。例如,可以通过将几个静态对象组合成称为批处理的单个大对象来优化渲染。

    GameObject的检查器在右上角有一个Static复选框和菜单,用于通知Unity中各种不同的系统,该对象不会改变。可以将对象分别标记为每个这些系统的静态对象。

    静态(static)复选框和下拉菜单,如在检查器(inspector)中查看GameObject时可看到

    预设体(Prefab

    通过添加组件并将其属性设置为适当的值,可以方便地在场景中构建GameObject。但是,如果您有像NPC这样的GameObject,就可能会产生问题。又如在场景中多次重复使用的环境或风景。简单地复制对象肯定会产生重复,而且它们都可以独立编辑。但是通常,您可能会希望特定对象的所有实例具有相同的属性,因此,当您编辑场景中的一个对象时,您不必对所有副本重复进行相同的编辑。

    幸运的是,Unity有一个Prefab(预设体)资产类型,可以让您存储一个完整的组件和属性的GameObject对象。预设体(Prefab)作为模板,您可以在该模板中在场景中创建新的对象实例。对预制体(Prefab)资产进行的任何编辑都会立即反映在从其在场景(Scene)中所生成的所有实例中,但也可以单独更改每个实例的组件和设置。

    注意:当您将资产文件(例如,网格(mesh))拖动到场景中时,它将创建一个新的对象实例,并且所有这些实例将在更改他们的原始(Asset)资产时更改。然而,虽然它的行为表面上相似,但(Asset)资产不是预设体(Prefab),所以您将无法添加组件或使用下面描述的预设体的其他功能。

    使用Prefab(预设体)

    您可以通过选择Asset > Create Prefab(创建预设体)创建预设体,然后将一个GameObject从(Scene)场景拖动到出现的""预设体(prefab)资产(Asset)上。之后,如果将不同的GameObject拖到预设体(prefab)上,将会询问您是否将当前的GameObject替换为新的对象。将预设体(prefab)资产(Asset)从项目视图拖动到场景视图,就能创建预设体(prefab)的实例。作为预设体(prefab)的实例创建的对象将以蓝色字体显示在层次结构视图中。(普通物体用黑色字体显示)

    如上所述,预设体资产本身的更改将反映在所有实例中,但您也可以单独修改单个实例。这是很有用的,比如说,当你想要创建几个类似的NPC时,但是要引入一些变化来使它们更逼真。为了让它清楚地表明当一个属性被修改了的时候,它会显示在检查器(inspector)中以略粗的黑体显示。 (当一个完整的新组件被添加到一个预设体的实例中时,它的所有属性都以略粗的黑体显示。)

    一个预设体(prefab)实例上的网格渲染器(mesh renderer)的"Cast Shadows"属性被修改

    您还可以使用脚本在游戏运行时创建prefab实例。有关更多详细信息,请参阅有关实例化Prefabs的手册页。

    从预设体(prefab)的实例编辑预设体(prefab

    预设体(prefab)实例的检查器具有不存在于普通GameObject的三个按钮:选择(Select还原(Revert 应用(Apply

    点击选择(Select"按钮选择到生成实例的预设体(prefab)资产(Asset)。这允许您编辑源预设体,从而更改它的所有实例。但是,您也可以使用应用(Apply"按钮将实例中的修改值保存回原始预制(由于显而易见的原因,您修改的Transform(坐标变换)的"位置""旋转"将被排除)。这有效地允许您通过任何单个实例来编辑所有实例,是进行全局更改的非常快捷方便的方式。如果您尝试修改属性,然后您觉得还是默认值适宜,则可以使用"还原(Revert)"按钮将该实例还原到与其预设体(prefab)相同的状态上。

    保存你的工作

    Unity存储了许多不同类型的关于您项目的信息,当你做出改变时需要保存你的工作。

    当然,我们建议您定期保存,并使用版本控制系统(VCS来保留对工作的增量更改,并允许您尝试并回滚更改,而不会对您的工作造成损失。

    将更改保存到当前场景("保存场景"

    Scene)场景更改包括对层次结构中的任何对象的修改。例如,添加,移动或删除GameObject,更改检查器中层次化GameObject的参数。

    将更改保存到(Scene)场景,从文件(Flie)菜单中选择保存场景(Save Scene),或点击Ctrl + S。这样可以将当前的更改保存到场景中,并执行"Save项目"(如下所示)这意味着当您执行"保存场景Save Scene"时,所有内容都将保存。

    保存项目范围的更改("保存项目"

    您在Unity中进行的一些更改可能不是特定于场景的,而是在整个项目范围内进行的。通过从文件菜单中选择"保存项目(save project)",可以独立于场景更改来保存这些设置。

    注意:使用"保存项目"不保存对(Scene)场景的更改,它只会保存项目范围的更改。"保存项目(save project"时保存的项目范围更改包括:

    所有的"项目设置(project Setting"

    "保存项目"时,将保存每个"项目设置"菜单项的所有设置,如自定义输入轴(custom input axes),用户定义的标签或图层,以及物理重力强度(physics gravity strength)。

    项目设置菜单

    当保存项目时,这些设置的更改将保存在项目目录下的Library文件夹中:

  • 输入:保存为"InputManager.asset"
  • 标签和图层:保存为"TagManager.asset"
  • 音频:保存为'AudioManager.asset'
  • 时间:保存为"TimeManager.asset"
  • 播放器:另存为'ProjectSettings.asset'
  • 物理学:保存为'DynamicsManager.asset'
  • 物理2D:保存为"Physics2DSettings.asset"
  • 质量:保存为"QualitySettings.asset"
  • 图形:保存为"GraphicsSettings.asset"
  • 网络:保存为"NetworkManager.asset"
  • 编辑器:保存为"EditorUserSettings.asset"

    "构建设置(Build Settings"

    构建设置(Build Settings)也保存在项目目录下的Library文件夹中,作为"EditorBuildSettings.asset"

    当您"保存项目"时,会保存构建设置

    项目(project)窗口中资产(Asset)的更改

    与项目范围设置一起保存的还有那些没有"应用(Apply"按钮的资产的更改,例如以下内容:

  • 材质参数(Material parameters
  • 预设体(prefab
  • 动画控制器(Animator Controllers&状态机(state machines)
  • 任何其他没有"应用"按钮的资产的更改

    立即写入磁盘的更改(不需要保存)

    有一些类型的更改立即写入磁盘,而不需要执行"保存"操作。这些包括以下内容:

    更改任何导入设置,要求用户按"应用(Apply"按钮

    大多数资产类型的导入设置要求您按"应用(apply"按钮使更改生效。根据新设置重新导入资产,当您点击Apply按钮时,这些更改将立即保存。例如:

  • 改变3D模型资产的比例因子
  • 更改音频资产的压缩设置
  • 更改图像资产的纹理类型
  • 任何其他导入设置更改具有"应用"按钮

    其他更改立即保存:

    一些其他类型的数据将立即或自动保存到磁盘,而无需执行"保存"操作:

  • 脚本执行顺序更改(按"应用"后,此数据保存在每个脚本的.meta文件中)

    在运行时实例化Prefab(预设体)

    到目前为止,您应该从根本上了解Prefab的概念。它们是您游戏中可重用的预定义GameObjectsComponents的集合。

    当您要在运行时实例化复杂的GameObject时,使用Prefab是非常方便的。

    常见情况

    为了说明Prefab的实力,让我们考虑一些基本的情况,他们会派上用场:

  1. 通过在不同的位置创建几次,通过单个""Prefab(预设体)建立一个墙壁。
  2. 一枚火箭发射器在发射时实例化了一枚飞行的火箭PrefabPrefab包含一个网格(么事),刚体(rigidbody碰撞器(Collier和一个带有自己的轨迹的粒子系统(Particle System)的子GameObject
  3. 机器人爆炸了许多件。一个完整的,可操作的机器人被毁坏,并被毁坏的机器人的Prefab替换。这个Prefab将包括机器人分为许多部分,全部设置了自己的刚体和粒子系统。这种技术允许您将机器人炸成许多块,只需一行代码,用Prefab替换一个对象。

    建墙

    这个演示将说明使用Prefab和从代码创建对象的优点。

    首先,让代码建立一个砖墙:

    void Start()

    {

    for (int y = 0; y < 5; y++)

    {

    for (int x = 0; x < 5; x++)

    {

    GameObject cube = GameObject. (PrimitiveType.Cube);

    cube.AddComponent<Rigidbody>();

    cube.transform.position = new Vector3(x, y, 0);

    }

    }

    }

  • 要使用上述脚本,我们只需保存脚本并将其拖到一个空的GameObject上。
  • 创建一个空的GameObject,从GameObject->Create Empty

    如果您执行该代码,在您进入游戏模式时您将看到一个完整的砖墙。每个砖块都与CreatePrimitive AddComponent 这两行代码有关。现在看起来还不错不是吗?但是我们的每个砖块都是没有纹理(texture)的。在每个砖块上进行一些额外的操作,如改变纹理,摩擦力或刚体质量(rigidbody mass),都可以通过一条额外的代码实现。

     

    如果您使用Prefab创建每个砖块,则这是创建墙壁所需的代码:

    public GameObject brick;

     

    void Start()

    {

    for (int y = 0; y < 5; y++)

    {

    for (int x = 0; x < 5; x++)

    {

    Instantiate(brick, new Vector3(x, y, 0), Quaternion.identity);

    }

    }

    }

    这不仅非常简洁,而且非常可重复使用。

    实例化火箭和爆炸

    Prefabs如何适应这种情况:

  1. 火箭发射器在用户点火时实例化火箭PrefabPrefab包含一个网格(mesh),Rigidbody(刚体)Collider(碰撞器)和一个带有自己的轨迹的粒子系统(Particle System)的子GameObject
  2. 火箭撞击并实例化爆炸Prefab。爆炸Prefab包含一个粒子系统(Particle System),一个随时间而消失的光源(Light),以及一个对周围的游戏物体造成伤害的脚本。
  3. 虽然可以完全从代码中构建一个火箭GameObject,但是比起手动添加组件和设置属性,实例化Prefab是更容易的。你可以用一行代码实例化火箭,无论火箭的Prefab有多复杂。在实例化Prefab之后,您还可以修改实例化对象的任何属性(例如,可以设置火箭刚度的速度)。

    该脚本显示如何使用Instantiate()函数启动火箭。

    public Rigidbody rocket;

    public float speed = 10f;

     

    void FireRocket()

    {

    Rigidbody rocketClone = (Rigidbody)Instantiate(rocket, transform.position, transform.rotation);

    rocketClone.velocity = transform.forward * speed;

     

    //您还可以使用克隆的其他组件/脚本

    //rocketClone.GetComponent<YourRocketScript>().DoSomething();

    }

     

    // 按住ctrl键或鼠标时调用Fire

    void Update()

    {

    if (Input.GetButtonDown("Fire1"))

    {

    FireRocket();

    }

    }

    用残骸替代角色

    让我们说,你有一个完全装备的敌人角色死亡。您可以简单地在角色上播放死亡动画,并禁用通常处理敌方逻辑的所有脚本。您可能需要注意删除多个脚本,添加一些自定义逻辑,以确保没有人会继续攻击死敌,以及其他清理任务。

    一个更好的方法是立即删除整个角色,并将其替换为破坏的预设体(prefab)的实例。这给了你很大的灵活性。您可以给死亡角色使用不同的材质,或附加完全不同的脚本。

    任何这些选项都可以通过单次调用Instantiate()来实现,您只需将其连接到正确的预制,即可设置!

    要记住的重要部分是,您Instantiate()的残骸可以由与原始物体完全不同的对象制成。例如,如果你有一架飞机,你可以建立两个版本。一个飞机可由一个网格渲染器(mesh renderer和一个飞机物理脚本来组成GameObject。通过将模型保持在一个GameObject中,当你的飞机高兴地飞来飞去时,你没有理由将它分开。

    要建造一架失事的飞机Prefab,典型的步骤是:

  4. 让您的建模者中把您的飞机模型拆许多不同的部分,
  5. 创建一个空的场景
  6. 将模型拖动到空的场景中
  7. 通过选择所有部件并选择Component-> Physics-> Rigidbody,将刚体添加到所有部份
  8. 通过选择所有部件并选择Component-> Physics-> Box ColliderBox Colliders(盒子碰撞器)添加到所有部分
  9. 要获得额外的特殊效果,可以将每个零件添加一个烟雾粒子系统作为子GameObject
  10. 现在你有一架有多个爆炸部件的飞机,它们通过物理掉落到地面,并由于附着的粒子系统而造成一个粒子轨迹。点击Play以预览您的模型如何反应并进行任何必要的调整。
  11. 选择Asset - >Create Prefab
  12. 将包含所有飞机零件的顶级GameObject拖到Prefab

    以下示例显示了这些步骤如何在代码中进行建模:

    1. public GameObject wreck;
    2. void Update()
    3. {
    4. if (/*一些条件*/)
    5. {
    6. KillSelf();
    7. }
    8. }
    9. void KillSelf()
    10. {
    11. // 我们在所处的同一位置实例化残骸游戏对象
    12. GameObject wreckClone = (GameObject)Instantiate(wreck, transform.position, transform.rotation);
    13. //有时我们需要把一些变量从这个对象移到残骸上
    14. //wreckClone.GetComponent<OtherScript>().someVariable = GetComponent<ThisScript>().someVariable;
    15. //然后干掉自己
    16. Destroy(gameObject);
    17. }

    将一堆对象放在特定的模式中

    让我们说你想把一堆对象放在一个网格或圆形图案中。一般来说,这可以通过以下两种方式完成:

  13. 从代码完全构建一个对象。这很麻烦!
  14. 在场景中制作一个完全可操纵的物体,复制它并在场景中多次放置。但这很乏味,而且在网格中精确放置对象是很困难的。

    因此,应该使用一个预设体(Prefab)的实例,我们认为你了解了为什么在这些场景中,Prefabs是如此有用。以下是这些场景所需的代码:

    public GameObject prefab;

    public int numberOfObjects = 20;

    public float radius = 5f;

     

    void Start() {

    for (int i = 0; i < numberOfObjects; i++) {

    float angle = i * Mathf.PI * 2 / numberOfObjects;

    Vector3 pos = new Vector3(Mathf.Cos(angle), 0, Mathf.Sin(angle)) * radius;

    Instantiate(prefab, pos, Quaternion.identity);

    }

    }

    再探坐标变换(Transform

    坐标变换(transform)被用来存储游戏物体的位置,旋转,缩放和父子关系,因此它在非常的重要。GameObject将始终具有一个Transform组件(component - 无法删除Transform或创建一个没有transformGameObject

    编辑坐标变换(transform

    坐标变换(transform)在XYZ轴的3D空间中或仅在XY中的2D空间中进行操作。在Unity中,这些轴分别由红色(X),绿色(Y)和蓝色(Z)表示。

    坐标变换(transform

    可以在"场景(Scene"视图中或通过在"检查器(inspector"中更改其属性来编辑"坐标变换(transform"。在(Scene)场景中,您可以使用移动,旋转和缩放工具修改变换。这些工具位于Unity 编辑器的左上角。

    查看,翻译,旋转和缩放工具

    这些工具可以在场景中的任何对象上使用。当您点击对象时,您将看到(小工具)Gizmo出现在其中。Gizmo(小工具)的外观取决于选择了哪个工具。

    Transform Gizmo(小工具(坐标变换特有的Gizmo))

    当您点击并拖动三个Gizmo轴之一时,您会注意到其颜色变为黄色。当您拖动鼠标时,您将看到对象沿所选轴的平移,旋转或缩放。释放鼠标按钮时,轴保持选中状态(呈现黄色)

    显示所选(黄色)X轴的变换

    父子关系

    父子关系是使用Unity时了解的最重要的概念之一。当GameObject是另一个GameObject 父级时,子GameObject会像其父级一样移动,旋转和缩放。你可以将父子关系视为像你的手臂和身体之间的关系每当你的身体移动,你的手臂也随之移动。子对象也可以拥有自己的子对象等等。所以你的双手可以被视为手臂的"子对象",然后每只手都有几根手指等等。任何物体都可以有多个子对象,但只有一个父对象。这些多级别的父子关系形成一个变换层次结构(hierarchy)。层次结构顶端的对象(即层次结构中唯一没有父项的对象)称为顶层对象或根

    您可以通过将层次结构(hierarchy)视图中的任何GameObject拖动到另一个来创建一个父级。这将在两个GameObject之间创建一个父子关系。

    父子层次结构示例。在其姓名左侧的折叠箭头的GameObject是父对象。

    请注意,对于任何子GameObjectInspector(检查器)中的Transform值将显示相对于父对象的Transform值。这些值被称为局部坐标。对于场景构造来说,它通常足够处理子对象的局部坐标,但是在游戏中,在世界空间或全局坐标中找到它们的确切位置通常是有用的。坐标变换(transform)组件(component)的脚本API具有单独的属性,用于本地和全局位置,旋转和缩放,还允许您在本地和全局坐标之间转换任意的点。

    非均匀缩放(Scale)的限制

    不均匀缩放是当变换中的缩放对于xyz具有不同的值时例如(242)。相反,均匀缩放对于xyz具有相同的值例如(333)。在一些具体情况下,非均匀缩放可能是有用的,但是它引入了不统一缩放不会出现的一些怪异:

  • 某些组件不完全支持非均匀缩放。例如,一些组件具有由半径属性定义的圆形或球形元素,其中包括球形碰撞器(Sphere Collider)、胶囊碰撞器(Capsule Collider)、光源(Light )和音源(Audio Source)。在这样的情况下,圆形的形状不会像你所期望的那样,在不均匀的缩放下变成椭圆,而且只会保持圆形。
  • 当一个子对象有一个非均匀扩展的父对象并且与父对象相对旋转时,它可能出现倾斜或"剪切"。有些组件支持简单的非均匀缩放,但是在这样的倾斜时不能正常工作。例如,倾斜的盒子对撞器(Box Collider)"将不准确地匹配渲染网格(mesh)的形状。
  • 出于性能原因,非均匀缩放父对象的子对象在旋转时不会自动更新其缩放比例。结果,当缩放比例最终更新时,子对象的形状可能会突然改变,比如说子对象是否与父母分离。

    缩放(Scale)的重要性

    Transform的缩放决定了建模应用程序中网格的大小与Unity中该网格的大小之间的差异。因此Transform的缩放非常重要,特别是在物理模拟过程中。

    有三个因素会影响对象的缩放:

  • 您的3D建模应用程序中的网格(mesh)尺寸。
  • 对象导入设置(Import Settings)网格比例因子(Mesh Scale Factor)设置
  • 变换组件的缩放(Scale)值。

    理想情况下,您不应该调整变换组件中对象的缩放。最好的选择是创建你需要的大小的模型,这样你就不必改变Transform的缩放。或者是在您导入单个网格的导入设置(Import Settings)调整导入网格(mesh)的比例。某些优化是基于导入大小进行的,并且实例化一个具有调整的缩放值的对象会降低性能。

    使用坐标变换的一些小提示

  • 在为父Transform添加子对象之前将父对象的位置设置为<0,0,0>是非常有用的。这意味着子对象的本地坐标将与全局坐标相同,从而更容易确保您的子对象处于正确的位置。
  • 粒子系统(Particle Systems)不受坐标变换的缩放(Scale)的影响。为了缩放粒子系统(Particle Systems),您需要修改粒子系统(Particle Systems),动画器(Animator)和渲染器(Renderer)中的属性。
  • 如果您使用Rigidbody(刚体)进行物理模拟,那么参阅Rigidbody组件参考页面上的Scale属性。
  • 改变缩放将影响子Transform的位置。

    Unity中的旋转和方向

    概要

    3D应用程序中的旋转通常用两种方式之一表示,即四元数或欧拉角。每个都有自己的用途和缺点。Unity在内部使用Quaternion(四元数),但是在检查器(inspector)中显示等效的欧拉角度的值,以便您编辑。

    再探欧拉角(Euler Angle)与四元数(Quaternion

    欧拉角(Euler Angle

    欧拉角具有更简单的表示,它们是顺序施加的三个角度值XYZ。为了将欧拉旋转应用于特定物体,每个旋转值依次被施加为围绕其​​对应轴线的旋转。

  • 优点:欧拉角度具有直观的"可读"格式,由三个角度组成。
  • 优点:欧拉角可以通过180度的旋转来表示从一个方向到另一个方向的旋转
  • 限制 :欧拉角度受到万向锁的影响。依次施加三次旋转时,第一或第二旋转可能导致第三轴指向与先前轴之一相同的方向。这意味着"自由度"已经丧失,因为第三个旋转值不能应用于唯一的轴。

    四元数Quaternion

    可以使用四元数来表示对象的方向或旋转。他在内部的表现包括四个数字(Unity中被称为xyzw),然而这些数字并不表示角度或坐标轴,通常不需要直接访问它们。除非你的兴趣是研究四元数学,否则你只需要知道四元数(Quaternions)代表3D空间中的旋转,你通常不需要知道或修改xyz属性。

  • 好处:四元数旋转不会受到万向锁定。
  • 限制:单个四元数不能表示任何方向超过180度的旋转。
  • 限制:四元数字的数字表示方式是不能直观理解的。

    Unity中,所有的游戏对象旋转都是内部存储为四元组。

    然而,在Transform检测员(inspector)中,我们使用欧拉角显示旋转,因为这更容易理解和编辑。输入到检查器(inspector)中的GameObject旋转的新值将被转换为"引擎内"的对象的四元数(Quaternion)旋转新值。

    游戏对象的旋转在检查器中显示和编辑为欧拉角(Euler Angle),但内部存储为四元数(Quaternions

    作为副作用,检查器可以为游戏对象旋转输入X0Y365Z0的值。这显然是一个不可能表示为四元数的值,所以当您点击Play时,您会看到对象的旋转值更改为X0Y5Z0(或者其他)。这是因为Transform的旋转(Rotation)为不具有"360度旋转加5"概念的四元组,而是简单地将其设置为与旋转结果相同的方向。

    对脚本的影响

    在处理您的脚本中处理旋转时,您应该使用(四元数)Quaternion类及其函数来创建和修改旋转值。

    直接创建和操纵四元数

    UnityQuaternion(四元数)类有许多功能,允许您创建和操作旋转,而无需使用欧拉角度。例如:

    创建:

  • Quaternion.LookRotation
  • Quaternion.AngleAxis
  • 操纵:

  • Quaternion.Slerp
  • Quaternion.Inverse
  • Quaternion.RotateTowards
  • Transform.Rotate Transform.RotateAround

    然而有时候,您的脚本中可能需要使用欧拉角度。在这种情况下需要注意,您必须将角度保存在变量中,并且只使用它们来应用它们作为你旋转的欧拉角。虽然可以从四元数中读取欧拉角,但如果您读取,修改和重新应用,则会出现问题。

    以下是使用假设的示例尝试围绕X轴以10/秒旋转对象的错误的例子。这是你应该避免的

    //旋转脚本错误# 1

    //这里的错误是我们正在修改四元数的x值

    //这个值不代表一个角度,也不会产生预期的结果

     

     

    void Update()

    {

     

    var rot = transform.rotation;

    rot.x += Time.deltaTime * 10;

    transform.rotation = rot;

     

    }

    //旋转脚本错误# 2

    //这里的错误是我们正在读取,修改然后将其应用作为欧拉角

    //这些值是由四元数计算出来的,

    //因为可能会受到万向锁锁的影响,每一个新的旋转(Rotation)可能会返回差别非常大的欧拉角

     

     

    void Update()

    {

     

    var angles = transform.rotation.eulerAngles;

    angles.x += Time.deltaTime * 10;

    transform.rotation = Quaternion.Euler(angles);

     

    }

     

    这里是一个正确使用欧拉角度的例子:

    //正确使用欧拉角旋转的脚本。

    //这里我们把欧拉角存储在一个类变量中,只使用它

    //把它应用到一个欧拉角度,但我们从不依赖于从四元数读取欧拉角。

     

     

    float x;

    void Update()

    {

     

    x += Time.deltaTime * 10;

    transform.rotation = Quaternion.Euler(x, 0, 0);

     

    }

    发布游戏

    在您创建游戏的时候,当您在编辑器之外构建和运行时,您可能希望看到它是如何独立运行的。本节将介绍如何访问构建设置(Build Settings 以及如何创建不同的游戏构建。

    File->Build Settings...是访问构建设置窗口的菜单项。它会弹出一个可编辑的场景列表,当您构建游戏时将包含这些场景。

    "构建设置( Build Settings)"窗口

    第一次在项目中查看此窗口时,它将显示为空白。将场景文件添加到列表中可以轻松添加多场景构建。有两种方法可以添加它们。第一种方法是单击添加打开场景(Add Open Scene按钮。您将看到当前打开的场景出现在列表中。添加场景文件的第二种方法是将它们从项目(project)视图"拖动到列表中。

    此时,请注意,您的每个场景都有不同的索引值。场景(Scene)0是构建游戏时将加载的第一个场景。当您要加载新场景时,请在脚本中使用SceneManager.LoadScene()[在namespace UnityEngine.SceneManagement中]

    如果您添加了多个场景文件并想重新排列,只需单击并拖动列表上方或下方的场景,直到按照所需顺序排列。

    如果要从列表中删除场景,请单击以突出显示场景,然后按Ctrl+Delete。场景将从列表中消失,不会包含在构建中。

    当您准备发布构建时,选择一个平台,并确保Unity徽标位于该平台旁边,让Unity知道您要构建哪个平台。最后按Build按钮。您可以使用标准的"保存"对话框来选择游戏的名称和位置。当您单击保存时Unity会建立您的游戏内容。这很简单 如果您不确定在哪里保存您的内置游戏,请考虑将其保存到项目根文件夹中。

    注:不要将其保存到Assets文件夹中。

    启用开发构建( Development Build复选框将启用Profiler(分析器)功能,并且还将使"自动连接分析器和脚本调试"选项可用。

    建立独立于编辑器的游戏

    使用Unity可以为WindowsMacLinux构建独立的应用程序。这只是在构建设置对话框中选择构建目标的问题,并点击"构建(build"按钮。构建独立的游戏时,生成的文件将根据构建目标而有所不同。对于Windows构建目标,将构建可执行文件(.exe),以及包含应用程序所有资产的Data文件夹。对于Mac构建目标,将构建一个包含运行应用程序所需的文件以及资产的应用程序安装包。

    在构建过程中

    建筑过程将会在您指定的地方放置内置游戏应用程序的空白副本。然后,它将通过构建设置中的场景列表工作,一次在编辑器中打开它们,优化它们,并将它们集成到应用程序包中。它还将计算所包含场景所需的所有资产,并将该数据存储在应用程序包中的单独文件中。

  • 任何的场景中标记(Tags)有"EditorOnly"GameObject将不包括在发布版本中。这可能会对您的调试有所帮助。
  • 当新的场景加载时,上一场景的所有对象都将被销毁。为了防止这种情况,请对任何不想销毁的对象使用DontDestroyOnLoad()。这最常用于在加载级别时保持音乐播放,或者用于保持游戏状态和进度的游戏控制器脚本。
  • 加载新的场景完成后,消息:OnLevelWasLoaded()将被发送到所有激活的GameObject

    预加载

    发布的游戏在场景加载时会自动地预加载场景中的所有资产。这个规则的例外是场景(Scene)0。这是因为第一个场景通常是一个启动界面(显示产品Logo、公司Logo或者开发者信息),你可能想要尽可能快地将它显示出来。

    为了确保您的所有内容都已预装载,您可以创建一个调用SceneManager.LoadScene(1);的空场景(Scene)。在构建设置中,把这个空场景的索引为0.这样所有后续的场景都可以被正确地预加载。

    首选项(Preferences)

    Unity提供了一些首选项设置,以允许您自定义Unity Editor的行为。要访问它们,请访问 Edit > Preferences

    通用(General)

    设置

    属性

    自动刷新

    (Auto Refresh)

    选中此框可在更改资产时将其自动更新。

    在启动时加载上一个项目

    (Load Previous Project on Startup)

    选中此框在Unity启动时始终加载上一个项目。

    在导入时压缩资产

    (Compress Assets on Import)

    选中此框以在导入期间自动压缩资产。

    禁用编辑器分析(仅限Pro)(Disable Editor Analytics)

    选中此框,以停止编辑器自动将信息发送回Unity。

    显示资产商店搜索匹配

    (Show Asset Store search hits)

    选中此框以显示项目浏览器中资产商店的免费/付费资产数量。

    保存资产核实

    Verify Saving Assets

    在退出时,要核实哪个资产单独保存吗?

    编辑皮肤(仅限Plus / Pro)

    可选黑或白。

    启用Alpha数字排序

    Enable Alpha Numeric Sorting

    选中此框,以便在层次结构(hierarchy)窗口的右上角启用一个新按钮,允许您在Transform排序(默认行为)和字母数字排序之间切换。

    外部工具(External tools)

    设置

    属性

    外部脚本编辑器(External Script Editor)

    在Visual Studio(比如VS2017)安装目录下找Common7\IDE\devenv.exe

    将.unityproj添加到.sln(Add .unityproj's to .sln

    使用Visual Studio不用考虑。

    编辑器连接

    (Editor Attaching)

    选中此框以允许在Unity编辑器中调试脚本。如果禁用此选项,则无法将脚本调试器附加到Unity以调试脚本。

    图像应用

    (Image application)

    选择Unity要用于打开图像文件的应用程序。

    修改控制或合并

    (Revision Control Diff/Merge)

    选择希望Unity用来解决与资产服务器的文件差异的应用程序。Unity在其默认安装位置检测这些工具

    颜色(Color)

    此面板允许您选择Unity显示各种用户界面元素时使用的颜色。

    按键(Keys)

    此面板允许您设置Unity中各种命令的按键。

    GI缓存(GI Cache)

    设置

    属性

    最大缓存大小(GB)

    (Maximum Cache Size (GB))

    使用滑块设置最大GI缓存文件夹大小。在可能的情况下,GI缓存文件夹将保持在这个大小之下。未使用的文件会周期性地删除,以创建更多的空间。这是由编辑器自动执行的,不需要您做任何事情。

    自定义缓存位置

    (Custom cache location)

    选中此框以允许GI缓存文件夹的自定义位置。缓存文件夹将在所有项目之间共享。

    缓存压缩

    (Cache compression)

    选中此框可以快速实时地压缩GI缓存文件,以减少生成的数据的大小。如果您需要访问原始数据,请禁用缓存压缩并清除缓存。

    清理缓存

    (Clean Cache)

    使用此按钮清除缓存目录。

    2D

    设置

    属性

    最大Sprite Atlas(精灵图集)缓存大小(GB)

    使用滑块设置最大精灵图集(sprite atlas)缓存文件夹大小。精灵图集缓存文件夹将尽可能保持在此大小以下。

    缓存服务器(Cache Server)

    设置

    属性

    使用缓存服务器

    选中此框以使用专用缓存服务器。

    IP地址

    如果启用,请在此处输入专用缓存服务器的IP地址。

     

    构建设置(Build Settings)

    "构建设置( Build Settings)"窗口允许您选择目标平台,调整构建的设置,并启动构建过程。要访问"构建设置( Build Settings)"窗口,请选择File > Build Settings…。指定构建设置后,可以单击构建(build)以创建游戏,或单击构建和运行(Build and run)以在指定的平台上创建和运行游戏。

    构建设置( Build Settings)窗口

    平台列表

    下面列举了本笔记可能会用到的平台。

    PC

    选项

    目的

    目标平台

            Windows

    构建属于Windows的游戏

    CPU架构

     

            x86

    32CPU

            x86_64

    64CPU

            UWP通用平台(Universal)

    所有CPU设备

    Android

    选项

    目的

    纹理压缩(Texture Compression)

                    Don't override

     

              DXT (Tegra)

     

            PVRTCPowerVR

     

            ATCAdreno

     

              ETC (default)

     

            ETC2GLES 3.0

     

            ASTC

     

    构建系统(Build System)

            Internal [默认]

    使用基于Android SDK实用程序的内部Unity构建过程生成输出包(APK)。

            Gradle [新技术]

    使用Gradle构建系统生成输出包(APK)。支持直接构建并运行并将项目导出到目录。这是导出项目的首选方案,因为GradleAndroid Studio的原生格式。

    音频管理器(Audio Manager)

    音频管理器(Audio Manager )允许您调整在场景(Scene)内播放所有的声音的最大音量。要查看它,请选择Edit > Project Settings > Audio

    属性

    属性:

    功能:

    音量(Volume)

    所有声音播放的音量。

    衰减因子(Rolloff Scale)

    值越高,音量衰减越快,反之越低,衰减越慢(1值将模拟"真实世界")。

    多普勒因子(Doppler Factor)

    多普勒因子描述如何可听。当它为0时,它被关闭。当为1意味着对于快速移动的物体,应该听得很清楚。

    默认扬声器模式

    (Default Speaker Mode)

    定义哪个扬声器模式应该是您的项目的默认设置。(有关模式列表,请参阅脚本API参考中的AudioSpeakerMode)。

    系统采样率

    (System Sample Rate)

    输出采样率。如果设置为0,系统的采样率将被使用。另请注意,这仅作为参考,因为只有某些平台允许更改,例如Android

    DSP缓冲区大小

    (DSP Buffer Size)

    可以设置DSP缓冲区的大小,以优化延迟或性能

     

    默认(Default)

    默认缓冲区大小

     

    最佳延迟

    (Best Latency)

    降低性能,有利于延迟

     

    好的延迟

    (Good Latency)

    延迟和性能之间的平衡

     

    最佳表现

    (Best Performance)

    降低延迟,有利于表现

    :因为官方不全所以下略。

    编辑器设置(Editor settings

    编辑器设置(Editor Settings让您选择会影响您与编辑器的工作方式的选项。

    属性

    属性:

    功能:

    Unity Remote(用不到)

    Version Control

    (用不到)

     

    资产序列化

    Asset Serialization

     

    模式(Mode

    为了帮助版本控制合并,Unity可以以基于文本的格式存储场景文件。如果不执行场景合并,那么Unity就可以以更有效的二进制格式存储场景,或者同时允许文本和二进制场景文件同时存在。

    默认行为模式

    Default Behavior Mode

     

    模式(Mode

    2D3D编辑器模式之间选择。

    精灵封装器(Sprite Packer

     

    模式(Mode

    这将选择是否始终启用Sprite Packer,仅对构建进行启用或完全禁用。

    游戏设置(Player Settings

    播放器设置(Player Settings(菜单:Edit > Project Settings > Player)让你为最终的游戏设定不同的选择。无论构建目标是什么,都有一些相同的设置,但大多数都是特定于平台的,并分为以下几部分:

  • 分辨率和演示:屏幕分辨率和其他演示细节的设置,如游戏是否应默认为全屏模式。
  • 图标:桌面上显示的游戏图标。
  • 启动图像:游戏启动时显示的图像。
  • 其他设置:特定于平台的任何剩余设置。
  • 发布设置:内置应用程序如何准备从应用商店或主机网页传送的详细信息。

    常规设置

    属性:

    功能:

    跨平台属性

    公司名

    Company Name

    你公司的名字 这用于查找首选项文件。

    产品名称

    Product Name

    您的游戏运行时将出现在菜单栏上的名称,也用于查找首选项文件。

    默认图标

    Default Icon

    应用程序在每个平台上将具有的默认图标。您可以针对特定平台覆盖此选项。

    默认光标

    Default Cursor

    应用程序在每个受支持平台上具有的默认光标。

    光标热点

    Cursor Hotspot

    从默认光标左上角的像素点上的光标热点。

    启动屏幕(Splash Screen

    Unity编辑器允许您为项目配置Splash Screen(启动屏幕)。

    Unity Splash屏幕在所有平台上均匀一致。它立即显示,第一个场景在后台异步加载时显示。

    Unity Splash Screen(启动屏幕)设置

    要访问Unity Splash Screen设置,请转到 Edit > Project Settings > Player。在"检查器(inspector"窗口中,导航到Splash Image 

    Splash Screen 设置

    config dialog banner配置对话框的横幅

    virtual reality Splash image虚拟现实启动图像

    标签和图层(Tags and Layers

    标签和图层管理器(Tags and Layers Manager允许您设置标签(Tags排序图层(Sorting Layers 图层(Layers 。要查看标签和图层管理器​​,请转到Edit > Project Settings > Tags and Layers.

    标签和图层管理器​​

    细节

    标签:这些标记值可用于识别项目中的对象(有关更多详细信息,请参阅标签文档)。要添加新标签,请点击列表右下角的加号按钮(+),并为新标签命名。

    添加新标签

    请注意,一旦您命名了标签,就无法重命名。要删除标签,请单击它,然后单击列表右下角的减号( - )按钮。

    标签列表显示四个自定义标签

    排序图层:与2D系统中的Sprite(精灵)结合使用,"排序"是指不同Sprite(精灵)的叠加顺序。

    添加新的排序图层

    要添加和删除排序图层,请使用列表右下方的加号和(+/-)按钮。要更改其顺序,请拖动每个图层项目左侧的手柄。

    排序图层"列表,显示四个自定义排序图层

    层(Layers:在整个Unity编辑器中使用这些方法来创建共享特定特征的对象组(有关详细信息,请参阅图层上的文档)。用户层主要限制诸如射线播放或渲染之类的操作,以便它们仅适用于相关对象组。在标签和图层管理器​​中,前八个内置图层Unity使用的默认值,因此您无法编辑它们。但是,您可以自定义用户层,831

    添加新的图层

    自定义用户层831; 在每个您要使用的文本字段中键入自定义名称。请注意,您不能添加到图层数量,但与标签不同,您可以重命名图层。

    时间管理器(Time Manager

    时间管理器(菜单:编辑>项目设置>时间)允许您设置一个数字,你的游戏中控制时序特性。

    属性

    属性:

    功能:

    固定时间戳

    Fixed Timestep

    与帧速率无关的时间间隔,用于指定何时执行物理计算和FixedUpdate()事件。

    最大允许时间戳

    Maximum Allowed Timestep

    与帧速率不相关的,与帧速率无关的时间间隔限制最坏情况。物理计算和FixedUpdate()事件将不会比指定的时间更长。

    时间尺度

    Time Scale

    时间进度的速度。更改此值以模拟子弹时间效果。值1表示实时。值为0.5表示半速2是双倍速度。

    细节

    时间管理器允许您全局设置属性,但是在游戏过程中将其设置为脚本通常很有用(例如,将时间刻度设置为零是暂停游戏的有用方式)。

    特殊文件夹名称

    您通常可以为创建的文件夹选择您喜欢的任何名称来组织Unity项目。但是,有一些文件夹名称,Unity解释为一个指令,文件夹的内容应该以特殊的方式对待。例如,您必须将Editor脚本放在名为Editor的文件夹中才能正常工作。

    此页面包含Unity使用的特殊文件夹名称的完整列表。

    资产(Assets

    资产{

    Assets }文件夹是包含一个统一项目中使用的资产主文件夹。编辑器中"项目(project"窗口的内容直接与"资产"文件夹的内容对应。大多数API函数假定所有内容都位于Assets文件夹中,因此不需要明确提及。但是,某些功能确实需要将Assets文件夹作为路径名的一部分(例如AssetDatabase类中的某些功能)。

    编辑(Editor

    放置在名为编辑器"的文件夹中的脚本被视为编辑器脚本而不是运行时脚本。这些脚本在开发过程中向编辑器添加功能,并且在游戏运行中是不可用的。

    可以在{Assets}文件夹内一个{Editor}文件夹,将编辑器脚本放入{Editor}文件夹或其中的子文件夹中。

    注意:如果脚本位于{Editor}文件夹中,Unity不允许将派生自MonoBehaviour的组件分配给GameObject

    插件(Plugins)

    您可以向项目添加插件以扩展Unity的功能。插件是通常用C / C ++编写的本机DLL。他们可以访问第三方代码库,系统调用和其他Unity内置功能。始终将插件放在名为Plugins的文件夹中,以便它们被Unity检测到。

    您只能有一个插件文件夹,它必须直接放在Assets文件夹中。

    资产(Resources[注意与Asset区分]

    您可以从脚本按需加载资产,而不是在场景中创建用于游戏的资产实例。您可以将资产放在名为{Resources}夹中。使用Resources.Load函数加载这些资产

    您可以将多个资产文件夹放置在Assets文件夹中的任何位置。将所需的资产文件放在资产文件夹或其中的子文件夹中。如果资产文件位于子文件夹中,则始终将子文件夹路径包含在传递给Resources.Load函数的路径中。

    请注意,如果资产文件夹是编辑器子文件夹,则其中的资产可以从编辑器脚本加载,但从最终游戏中排除。

    标准资产(Standard Assets

    导入标准资产包(菜单:Assets > Import Package)时,资产将放置在名为Standard Assets(标准资产)的文件夹中。除了包含资产,这些文件夹也对脚本编译顺序有影响。

    您只能有一个Standard Assets文件夹,它必须直接放在Assets文件夹中。将所需的资产文件放在此Standard Assets文件夹或其中的子文件夹中。

    被隐藏的

    在导入过程中,Unity忽略了Asset文件夹(或其中的子文件夹)中的以下文件和文件夹:

  • 隐藏的文件夹。
  • 以"."开头的文件和文件夹。
  • ~ " 结尾的文件和文件夹。
  • 名为cvs文件和文件夹。
  • 扩展名为.tmp文件。

    这用于防止导入由操作系统或其他应用程序创建的特殊和临时文件。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值