赞
踩
场景(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如何组合在一起,以及如何创建和使用它们。
简介
GameObjects是Unity中基本的对象,它们代表人物,道具和风景。它们本身并没有完成什么工作,但是它们作为组件(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场景里面所有实体的基类。
| |
| |
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
| |
| |
| |
|
注:关于查找的方法如果没有找到都返回null。
组件是游戏中对象和行为的坚果和螺栓。它们是每个GameObject的功能块。
GameObject是许多不同组件的容器。默认情况下,所有GameObject都会自动有一个Transform Component(组件)。这是因为"(transform)坐标变换"指示GameObject所在的位置,以及如何旋转和缩放。没有变换组件,GameObject将不能存在于游戏世界上的任何一个位置。现在尝试创建一个空的GameObject作为例子。单击GameObject> Create Empty菜单项。选择新的GameObject,然后查看Inspector(检查器)。
即使空的GameObjects也有一个变换组件(transform)
请记住,您可以随时使用检查器(inspector)来查看哪些组件附加到所选的GameObject。在添加和删除组件时,检查器将始终显示当前附加的组件。您将使用检查器(inspector)更改任何组件(包括脚本)的所有属性。
您可以通过组件菜单将组件添加到所选的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)面板右上角的"齿轮"图标可以打开。
此命令可恢复组件属性在最近的编辑会话之前所具有的值。
一个删除组件(remove component)可删除您不再需要连接到GameObject的组件。注意,有一些组合相互依赖的组件(例如,铰链关节(Hinge Joint)只在有刚体(rigidbody)时起作用); 如果您尝试删除其他GameObject依赖的组件,您将看到一条警告消息。
使用上移(up)和下移(Down)命令来重新排列检查器中GameObject的组件顺序。
Copy component(复制组件)命令存储组件的类型和当前属性设置。然后可以使用" (paste component values)粘贴组件值"将这些粘贴到相同类型的另一个组件。您还可以通过使用"(paste component as new)粘贴为一个新的组件"将对象复制的值创建为新组件
当您的游戏处于游戏模式时,您可以随意更改任何GameObject的Inspector(检查器)中的属性。当您退出游戏模式时,您的属性将恢复为其播放前模式值,因此您不会丢失您的任何工作。
所述变换组件确定的位置(position),旋转(rotation),和缩放(scale)场景中的每个对象的。每个GameObject都有一个Transform(坐标变换)。
属性: | 功能: |
位置(position) | 变换在X,Y和Z坐标中的位置。 |
旋转(rotation) | 围绕X,Y和Z轴的旋转,以度为单位。 |
缩放(scale) | 沿X,Y和Z轴的缩放尺度。值"1"是原始大小(导入对象的大小)。 |
Transform的位置,旋转和缩放值是相对于Transform的父节点进行测量的。如果Transform没有父项,则属性是在世界空间中测量的。
场景中的每一个对象都有一个Transform(坐标变换)。用于储存并操控物体的位置、旋转和缩放。每一个Transform可以有一个父级,允许你分层次应用位置、旋转和缩放。可以在Hierarchy(层次结构)面板查看层次关系。它实现了IEnumerable(枚举接口),因此你可以使用循环(foreach)遍历其子对象。
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
Matrix that transforms a point from world space into local space (Read Only). |
| |
| |
通过索引返回一个子对象的坐标变换。 | |
Gets the sibling index. | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
变换一个向量从局部坐标空间到世界坐标空间。 | |
|
欧拉角(euler Angles)和旋转(rotation)都是基于local(局部)坐标系的旋转,不同的是角度的表示方式,前者是用欧拉角度表示的,而后者是用四元数表示的。
可以通过将GameObject标记为非激活状态来临时从场景中移除GameObject。这可以使用脚本中的activeSelf属性或检查器(inspector)中的激活复选框来完成。
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)帮助您识别用于脚本的游戏对象。它们确保您不需要使用拖放来手动地将GameObject添加到脚本的public属性中,从而节省了在多个游戏对象中使用相同的脚本代码的时间。
标签在碰撞器(Collider)控制脚本中对会触发器很有用; 他们需要确定玩家是否与敌人,道具或收集品进行交互。
检查器(inspector)显示标签(Tags)下拉菜单。
要创建一个新的标签,选择添加标签...。这将在检查器员(inspector)中打开标签管理器。请注意,一旦你命名一个标签,它将不能被重命名。
静态(Static)GameObjects
许多优化需要知道对象是是否会在游戏过程中改变。关于静态(static)(即不改变)对象的信息通常可以在编辑器中预先计算,因为它不会因对象位置的变化而失效。例如,可以通过将几个静态对象组合成称为批处理的单个大对象来优化渲染。
GameObject的检查器在右上角有一个Static复选框和菜单,用于通知Unity中各种不同的系统,该对象不会改变。可以将对象分别标记为每个这些系统的静态对象。
静态(static)复选框和下拉菜单,如在检查器(inspector)中查看GameObject时可看到
通过添加组件并将其属性设置为适当的值,可以方便地在场景中构建GameObject。但是,如果您有像NPC这样的GameObject,就可能会产生问题。又如在场景中多次重复使用的环境或风景。简单地复制对象肯定会产生重复,而且它们都可以独立编辑。但是通常,您可能会希望特定对象的所有实例具有相同的属性,因此,当您编辑场景中的一个对象时,您不必对所有副本重复进行相同的编辑。
幸运的是,Unity有一个Prefab(预设体)资产类型,可以让您存储一个完整的组件和属性的GameObject对象。预设体(Prefab)作为模板,您可以在该模板中在场景中创建新的对象实例。对预制体(Prefab)资产进行的任何编辑都会立即反映在从其在场景(Scene)中所生成的所有实例中,但也可以单独更改每个实例的组件和设置。
注意:当您将资产文件(例如,网格(mesh))拖动到场景中时,它将创建一个新的对象实例,并且所有这些实例将在更改他们的原始(Asset)资产时更改。然而,虽然它的行为表面上相似,但(Asset)资产不是预设体(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)实例的检查器具有不存在于普通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)"时保存的项目范围更改包括:
"保存项目"时,将保存每个"项目设置"菜单项的所有设置,如自定义输入轴(custom input axes),用户定义的标签或图层,以及物理重力强度(physics gravity strength)。
项目设置菜单
当保存项目时,这些设置的更改将保存在项目目录下的Library文件夹中:
当您"保存项目"时,会保存构建设置
与项目范围设置一起保存的还有那些没有"应用(Apply)"按钮的资产的更改,例如以下内容:
有一些类型的更改立即写入磁盘,而不需要执行"保存"操作。这些包括以下内容:
大多数资产类型的导入设置要求您按"应用(apply)"按钮使更改生效。根据新设置重新导入资产,当您点击Apply按钮时,这些更改将立即保存。例如:
一些其他类型的数据将立即或自动保存到磁盘,而无需执行"保存"操作:
到目前为止,您应该从根本上了解Prefab的概念。它们是您游戏中可重用的预定义GameObjects&Components的集合。
当您要在运行时实例化复杂的GameObject时,使用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);
}
}
}
如果您执行该代码,在您进入游戏模式时您将看到一个完整的砖墙。每个砖块都与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如何适应这种情况:
该脚本显示如何使用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,典型的步骤是:
以下示例显示了这些步骤如何在代码中进行建模:
让我们说你想把一堆对象放在一个网格或圆形图案中。一般来说,这可以通过以下两种方式完成:
因此,应该使用一个预设体(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)被用来存储游戏物体的位置,旋转,缩放和父子关系,因此它在非常的重要。GameObject将始终具有一个Transform组件(component) - 无法删除Transform或创建一个没有transform的GameObject。
坐标变换(transform)在X,Y和Z轴的3D空间中或仅在X和Y中的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是父对象。
请注意,对于任何子GameObject的Inspector(检查器)中的Transform值将显示相对于父对象的Transform值。这些值被称为局部坐标。对于场景构造来说,它通常足够处理子对象的局部坐标,但是在游戏中,在世界空间或全局坐标中找到它们的确切位置通常是有用的。坐标变换(transform)组件(component)的脚本API具有单独的属性,用于本地和全局位置,旋转和缩放,还允许您在本地和全局坐标之间转换任意的点。
不均匀缩放是当变换中的缩放对于x,y和z具有不同的值时; 例如(2,4,2)。相反,均匀缩放对于x,y和z具有相同的值; 例如(3,3,3)。在一些具体情况下,非均匀缩放可能是有用的,但是它引入了不统一缩放不会出现的一些怪异:
Transform的缩放决定了建模应用程序中网格的大小与Unity中该网格的大小之间的差异。因此Transform的缩放非常重要,特别是在物理模拟过程中。
有三个因素会影响对象的缩放:
理想情况下,您不应该调整变换组件中对象的缩放。最好的选择是创建你需要的大小的模型,这样你就不必改变Transform的缩放。或者是在您导入单个网格的导入设置(Import Settings)中调整导入网格(mesh)的比例。某些优化是基于导入大小进行的,并且实例化一个具有调整的缩放值的对象会降低性能。
3D应用程序中的旋转通常用两种方式之一表示,即四元数或欧拉角。每个都有自己的用途和缺点。Unity在内部使用Quaternion(四元数),但是在检查器(inspector)中显示等效的欧拉角度的值,以便您编辑。
欧拉角具有更简单的表示,它们是顺序施加的三个角度值X,Y和Z。为了将欧拉旋转应用于特定物体,每个旋转值依次被施加为围绕其对应轴线的旋转。
可以使用四元数来表示对象的方向或旋转。他在内部的表现包括四个数字(在Unity中被称为x、y、z和w),然而这些数字并不表示角度或坐标轴,通常不需要直接访问它们。除非你的兴趣是研究四元数学,否则你只需要知道四元数(Quaternions)代表3D空间中的旋转,你通常不需要知道或修改x,y和z属性。
在Unity中,所有的游戏对象旋转都是内部存储为四元组。
然而,在Transform检测员(inspector)中,我们使用欧拉角显示旋转,因为这更容易理解和编辑。输入到检查器(inspector)中的GameObject旋转的新值将被转换为"引擎内"的对象的四元数(Quaternion)旋转新值。
游戏对象的旋转在检查器中显示和编辑为欧拉角(Euler Angle),但内部存储为四元数(Quaternions)
作为副作用,检查器可以为游戏对象旋转输入X:0,Y:365,Z:0的值。这显然是一个不可能表示为四元数的值,所以当您点击Play时,您会看到对象的旋转值更改为X:0,Y:5,Z:0(或者其他)。这是因为Transform的旋转(Rotation)为不具有"360度旋转加5度"概念的四元组,而是简单地将其设置为与旋转结果相同的方向。
在处理您的脚本中处理旋转时,您应该使用(四元数)Quaternion类及其函数来创建和修改旋转值。
Unity的Quaternion(四元数)类有许多功能,允许您创建和操作旋转,而无需使用欧拉角度。例如:
创建:
操纵:
然而有时候,您的脚本中可能需要使用欧拉角度。在这种情况下需要注意,您必须将角度保存在变量中,并且只使用它们来应用它们作为你旋转的欧拉角。虽然可以从四元数中读取欧拉角,但如果您读取,修改和重新应用,则会出现问题。
以下是使用假设的示例尝试围绕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可以为Windows,Mac和Linux构建独立的应用程序。这只是在构建设置对话框中选择构建目标的问题,并点击"构建(build)"按钮。构建独立的游戏时,生成的文件将根据构建目标而有所不同。对于Windows构建目标,将构建可执行文件(.exe),以及包含应用程序所有资产的Data文件夹。对于Mac构建目标,将构建一个包含运行应用程序所需的文件以及资产的应用程序安装包。
建筑过程将会在您指定的地方放置内置游戏应用程序的空白副本。然后,它将通过构建设置中的场景列表工作,一次在编辑器中打开它们,优化它们,并将它们集成到应用程序包中。它还将计算所包含场景所需的所有资产,并将该数据存储在应用程序包中的单独文件中。
发布的游戏在场景加载时会自动地预加载场景中的所有资产。这个规则的例外是场景(Scene)0。这是因为第一个场景通常是一个启动界面(显示产品Logo、公司Logo或者开发者信息),你可能想要尽可能快地将它显示出来。
为了确保您的所有内容都已预装载,您可以创建一个调用SceneManager.LoadScene(1);的空场景(Scene)。在构建设置中,把这个空场景的索引为0.这样所有后续的场景都可以被正确地预加载。
Unity提供了一些首选项设置,以允许您自定义Unity Editor的行为。要访问它们,请访问 Edit > Preferences。
设置 | 属性 |
自动刷新 (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 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在其默认安装位置检测这些工具 |
此面板允许您选择Unity显示各种用户界面元素时使用的颜色。
此面板允许您设置Unity中各种命令的按键。
设置 | 属性 |
最大缓存大小(GB) (Maximum Cache Size (GB)) | 使用滑块设置最大GI缓存文件夹大小。在可能的情况下,GI缓存文件夹将保持在这个大小之下。未使用的文件会周期性地删除,以创建更多的空间。这是由编辑器自动执行的,不需要您做任何事情。 |
自定义缓存位置 (Custom cache location) | 选中此框以允许GI缓存文件夹的自定义位置。缓存文件夹将在所有项目之间共享。 |
缓存压缩 (Cache compression) | 选中此框可以快速实时地压缩GI缓存文件,以减少生成的数据的大小。如果您需要访问原始数据,请禁用缓存压缩并清除缓存。 |
清理缓存 (Clean Cache) | 使用此按钮清除缓存目录。 |
设置 | 属性 |
最大Sprite Atlas(精灵图集)缓存大小(GB) | 使用滑块设置最大精灵图集(sprite atlas)缓存文件夹大小。精灵图集缓存文件夹将尽可能保持在此大小以下。 |
设置 | 属性 |
使用缓存服务器 | 选中此框以使用专用缓存服务器。 |
IP地址 | 如果启用,请在此处输入专用缓存服务器的IP地址。 |
"构建设置( Build Settings)"窗口允许您选择目标平台,调整构建的设置,并启动构建过程。要访问"构建设置( Build Settings)"窗口,请选择File > Build Settings…。指定构建设置后,可以单击构建(build)以创建游戏,或单击构建和运行(Build and run)以在指定的平台上创建和运行游戏。
构建设置( Build Settings)窗口
下面列举了本笔记可能会用到的平台。
选项 | 目的 |
目标平台 | |
Windows | 构建属于Windows的游戏 |
CPU架构 | |
x86 | 32位CPU |
x86_64的 | 64位CPU |
UWP通用平台(Universal) | 所有CPU设备 |
选项 | 目的 |
纹理压缩(Texture Compression) | |
Don't override | |
DXT (Tegra) | |
PVRTC(PowerVR) | |
ATC(Adreno) | |
ETC (default) | |
ETC2(GLES 3.0) | |
ASTC | |
构建系统(Build System) | |
Internal [默认] | 使用基于Android SDK实用程序的内部Unity构建过程生成输出包(APK)。 |
Gradle [新技术] | 使用Gradle构建系统生成输出包(APK)。支持直接构建并运行并将项目导出到目录。这是导出项目的首选方案,因为Gradle是Android Studio的原生格式。 |
音频管理器(Audio Manager )允许您调整在场景(Scene)内播放所有的声音的最大音量。要查看它,请选择Edit > Project Settings > Audio。
注:因为官方不全所以下略。
该编辑器设置(Editor Settings)让您选择会影响您与编辑器的工作方式的选项。
该播放器设置(Player Settings)(菜单:Edit > Project Settings > Player)让你为最终的游戏设定不同的选择。无论构建目标是什么,都有一些相同的设置,但大多数都是特定于平台的,并分为以下几部分:
属性: | 功能: |
跨平台属性 | |
公司名 (Company Name) | 你公司的名字 这用于查找首选项文件。 |
产品名称 (Product Name) | 您的游戏运行时将出现在菜单栏上的名称,也用于查找首选项文件。 |
默认图标 (Default Icon) | 应用程序在每个平台上将具有的默认图标。您可以针对特定平台覆盖此选项。 |
默认光标 (Default Cursor) | 应用程序在每个受支持平台上具有的默认光标。 |
光标热点 (Cursor Hotspot) | 从默认光标左上角的像素点上的光标热点。 |
Unity编辑器允许您为项目配置Splash Screen(启动屏幕)。
Unity Splash屏幕在所有平台上均匀一致。它立即显示,第一个场景在后台异步加载时显示。
要访问Unity Splash Screen设置,请转到 Edit > Project Settings > Player。在"检查器(inspector)"窗口中,导航到Splash Image 。
Splash Screen 设置
config dialog banner配置对话框的横幅
virtual reality Splash image虚拟现实启动图像
该标签和图层管理器(Tags and Layers Manager)允许您设置标签(Tags),排序图层(Sorting Layers )和图层(Layers )。要查看标签和图层管理器,请转到Edit > Project Settings > Tags and Layers.。
标签和图层管理器
标签:这些标记值可用于识别项目中的对象(有关更多详细信息,请参阅标签文档)。要添加新标签,请点击列表右下角的加号按钮(+),并为新标签命名。
添加新标签
请注意,一旦您命名了标签,就无法重命名。要删除标签,请单击它,然后单击列表右下角的减号( - )按钮。
标签列表显示四个自定义标签
排序图层:与2D系统中的Sprite(精灵)结合使用,"排序"是指不同Sprite(精灵)的叠加顺序。
添加新的排序图层
要添加和删除排序图层,请使用列表右下方的加号和(+/-)按钮。要更改其顺序,请拖动每个图层项目左侧的手柄。
" 排序图层"列表,显示四个自定义排序图层
层(Layers):在整个Unity编辑器中使用这些方法来创建共享特定特征的对象组(有关详细信息,请参阅图层上的文档)。用户层主要限制诸如射线播放或渲染之类的操作,以便它们仅适用于相关对象组。在标签和图层管理器中,前八个内置图层是Unity使用的默认值,因此您无法编辑它们。但是,您可以自定义用户层,从8到31。
添加新的图层
自定义用户层从8到31; 在每个您要使用的文本字段中键入自定义名称。请注意,您不能添加到图层数量,但与标签不同,您可以重命名图层。
在时间管理器(菜单:编辑>项目设置>时间)允许您设置一个数字,你的游戏中控制时序特性。
属性: | 功能: |
固定时间戳 (Fixed Timestep) | 与帧速率无关的时间间隔,用于指定何时执行物理计算和FixedUpdate()事件。 |
最大允许时间戳 (Maximum Allowed Timestep) | 与帧速率不相关的,与帧速率无关的时间间隔限制最坏情况。物理计算和FixedUpdate()事件将不会比指定的时间更长。 |
时间尺度 (Time Scale) | 时间进度的速度。更改此值以模拟子弹时间效果。值1表示实时。值为0.5表示半速; 值2是双倍速度。 |
时间管理器允许您全局设置属性,但是在游戏过程中将其设置为脚本通常很有用(例如,将时间刻度设置为零是暂停游戏的有用方式)。
您通常可以为创建的文件夹选择您喜欢的任何名称来组织Unity项目。但是,有一些文件夹名称,Unity解释为一个指令,文件夹的内容应该以特殊的方式对待。例如,您必须将Editor脚本放在名为Editor的文件夹中才能正常工作。
此页面包含Unity使用的特殊文件夹名称的完整列表。
该资产{
放置在名为" 编辑器"的文件夹中的脚本被视为编辑器脚本而不是运行时脚本。这些脚本在开发过程中向编辑器添加功能,并且在游戏运行中是不可用的。
可以在{Assets}文件夹内一个{Editor}文件夹,将编辑器脚本放入{Editor}文件夹或其中的子文件夹中。
注意:如果脚本位于{Editor}文件夹中,Unity不允许将派生自MonoBehaviour的组件分配给GameObject。
您可以向项目添加插件以扩展Unity的功能。插件是通常用C / C ++编写的本机DLL。他们可以访问第三方代码库,系统调用和其他Unity内置功能。始终将插件放在名为Plugins的文件夹中,以便它们被Unity检测到。
您只能有一个插件文件夹,它必须直接放在Assets文件夹中。
您可以从脚本按需加载资产,而不是在场景中创建用于游戏的资产实例。您可以将资产放在名为{Resources}夹中。使用Resources.Load函数加载这些资产。
您可以将多个资产文件夹放置在Assets文件夹中的任何位置。将所需的资产文件放在资产文件夹或其中的子文件夹中。如果资产文件位于子文件夹中,则始终将子文件夹路径包含在传递给Resources.Load函数的路径中。
请注意,如果资产文件夹是编辑器子文件夹,则其中的资产可以从编辑器脚本加载,但从最终游戏中排除。
导入标准资产包(菜单:Assets > Import Package)时,资产将放置在名为Standard Assets(标准资产)的文件夹中。除了包含资产,这些文件夹也对脚本编译顺序有影响。
您只能有一个Standard Assets文件夹,它必须直接放在Assets文件夹中。将所需的资产文件放在此Standard Assets文件夹或其中的子文件夹中。
在导入过程中,Unity忽略了Asset文件夹(或其中的子文件夹)中的以下文件和文件夹:
这用于防止导入由操作系统或其他应用程序创建的特殊和临时文件。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。