【Unity】Transform、Rigidbody、CharacterController移动

前言

在使用Unity开发的时候,移动是最最基础的一个需求,我来给大家简单的讲一下Unity中的几种常见的移动方法。

1.Transform移动

Transform移动就是修改物体的position

①修改位置

这里要注意:坐标分为世界坐标和本地坐标

csharp 复制代码
   //将物体的世界坐标修改为(1,1,1)
   transform.position = new Vector3(1, 1, 1);

   //将物体的本地坐标修改为(2,2,2)
   transform.localPosition = new Vector3(2, 2, 2);

②使用Translate()函数

csharp 复制代码
    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

csharp 复制代码
	public Rigidbody mRigidbody;

    void FixedUpdate()
    {
        mRigidbody.velocity = new Vector3(100 * Time.fixedDeltaTime, 0, 0);
    }

②使用AddForce

csharp 复制代码
 	public Rigidbody mRigidbody;

    void Update()
    {
        mRigidbody.AddForce(100 * Time.fixedDeltaTime, 0, 0);
    }

③使用MovePosition

csharp 复制代码
   public Rigidbody mRigidbody;

    void Update()
    {
      
        mRigidbody.MovePosition(transform.position + Vector3.forward * 0.2f);

    }

3.CharacterController移动

刚体移动首先要添加CharacterController组件。
代码示例:

csharp 复制代码
	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:适用于控制角色的移动和碰撞检测,但不受物理引擎的影响。

相关推荐
蒙双眼看世界1 小时前
Unity结合ECharts图表及网页插件EmbeddedBrowser的应用开发
unity·游戏引擎·echarts
郝学胜-神的一滴6 小时前
中级OpenGL教程 004:为几何体注入法线灵魂
c++·unity·游戏引擎·godot·图形渲染·opengl·unreal
la_vie_est_belle1 天前
Pygame Studio——用Python自制的一款可视化游戏编辑器
python·游戏·编辑器·游戏引擎·pygame·pyside6·pygame-ce
LF男男2 天前
GameManager.cs
unity
晴夏。2 天前
c++调用lua的方法
c++·游戏引擎·lua·ue
RPGMZ3 天前
RPGMakerMZ 地图存档点制作 标题继续游戏直接读取存档
开发语言·javascript·游戏·游戏引擎·rpgmz·rpgmakermz
郝学胜-神的一滴3 天前
[简化版 GAMES 101] 计算机图形学 07:图形学投影完全推导
c++·unity·图形渲染·three.js·unreal engine
晴夏。3 天前
UE垃圾回收的全方面讲解(通俗易懂)【底层实现、触发方式、引用保持、优化、工具】
ue5·游戏引擎·ue·垃圾回收
相信神话20214 天前
3.2《酒魂》规则设计文档
游戏引擎·godot·2d游戏编程·godot4·2d游戏开发
Avalon7124 天前
Unity3D响应式渲染UI框架UniVue
游戏·ui·unity·c#·游戏引擎