1. 场景与工程
Project(工程)与Scene(场景)是不同的概念,一个项目工程可包含多个场景,而每个场景是唯一的。例如通关游戏,项目就是整个游戏,场景就是游戏中的各个关卡。
2. 图层的个数
图层的上限是32个,前8个是系统默认的图层,不可更改。
3. U3D编辑器的视图
基本视图,包括Project视图、Hierarchy视图、Inspector视图、Game视图和Scene视图。
Project视图是整个工程的资源汇总,会显示项目所包含的全部资源文件。
Hierarchy视图只显示了当前场景中用到的对象,并按照父子化关系组织对象,并以命名的字母顺序来排序,方便管理和查找资源。
Inspector视图用于选择游戏场景中当前所选对象的详细参数信息。
Game视图是游戏的预览窗口,不可编辑,用于呈现效果,可播放。
Scene视图是Unity最常用的视图,场景中所有的模型、光源、摄像机、材质、音效等都在此窗口显示,Scene视图提供了一个可视化的游戏对象编辑环境。
还包括Profiler(分析器)视图、Console(控制台)视图。
Profiler视图,按F7可弹出该窗口,用于监视CPU、GPU、渲染、内存、声音、物理引擎等统计信息。
Console视图,Ctrl + shift + C打开该视图,控制台输出一般用于调试。
4. U3D支持的三维文件格式
Maya : .mb或.ma1
3D Studio Max: .max1
Cheetah3D : .jas1
Cinema4D : .c4d1
Blender : .blend1
AutoDesk FBX: .FBX
....
使用相应的3D文件之前,需要下载相应的插件。
5. U3D与常见三维动画软件的单位比例关系
U3D的单位默认是“米”,在三维软件中应尽量用米制单位来配合U3D。
6.U3D中图片文件尺寸和格式建议
建议图片尺寸是2的n次幂,最小像素大于等于32,最大像素尺寸小于或等于4096。若图片不是2的n次幂,可在导入设置中使用NonPower2 Size Up来调整。
出于性能考虑,模型贴图尽量用Mip Maps。
对于项目制作而言,图片类型设定非常重要,如普通纹理、法线贴图、GUI、反射贴图等,应设置为对应的格式。Unity支持的纹理类型有:Texture、Normal map(法线贴图)、GUI、Cursor(图标文件)、Reflection(反射)、Cookie(作用于光源的Cookie)、Lightmap(光照贴图)、Advanced(高级)等8种类型。
ps: 法线贴图就是在原物体的凹凸表面的每个点上均作法线,通过RGB颜色通道来标记法线的方向,你可以把它理解成与原凹凸表面平行的另一个不同的表面,但实际上它又只是一个光滑的平面。对于视觉效果而言,它的效率比原有的凹凸表面更高,若在特定位置上应用光源,可以让细节程度较低的表面生成高细节程度的精确光照方向和反射效果。
7.Prefab的概念
Prefab意为预设体,可理解为有个游戏对象及其组件的集合,相似于类与对象实例化。可以将一个游戏对象构造为Prefab以方便重复使用。
8.Unity中的Material和Physic Material
Material可理解为对象的视觉质感,如表面反射、高光、纹理、颜色等属性。
Physic Material:模拟对象的物理特性,如弹性、硬度、光滑度等。
9.组件(component)的概念
组件就是游戏对象实现其用途的功能件,例如同一个空对象,添加了摄像机组件,它就是一架摄像机;添加了网格过滤组件,它就是一个模型;添加了灯光组件,它就是一盏灯光。Unity脚本也是一种组件。
一个空的对象,会自动包含一个Transform(几何变换)组件,所有对象都包含该组件,不可删除也无手动指定。
组件是Unity中的重点内容。
10.Unity脚本
Unity中脚本也是一种组件,添加到对象上实现各种交互操作和其他功能。Unity支持JavaScript、C#和Boo三种脚本语言。
11.摄像机
Unity摄像机用于将游戏世界呈现给玩家,游戏场景中至少有一个摄像机,也可以有多台,多台摄像机用于双人分屏效果或者高级的自定义效果。Unity支持Persperctive(透视)和Orthogra-phic(正交)摄像机。
12.地形编辑(Terrain)
地形的Transform组件只支持Position变换,Rotation和Scale无效。可在地形对象上创建高地图,绘制纹理,种树,种草等。
13.粒子系统
粒子是在三维空间中渲染出来的二维图像,主要用来表现烟、火、水滴、落叶等。
一个粒子系统由粒子发射器、粒子动画器、粒子渲染器组成。
粒子系统是作为组件添加到游戏对象上的。
粒子效果耗费硬件资源较多,应尝试用尽量少的粒子数来达到需求的效果。
14.天空盒
Unity中的天空盒是一种使用了特殊类型Shader的材质,该材质笼罩在整个游戏场景之外,并根据材质中指定的纹理模拟出类似远景、天空等效果,使游戏场景看起来更加完整。
添加天空盒有两种方式:一种是在Unity的Render Setting中指定,这种方式是针对游戏场景的,这种方式无论哪个摄像机对象,天空盒子保持不变。二是对摄像机对象添加天空盒组件,这种方式只针对摄像机,如果在一个场景中变换摄像机对象,天空盒也会变。摄像机天空盒优先级高于场景天空盒。
除了使用系统自带的天空盒资源,也可以自己制作,一般需要六张图。
15.雾效
开启fog将会在场景中渲染出雾的效果,开启雾效可以用来优化性能(远处物体被雾遮挡,可以不渲染)。
雾效的设置是针对场景的。
在Unity中,要实现正常的音效,必须具备两个条件:
1.Audio Listener : 音频监听组件,该组件用于接收音效,相当于人耳朵,一般应用在摄像机对象上,在创建摄像机对象时,Unity会自动添加该组件。
2.Audio Source: 声源组件,该组件用于播放音频,一般用于发出声音的游戏对象上。
17.Shuriken粒子编辑
Shuriken是unity提供的一个粒子编辑器(particle system),以模块的方式管理粒子属性,用户可自定义粒子的各种属性,完成丰富的粒子效果。
18.Mecanim动画系统
Mecanim是Unity提供的一个丰富的动画系统,一般用于人形角色的动画创建。创建动画的一个基本流程就是建立一个从Mecanim系统的简化人形骨骼结构到用户实际提供的骨骼架构的映射,这个映射称为Avatar。
游戏中一个角色往往有多种运动动画,如空闲时微微喘气、接受指令后开始走动或跑步,如果用脚本控制这些运动状态的切换和过度往往比较复杂,Mecanim提供了状态机来进行控制。状态集合、状态过渡条件以及记录当前状态的变量放在一起,就组成了状态机。
动画混合功能可以对多个相似的运动进行混合,每个动作对于最终动画的影响取决于权重参数,动画混合和动画过渡是两个不同的概念。
19.物理引擎
Unity提供了:刚体、角色控制器、碰撞体、布料、关节、力场这几种物理效果,合理的组合各种物理组件能模拟现实的物体行为。
20.向量
Unity中,和向量有关的类有Vector2、Vector3和Vector4,分别对应不同维度的向量,其中Vector3使用最多。
矩阵也是常用的数学工具,可以描述向量的平移、旋转和缩放。Unity使用Matrix4*4类来描述4*4矩阵。
Unity中,用Quaternion类表示四元数Q=[w,(x,y,z)]。
21.渲染管线
渲染就是将三维物体转换为二维图像的过程,渲染管线就是显卡用于处理图形信号而相互独立的并行处理单元,也称作渲染流水线。可编程渲染管线就是Shader。
22.脚本
Unity提供了3种脚本:javaScript、C#、Boo。
对于jacaScript脚本,unity会自动添加一个与脚本名相同的类,并继承monoBehaviour,但C#和Boo需要在脚本里显示的写出类名和继承。
C#也有Arraylist、list等容器类。
C#可以用ref关键字声明为引用参数,在函数调用时也要添加ref。
C#做脚本,需要使用start和awake函数来初始化,避免使用构造函数;类名和脚本名要相同,这里要求同名的类指的是从MonoBehaviour继承的行为类,普通的C#类可以随意命名;目前unity中的C#不支持自定义命名空间。
MonoBehaviour类是Unity中一个很重要的类,它定义了脚本的基本行为,所有脚本都需要从它直接或间接的继承。
响应函数都以On开头,如OnMouseEnter、OnTriggerEnter、OnCollisionEnter等。
脚本可以动态的改变游戏对象的各组件的属性值。这些属性值作为成员变量从MonoBehaviour中继承下来。若游戏对象上不存在该组件,则组件对应的变量名为空。
可用GetComponent函数来得到组件,但这个函数比较耗时,不应该放在update中使用。
脚本不仅可以访问脚本所在的游戏对象,也可以夸对象访问,常用的方法:GameObject.find、GameObject.FindWithTag。还有一种简单的方法:在脚本中设置两个public变量,然后在inspector视图中对其赋值,就可以跨对象访问了。
协同程序:Coroutine协同程序和多线程类似,但是在任一时刻只能有一个协同程序运行。
23.输入与控制
Unity提供了强大的Input类来处理鼠标、键盘、遥感、ios/android触摸等输入信息。注意,和输入相关的处理逻辑一般应该放在update方法中。
Input类提供了监听各种设备输入的接口,提供了键盘按下弹起、鼠标按下弹起等各种回调方法。
尽量使用虚拟按键,使得玩家可以配置键位输入。
在Unity中,鼠标位置用屏幕坐标来表示,屏幕左下角为坐标原点(0,0), 右上角为(screen.width, screen.height)。
24.UnityGUI
目前Unity没有内置可视化GUI编辑器,可借助第三方插件来提高GUI开发效率。
Unity提供了丰富的GUI控件,这些控件配合使用可以构建出完整的游戏界面。
注意,GUI代码需要放在onGUI函数中才能绘制,放在onUpdate中会报错。
在GUI中,屏幕坐标系以左上角为原点(0,0),右下角为(screen.Width,screen.Height),与input.mousePosition的鼠标位置不同。
常见的GUI控件有:Label、Box、Button、RepeatButton、TextField、PasswordField、TextArea(与TextField类似,用于编辑多行文字)、Toggle(用于制作开关按钮)、ToolBar(生成一组按钮,每次只能激活一个)、Slider(滑动条)、Scrollbar(滚动条)、ScrollView、Window(可看作容纳控件的容器)。
Unity可使用GUIskin来配置一套风格化的GUI样式,制作出符合游戏风格的界面外观。
Unity提供两种布局方式:固定布局(GUI类)和自动布局(GUILayout类)。
25.Shader
Shader是伴随可编程渲染管线出现的,它使得游戏开发者可以对渲染过程进行控制,拥有更大的创作空间。Unity中所有的渲染都需要Shader完成,开发者可以自己编写Shader,也可以使用Unity提供的内建Shader。
内建Shader可以从官网上下载,开发者可以基于这些代码开发出个性化Shader。
Unity提供了一种名为ShaderLab的着色器语言来编写Shader。Unity支持三种Shader(固定功能管线着色器、表面着色器、顶点片段着色器)。
26. DrawCall Batching技术
Unity每次在准备数据并通知GPU渲染的过程,称为Draw call。一般情况下,渲染一次拥有网格并携带一种材质的物体会使用一次Draw call。Draw call的次数是决定性能的主要指标之一。
Draw call Batching技术:在每一次Draw call中除了GPU的渲染耗时之外,切换材质和Shader也是耗时的操作,Draw call Batching技术的目标是每一次运行Draw call时,批量处理多个物体,只要某几个物体的材质相同,GPU就打包批量处理,以减少切换耗时。
27. 网络
服务器端分为两种:授权服务器和非授权服务器。
28.工作流
AssetBundle可实现游戏的动态加载,他可以存储任一Unity可识别的资源,并上传服务器,在运行游戏时下载到本地。
实现流程:开发者将创建号的AssetBundle文件上传至服务器。游戏运行时客户端根据需求从服务器上下载相应的AssetBundle到本机。Unity提供了三种方式将资 源打包成AssetBundle。Unity提供了两种方式来下载AssetBundle。
29.脚本调试与Profiler
Unity提供的MonoDevelopment提供了单步调试,可用于脚本调试;
Unity提供了Profiler,可分析CPU占用GPU占用,以及函数调用时间等。
30.Unity支持夸平台发布
支持Android、ios、web平台。
31.图形管道数据流的大体流程:
1.建立场景:开始渲染之前,需要预先设定整个场景有效的一些选项。比如建立摄像机位置,或者更具体些,要选择进行渲染的出发点----视点,渲染的输出----视图。
2.可见性检测:选好了摄像机,就必须检测场景中哪些物体是可见的。可见性检测极其重要,我们不希望浪费时间去渲染那些看不到的物体。
3.设置物体的渲染状态:一旦发现了某物体潜在可见,就到了把它实际绘制出来的时候。每个物体的渲染设置可能是不同的,在渲染物体的任何片元之前,首先要设置上述选项,最常见的设置选项是纹理映射。
4.几何体的生成和提交:接着,实际向API提交几何体,通常提交的数据是种种形式的三角形,或是独立三角形;此阶段可能会应用LOD,或者渐进式生成几何体。
5.变换与光照:一旦渲染API得到了三角形数据,由模型空间向摄像机空间的顶点坐标转换和顶点的光照计算即开始。
6.背面剔除与裁剪:然后,那些背对摄像机的三角形去除(背面剔除);三角形在视锥外的部分也去除(裁剪)。
7.投影到屏幕空间:在3D剪裁空间中经裁剪产生的多边形,被投影到输出窗口的2D屏幕空里。
8.光栅化:当把裁剪后的多边形转换到屏幕空间后,就到了光栅化的阶段。光栅化指计算应绘制三角形上的哪些像素,并为接下来的像素着色阶段提供合理的插值参数。
9.像素着色:最后,在管道的最后阶段,计算三角形的色彩,并把色彩写入屏幕,这时可能需要alpha混合和z-缓冲。
32.可见面检测VSD
VSD的目的是找出不应该被绘制的三角形,VSD可在多个不同的层次进行,如:像素,三角形,物体。像素级的VSD由深度缓存处理;三角形级的VSD由背景剔除和裁剪完成。
可见面检测的两个基本原则:
1.三角形在视椎体外的部分不可见。视椎体外的部分被裁剪,视椎体内的部分留待处理。
2.像素可能会被离摄像机更近的物体遮挡。
33.U3D内存优化
推荐这篇博客
34.U3D UGUI的EventSystem
推荐这篇博客
35.U3D UGUI的UI事件
推荐这篇博客
36.U3D 每一秒钟执行一次
void Update()
{
m_duringTime += Time.deltaTime;
if (m_duringTime >= 1)
{
m_duringTime = 0;
_Init();
}
}
37. 行为树的基础
参考博客: 1、2
38.DontDestroyOnLoad()方法
参考:这里
39.Time类详解
参考:博客
40.腾讯桌球的项目架构
参考:这里
参考:博客
参考:博客
参考:博客
参考:博客 、博客、博客
深度缓冲区:深度缓冲区可以很容易的被描述为一个游戏屏幕大小的灰度图像,这个图像中的每个像素都代表着这个像素到摄像机到底有多远(实话实说这个解释不是100%正确的,但是我们认为现在不应该为了追求准确性而把这个概念解释的过于复杂)。深度缓冲区是由显卡的GPU来使用的,用来决定要被渲染的像素是否应该被处理还是应该从渲染中移除。结果就是,会被其他像素遮挡住的像素不会是可见的。
1、World Space(世界坐标):我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在场景中的。transform.position可以获得该位置坐标。
2、Screen Space(屏幕坐标):以像素来定义的,以屏幕的左下角为(0,0)点,右上角为(Screen.width,Screen.height),Z的位置是以相机的世界单位来衡量的。注:鼠标位置坐标属于屏幕坐标,Input.mousePosition可以获得该位置坐标,手指触摸屏幕也为屏幕坐标,Input.GetTouch(0).position可以获得单个手指触摸屏幕坐标。
Screen.width = Camera.pixelWidth
Screen.height = Camera.pixelHeigth
3、ViewPort Space(视口坐标):视口坐标是标准的和相对于相机的。相机的左下角为(0,0)点,右上角为(1,1)点,Z的位置是以相机的世界单位来衡量的。
4、绘制GUI界面的坐标系:这个坐标系与屏幕坐标系相似,不同的是该坐标系以屏幕的左上角为(0,0)点,右下角为(Screen.width,Screen.height)。
【四种坐标系的转换】
1、世界坐标→屏幕坐标:camera.WorldToScreenPoint(transform.position);这样可以将世界坐标转换为屏幕坐标。其中camera为场景中的camera对象。
2、屏幕坐标→视口坐标:camera.ScreenToViewportPoint(Input.GetTouch(0).position);这样可以将屏幕坐标转换为视口坐标。其中camera为场景中的camera对象。
3、视口坐标→屏幕坐标:camera.ViewportToScreenPoint();
4、视口坐标→世界坐标:camera.ViewportToWorldPoint();
Destroy(obj);
print(obj);
上面的obj并不会立即销毁,而是需要等待下一个Update更新,所以还是可以被print出来。DestroyImmediate(obj);
print(obj);
DestroyImmediate立即对对像进行销毁,print出来是null。
void Update () {
if (Input.GetMouseButtonDown(0))
{
if (EventSystem.current.IsPointerOverGameObject())
{
//是UI的时候,执行相关的UI操作
Debug.Log("是UI");
}
else
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
if (hit.collider.gameObject == gameObject)
{
Debug.Log("点击Cube!");
}
}
}
}
}
UGUI的界面是用Canvas(画布)进行布局的,它的渲染顺序有所不同,下面我进行了总结:
1.Unity3d中的渲染顺序如下:
不同的Camera的Depth
相同Camera下的不同SortingLayer
相同SortingLayer下的不同Z轴/Order in Layer
2.改变控件之间的层级关系
(1)同一canvas下:
改变控件transform的SiblingIndex,
transform.GetSiblingIndex();
transform.SetSiblingIndex(int index); //index值越大,越后渲染,层级越大,越显示在前面
(2)不同Canvas下:
设置Canvas下的Sort Order //Sort Order值越大,越后渲染,层级越大,越显示在前面
参考博客
参考博客