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

相关推荐
叶帆16 天前
【YFIOs】用C#开发硬件之设备上云
开发语言·unity·c#
久数君17 天前
AI三维建模工具“造形家”:地理场景三维化的高效解决方案
unity·glb·ai算法·ai三维建模工具·地图框选·造形家·城市建筑模型
会思考的猴子17 天前
Unity VFX 属性 Postion 和 TargetPostion
unity
hai31524754317 天前
九章编程法 · 猜数字游戏 (GW-BASIC 重构版) *
人工智能·microsoft·游戏引擎·游戏程序
心前阳光17 天前
Unity资源导入之自动化资源导入
unity·自动化·游戏引擎
心前阳光17 天前
Unity之2021.3.45f2c1发布安卓程序遇到的问题
android·unity·游戏引擎
纪纯17 天前
PicoVR Unity Integration SDK 3.4 常用交互API
unity·游戏引擎·vr·pico
龙智DevSecOps解决方案17 天前
3A 游戏优化技术栈:如何打通引擎级分析工具与 DevOps 持续集成管线?
unity·性能优化·游戏开发·技术美术·perforce·unrealengine
葛兰岱尔17 天前
从 SolidWorks 到 Three.js,从 Inventor 到 Unity——制造业CAD模型“几何-语义一体化“转换,不再是天方夜谭!
开发语言·javascript·unity
鼎艺创新科技18 天前
三维电子沙盘中OSGB倾斜摄影数据的加载与渲染
游戏引擎·cocos2d