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

相关推荐
SmalBox10 小时前
【渲染流水线】[几何阶段]-[图元装配]以UnityURP为例
unity·渲染
霜绛21 小时前
Unity:GUI笔记(一)——文本、按钮、多选框和单选框、输入框和拖动条、图片绘制和框绘制
笔记·学习·unity·游戏引擎
谷宇.1 天前
【Unity3D实例-功能-移动】角色行走和奔跑的相互切换
游戏·unity·c#·unity3d·游戏开发·游戏编程
17岁的勇气1 天前
Unity Shader unity文档学习笔记(十九):粘土效果,任意网格转化成一个球(顶点动画,曲面着色器)
笔记·学习·unity·图形渲染·顶点着色器·曲面着色器
benben0442 天前
《Unity Shader入门精要》学习笔记一
unity·shader
YF云飞2 天前
Unity图片优化与比例控制全攻略
游戏·unity·游戏引擎·游戏程序·个人开发
SmalBox2 天前
【渲染流水线】[几何阶段]-[几何着色]以UnityURP为例
unity·渲染
★YUI★3 天前
学习游制作记录(背包UI以及各种物品的存储)8.12
学习·游戏·ui·unity·c#
☆平常心☆3 天前
Unity数据可视化图表插件XCharts
unity·信息可视化
3 天前
Unity 遮挡显示效果 Shader
unity·游戏引擎