unity打开场景什么也没有 改变物体的重置位置

这是一个基础的问题时间长了鈈用就有点遗忘,在此记录下来

递归查找,最简单效率最好

该系列笔记基于unity打开场景什么也沒有3D 5.x的版本学习部分API使用和4.x不一致。

目前在unity打开场景什么也没有3D中除了新的UGUI部分控件外,所有的物体(GameObject)都必带有Transform组件而Transform组件主要昰控制物体在3D空间中的位置、旋转以及缩放。

学习和掌握物体的变换是unity打开场景什么也没有3D开发者必备的基础知识

最基础的变换就是通過脚本直接对物体的位置旋转缩放等进行变换。

我们下面实现一个匀速移动物体的效果我们在场景中添加一个Cube物体,把下面的脚本绑定箌摄像机上并把Cube拖拽赋予transfrom属性

运行游戏,我们会发现Cube会匀速上升我们回到编辑场景,对Cube进行任意的旋转后运行游戏该Cube仍然是向上上升这是因为位置和旋转是相互独立的,我们直接操作位置的话程序是不会理会旋转属性的更换为localPosition效果也是一致的。

我们发现如果使用上媔的方法来按照物体面向的方向移动物体是不容易的我们需要根据物体的朝向计算出x、y、z这3个分量的数值再应用回物体中才行,这需要紮实的3维运算功底不过好在unity打开场景什么也没有已经给我们提供了大量的属性及方法,方便我们直接调用来达到我们需要的效果

  • transform.right:物體本地坐标的x轴正方向朝向,1米的单位
  • transform.up:物体本地坐标的y轴正方向朝向,1米的单位
  • transform.forward:物体本地坐标的z轴正方向朝向,1米的单位

由于峩们知道了物体本地坐标的信息,所以可以方便的通过这个来按照物体的朝向移动物体了比如,下面的代码会朝着物体的y轴正方向每秒1米的速度匀速移动:

由于坐标系存在本地坐标系和世界坐标系两种那么就需要有方法可以对这两种坐标系进行转换。

  • transform.TransformVector:将坐标点从本地唑标转换为世界坐标不受位置影响但受缩放影响。

下面我们看看这两个方法的区别首先,我们添加一个空物体到舞台并设置该物体的唑标为(1,1,1)然后把Cube对象拖入该空物体成为其子项设定其坐标为(2,2,2),修改脚本如下:

接下来我们把空物体的尺寸缩小一半看看结果会如何:

TransformPoint转变會受物体的位置和缩放影响转换而TransformVector仅受物体的缩放影响转换。

这里做了一个示例具体的功能是按下指定的键抓取到场景中的小盒子,使其始终位于屏幕前方按下另一个键将这个小盒子抛出。

下面我们看核心的实现

17 //设定小盒子的位置到屏幕前方 19 //将小盒子设定为读取对潒的子对象, 保证跟随运动 21 //去掉物理交互 29 //使用掉物理交互 31 //解除所有子物件的绑定关系 35 //添加缓冲的力

我们先将摄像机前的一个点转换为世界坐標赋予给小盒子的世界坐标使其位于摄像机之前,抛出时把摄像机向前方向的一个向量转换为世界方向赋予小盒子抛出

unity打开场景什么也沒有3D里提供了方便控制物体位移的属性及方法。

Transform的Translate方法可以更加方便的对物体的位移进行操作该方法有四个重载:

相对于本地坐标系或卋界坐标系对物体进行位移操作。

相对于指定物体的坐标进行位移操作

注意:如果是相对于本地坐标系,则如果向上移动就是朝向物体夲身的上方移动如果是相对于世界坐标系则是向世界的上方向移动,如果是相对于其他物体则是向这指定的物体的上方向移动

AnimationCurve可以用來定义自定义的动画轨迹,我们通过在脚本中声明一个该类型的对象就可以在编辑器窗口对其进行编辑,然后使我们的物体按照编辑的軌迹进行移动等操作

比如我们想要得到一个物体在X轴匀速移动,Y轴进行上下循环移动的时候可以使用下面的脚本:

编辑器编辑的曲线洳下:

在游戏中都会有一个最基本的需求,就是移动到指定的点下面我们来实现一下这个基本的功能,脚本如下:

28 //判断是否抵达终点 33 //标記到达和调用回调 42 //这里使用Lerp方法进行差值运算也可以得到相同的效果, 但是我们作为学习还是自己实现 45 //获取方向的单位向量 68 //计算总共需要花費的时间 70 //重置使用的时间

运行后小盒子会想指定的物体进行匀速移动到达后会输出“I am arrived!”的字符串。

欧拉角是由3个轴的旋转角度组成的旋轉数据比如我们在Inspector界面的Transform中看到的就是物体本地坐标系的欧拉角:

欧拉角每个轴数字都在0-360之间,表示其旋转的角度

官方提供的旋转方法,其一共有三个重载方法:

指定在本地坐标系或世界坐标系下旋转到指定的角度

指定在本地坐标系或世界坐标系下基于轴axis进行旋转,旋转到angle角度

表示我们的物体围绕指定的点point在轴axis下旋转angle的角度。

可以使物体面向指定的点我们看看其参数:

即使我们的物体面向指定的粅体或点。

欧拉角理解和使用都相当的方便但是在实际进行旋转时存在万向锁的问题,所以引入了比较抽象的四元数的概念当然我们茬unity打开场景什么也没有中只要直接使用即可,是非常方便的

这里提供一个视频,可以让大家直观的了解什么是万向锁:

在Transform中eulerAngles属性是使鼡欧拉角来表示旋转,而rotation属性则是使用四元数来表示旋转

四元数提供了许多的静态方法来使我们完成特定需求的效果,点击可查看帮助

如果我们想要实现一个效果,物体匀速旋转到指定角度时使用欧拉角对每个轴进行变换是相当复杂的,同时如果两个轴重合了就会出現万向锁的问题无法解决,而使用四元数则可以避免这些问题下面是实现的脚本:

20 //获取目标方向的单位向量 22 //获取目标方向的四元数对潒 24 //按照每秒 45 度的速度旋转面向目标对象

这样我们就可以使我们的物体匀速的转向指定的目标对象了。

缩放比较简单没有提供更多的方法。

  • Transform.lossyScale:只读获取本物体相对于世界坐标的缩放大小。

在unity打开场景什么也没有3D中所有3D对象是按照树形结构进行组合的,而操作物体之间的位置关系的所有API都存放在Transform对象中下面我们看看常用的属性及方法。

Z最大化显示当前物体 或者按H打開场景物体浏览器,看看里面有没有物体如果有的话就一定能找到,要不就是隐藏了要不就是不在镜头范围。

你对这个回答的评价是

参考资料

 

随机推荐