前言
在使用Unity开发的时候,移动是最最基础的一个需求,我来给大家简单的讲一下Unity中的几种常见的移动方法。
1.Transform移动
Transform移动就是修改物体的position
①修改位置
这里要注意:坐标分为世界坐标和本地坐标
//将物体的世界坐标修改为(1,1,1)
transform.position = new Vector3(1, 1, 1);
//将物体的本地坐标修改为(2,2,2)
transform.localPosition = new Vector3(2, 2, 2);
②使用Translate()函数
private void Update()
{
//以恒定的速度向x方向移动
transform.Translate(2.0f* Time.deltaTime, 0, 0);
}
Time.deltatime 是两帧之间的间隔。因为设备无法保证稳定的帧率,物体移动速度就会因帧率出现不同。所以要加Time.deltatime 确保每秒移动同样的距离
2.Rigidbody刚体移动
Rigidbody赋予了游戏对象一些运动学上的属性,模拟真实世界的运动,包括 质量、阻力、重力、 碰撞检测、 速度、受力、爆炸力等
刚体移动首先要添加Rigidbody组件。
Rigidbody属性
Mass: 物体的质量
Drag: 物体受到的空气阻力大小
Angular Drag: 物体旋转时,受到的旋转阻力大小
Use Gravity: 如果启用,物体将受到重力的影响
Is Kinematic: 如果启用,物体将不会由物理引擎驱动,只能由 Transform 组件操作
Interpolate: 物体运动位置的插值器
Collision Detection: 碰撞检测类型,当看到物体由于运动太快而穿墙时,可以增强碰撞检测频率
Constraints: 对刚体运动和旋转的限制,限制物体运动时在某个坐标轴上的分量保持不变
①使用velocity
public Rigidbody mRigidbody;
void FixedUpdate()
{
mRigidbody.velocity = new Vector3(100 * Time.fixedDeltaTime, 0, 0);
}
②使用AddForce
public Rigidbody mRigidbody;
void Update()
{
mRigidbody.AddForce(100 * Time.fixedDeltaTime, 0, 0);
}
③使用MovePosition
public Rigidbody mRigidbody;
void Update()
{
mRigidbody.MovePosition(transform.position + Vector3.forward * 0.2f);
}
3.CharacterController移动
刚体移动首先要添加CharacterController组件。
代码示例:
public float m_Speed = 5;
public CharacterController controller;
void Start()
{
controller = this.gameObject.GetComponent<CharacterController>();
}
void Update()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
Vector3 dir = new Vector3(h * m_Speed, 0, v * m_Speed);
controller.SimpleMove(dir);
}
CharacterController有用两种移动实现方式,SimpleMove和Move。
① SimpleMove
- 不受Y轴速度影响,自带重力效果,无法实现跳跃功能
- 返回值为Bool,当角色接触地面返回True,反之为False。
- SimpleMove方法用于角色简单的平面移动,它自动处理了角色与地面的碰撞检测和摩擦,但它不支持跳跃等垂直方向的动作
② Move
- 无重力效果,自行实现重力,可做跳跃功能
- 返回值为角色与物体碰撞的信息
4.总结
Transform:不带重力和碰撞,移动不受物理引擎控制。非单机的游戏基本都是使用Transform移动,因为位置都是服务器发送过来,然后客户端同步。
Rigidbody:适用于实现真实的物理行为,可以模拟重力、惯性等效果。
CharacterController:适用于控制角色的移动和碰撞检测,但不受物理引擎的影响。