UnityD场景搭建教程优选稿.docx
《UnityD场景搭建教程优选稿.docx》由会员分享,可在线阅读,更多相关《UnityD场景搭建教程优选稿.docx(16页珍藏版)》请在冰豆网上搜索。
UnityD场景搭建教程优选稿
集团文件版本号:
(M928-T898-M248-WU2669-I2896-DQ586-M1988)
UnityD场景搭建教程
Unity3D场景搭建方法
本教程将解释用于创建游戏场景的元素及方法。
1.游戏物体(GameObject)
在Unity中昀重要的就是游戏物体。
理解什么是游戏物体如何使用它是非常重要的。
该部分就将解释这个概念。
什么是游戏物体在你的游戏中的任何东西都是游戏物体。
然而,游戏物体自身并不能做所有的事情。
在它们成为角色,环境或者特定的效果之前它们需要特定的属性。
但是物体中的每一个都会做许多不同的事情。
如果每一个物体都是一个游戏物体,我们怎么从一个静态房间中区分一个具有强大交互能力的物体是什么使得游戏物体相互不同呢
答案就是游戏物体是一个容器。
他们是一个空的可以容纳不同块的盒子,而这些块组成了一个带有光照贴图的岛或是一个物理驱动的汽车。
为了真正理解游戏物体,你需要理解这些块;这些块被称为组件(Components)。
根据你要创建的物体的不同,你可以添加不同组件到一个游戏物体中。
将游戏物体想象为一个空的烹调罐,组件为不同的组成游戏的配料。
游戏物体与组件的关系现在我们知道游戏物体包含组件。
我们将通过使用昀常用的组件——变换组件(Transform)来讨论这两者之间的关系。
打开任意一个场景,创建一个新的游戏物体(使用Shift-Command-N),选择他并查看检视面板(Instpector)
空物体的检视面板
你可能注意到了这里有两个完全不同的部分。
”GameObject”和”Transform”。
属于游戏物体部分的是关于游戏物体自身的信息。
这里只有物体的名称。
变换部分显示变换组件的信息。
当你创建一个新的物体时,将会自动包含一个变换组件。
所有的物体都会有一个变换组件。
在Unity中你不可能创建一个没有变换组件的物体,变换组件为所有物体提供了独特的功能。
变换组件变换组件是昀重要的组件之一。
它定义了游戏物体在场景视图中的位置,旋转,和缩放。
如果游戏物体没有旋转组件,那么它将不会存在世界中。
参考变换组件部分。
变换组件也可以使用一个被称为父子化(Parenting)的功能,这个功能被编辑器(UnityEditor)利用并且是使用游戏物体昀关键的部分。
父子化父子化的意思是你可以使一个游戏物体的变换值完全依赖于另一个不同游戏物体。
简单来说,就是一个物体随着另一个物体移动。
当一物体是另外一些物体的父(Parent)物体时,这个物体的旋转将影响所有的子(Child)物体。
你可以在层次视图(HierarchyView)中通过拖动任何物体到另一个物体上来创建一个父。
这将在两个物体之间创建父子关系。
这种功能非常类似于文件夹树的功能,一个游戏物体包含在另一个游戏物体中。
需要指出的是所有子物体的变换值都是相对于父物体的,这个被称为局部坐标(LocalCoordinates)。
通过脚本你可以访问全局坐标(GlobalCoordinates)和局部坐标。
一个游戏物体可以有任意多个子物体,但是只能有一个父物体。
子物体也可以是其它物体的父物体。
你可以很容易的在层次视图中分辨一个物体是不是一个父物体。
如果在它名称的左边有一个箭头,那么它就是一个父物体。
一个真实的父子层次树,所有带有箭头的物体都是父物体
记住所有的父子化的功能都是通过游戏物体的变换组件执行的,而不是游戏物体自身。
游戏物体-脚本关系当你创建一个脚本(script)并将其附加到一个游戏物体上时,这个脚本将在检视面板中作为一个组件显示。
这是因为当它们被保存时脚本就变成一个组件。
从技术角度来说,脚本是作为组件的一种来编译的,就像其它组件一样。
任何在脚本中申明的公有变量都将在游戏物体的检视面板中显示为可编辑或可连接。
编写脚本的时候,你能够直接访问任何游戏物体类的成员。
你可以在这里看到一个游戏物体类的成员列表。
如果任何一个类作为一个组件附加在一个游戏物体上,你就可以在脚本中使用成员名来直接访问这个组件。
例如键入transform等同于gameObject.transform。
前面的
gameObject是编译器自动加入的,除非你要指定一个不同的物体。
使用this可以访问当前的脚本组件。
使用this.gameObject可以访问该脚本所依附的游戏物体,当然你可以简单的使用gameObject来访问此游戏物体。
逻辑上来说,键入this.transform与tansform是相同的,如果你想访问一个组件而该组件并没有作为一个游戏物体成员包含在其中,你需要使用gameObject.GetComponent()
2.使用组件(UsingComponents)
组件是游戏中一个物体的行为和核心。
它们是游戏物体的功能性模块。
如果你还不理解游戏物体和组件之间的关系,请参考游戏物体部分。
一个游戏物体包含许多不同的组件。
缺省情况下。
所有的游戏物体都包含一个变换(Transform)组件。
这是因为变换表示物体的位置,旋转和缩放。
没有变换组件,游戏物体将不会有位置。
尝试创建一个空的游戏物体。
单击GameObject->CreateEmpty菜单项。
选择新游戏物体,并查看检视面板。
每一个空的游戏物体都有一个变换组件
可以使用检视面板来查看都有什么组件附加在游戏物体上。
但一个组件被加入或删除的时候,检视面板将显示当前附加的组件。
可以使用检视面板来改变任何组件的属性(包括脚本)。
添加组件可以通过组件菜单为当前的游戏物体添加一个组件。
尝试添加一个刚体(Rigidbody)到刚创建的物体上。
选择该物体并从菜单中选择Component->physics->Rigidbody。
现在你将会发现刚体属性显示在检视面板中,如果在该物体被选中的情况下按下播放键(Play)你将会有惊喜的发现。
注意刚体是如何在一个空物体上添加功能的。
附加了刚体组件的空物体
可以附加任意数量的组件到一个游戏物体。
一些组件可以与其他一些组件一起工作。
例如,刚体可以和任何碰撞物一起工作。
刚体通过AgeiaPhysX物理引擎控制变换,并且碰撞器允许刚体与其它的碰撞器碰撞和交互。
一个不同的组件组合例子是一个粒子系统(ParticleSystem)。
它们使用一个粒子发射器(ParticleEmitter),粒子动画(ParticleAnimator)和粒子渲染器(ParticleRenderer)来创建一组移动的粒子。
可以通过点击位于检视面板头部的问号访问组件的参考页。
编辑组件一个组件昀重要的方面是其可扩展性。
当你添加一个组件到一个物体上时,它有不同的可以调整的值或者属性(Properties),也可以在游戏中通过脚本来调整它。
有两种不同类型的属性:
值(Values)和引用(References)。
下图中是一个具有音频源(AudioSource)组件的空游戏物体。
在检视面板中所有音频源的值都是缺省的。
这个组件包含一个单一的引用属性和七个值属性。
音频剪辑(AudioClip)是一个引用属性。
当这个音频源开始播放时,它将尝试播放AudioClip属性所引用的音频文件。
如果没有添加引用属性,将会出现一个错误因为没有音品将被播放。
你必须在检视面板中引用音频文件。
你可以非常简单的从工程视图中将音频文件拖动到引用属性中。
现在一个音效文件在音频剪辑属性中被引用
组件可包含任何其它类型组件的引用,文件或游戏物体。
你只需拖动适当的引用到这个属性上。
引用类型是非常有用和强大的,尤其是在使用脚本时。
参考脚本教程。
音频剪辑中剩下的七个都是值属性。
都可以通过单击并按下Enter键来调整它们。
使用键盘输入值,并按Enter保存它。
你也可以通过使用option-或right-click或拖动数字属性来快速滚动这些值。
音频剪辑中的值属性都是数字,但是一些属性也可以是字符串。
例如,文本网格(TextMesh)组件包含一个文本(Text)属性,这个属性可以接受字母数字字符。
一些值可以包含字符,例如文本网格中的Text属性
测试属性当你的游戏处在播放模式(PlayMode)中时,你可以在游戏物体的检视面板中修改它的属性。
例如,你或许想试验不同的跳跃高度。
如果你在一个脚本中创建了一个跳跃高度(JumpHeight),你可以进入播放模式,改变这个值,并按跳跃键查看结果。
然后不需要退出播放模式就可以再次改变这个值。
当你退出播放模式时你的属性值将恢复到播放前的值,因此,你不会丢失任何工作。
这个工作方式,提供给你难以置信的方便来试验,调整,精简你的游戏而不必要花费大量的时间。
移除组件如果你想移除一个组件,在检视面板的头部使用option-或右击然后选择移除组件(RemoveComponent)。
或者你可以单击位于组件头部问号旁边的选项图标。
所有的属性值都将丢失并且是不可恢复的。
因此在移除组件前请确认你要这样做。
组件-脚本关系尽管脚本(Scripts)看起来都与组件不同,事实是脚本是组件的一种类型。
它是一种你自己创建的组件。
你可以定义能够显示在检视面板中的成员,并且它将执行你写出的任何功能。
脚本组件有很多组件可以通过任何脚本直接访问。
例如,如果你想访问变换组件的变换(Translate)功能,你只需要使用transform.Translate()或。
因为所有的脚本都是附加在游戏物体上的,所以当你写transform的时候就暗示要访问当前脚本所在的物体的变换组件。
当然这两者完全等价的。
使用GetComponent()有许多组件不能成为一个游戏物体类的成员。
因此你不能隐式访问它们,必须显式访问它们。
通过调用GetComponent(“componentname”)并存储一个引用到结果中。
当你需要引用附加到该游戏物体上的其它脚本时这个方法是昀常用的。
假设你在写脚本B并且你想做一个脚本A的引用,而这两者是附加在相同的游戏物体上的。
你可以使用GetComponent()来引用脚本。
在脚本B中你可以使用scriptA=GetComponent(“ScriptA”);然后你就能够在脚本B中通过scriptA.variableName来访问任何脚本A中的变量。
3.预设(Prefab)
预设是一个存储在工程视图中可重用的游戏物体。
预设可以被插入到任意数量的场景中,并可多次出现在同一场景中。
当你添加一个预设到场景中,你就创建了一个它的实例。
所有的预设实例都与原始的预设相关联并且本质上是它的一个克隆。
不论在你的工程中存在多少实例,当你对预设作了任何改变后你将看到这种改变被应用到所有的实例上。
不论你的预设是单一的一个游戏物体或者是一组游戏物体,在预设的变换层次中所作的任何改变都建碑应用到它的实例上。
创建预设为了创建预设,你需要一个新的空预设。
这个空预设不包含任何物体,并且你不能创建它的一个实例。
将一个新的预设想象为一个空的容器,等待使用游戏物体数据来填充。
一个新的空预设,它不能被实例化,除非你使用游戏物体来填充它
为了填充预设,你需要使用在场景中已经创建的游戏物体。
下面是精确的步骤:
在工程视图中,选择一个你要放置预设的文件夹
从主菜单中选择Assets->Create->Prefab,或者从工程视图的上下文菜单中选择Create->Prefab
命名该预设
在层次视图(Hierarchyview)中,选择你要放入预设的游戏物体
将它们从层次使用中拖放到工程视图中
在你执行了上述步骤后,游戏物体和它的子物体都将被拷贝到预设中。
现在,预设可以在多个实例中被重用。
在层次中的原始物体现在已经成了该预设的一个实例。
创建更多预设的实例是非常简单的。
实例化预设为了在当前场景中创建一个预设的实例,从工程视图中拖动预设到场景(Scene)或层次视图中。
这将从预设中拷贝所有父物体和所有的子物体。
这些游戏物体被连接到(linked)预设,在工程视图中将使用蓝色的文本来显示它们。
其中三个物体是预设的实例
继承继承意味着当预设改变时,这些改变也将被应用到所有与之相连的物体上。
例如,如果你添加一个脚本到一个预设,那么所有该预设的实例都将包含该脚本。
然而你也可以修改单个实例的属性而不会破坏与预设的联系。
一个链接物体检视面板(Inspector)中的所有公有属性都有一个复选框。
这个复选框是一个重载标记(overrideflag)。
如果该属性的重载标记被启用,表示该属性将不会受到预设改变的影响。
简单来说,这允许你修改实例物体并使得它们不同于它们的预设,而且又不会破坏它与预设之间的联系。
一个实例物体和非继承
一个实例物体和非继承\
当你在检视面板中修改一个属性的时候,该属性的重载标记会自动启用。
任何对已有属性的改变都不会打断与预设的联系。
然而有一些改动将断开它,下面是保持预设连接的基本规则:
不能添加一个新的组件到一个实例上
不能从一个实例上移除一个组件
不能使用其他游戏物体作为实例的子物体如果你这样做,你将看到一个警告消息出现并要求你确认。
当一个实例与预设断开后,对预设的修改将不会影响到这个游戏物体。
如果你特意或是意外地断开了实例的连接,你可以应用你的改变到预设并重新建立该连接。
这将使得预设和所有的实例都发生改变。
应用改变创建或编辑一个复杂预设的时候,你可以非常容易的在场景中实例化它们,编辑实例,并应用改变到预设。
这种工作方式将允许你在场景视图中查看并修改预设。
一旦你修改完成,选择该实例物体的根并从菜单中选择GameObject->ApplychangestoPrefab。
所有的改变都被拷贝到预设中,并应用到每个场景中所有的实例上。
将物体连接到预设可以将预设应用于现有的没有连接的物体上。
这将添加所有该物体没有的组件到物体上并将其连接到预设。
在某些场合这是非常有用的。
为了连接任何已有的物体到到预设,按住Option并将预设从工程视图中拖放到层次视图的物体上。
这个游戏物体将成为该预设的一个实例。
这个操作不会改变预设本身,但是会在你刚连接的物体上添加或移除一些组件和子游戏物体。
导入预设
当你放置了一个网格资源到你的资源文件夹中时,Unity将自动导入该文件并生成一些看起来与预设相似东西。
但它们并不是预设,这只是简单的资源文件。
注意资源文件图标与预设图标是有点不同的
这个资源在场景中作为一个游戏物体被初始化。
可以在该游戏物体上添加或移除组件。
然而你不能将任何改变应用到资源自身上因为这需要添加一些数据到该资源物体上!
如果要创建需要重用的物体,你应该将资源实例作为预设。
当你已经创建了一个资源实例,可以创建一个新的空预设并拖动游戏物体到该预设上。
现在你拥有了一个连接到该物体的标准预设。
下面给出了一些详细的步骤:
从工程视图中拖动一个资源文件到场景或层次视图中。
修改该资源(例如,添加脚本,子物体,组件等等)
创建一个新的空预设。
从菜单中选择Assets->Create->Prefab,或者从工程视图的上下文菜单中选择Create->Prefab
从层次视图中拖动该物体到预设上。
4.灯光(Lights)
对于每一个场景灯光是非常重要的部分。
网格和纹理定义了场景的形状和外观,而灯光定义了场景的颜色和氛围。
你很可能需要在每个场景中设置多个灯光。
让他们一起工作需要一点练习但是结果是非常惊人的。
简单的两个灯光
可以通过从菜单中选择GameObject->CreateOther并将其添加到你的场景中。
有三种类型的灯光。
一旦添加了一个灯光你就可以像操作其他物体一样操作它。
此外你还可以通过选择Component->Rendering->Light为选中的物体添加一个灯光组件。
在灯光的检视面板中有许多不同的选项
检视面板中灯光的属性
通过简单地改变灯光的颜色(Color),你可为场景添加完全不同的气氛。
明亮,太阳光
黄昏,中度光诡异的夜光
光照灯光将使你的游戏具有个性和情趣。
使用灯光来照亮场景和物体以便创建一个完美的可视氛围。
灯光可以用来模拟太阳,燃烧的火光,闪光,炮火或者爆炸,下面给出几个例子。
灯光的检视面板
在Unity中有三种不同类型的灯光:
点光源(Pointlights)从一个位置向所有方向发射相同强度的光,就像灯泡一样。
方向光(Directionallights)放置于无穷远处并影响场景中所有的物体,就像太阳一样。
投射光(Spotlights)从一个点向一个方向发光,像一个车灯一样照亮一个锥形的范围。
属性
类型(Type):
当前光照物体的类型
方向(Directional):
一个放置在无穷远的光源。
它将影响场景中的所有物体并不会衰减。
点(Point):
一个从它的位置向所有方向发光的光源,将影响位于它的范围内的所有物体。
投射(Spot):
照亮一个锥形(SpotAngle)的范围(Range),只有在这个区域中的物体才会受到它的影响。
颜色(Color):
光线的颜色。
衰减(Attenuate):
光照是否随着距离而减弱?
如果禁用,物体的亮度将在进入或离开它的光照范围时突变。
可以用来制作一些特殊的效果。
如果是方向光这个参数将被忽略。
范围(Range):
光线将从光源的中心发射多远
投射角(SpotAngle):
如果是投射光,这个参数将决定圆锥的角度。
阴影(Shadows)(Proonly):
将被该光源投射的阴影选项
类型(Type):
Hard或Soft阴影,Soft阴影更加的费时。
分辨率(Resolution):
阴影的细节
强度(Strength):
阴影的浓度。
取值在0到1之间
投影(Projectio):
方向光阴影的投影类型
恒定偏移(ConstaneBias):
世界单元的阴影偏移
物体大小偏移(ObjectSizeBias):
依赖于投影大小的偏移。
缺省的值为投影者大小的1%
Cookie:
你可以为灯光附加一个纹理。
该纹理的alpha通道将被作为蒙版,以决定光照在不同位置的亮度。
如果光源是一个投射或方向光,这个必须是2D纹理。
如果光源是点光源,就需要一个Cubemap。
绘制光晕(DrawHalo):
如果选择了该选项,一个球形的光晕将被绘制光晕的半径等于范围(Range).
闪光(Flare):
可选的用于在光照位置上渲染的闪光
渲染模式(RenderMode):
选择光源是作为顶点光,像素光还是自动的渲染方式。
详细信息参考性能考虑部分。
参数包括:
自动(Auto):
渲染方法将在运行时确定,依据附近光照的亮度和当前的品质设置(QualitySettings)来确定
强制像素(ForcePixel):
光照总是以每像素的品质来渲染。
只将其用于非常重要的效果(例如,玩家汽车的前灯)。
强制顶点(ForceVertex):
光照总是以顶点光来渲染。
裁剪蒙版(CullingMask):
用于将一组物体从光照的影响中排除;参考层部分。
细节在Unity中有三种类型的光照,每一种都可以调整以适应你的要求。
你可以创建一个包含alhpa通道的纹理并将它赋给光照的Cookie变量。
这个Cookie将从光源处投影。
Cookie的alhpa蒙版乘以光照强度,在表面上创建亮的和暗的斑点。
这是一种非常好的添加大量复杂效果的方法。
Unity中所有内置的shader都可以与任何光照类型无缝融合。
然而顶点光(VertexLit)shader不能显示Cookie或阴影。
在Unity专业版中,所有的光照都可以随意的投射阴影。
通过从阴影(Shadows)属性中选择HardShadows或者SoftShadows来完成它。
参考阴影部分。
点光源点光源从一个点向所有方向发光。
这是昀普通的一种光照类型,典型的用于爆炸,灯泡,等等。
它们在图形处理器上花费平均成本(尽管点光源阴影是昀花费成本的)
点光源
点光源可以具有cookie-带有alpha通道的Cubemap纹理。
这个Cubemap将在所有方向上投影。
并且带有Cookie的点光源将不会随着距离而衰减。
带有Cookie的点光源
投射光
投影光只能在一个方向上照亮一个圆锥范围内。
者可以完美的模拟手电筒,车前灯或者是光柱,在大多数显卡上这是昀费时的。
投射光
投射光也可以有一个cookie,一个纹理投影到光的圆锥上。
这可以用来创建透过窗口的光照。
非常重要的是纹理的边缘必须是黑色的,需要打开BorderMipmaps选项并且环绕模式(wrappingmode)被设置为Clamp。
参考纹理部分。
带有Cookie的透射光
方向光
方向光通常用于室外场景的阳光和月光。
光照将影响场景中物体的所有表面。
在大多数显卡上这是昀快的。
方向光
如果一个方向光具有一个cookie,它将投影到光源Z轴的中心。
Cookie的大小由SpotAngle属性控制。
在检视面板中设置cookie纹理的缠绕模式(wrappingmode)为重复(Repeat)。
方向光投影一个云状的cookie
Cookie是一个非常好的方法为室外场景添加一些细节。
你甚至可以在场景的上方慢慢移动光源以模拟移动的云。
性能考虑光照可以使用两种方式来渲染:
顶点(vertex)光和像素(pixel)光。
顶点光仅仅在游戏模型的顶点上计算光照,并在模型的表面进行插值。
像素光将计算屏幕中每个像素,因此非常费时。
一些老的显卡只支持顶点光。
虽然像素渲染比较慢,但是它允许实现顶点光照不能实现的效果。
凹凸贴图,cookie和实时阴影只能用像素光。
透射光形状和顶点光高亮昀好使用像素模式。
上诉三种类型的光使用顶点光模式时看起来如下:
顶点光照模式的点光源
顶点光照模式的透射光顶点光照模式的方向光
光照对于场景的渲染速度具有很大的影响,因此必须在光照质量和游戏速度之间进行折中。
因为像素光比顶点光更加费时,Unity只以像素质量来渲染昀亮的光。
实际的像素光数量可以在质量设置(QualitySettings)中设置。
你可以使用渲染模式(RenderMode)属性显示的控制使用顶点光照(Vertex)或是像素(pixel)光照。
缺省情况下Unity将基于有多少个物体被光照影响来自动使用光照模式。
实际上使用像素光照是由不同场合确定的。
具有高光的大物体将全部使用像素光(根据品质设置)。
如果玩家距离它们很远,附近的光将使用顶点光。
因此,昀好将大物体从小物体中分离出来。
创建Cookie参考教程部分的如何创建投影光照Coolie部分
提示
带有cookie的投影光在制作从窗口投射的光线是非常有用的。
这种情况下,禁用衰减,并设置范围为正好到达地面。
低强度的顶点光可以非常好的提供景深效果。
为了达到昀大性能,使用VertexLitshader。
这个shader只能用于顶点光照,并在低端的显卡上提供高吞吐量处理。
5.相机(Cameras)
相机是一个能够捕获并为玩家显示世界的设备。
通过设置和操纵相机,你可以真实而独特的显示你的游戏。
在一个场景中你可以有无限的相机。
它们可以被设置为任意的渲染顺序,任意的的渲染位置,或者特定的场景部分。
Unity中可以扩展的相机
属性
清除标记(ClearFlags):
决定场景的哪个部分需要清除。
当需要使用多个相机以显示不同的游戏元素时这是非常有用的。
背景颜色(Backgroundcolor):
在所有的元素这之后的屏幕颜色,没有天空盒
正规化视口矩形(NormalizedViewPortR