Unity3D 移动物体方式总结

简述

在Unity 3D中很多时候我们会想要移动一个物体到别的位置,如让想人物跑动起来,或者想要移动相机来跟随人物。有很多种方法可以改变物体的坐标,实现移动的目的,移动的本质是在每一帧中修改物体的position。在这里把之前使用过的移动物体的方法做一个总结。

 


一.Transform

Transform 组件用于描述物体在空间中的状态,它包括位置(position), 旋转(rotation)和 缩放(scale)。 所有的移动都会导致position的改变,所以我们可以通过直接操作Transform来控制物体的位置(position),而不用考虑碰撞。我们把他写在update函数中,每一帧都调用变换一个位置,看起来就是在移动。

1.transform.position = new Vector3 targetPos

      targetPos是一个vector3的向量,是我们想要到达的坐标位置,我们可以这样:transform.position = new Vector3(0, 1, 0),这样物体就会直接到(0, 1, 0)这个位置。严谨来说对transform.position直接复制并不能称作移动,而是直接改变物体的坐标。

      如果我们想要移动相机追随物体移动时就可以在update函数中每一帧获取物体的position,然后加上相机和物体初始的偏移量就可以让物体一直出现在我们的镜头中了。

1.transform.Translate(Vector3 ,指定参照坐标系(默认为Space.Self))

      这里的第一个参数也是一个vector3的向量,不同于上面transform.position中的vector3向量,它不是一个位置坐标。我们可以这么写:transform.Translate(Vector3.forward * Time.deltaTime * speed),Vector3.forward是一个向前的方向,Time.deltaTime是每一帧的增量时间,speed是我们自己定义的速度,也就是希望物体每秒移动的距离(如果不懂的可以看看另一位大大写的这篇博客,写到很通俗易懂Unity增量时间Time.deltaTime详解)。第二个参数是参照坐标系,默认为Space.Self,以自身为坐标系,Space.World是世界坐标系。

 

二.Rigidbody

      Rigidbody组件用于模拟物体的物理状态,比如物体所受重力影响,物体被碰撞后的击飞等等。

      注意:关于Rigidbody的调用均应放在FixedUpdate方法中,该方法会在每一次执行物理模拟前被调用。

1.Rigidbody.velocity = Vector3 

      使用方法:rigidbody.velocity = Vector3.forward * speed,让物体向前以我们给的速度前进。

      设置刚体速度可以让物体运动并且忽略静摩擦力,这会让物体快速从静止状态进入运动状态。

2.Rigidbody.AddForce()

      使用方法:rigibody.AddForce(transform.forward * thrust),这里thrust是我们自己定义的一个推力,它会给物体一个向前的大小为thrust的推力,由于Rigidbody的物理属性而像前移动。这种方式适合模拟物体在外力的作用下的运动状态。

3.Rigidbody.MovePosition(Vector3 targetPos)

      使用方法:rigidbody.MovePosition(transform.position + new Vector3(1, 0, 0)),让物体从当前位置沿x轴移动一米。

      刚体受到物理约束的情况下,移动到我们指定的位置。unity会帮我们在任何呈现的中间帧中都实现两个位置之间的平滑过渡,让我们感觉在连续的移动物体。

 

三.CharacterController

      CharacterController组件是一个角色控制器组件,我们也可以通过它来控制物体移动。CharacterController用于控制第一人称或第三人称角色的运动,使用这种方式可以模拟人的一些行为,比如限制角色爬坡的最大斜度,步伐的高度等。

1.SimpleMove()

      使用方法:characterController.SimpleMove(Vector3.forwrd * Time.deltaTime * speed)

      SimpleMove方法用于模拟简单运动,并且自动应用重力,返回值表示角色当前是否着地。

2.Move()

      使用方法:characterController.Move(Vector3.forwrd * Time.deltaTime * speed)

      Move方法模拟更复杂的运动,重力需要通过代码实现,返回值表示角色与周围的碰撞信息。

 

四.Vector3

      Vector3 既可以表示三维空间中的一个点,也可以表示一个向量。可以用Vector3.Lerp, Vector3.Slerp, Vector3.MoveTowards这几个方法。这三个方法均为插值方法, Lerp为线性插值,Slerp为球形插值, MoveTowards在Lerp的基础上增加了限制最大速度功能。 当需要从指定A点移动到B点时,可以考虑时候这些方法。

1.Vector3.Lerp()

      使用方法:Vector3.Lerp(transform.position, targetPos, smoothing * Time.deltaTime)

      第一个参数是物体初始位置的坐标,第二个参数是目标位置的坐标,第三个参数是移动速度,smoothing是我们自己定义的平滑程度值,它的大小决定了从初始位置到目标位置移动的平滑程度。一般在移动相机时,我们会使用这个方法,使视野的移动更加平滑。

2.Vector3.MoveTowards()

      使用方法:Vector3.MoveTowards(transform.position, targetPos,  maxDelta * Time.deltaTime)

      其中前面两个参数和Lerp一样,maxDelta是我们自己定义的,每次向目标点移动的距离。

3.Vector3.Slerp()

      球型差值

4.Vector3.SmoothDamp()

      使用方法:Vector3.SmoothDamp(Vector3current, Vector3target, ref float currentVelocity, float smoothTime, float maxSpeed)

      current是当前位置,target是目标位置,currentVelocity是当前速度(必须是一个全局变量),smoothTime是到达目标位置的时间,maxSpeed是最大速度(默认为无穷大)。

 

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值