包含了gameobject的相关参数教程,平移,旋转等基础操作
在开始了解本部分之前,你首先可以创建一个任意命名的3d项目,并且在场景中创建一个3d物体cube(立方体)
如果没有问题的话,你将会看到以下界面。
事实上,立方体的属性中还应该包含Collider,但是这个我们会在以后再进行讲解。
- 1、Transform
- 2、Mesh Filter(网格过滤器)
- 3、Mesh Renderer(网格渲染器)
1、Transform
Transform组件是物体本身的变形组件,也是游戏物体最基础的组件之一,它下设三个属性,决定了物体的坐标、旋转和缩放。
理论上来说,所有的物体都必须包含这个组件。
1.1 Position(坐标)
如果你有着正常人的思考能力,你应该就明白,这里决定着物体物理坐标。但你觉得我会只告诉你这些吗?
我们一般有着很多方法来改变物体的坐标,在这里我将列出一些常用的代码。
1.1.1 直接修改
this.transform.position = new Vector3(0, 0, 0);
最简单的方式,我们可以直接在transform的position上修改其属性。一般意义上讲,应该用一个三维向量Vector3赋予。
Vector3,三维向量,括号里分别带有它的三个坐标(均为float),我们可以像这样声明它:
Vector3 veca = new Vector3(1.0f, 1.0f, 1.0f);
同样也可以像上面一样,临时new一个出来,这两种分别应用在不同的场景。
1.1.2 translate(平移)
this.transform.Translate(1.0f,0f,0f);
·最简单的平移方法,调用transform下的translate方法,后面的三个数据分别为x,y,z轴上移动的**速度**。
this.transform.Translate(new Vector3(0.1f,0,0));
·translate函数也可以把一个三维向量vector3作为参数,这里使用的vector3内的三个值,也分别是这个三维向量的三个值。该代码同样可以实现移动。
到这里为止,我们发现,我们所赋予的三个值,都是相对cube这个物体本身的坐标。那万一物体经过了翻滚等动作,自己本身的方向改变了,我们想让他向左边移动,但它却向的是“自己的左边”移动的,就无法按照我们原定的方向前进了。
this.transform.Translate(new Vector3(0.1f,0,0),Space.World);
这个时候,我们就要加入世界的参考坐标系。也就是Space.World
。
当然,对应的还有Space.Self
。
世界坐标系:指无论物体本身怎么反转,我们让它往左它就往绝对左,让它往右它就往绝对右。
本身坐标系:指物体经过翻转等操作之后,我们让它往左,它就往自己的左走,我们让它往右,它就往自己的右走。
然后,我们可以加入一些判断条件,比如当我们按下D时,它开始移动。
if(Input.GetKey(KeyCode.D))
{
this.transform.Translate(new Vector3(0.1f,0,0),Space.World);
}
1.1.3 MoveTowards(平滑移动)
我们发现,上面的移动只是针对“持续,方向,速度”这三个指标,那么如果我们需要一个“在某种速度下,从一个点移动到另一个点为止”的移动方式的话,就需要用到vector3的函数,MoveTowards(平滑移动)。
this.transform.position = Vector3.MoveTowards(transform.position, new Vector3(10.0f, 10.0f, 10.0f), 0.1f);
这个函数由三个部分构成:
transform.position
:初始位置。
new Vector3(10.0f, 10.0f, 10.0f)
:目标位置,同样可以用一个已经定义好的vector3替代。
0.1f
:速度,值为float,可以用任何float值代替,但是过高的float值会让整个移动不是那么平滑。当然,我们更多的也直接使用float值*Time.deltaTime来解决,比如m_speed *Time.deltaTime
.这里的m_speed是提前设好的float值。
1.2 Rotation(旋转)
旋转的三个值分别表示了物体的三个方向自转。
1.2.1 Rotate(旋转函数)
在一般情况下,我们可以像调用平移一样,直接调用旋转函数来完成旋转。
this.transform.Rotate(1.0f,0f,0f);
函数后的三个值均为float,表示的是旋转的“速度”,它本质上和平移很相似,因此相似的,也可以选择两个坐标系:
this.transform.Rotate(1.0f,0f,0f,Space.World);
this.transform.Rotate(1.0f,0f,0f,Space.Self);
同样的,三个变量也可以合为一个vector3变量,我在这里不多赘述。
1.2.2 Quaternion.Euler(四元欧拉赋予)
除了上面的定速度旋转,我们也可以直接修改rotation的值来使其到达目标角度。
this.transform.rotation = Quaternion.Euler(new Vector3(1.0f, 0, 0));
可能你对忽然出现的两个东西有点头大,那么我们来简单介绍一下。
本质上,其实是将一组数据赋予给了rotation来直接改变目标角度,也就是Quaternion.Euler(new Vector3(1.0f, 0, 0))
,使用它的主要原因是,我们无法直接将vector3赋予rotation,因为rotation本质上存储的是一个Quaternion(四元数)。
替代的,我们就需要用
Quaternion.Euler()
四元数下的欧拉方法,去将一个三维向量转化为四元数了。
值得一提的是,一般情况下,我们不会持续调用这个方法,而是使用一些变量储存起来它的值。再在update或者其它函数中调用。
Quaternion rotation= Quaternion.Euler(new Vector3(x, y,z));
...
this.transform.rotation = Quaternion.Euler(rotation);
1.2.3 localEulerAngles(欧拉旋转)
transform.localEulerAngles = new Vector3(x, y,z);
欧拉旋转的本质和上面的四元欧拉赋予差别不大,都是直接将物体旋转到目标的角度,不同的是,欧拉旋转可以直接使用vector3赋予。
1.3 Scale(缩放)
三个坐标分别控制物体的缩放大小,这个没什么花里胡哨的。
this.transform.localScale=new Vector3(2.0f,2.0f,2.0f);
直接修改transform下的localScale为新的vector3,就可以改变物体的缩放大小。
2、Mesh Filter(网格过滤器)
该过滤器下只有一个属性:Mesh,也就是网格。它的作用本身其实就是选择一个网格,来交给渲染器进行渲染。
如何理解网格呢?我们可以尝试修改mesh,来看看里面是什么。
其实在这里我们已经可以看到,它本身便是一个“模型”,或者说“网格选择”。在这里当然可以直接理解成一个“空白的模型”。我们通过网格过滤器来选择这个模型,紧接着通过接下来要讲的渲染器来为模型增加一些好康的。
如果你是初学者,看到这个地方就完全可以了,请直接去下一个教程。如果你想继续看,这之后的内容你可以完全看不懂,全当了解,他们会在之后的不同部分进行讲解
3、Mesh Renderer(网格渲染器)
3.1 Materials(材质)
这里决定了游戏的材质数量和类型。
3.1.1 size(数量)
在这里可以直接修改材质的数量。
3.1.2 Element(材质元素)
本属性可以直接修改材质元素
3.2 Lighting(光亮)
这个是光亮相关的选项
3.2.1 Cast Shadows(阴影)
我用一个表格来说明它的选项内容
选项名 | 作用 |
---|---|
On | 阴影投射光投射到我们的物体上后,会产生阴影 |
off | 不会产生阴影 |
Two Sided | 投射双面阴影(从任意一侧),可以之后用用试试 |
Shadows Only | 我们的物体会被隐藏,只留下阴影 |
3.2.2 Receive Shadows(允许阴影)
该选项勾选后,就可以在物体上产生其他物体的阴影了。但值得一提的是,你想要勾选这个,需要一个叫做Progressive Lightmapper(渐进光照贴图 )的东西,这个我们会在后续部分讲到。
3.2.3 Contribute Global Illumination(全局照明选项)
设置该物体是否在静态编辑标志中启用Contribute GI[1],同样会在后续讲到。
3.3 Probes(探针/探测器)
一般来说,光照或者反射的烘焙都只可以对静态物体产生效果,对于动态物体,我们需要用另一种方式来完成,一般而言,也就是Probes,探针或者叫探测器。涉及光照,因此一样会在后续进行讲解。
3.3.1 Light Probes(光照探针/光照探测器)
一般用来设置如何从Light Probes中接受光。
选项 | 介绍 |
---|---|
off | 不使用任何插值光照探针。 |
Blend Probes | 使用一个内插的光探针,一般来说这是默认值。 |
Use Proxy Volume | 使用插值光照探针的 3D 网格。 |
Custom Provided | 从MaterialPropertyBlock[2]中提取“ Light Probe”着色器。 |
3.4 Additional Settings(其他设置)
包含一些其他相关设置。
3.4.1 Motion Vectors(运动向量)
设置是否使用运动矢量从一帧到下一帧,跟踪此渲染器的每像素屏幕空间运动。可以使用这个实现后处理效果,例如运动模糊。
选项 | 介绍 |
---|---|
Camera Motion Only | 仅仅使用相机来跟随 |
Per Object Motion | 使用特定传递来跟踪 |
Force No Motion | 不跟踪 |
3.4.2 Dynamic Occlusion(动态遮挡)
官方文档中的描述:
启用动态遮挡后,当静态渲染器将其从相机的视图中遮挡时,Unity会将此渲染器剔除。 默认情况下启用动态遮挡。
禁用动态遮挡后,当静态渲染器将其从相机的视图中挡住时,Unity不会删除该渲染器。 禁用动态遮挡以实现诸如在墙后绘制角色轮廓之类的效果。