大家好,又见面了,我是你们的朋友全栈君。
0. 目录
- 简要介绍
- 基本概念
- 视图菜单
- 坐标系统
- 资源元素
- 脚本交互
- 相机操作
1. 简要介绍
Unity3D软件是由Unity Technologies公司提供的综合开发环境,主要面向游戏开发人员、虚拟现实设计师等,可用于创建诸如三维视频游戏、建筑可视化、实时三维动画等类型的多媒体内容,并支持这些内容在Windows、iOS、Android等多种平台的发布,功能非常强大。
Unity3D软件分为Free版和Pro版,前者在功能上要弱于后者(比如前者不支持LOD等,具体区别参见这里),对于后者还提供全功能的30天试用版。目前Unity3D软件的最新版本是4.3.2,下载地址在这里。
Unity3D软件集成了专业的渲染引擎和“所见即所得”的开发编辑界面,可快速创建具有强大视听效果的交互式3D内容,并支持3ds max、maya等多种三维建模软件所制作的物件模型(以资源形式导入并使用)。脚本编程基于Mono技术,可使用JavaScript、C#或Boo语言编写,用来对基于可视化编辑界面的基础开发方式进行功能扩展。
2. 基本概念
熟悉Unity3D使用的基本概念和术语,对于理解后文内容非常重要。以下术语在后文中将会反复出现。
- 工程(Project):表示单个开发项目,包含项目中所有的元素,如模型、脚本、关卡等。如果需要开发一个游戏,那么这个游戏在Unity3D软件中以单个工程的形式存在并进行管理。
- 场景(Scene):每个工程包含一个或多个场景。通常而言单个场景作为一个游戏关卡或游戏主菜单,在其中放置环境、装饰、敌人等游戏对象。
- 游戏对象(GameObject):构建游戏的基础单元,通过在特定场景中进行交互来完成游戏过程。游戏对象是组件(Component)的容器,单个游戏对象通常包含多于一个组件,同时也可以包含其他游戏对象作为其子对象。每个游戏对象至少包含Transform组件。
- 组件(Component):构建游戏对象的基础单元,为游戏对象添加特定的功能。组件可以是网格、材料、地形等可视化实体,也可以是摄像机、灯光等抽象类型。组件必须依附于游戏对象而存在。
- 资源(Asset):表示材质、纹理、音频文件、游戏对象等在开发过程中可使用的资源。
- 预制件(Prefab):游戏对象和组件的集合,可以在场景中被复用。适用于大量重复使用的物体(相当于为这些重复物体创建一个模板)。将预制件放置在场景中,即对其进行了实例化。修改预制件的属性将影响它的所有实例,而修改其单个实例的属性将仅影响该实例。预制件以蓝色字体显示。
- 脚本(Script):定义了场景中的资源和游戏对象如何进行交互,是游戏业务逻辑的实现。脚本也是一种组件。
- 相机(Camera):相机是附带了相机组件的游戏对象。玩家在屏幕上所看到的一切均是通过相机视角来展示的。
- 灯光(Light):绝大多数情况下均需将灯光添加到场景中。灯光可以为场景渲染出不同的气氛。
举例说明,假设我们需要开发一款类似于《暗黑破坏神2》的游戏,那么开发团队将为该游戏创建一个工程,并在该工程中进行各种资源的管理和逻辑脚本的编写。玩家为了升级和获取装备,需要到地牢去打怪。如果地牢有三层,那么每一层都可以作为一个场景,各场景间通过地道进行切换。在每一层地牢场景中的地形、怪物、装备、血瓶、水池等元素都是游戏对象,这些游戏对象由于包含了不同的组件而具备不同的功能。比如怪物对象可以包含音频组件,在被杀死时能发出对应的惨叫声。
游戏中所有的三维模型(包括怪物模型、地牢模型等)、音频文件、图片文件等都可以看作是资源。如果某一类怪物数量较多,我们可以考虑把它作成预制件资源,直接在场景中实例化多份即可,这样一旦怪物属性发生了变化,仅需要修改一次。怪物的寻路与搏斗等业务逻辑适合放在脚本中实现,从而让它们真正地智能化,并与玩家角色进行交互,推动游戏情节展开。相机是玩家在游戏中的眼睛,向玩家展示游戏世界。该游戏中的相机需要跟随玩家角色而移动,方便玩家时刻观察自己角色的状态。
3. 视图菜单
运行Unity3D软件,如果是第一次使用则需要创建新的工程并导入开发所需的package,否则可直接打开原有工程。注意:工程路径中不能包含中文,否则会提示“Creating file Temp/tempFile failed…”并且无法创建成功。
进入Unity3D后,软件界面如下图所示:
以下分别介绍软件界面各组成部分的功能:
- 工程浏览面板(Project):用于访问、管理和查找工程中所使用的资源(Asset)。面板左侧有Favorites和Assets两个分支,其中Assets分支为所有资源的树状层级列表,类似于Windows资源管理器,而Favorites分支可存放经常访问的资源以及某次资源查找的结果,类似于收藏夹。面板右侧是以图标(或列表)形式显示的资源集合,其右上方放大镜图标所标识的输入框为资源查找框,可输入资源名称、类型和标签进行查找。
- 层级面板(Hierarchy):列出当前场景视图中的所有游戏对象(GameObject)。一旦游戏对象在场景视图中被添加或删除,在层级视图中也将同步更新。层级视图提供游戏对象的父子关系设置,子对象继承父对象的运动和旋转效果。
- 场景视图(Scene):用于选择和放置当前场景所包含的各类游戏对象,包括环境、玩家、敌人、摄像机等,这是开发过程中最重要的环节之一。可通过鼠标或快捷键进行场景的观察视角变换与导航。视图右上角是场景手柄工具(Scene Gizmo),显示了场景视图当前视角方向,可通过它快速修改视角。
- 工具栏(Toolbar):包括5个呈水平方向排列的工具条,从左至右分别用于导航/空间变换、场景显示切换、游戏视图控制、游戏对象显示与视图布局。
- 属性监视面板(Inspector):显示当前选中游戏对象的详细信息,包括它所附带的组件(Component)及其属性。属性监视面板中列出的任何属性均可以被直接修改,从而改变该游戏对象的功能和特性。
软件界面的最上方是主菜单,包括如下菜单项:
- 文件(File):用于场景和工程的新建/打开/保存,以及工程构建。
- 编辑(Edit):用于基本操作和设置。
- 资源(Assets):用于资源的导入/导出/创建/显示。
- 游戏对象(GameObject):用于游戏对象的创建/显示/移动/父子关系设置。
- 组件(Component):用于各类组件的设置。
- 窗口(Window):用于窗口的切换,以及各类窗口的显示。
- 帮助(Help):提供关于信息、参考手册、脚本手册、论坛信息等。
4. 坐标系统
坐标系统在Unity3D开发过程中具有非常重要的作用,是游戏对象定位、移动、缩放、旋转等操作的基础。坐标系统包含以下基本概念:
- 三维向量(Vector3):用于表示三维坐标空间的向量和点,可进行向量运算。
- 世界坐标(World Space):相对于整个世界空间建立坐标系,使用全局坐标(通过Transform.position获取)。其X轴正方向指向屏幕右侧,Y轴正方向背离观察者,Z轴正方向指向屏幕上方。
- 视口坐标(ViewPort Space):坐标点被归一化,并且相对于相机建立坐标系。以相机左下角为(0,0)点,右上角为(1,1)点,Z轴使用相机的世界坐标单位。其X轴正方向指向屏幕右侧,Y轴正方向指向屏幕上方,Z轴正方向指向观察者。
- 屏幕坐标(Screen Space):坐标点使用像素点进行定义,并且相对于屏幕建立坐标系。以屏幕左下角为(0,0)点,右上角为(pixelWidth,pixelHeight)点,Z轴使用相机的世界坐标单位。其各轴方向与视口坐标相同。屏幕坐标的本质是激活的视口坐标(相机有多个,每个相机有自己的视口坐标,屏幕对应于被激活相机的视口,因此屏幕坐标是被激活相机的视口坐标)。鼠标位置坐标属于屏幕坐标。
- 局部坐标(Local Space):使用所选择对象的坐标系统。一个对象的局部坐标来自它的枢轴点(Pivot Point),坐标原点即该对象的枢轴点(对象的局部中心),坐标方向与枢轴点方向相同。可以在层级面板中调整一个对象的局部坐标位置和方向。
5. 资源元素
网格、材质、纹理、贴图和动画是资源模型中非常重要的元素,直接决定了资源在场景中的外观和行为表现。
- 网格(Mesh):是一种将物体模型的顶点、纹理、材质等信息存储在一个外部文件中的3D物体模型。
- 材质(Material):物体表面最基础的材料,如木质、塑料、金属或者玻璃等。
- 纹理(Texture):物体表面呈现的线形纹路,是在材质基础上的丰富细节呈现。
- 贴图(Map):一种将图片信息投影到曲面的方法。
Unity3D没有创建网格的工具,但是可以在常用的三维建模软件(如Maya、3ds Max等)中创建模型,然后导入到Unity3D中形成资源,这些资源可以被场景直接使用。
Unity3D支持读取fbx、dae、3ds、dxf和obj格式的文件,因此所有可以导出这些格式的软件都适用于Unity3D。
6. 脚本交互
Unity3D脚本支持JavaScript、C#与Boo(.Net平台中与Python语法相似的一种静态语言),官方推荐使用JavaScript,但考虑到C#的面向对象支持程度与强大的类库,在大型游戏项目开发时建议使用C#。
前文提到过,脚本也是组件的一种,可以挂载到游戏对象中。游戏框架在脚本生命周期的流程节点处或特定事件发生时调用相应方法,实现游戏业务逻辑。因此,脚本开发最为重要的是明确其生命周期的关键流程环节,这些流程环节所关联的脚本方法和它们的执行时机,从而在合适的脚本方法中编写所需的业务逻辑代码。
下图描述了脚本生命周期的脚本方法调用流程与时机。
图中内容可简化为这样的方法执行次序:Awake –> Start –> Update –> FixedUpdate –> LateUpdate –> OnGUI –> Reset –> OnDestory
- Awake:用于在游戏开始之前初始化变量或游戏状态,在脚本整个生命周期内仅被执行一次。Awake在所有游戏对象初始化之后执行,因此可以在方法中安全地与游戏对象进行通信。
- Start:仅在所有脚本的Update方法第一次被调用前执行,且仅在脚本实例被启用时执行。Start在所有脚本的Awake方法全部执行完成后才执行。
- Update:在每次渲染新的一帧时执行。由于该方法调用的频率与设备性能、被渲染对象有关,导致同一游戏在不同机器的效果不一致(因为Update方法的执行时间间隔不一致)。
- FixedUpdate:在固定的时间间隔执行,不受游戏帧率的影响。所以处理RigidBody时最好用FixedUpdate。FixedUpdate的时间间隔可在工程设置中更改(Edit –> Project Setting –> Time)。
- LateUpdate:所有脚本的Update方法调用后执行。例如相机跟随即是在LateUpdate方法中实现。
- OnGUI:在渲染和处理GUI事件时执行。
- Reset:用户点击属性监视面板(Inspector)的Reset按钮或首次添加该组件时执行,仅在编辑模式下执行。
- OnDestroy:当游戏对象将被销毁时执行。
需要注意的是,必须所有脚本的Awake方法均执行完毕后才会开始执行这些脚本中的Start方法,而各脚本的Awake方法的调用顺序是随机的。因此,对象的创建可在Awake方法中实现,而对象的获取可在Start方法中实现,保证调用先后次序。
7. 相机操作
相机是为玩家捕捉和显示世界的一种装置。在一个场景中你可以有数量不限的相机,它们可以被设置为任何顺序渲染,在屏幕上的任何地方渲染,或仅渲染屏幕的一部分。
相机可以被定制,被脚本化,或被子类化。对于益智游戏,相机通常处于静态显示全部视角。对于第一人称射击游戏,相机通常作为玩家角色的子对象,并将其放置在与玩家角色的眼睛等高的水平。对于赛车游戏,相机通常会跟随玩家角色所控制的车辆。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/169326.html原文链接:https://javaforall.cn