当前位置:   article > 正文

Unity知识点总结(1)_unity的恒力组件中决定物体所受全局坐标恒力作用的参数是

unity的恒力组件中决定物体所受全局坐标恒力作用的参数是

这里是上半个月的学习内容,小编将会“事无巨细”地分享一下!

主要用到的学习资料有《unity2017从入门到精通》的第三章~第八章和B站的“史上最全Unity3D教程”的初始unity里18个视频

主要内容:unity界面操作、创建基本的3D、2D游戏场景+3D数学基础

目录

基本概念:

工作视图

*坐标

*场景

*游戏对象

*组件

材质Material

纹理、着色器与材质的关系

摄像机Camera

制作游戏场景小地图

渲染管线:

顶点处理:

图元装配:

光栅化:

像素处理:

缓存:

遮挡剔除:

LOD

GI

直接光照:

环境光照;

反射光照

间接光照

实时GI

烘焙GI   

光源侦测

声音:

3D游戏场景基本操作

预设体Prefabs

降低地形高度:

绘制地形纹理:

添加树木:

添加水效果:

添加天空盒:

添加雾效:

创建第一人称控制器

创建第三人称控制器

3D数学基础

3D坐标系:

向量

齐次坐标

四元数

坐标转换原理


基本概念:

工作视图

Assets文件夹与project面板(放游戏资源)有对应关系

Unity package file可导入project面板  Export Package 可导出文件包

Scence 操作游戏界面,作场景布局

Hierarchy面板:放游戏对象(在游戏运行时可看见)

Game面板: 预览游戏运行

Inspector检视面板:显示当前选定游戏对象附加的组件(功能的模块)及其属性信息、为重要游戏物体选择图标

【技巧】顶点吸附:选择物体后按住V,定位定点,再拖拽到目标物体某个定点上

*坐标

世界坐标:整个场景的固定坐标,不随物体旋转而改变

本地坐标:物体自身坐标,随旋转而改变

*场景

一组相关联的游戏对象的集合

通常游戏中每个关卡就是一个场景,用于展现当前关卡中的所有物体

*游戏对象

运行时出现在场景中的游戏物体

是一个容器,可以挂载组件

*组件

是游戏对象的功能模块

每个组件都是一个类的实例

Transform变换组件:决定物体位置、旋转、缩放比

Mesh Filter 网格过滤器:用于从资源中获取网格信息

Mesh Randerer 网格渲染器:从网格过滤器中获得几何形状,再根据变化组件定义的位置进行渲染

网格过滤器与网格渲染器联合使用,使模型显示到屏幕上——>

Hierarchy面板右键——>Create Empty——>(Inspector)Add Component——>Mesh Filter——>Mesh(Mesh Renderer——>[Materials(材质)]Element)

Position 子物体相对于父物体,父物体相对于世界

做父子物体,一般先把子物体reset,再调整

材质Material

材质:物体的质地,指色彩、纹理、光滑度、透明度、反射率、折射率、发光度等。实际就是Shader的实例

色彩

做材质:project面板——>Create——>Material

做完的材质给到物体的Mesh Renderer 组件的Element

改变颜色

也可以拖(材质往Scene物体上拖或子物体上拖)

Texture纹理:附加到物体表面的贴图

导入图片(Assets——>Import New Asset)给到Main Maps

Main Maps

Albedo基础贴图:决定物体表面纹理与颜色

Metallic金属:使用金属特性模拟外观

Specular镜面反射:使用镜面特性模拟外观

Smoothness 光滑度:设置物体表面光滑程度

Normal Map 法线贴图:描述物体表面凹凸程度

Emission自发光:控制物体表面自发光颜色和贴图

——None不影响环境

——Realtime实时动态改变

——Backed烘焙生效

Tiling平铺:沿着不同的轴,纹理平铺个数

Offset偏移:滑动纹理

Shader着色器:专门用来渲染3D图形的技术,可以使纹理以某种方式展现。实际就是一段嵌入到渲染管线中的程序,可以控制GPU(显卡)运算图像效果的算法。

Redering  Mode渲染模式

Opaque 不透明(默认选项)

Transparent透明,用于半透明和全透明物体,如玻璃(改变颜色A)

Cutout 镂空,用于完全透明或完全不透明物体,如栅栏

Fade 渐变 用于淡入淡出物体(改变颜色A)

纹理、着色器与材质的关系

shader给功能,Material才能有这个属性

用代码修改颜色,先找物体——>Mesh Renderer组件——>Material——>Color

把Shader给材质,材质给到物体

摄像机Camera

附加了Camera组件的游戏对象

向玩家捕获和显示世界的设备

场景中摄像机的数量不受限制

组件:

Transform变换组件

Camera:向玩家捕获和显示世界

Audio Listener音频监听器:接受场景输入的音频源Audio Source并通过计算机的扬声器播放声音

属性:

Clear Flags清除标识:决定屏幕的空白部分如何处理

——Skybox天空盒:空白部分显示天空盒图案

天空盒

*围绕整个场景的包装器,用于模拟天空的材质

天空盒材质种类:6 Sided、Procedural、Panoramic

创建天空盒:Project面板(右键)——>Create——>Material创建材质——>Shader——>6 Sided

天空盒的使用:

①种.为特定的摄像机绘制天空盒

Main Camera——>Add Component——>Skybox

②种.将天空盒材质用于环境光照设置(最佳)

Windows——>Redering——>Lighting Settings

可作为反射源将天空色彩反射到场景中物体

Procedural

太阳模式

——None没有、Simple简单、Hight Quality高质量

Atmoshpere Thickness大气层厚度

Ground地面颜色

——Solid Color纯色:空白部分显示背景颜色

——Depth Only仅深度:画中画效果时,小画面摄像机选择该项可清楚屏幕空部分信息只保留物体颜色信息

Background背景:所有元素绘制后,没有天空盒的情况下,剩余屏幕的颜色

Culling Mask选择遮蔽层:选择要照射的层Layer

一个物体在相机视角以内,应该看见,但不想看见,就让物体有两个层(可自己去添加层)

(物体换成自己的层)

让摄像机camera把层取消掉

Projection投射方式:

Perspective透视(3D镜头)

orthograhic正交(2D镜头)摄像机会均匀地渲染物体,没有透视感通常小地图使用

Field Of View 野视:拉近/远镜头

Clipping Planes 探针摄像机剪裁面

Near近:绘制的最近点

Far远:绘制的最远点

玩游戏时,一边往前走,远处的物体慢慢出来了,往后退没了,为了性能优化

Viewport Rect视口矩形:可做后视镜、小地图、分屏

Depth深度值:

相机在渲染顺序上的位置,具有较低深度的摄像机将在较高深度的摄像机之前渲染

可创建两个Camera:

Depth:Main Camera<MapCamera(新建的相机)才能确保小地图相机在前渲染

制作游戏场景小地图

让摄像机的模型看似好像一个物体,就把它们放在统一的父物体里,对父物体操作——>摄像机可以有多个,Audio Listener(耳朵)只能有一个

(两个摄像机的错误提示)——>调深度值——>在人物上做一平面,用来当小地图的标识,Main Camera不想看到平面,MipCamera不想看到人物:新建层,用Culling Mask隐藏

(实际开发时:地图摄像机不让看地形,渲染消耗大,美工准备一张图放地下,camera只看人物标识,性能优化了)——>小地图去掉空白部分:MipCamera—>Clear Flags—>Depth Only(空白地方不做渲染)

渲染管线:

图形数据在GPU上经过运算处理,最后输出到屏幕的过程

CPU:中央处理器

GPU:显卡,做渲染的

Draw Call(unity5叫Batches):每次引擎准备数据并通知GPU的过程。通俗讲,每帧调用显卡渲染物体的次数

(Batches越大,渲染越多,要减少Batches)

顶点处理

接受(GPU给它发)模型顶点数据;坐标系转换

图元装配:

组装面:连接相邻的顶点,绘制三角面

光栅化:

计算三角面上的像素,并为后面着色阶段提供合理的插值参数

像素处理

对每个像素区域进行着色,写入到缓存中

缓存

一个存储像素数据的内存块,最重要的缓存是帧缓存与深度缓存

帧缓存:存储每个像素的色彩,即渲染后的图像。帧缓存常常在显卡中,显卡不断读取并输出到屏幕中

深度缓存z-buffer:存储像素的深度信息,即物体到摄像机的距离

光栅化时便计算各像素的深度值,如果新的深度值比现有深度值更,则像素颜色被写到帧缓存,并替换深度缓存

遮挡剔除:

当物体被送到渲染流水线之前,将摄像机视角内看不到的物体进行剔除,从而减少了每帧渲染数据量,提高渲染性能(优点)

插件:Instant Occlusion Culling

[链接:https://pan.baidu.com/s/1A8IUPgpk8rGgzE7NnbY0DA?pwd=ufl2

提取码:ufl2(可免费提取博主网盘的Instant OC插件,可点赞博主文章作为答谢呦)]

缺点:判断物体是否被遮住,CPU使用了额外的开销

适用性:在场景中,物体分布较密集且存在着大量的被挡物体

步骤:1.创建层2.为游戏制定层(将参与遮挡剔除)与标签(将自动附加IOClod脚本)3.物体添加碰撞器Collider组件4.摄像机附加脚本IOCcam.

LOD

多细节层次(Level Of Detail)

LOD技术指根据物体模型的节点在显示环境中所处的位置重要性,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而或得高效率的渲染运算

减少了相机与模型之间的距离去选择高、中、低模(Lod_0精模、Lod_1中模、Lod_2简模)

属性:

lod 1distance:摄像机到物体距离小于当前距离时,使用Lod_0模型

lod 2distance:摄像机到物体距离大于Lod 1且小于当前距离时,使用Lod_1模型,大于当前值,使用Lod_2模型

步骤:

  1. 创建层2.创建空物体并将模型(Loa_0、Loa_1、Loa_2)添加到其中3.为父物体指定层与标签4.父物体或子物体添加碰撞器组件5.摄像机附加脚本IOCcam

适用性:

场景中,存在高模且高模会有远近变化

缺点:

CPU消耗、占用内存(原来一个,现在三个)、(美工要做三个模

性能优化三方面:

CPU的使用、渲染、内存的使用

(window——>Profiler)

04DAY

[光照系统]

GI

Global Illumination,GI即全局光照

能够计算直接光间接光、环境光以及反射光的光照系统,通过GI算法可以使渲染出来的光照效果更为真实丰富

直接光照:

从光源直接发出的光,通过Light组件实现

Type类型:

灯光对象的当前类型

——Directional Light平行光:平行发射光线,可以照射场景里所有物体,用于模拟太阳

——Point Light点光源:在灯光位置上向四周发射光线可以照射其范围内所有对象,用于模拟灯泡

——Spot Light聚光灯:在灯光位置上向圆锥区域发射光线,至于在这个区域内的物体才会受到光线照射,用于模拟探照灯

——Area Light区域光:由一个面向一个方向发射光线(形成一个面,往Z轴发射),只照射该区域内物体,仅烘焙时有效,用在光线较为集中的区域。

场景烘焙才能用的光,没有实时光照,因为这个光极其消耗性能

Hierachy(右键—>light—>Area Light

属性

Range范围:光从物体的中心发射的范围,仅适用于点光源和聚光灯

Spot Angle聚光角度,只适用于聚光灯

Color:光线的颜色

Intensity强度:光线的明亮程度

Culling Mask选择遮盖层:选择要照射的层Layer

Shadow Type阴影类型:Hard硬阴影、Soft软阴影

——Strength硬度:阴影的细节程度

——Resolution分辨率:设置阴影的细节程度

——Bias偏移:物体与阴影的偏移

通过Mesh Renderer组件启用禁用阴影

——Cast/Receive Shadows:当前物体是否投射/接受阴影

物体—>Mesh Rederer—>Lighting—>Cast/Receive Shadows

——Off不投射阴影、On投射阴影、Two Sided双面阴影、Shadows Only隐藏物体,只投射阴影

——阴影剔除:设置显示阴影的距离

很多时候需要产生阴影,但个别物体不需要产生阴影,怎么办?

——所有物体都产生阴影,找光

——个别不产生阴影,找物体

Edit—>Project Setting—>Quality—>Shadows Disdance

环境光照;

作用于场景内所有物体的光照,通过Environment Lighting中Ambient控制

Ambient Source环境光源

——Skybox通过天空盒颜色设置环境光照

——Graduent 梯度颜色

Sky天空颜色、Equator地平线颜色、Ground地面颜色

Ambient Intensity环境光强度

Ambient Mode

——Realtime实时更新,环境光源会改变选择此项

——Backed烘焙,环境光源不会改变选择此项

反射光照

根据天空盒或立方体贴图计算作用于所有物体的反射效果,通过Environment Lighting中Reflection 控制

Reflection Source

——Skybox天空盒

Resolution分辨率、Compression 是否压缩

——Custom自定义

Cubemap立方体贴图

Reflection Intensity反射强度

Reflection Bounces使用Reflection Probe后允许不用游戏对象间来回反弹的次数。

(环境光照)(反射光照)

间接光照

物体表面在接受光照后反射出来的光

通过Light组件中的Indirect Multiplier反弹强度控制

注意:只有标记static—>Contribute GI的物体,才能产生间接反弹光照

(把场景中不动的物体标记为静态)

实时GI

“实时”指在运行期间任意修改光源,而所有的变化可以立即更新    

步骤:

  1. 游戏对象设为static

  1. 启动Lighting面板Realtime Global Illur
  2. 点击Generate Lighting(如果勾选Auto Generate,编辑器会自动检测场景的改动、修复光照效果)

手游一般不用实时GI,PC用做树动阴影就跟着动                

烘焙GI   

Baked GI  

当场景包含大量物体时,实时光照和阴影,对游戏性能有很大影响。使用烘焙技术,可以将光线效果预渲染成贴图作用到物体上模拟光影,从而提高性能,适用于在性能较低的设备上运行的程序。           

物体标静态—>Light—>Mode

Light组件Mode属性:烘焙模式  

——Realtime 仅实时光照时起作用

——Baked仅烘焙时起作用

——Mixed混合,烘焙与实时光照都起作用             

可以通过Scence面板Baked模式查看光照贴图

光源侦测

Light Probes

由于Light Maooing只能作用于Static物体,所以导致运动的物体与场景中的光线无法融合在一起,显得非常不真实,而Light Probes组件可以通过Probe收集光影信息,然后对运动物体邻近的几个Probe进行插值运算,最后将光照作用到物体上。

步骤:

  1. 创建对象Light Probe Group
  2. 添加侦测小球Add Probe
  3. 点击Generate Lighting(如果勾选Auto Generate,编辑器会自动检测场景的改动、修复光照效果)  

声音:

Unity支持的音频文件格式

Mp3、ogg、wav、aif、mod、it、s3m、xm

声音分为2D、3D两类:

3D声音:有空间感,近大远小(如游戏脚本声)

2D声音:适合背景音乐

在场景中产生声音,主要依赖两个组件:

Audio Listener音频监听器

接受场景中音频源Audio Source发出的声音,通过计算机的扬声器播放声音

Audio Source音频源组件

——Audio Clip音频剪辑:需要播放的音频资源

——Mute静音

——Play On Awake唤醒播放:场景启动时自动播放

——Loop播放

——Volume音量

——Pitch音调:改变音调值调节音频播放速度。1是正常速度

——Stereo Pan:2D声音设置左右声道

——Spatial Blend:2D与3D声音切换

3D Sound Settings

Volume Rolloft音量的衰减方式        

此图距离越大,音量越小,x轴代表距离,y轴代表音量大小,曲线是音量衰减曲线

(可以调整曲线)

3D游戏场景基本操作

预设体Prefabs

一个游戏对象及其组件的集合,目的使游戏对象及资源能够被重复使用

创建预设体:

Assets—>Create—>Prefab,把游戏对象拖进Prefab文件夹

在Hierachy视图中,游戏对象的名字变成了蓝色,代表变成预设体实例

降低地形高度

Terrain视图—>Terrain组件—>Paint Terrain下拉的Set Height、Raise or Low Terrain

绘制地形纹理:

Terrain视图—>Terrain组件—>Paint Terrain下拉的Terrain Layers—>Create Layer

添加树木:

Terrain视图—>errain组件—>Paint Terrain—>Edit Terrain Layers—>Creat Layer

添加水效果:

Environment资源包—>water—>Prefabs

设置阴影:

Directional Light视图—>Light组件—>Shadow Type

添加天空盒:

Window—>Rendering—>Lighting Settings—>Skybox Material

导入(Project01\Chapter05\skybox)天空盒资源

拖到Skybox Material

添加雾效:

Lighting视图的Fog选项

创建第一人称控制器

Character资源包—>FirstPersonCharacter—>Prefabs—>FPSController

(结束播放状态,按键盘Ctrl+P)

创建第三人称控制器

Character资源包—>ThirdPersonCharacterr—>Prefabs—>ThirdPersonController

Cameras资源包—>Prefabs—>FreeLookCameraRrg,将其放在ThirdPersonController的位置上

FreeLookCameraRrg下FreeLookCam(Script)组件的Target参数指定为ThirdPersonController对象

3D数学基础

3D坐标系:

·全局(世界)坐标系:

描述游戏场景内所有物体位置和方向的基准

Hierrarchy视图中Position属性为(1,2,3)表示它距离全局坐标系原点在x轴方向上有1个单位坐标,在y轴方向上有2个单位坐标,在z轴方向上有3个单位坐标

当游戏对象父物体时,其Hierrarchy视图中Position显示为局部坐标,当游戏对象父物体时,其Hierrarchy视图中Position显示既是局部坐标也是全局坐标

·局部(模型、物体)坐标系

每个物体都有其独立的物体坐标系,并且随物体进行移动或者旋转

模型mesh保存的顶点坐标均为局部坐标系下的坐标

父子物体的坐标系是关联的,子物体会以父物体的某一坐标点为自身的坐标原点

·相机坐标系:

根据观察位置和方向建立的坐标系

判断物体是否在相机前方,以及物体之间的先后遮挡顺序

·屏幕坐标系:
建立在屏幕上的二维坐标系,用来描述像素在屏幕上的位置,其中原点位置(0,0)在屏幕左下角

向量

用于描述具有大小和方向两个属性的物理量

向量的运算:

·加减

·数乘

向量与一个标量相乘

·点乘

两个向量点乘得到一个标量,数值等于两个向量长度相乘后再乘以二者夹角的余弦值

·叉乘

两个向量的叉乘得到一个新的向量,新向量垂直于原来的两个向量,并且长度等于原向量长度相乘后再乘夹角的正弦值

Vector3类

Vector3应用:

·计算两物体间的距离

public Transform objTrans1;

public Transform objTrans2;

    void Start()

    {

        float dis = Vector3.Distance(objTrans1.position, objTrans2.position);

        Debug.Log("Distance:" + dis);

}

(Debug.Log将消息记录到Unity控制台)

将脚本绑定给场景中的主相机Main Camera,然后再Inspector视图中objTrans1objTrans2指定为2个cube

运行、CTRL+SHIFT+C调出控制台

·缓动效果

Vector3.Lerp方法

让物体从当前位置移动到坐标系下的坐标另一个位置的缓动效果

public Transform endTrans;

void Update()

    {

        transform.position = Vector3.Lerp(transform.position, endTrans.position, Time.deltaTime);

    }

Time.deltaTime 表示 Update() 方法上完成上一帧所用的时间

将脚本绑定给场景中的Cube上,然后在其Inspector视图中将endTrans指定为Cube(1)

齐次坐标

将原本三维的向量(x,y,z)用四维向量(wx,wy,wz,w)来表示

引入目的:

更好地区分向量和点;

统一用矩阵乘法表示平移、旋转、缩放变换

当分量w=0时可以用来表示无穷远的点

四元数

包含一个标量分量和一个三维向量分量,四元数Q记作Q=[w,(x,y,z)]

在游戏对象的 Transform 组件中,变量 Transform.rotation 为对象在全局坐标系下的旋转;变量 Transform.localRotation 为对象在父对象的局部坐标系下的旋转

应用:通过四元数控制对象旋转

坐标转换原理

世界坐标与局部坐标的转换:改变全局和局部坐标

ransform 组件的 Transform.TransformPoint 方法可以将坐标点从局部坐标系转换到全局坐标系,Transform.InverseTransformPoint 方法可以将坐标点从全局坐标系转换到局部坐标系

世界坐标与屏幕坐标的转换:设置世界坐标

在 Unity 中,由于屏幕的画面是由相机(Camera)所呈现的,所以世界坐标和屏幕坐标之间的转换需要以相机为媒介

·如何通过鼠标单击来设置物体的世界坐标位置

新建 C# 脚本

Vector3 screenPos;

    // Start is called before the first frame update

    void Start()

    {

        screenPos = Camera.main.WorldToScreenPoint(transform.position);

        //打印坐标信息

        Debug.Log("屏幕坐标:" + screenPos);

    }

    // Update is called once per frame

    void Update()

    {

        if(Input.GetMouseButtonDown(0))

        {

            //获取鼠标的位置坐标

            Vector3 mousePos = Input.mousePosition;

            //将物体屏幕坐标的z轴值赋值给鼠标坐标的z轴

            mousePos.z = screenPos.z;

            //将屏幕坐标换成世界坐标

            Vector3 worldPos = Camera.main.ScreenToWorldPoint(mousePos);

            //设置物体位置

            transform.position = worldPos;

        }

}

将脚本绑定到 Cube 立方体上

当运行开始时,控制台中会输出该 Cube 的世界坐标转换成屏幕的坐标;当鼠标指针在 Game 视图,单击左键时,可以看到Cube 的位置会跟随鼠标指针的位置移动

世界坐标转换成屏幕坐标后,屏幕坐标的 z 轴大于 0,则说明该坐标在相机前方,反之,则说明该坐标在相机后方

小编从今天开始学习unity脚本,持续更新呦~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/686497
推荐阅读
相关标签
  

闽ICP备14008679号