包含了gameobject的相关参数教程,平移,旋转等基础操作

在开始了解本部分之前,你首先可以创建一个任意命名的3d项目,并且在场景中创建一个3d物体cube(立方体)

如果没有问题的话,你将会看到以下界面。
场景
属性
事实上,立方体的属性中还应该包含Collider,但是这个我们会在以后再进行讲解。

(从Cube看GameObject目录)


1、Transform

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(网格渲染器)

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不会删除该渲染器。 禁用动态遮挡以实现诸如在墙后绘制角色轮廓之类的效果。


  1. Contribute GI是unity2019.4版本新加入的东西,它和全局光照相关,我们将在之后讲解光照时讲到它。 ↩︎

  2. MaterialPropertyBlock是一种多向材质,我们将会在之后讲解材质的时候讲到它。 ↩︎