Basic Tips
- u3d Texture
有以下集中用途: Texture纹理, normal map法线贴图, gui, cursor 图标文件, Reflection 反射,
cookie用作光源, lightmap光照贴图, advanced贴 - Wrap Mode Repeat,
Clamp重复,截断 - Filter Mode 过滤模式
Point, Bilinear双线性(找出最接近的四个图素,做插值), Trilinear - Prefab 预设体
gameobject 和 component 的集合,为了重复利用。
游戏场景
- Create Scene
创建Plane平面, Gameobject创建的时候以当前的scene的中心点位置。Basic Sphere
cube, sphere, capsule, cylinder, plane - GameObject除了empty object, 还包括几何体,导入模型,camera, gui, particle, light, 树木等各类元素
Hierarchy的元素都是gameobject. - 所有的gameobject, 不过是在empty object上挂载了各种类别的组件。
- GameObject必须有一个transform component,位置,旋转,缩放
组件介绍
Mesh
网格
Mesh Filter: 获取mesh, 并传递到所属的对象gameobject上,如果网格拥有蒙皮信息,将创建skinned mesh renderer.还要为gameobject添加一个mesh render,才能让对象在scene中渲染出来。让对象在scene中渲染出来。
Text Mesh: 文字渲染器, 生成3d文字。
Mesh Renderer: 从filter获取网格模型,根据transform组件在scene中渲染。Effect
特效,效果
Particle System: 粒子,烟雾,气流,火焰,瀑布
Tail Renderer: 轨迹/拖尾 Gameobject 在scene中产生拖影效果
Line Renderer: 3d空间中2-N个点之间的连线,支持自定义宽度和材质贴图,需要多个Gameobject添加LineRenderer.
Lens Flare: 镜头光晕,强烈光源的折射效果。
Halo: 光环,光晕,光源对象或自发光物体光晕和空气中细小灰尘
Projector: 幻灯片,将材质纹理投射到Scene中所有与视锥相交的gameobject上。必须projector类型的Shader配置才能工作。
Legacy Particles:Physics
物理组件: 各种物理效果 Nvidia Physx物理引擎Navigation
寻路导航
NavMesh Agent: 寻路,存放导航网络代理导航信息
Off-Mesh Links: 导航网格代理 将分离的网格连接起来
Navmesh Obstacle: 导航网格障碍物,通过将固定位置的障碍物来烘培进行计算。Audio:
Audio Listener: 侦听器
Audio Source: 音源
Audio Reverb Zones: 混响区
Audio Low Pass Filter: 低通滤波器
Audio High Pass Filter: 高通滤波器
Audio Echo Filter: 回响过滤器
Audio Distortion Filter: 失真滤波器
Audio Reverb Filter:
XXXXXRendering:
渲染
Camera: 摄像机 数量不受限制
Skybox: 天空盒 包围Scene的巨大立方体
Flare Layer: 耀斑/光晕层 camera默认带有
GUI Layer: ui 在游戏运行状态下才能被渲染出来,摄像机默认带有的组件
Light: 灯光,各种光,平行,点,方向光
Light Probe Group: 动态光探头/灯光探测器 添加一个或多个探测器,为移动物体实事计算光照贴图
Occlusion Area: 遮挡区域 运动的游戏对象身上,遮挡剔除功能
LODGroup: LOD Group 细节级别,
GUI Texture: gui 使用的图片
GUI Text: 文本Miscellaneous:
综合
Animator: 生成器
Animation: 动画
Network View: 网络视图 网络通信组件??? 状态同步 和 RPC(remote procedure call <html/>)
Wind Zone: 风域 用来模拟游戏对象受风力影响产生效果
操作
- scene 中添加gameobject
`create object -> add mesh filter -> add mesh render(add material for render)`
Script脚本
javascript C sharp Boo
- Scripts.unity
包含一些默认的脚本
General:
Camera Control:__Activate Trigger__: 激活触发器 激活场景中的触发器对象 __Drag Rigidbody__: 拖动刚体
Unity Script:__Mouse Orbit__: 鼠标轨迹 camera 根据鼠标的偏移值旋转 __SmoothFollow__: 平滑跟随 camera 跟随父对象进行移动、旋转,跟随的延迟和阻尼系数 __SmoothLookAt__: 平滑注视 camera 永远对准约束的游戏对象__CombineChildren__: 结合子对象 将相同材质的对象们结合起来,达到优化的目的 __MeshCombineUtility__: 网格合并工具
创建光源
light 的类型
directional:放到无限远
point: range 类似于灯泡
Spot: 锥形区域,耗费gpu资源
Area Light: 光照贴图烘培Rendering paths : vertex lit顶点光照 , forward正向渲染, deferred lighting延时光照
主要是阴影的效果创建光源调节颜色可以制造处午后的光照效果
创建Camera
. Perspective:透视
. Orthographic: 正交
. Camera Component:
clear flag : skybox SolidColor DepthOnly Don’tClear
CullingMask: 剔除遮罩 根据游戏对象指定的层控制摄像机渲染的游戏对象。
Projection: Perspective:透视,透视方式渲染对象 Orthographic:正交
Depth: 深度,控制摄像机渲染顺序,较大值在之上渲染
ClippingPlanes: 剪裁平面 开始渲染与停止渲染之间的距离near far
RenderingPath: 渲染路径Terrian Editor 地形编辑器
unity 底边lod 功能,会根据地形距离及起伏程度调整pathc网络的疏密程度。
TODO:CharacterController
- First Person Controller
- 3rd Person Controller
粒子系统
粒子发射器、粒子动画器、粒子渲染器, 可以通过脚本控制每个单独的例子
Send Collision Message 模拟子弹和冲击伤害Skybox 天空盒
使用了特殊类型shader的材质, 根据指定的纹理模拟远景、天空效果
- DawnDusk
- Eerie
- MoonShine
- 自定义天空盒
Fog雾效
远看有,近看没有
Water效果
Sound效果
Shuriken粒子系统
Mecanim 动画系统
丰富且复杂的动画系统
- 人体角色工作流和动画创建能力
- Retargeting运动重定向 把动画从一个角色模型应用到另一个角色模型
- Animation Clips 动画预览能力
- 动画间复杂交互作用的可视化
Mecanim 工作流
- 资源准备与导入
- 角色的建立 (人体模型的avatar创建、肌肉定义muscle definitions)
- 角色的运动 (动画片段及相互间的交互作用,状态机、混合树、动画参数、代码控制动画)
游戏中使用角色动画
- 动画循环片段 是否适配
- Animator组件 拥有Avatar的GameObject 都有一个Animator组件,
Animator Controller角色设置行为,包含状态机(statemachines)、BlendTrees、脚本控制的Events
- Controller
- Avatar
- Apply Root Motion 控制角色的位置
- Animate Physics 动画物理交互
- Culling Mode 动画剪裁模式
- 总是启用动画
混合树Blend Tree
区别于 动画过渡
物理引擎
RigidBody 刚体 接受外力、扭矩力
transform组件 不会受到外力
RigidBody与游戏对象的关系- Parenting 半独立方式随parent 移动
- Scriping 在游戏对象刚体上添加AddForce()和AddTorque()添加作用力和扭矩力
- Animation 在动画和物理系统间切换对象的控制权,被标记为动力学模式,直接操作Transform,刚体会影响其他对象,但自身不会受到影响。
Colliders 碰撞体
没有碰撞体的刚体 在模拟中会彼此穿过
physic material 不同的物理材质类型决定了碰撞体与其他对象的交互形式- Box Collider
- Sphere Collider
- Capsule Collider
- Mesh Collider 网格,获取网格对象, 开始convex参数才能是mesh 碰撞体之间碰撞, 耗资源。网格碰撞体3角行数量少于255省。
- Wheel Collider
碰撞
- 碰撞体和刚体 共同作用 产生了物理效果 碰撞的时候会有3个消息 发送给绑定的对象
- 触发器 是碰撞体失效,发生碰撞时发送3个触发消息 切换场景、自动门等
- 摩擦力和弹力 物理材质决定
- 关节
- HingeJoint,
- FixedJoint固定关节(约束一个游戏对象对另一个的运动)
- SpringJoint弹簧关节
- CharacterJoint角色关节 表现布娃娃 系统
- ConfigurableJoint可配置关节
- 力场
类似于火箭 起初没速度、不断加速
Demo
Scene End ball game 物理引擎练习。
光照贴图技术
- Lightmapping
增强静态场景光照效果, 不能作用到动态游戏对象
- Single Lightmapping 静态、仅生成一张Far光照图(保存了非实时光源)、
- Dual Lightmaps 区分实时、非实时区域,bake near,far 两种贴图, 近的实时渲染、远的使用贴图,临界区会平滑的插值过渡。
- Directional Lightmap 静态物体使用, 光照贴图+实时Bump/Spec映射效果。
- LightProbes
Scene中放置采样点,收集周围明暗信息,对动态对象临近的采样点进行插值,结果作用于对象上
NavMesh 导航网格
3d游戏World中 动态物体自动寻路的一种技术
- Navigation Static 参与导航网格烘培
- OffMeshLink Generation 关联分离的mesh
- NavigationLayer Default, NotWalkAble, Jump
- Bake Radius
- Navmesh Obstacle组件 路障、
yield return 代替Timer 使用
遮挡剔除技术
Occlusion Culling 提高渲染性能
后期屏幕渲染特效
ImageEffects 应用在Camera上
- 特效编写在OnRenderImage()函数
开发篇
基础知识
向量
Basic Concepts
- 模 向量的长度
- 标准化 保持方向不变 将向量长度变1
- 单位向量 长度为1
- 零向量 各分量均为0
运算
- 加减 合力、叠加
- 数乘 缩放
- 点乘 向量点相乘 标量值 向量长度相乘后 再乘以 夹角的余弦值,如果均为单位向量 a.b 等于向量b在a方向上的投影长度
u.v == 0 u,v垂直 u.v >0 u,v小于90’, u.v <0 u,v夹角大于90
- 叉乘 两个向量相乘得到新的向量,垂直于原来的两个向量
矩阵
BasicConcepts
- m行n列 3d 中常用4x4矩阵
运算 - 平移
- 旋转
- 缩放
Matrix4x4类
- m行n列 3d 中常用4x4矩阵
齐次坐标
- (wx, xy, wz, 1) 坐标点 (wx, wy, wz, 0)表示向量
四元数
- 一个标量分量和一个3维向量
Q=[w, (x,y,z)] - 使用Quaternion类表示
- 一个标量分量和一个3维向量
坐标系
- 世界坐标系 游戏场景
- 局部坐标系 模型Mesh的顶点就是
- 相机坐标系 物体是否在相机前方,及物体间的遮挡顺序
- 屏幕坐标系 描述屏幕上的位置
+Transform.TransformPoint() 局部坐标系->世界坐标系
+Transform.InverseTransformPoint()
+Transform.TransformDirection(Vector3.forward)计算世界坐标系下物体的前方向(物体的前方向为局部坐标系z轴的正方向)
渲染管线
- Rendering 3d物体场景 转化为二维图像
- RenderingPipeline 显示芯片内用于处理图形信号而相互独立的并行处理单元,每个处理阶段都从上一阶段接受输入数据,然后进行处理
管线处理的数据是顶点、几何图元和片段 - FixedRenderingPipeline 固定管线 顶点处理和像素着色是固化的
- 可编程Pipeline(shader)
+D3D9 渲染管线有9个阶段 局部坐标transform->世界坐标transform->观察坐标transform->背面消隐->光照计算->裁剪->投影->视口计算->光栅化
- RenderingPipeline 显示芯片内用于处理图形信号而相互独立的并行处理单元,每个处理阶段都从上一阶段接受输入数据,然后进行处理
- Rendering 3d物体场景 转化为二维图像
Unity Script
C Sharp
- 只支持内建数组 new int[5]
- foreach(int item in array)
- ArrayList List
- ref 关键字 引用参数, 声明和函数调用实参数钱也要添加ref.
- out 关键字 实现多个返回值, 声明和实参调用都得使用out .
- Start或Awake 不是用构造函数
- 游戏对象脚本类名与文件名要相同
- 协同函数Coroutines 返回类型是IEnumerator, 使用yield return 替代yield
- 必然事件Update(called every frame), Start(), awake(called when create), fixedUpdate(固定时间间隔, 物理状态), LateUpdate(相机、游戏场景)
MonoBehavior
- OnMouseEnter, OnMouseOver, OnMouseExit, OnMouseDown, OnMouseUp, 鼠标对于GUI控件、或碰撞体
- OnTriggerEnter, OnTriggerExit, OnTriggerStay, 碰撞体和触发器相关
- OnCollisionEnter, OnCollisionExit, OnCollisionStay, 碰撞体和刚体相关
- OnControllerColliderHit, 当控制器移动时与碰撞体
- OnBecameVisible, OnBecameInvisible, 相机
- OnEnable, OnDisable, 对象
- OnDestroy 脚本销毁, OnGui 渲染GUi和处理GUI消息时调用
组件变量
- transform 对象位置、旋转、缩放
- rigidbody
- renderer
- light
- camera
- Collider
- Animation
- Audio
GetComponent, GetComponents, GetComponentInChildren, GetComponentsInChildren
Time类
Time
- time
- timeSinceLevelLoad
- deltaTime 上一帧的时间
- fixedTime fixedUpdate时间
- fixedDeltaTime
- maximumDeltaTime
- smoothDeltaTime
- timeScale
- frameCount 渲染帧的总数
- realtimeSinceStartup 游戏开始到现在经历的真实时间
- captureFramerate 固定帧率
Random - seed 随机数生成器种子
- value
- insideUnitSephere
Mathf - PI
- infinity
- NegativeInfinity
- Deg2Rad
- Rad2Deg
- Epsilon
Coroutine协同程序
多个协同程序,同时只有一个在运行,别的会挂起- StartCoroutine
- StopCoroutine
- StopAllCoroutine
- WaitForSeconds
- WaitForFixedUpdate
I/O 和 控制
Input
鼠标、键盘、摇杆/方向盘/手柄
- compensateSensors 屏幕方向补偿感应器
- gyro 陀螺仪
- mousePosition
- anyKey
- anyKeyDown 任意键按下第一帧返回true
- inputString 键盘输入字符串
- acceleration 3维空间中的线性加速度
- accelerationEvents 上一帧的加速度数据列表
- accelerationEventCount 上一帧的加速度参数数据长度
- touches 触摸状态列表
- touchCount 所有触摸状态列表长度
- deviceOrientation
. - GetAxis 虚拟输入轴的值, -10 - 10的渐变值
- GetAxisRaw
- GetButton 虚拟按键是否被按下
- GetButtonDown 在按键按下的那一帧返回true
- GetButtonUp 在按键松开的那一帧返回true
- GetKey 指定的按键被按下时返回true
- GetKeyDown 指定的按键按下时返回true
- GetKeyUp 指定的见松开
- GetJoystickNames 所有摇杆名称数组
- GetMouseButton
- GetMouseButtonDown
- GetMouseButtonUp
- ResetInputAxes重置输入
GUI
内置GUI
Shader \& ShaderLab
Shader开发
渲染管线中的特定处理阶段提供算法的一段代码
实时渲染, 镜头景深、动态模糊、卡通渲染
shader, shaderLab, 表面着色器(Surface Shader)Shader 'MyShader'{ Properties{ _MyTexture ("My Texture", 2) = "white" {} } SubShader{ //surface shader, vertex & fragment shader, fixed function shaders } SubShader{ //备选shader } }- 一个着色器包含1个或多个字着色器,会遍历寻找第一个被用户设备支持的子着色器进行渲染
- Properties的属性定义
(“显式名称”, Vector)=默认向量值 4维向量
(“定义名称”, Color)=颜色值
(“……”, Float)=浮点数
(“……”, Range(min, max))=默认浮点数
(“……”, 2D) 贴图{选项}
(“……”, Rect) 矩形纹理属性(非2的n次幂)
(“……”, Cube) 立方体纹理属性选项
- TexGen 纹理生成模式 ObjectLinear, EyeLinear, SphereMap, CubeReflect, CubeNormal
与OpenGL的纹理生成模式相对应,如果使用自定义的顶点程序,该参数将被忽略。 - LightmapMode 纹理将接受渲染器的光照贴图,不从Material材质
- Pass 每个Pass都会渲染一次对象 根据光照交互情况渲染多次
- TexGen 纹理生成模式 ObjectLinear, EyeLinear, SphereMap, CubeReflect, CubeNormal
- Pass 语法
Pass {[name and tags] [RenderSetup 渲染][TextureSetup纹理]}
RenderingSetup Material 材质 Lighting光照 Cull裁剪 ZTest深度测试 ZWrite深度缓存写入 Fog AlphaTest BlendAlpha Color ColorMask Offset SeparateSpecular ColorMaterial
TextureSetup 用于固定管线(使用了SurfaceShader Vertex&FragmentShader将忽略)使用SetTexture{[命令选项]}, 包含命令combine[previous, constant, primary, texture], constantColor, matrix, Unity支持UsePass - Category分类
类似于子着色器继承
Shader “example”{
Category{
}Fog {Mode Off} Blend One One
}
FixedFunction Shaders
Surface Shaders
嵌在ShaderLab的结构代码
Vertex & Fragment Shaders
使用vertex时,FixedFunction会关闭,vertex关闭固定管线中的3d transform、光照、纹理坐标生成,fragment会替换掉SetTexture的纹理混合模式
Advanced Develop
Batching
渲染过程:camera可视范围->任务模型(法线、本地位置、UV), 索引(各顶点形成的3角形),变换(位置、缩放、旋转、摄像机位置)、编辑器扩展
Editor Class for extend dev。
+继承EditorWindow @MenuItem
+自定义Inspector
+自定义Scene onSceneGUI()
工作流程
- AssetBundle 是Unity包含一切的格式
自定义二进制文件ext 改为.bytes
AssetBundle API- BuildPipeline.BuildAssetBundle 任意文件类型的Asset打包成AssetBundle
- BuildPipeline。BuildStreamedSceneAssetBundle 一个或N个Scene以流的方式打包成AssetBundle文件
- BuildPipeline.BuildAssetBundleExplicictAssetNames 与build相同,但可以额外的指定名字
- 使用PushAssetDependencies() 和 PopAssetDependencies()来设置asset之间的依赖关系
使用网络下载AssetBundle
- 使用WWW直接下载
- 使用WWW.LoadfromCacheorDownload
加载Asset
- AssetBundle.Load() AssetBundle.LoadAsync(name)
- Application.LoadLevel(name) Application.LoadLevelAsync(name)
- Application.LoadLevelAdditive Application.LoadLevelAdditiveAsync(name)
卸载AssetBundle
- Assetbundle.Unload(bool) true | false 导致AssetBundle相关的Asset是否被卸载
卸载没有使用的Assets
- Resources.UnloadUnunsedAssets() 卸载没用的assets
Instantiate 的GameObject使用 Destroy() DestroyImmediate()
Script Debug
- Profiler 优化与调试
- FixedUpdate中不要包含无需重复调用的代码
- Update 中最好不要执行find findObjectOfType findGameObjectWithTag, find操作最好在awake或 start中执行
Demo 详解
- Angry Bots
- FBX(静态资源、动态资源)的导入 Model Label 可以设置FBX文件的Mesh, Material, UV, Normal 切线 Rig 设置Animation Type
- 人物身上挂载了多个脚本
- FBX(静态资源、动态资源)的导入 Model Label 可以设置FBX文件的Mesh, Material, UV, Normal 切线 Rig 设置Animation Type
第二次阅读
概述&Concept
- LOD Levels of Details 多层次细节
- 实时光影
- Lightmap 工具Beast(Color Bounce, Soft Shadows, High Dynamic Range Lighting, Lingthing of Moving Objects)
- Mecanim 新的动画系统
3D模型、材质与动画
- 3d的内容 Mesh, Textures, Animations, Bones骨骼
Components Mesh
- Mesh Filter 获取Mesh