Unity Rigidbody实现爬坡功能

article/2025/10/19 13:32:31

文章目录

  • 🎈 简介
  • 🎈 实现原理
  • 🎈 实现代码


🎈 简介

人物爬坡

人物移动功能的实现或许用到Character Controller组件或许用到Rigidbody刚体组件,前者可以直接实现在某些高地不平的地面上移动,而后者想要在具有一定角度的坡面上进行移动则需要通过代码实现。本篇内容介绍如何通过Rigidbody刚体组件实现人物爬坡功能;

🎈 实现原理

Move Direction
实现人物爬坡功能前,通过获取用户HorizontalVertical轴输入形成了一个移动方向Move Direction,该方向平行于地面,驱动Rigidbody沿该方向移动,代码如下:

//根据输入获取方向
protected Vector3 GetInputDirection()
{//前方Vector3 forward = Vector3.ProjectOnPlane(mainCamera.forward, Vector3.up).normalized;//右方Vector3 right = Vector3.ProjectOnPlane(mainCamera.right, Vector3.up).normalized;//输入值input = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));//返回值return input.x * right + input.y * forward;
}
protected override void Update()
{base.Update();//计算当前的移动速度speed = walkThreshold + ((sprintThreshold - walkThreshold) * sprintFactor);//获取方向Vector3 direction = GetInputDirection();//驱动刚体rb.velocity += direction * speed * Time.deltaTime;//目标旋转值Quaternion targetRot = Quaternion.Euler(new Vector3(0f, Vector3.SignedAngle(transform.forward, direction, Vector3.up), 0f)) * transform.rotation;//插值方式进行旋转transform.rotation = Quaternion.Lerp(transform.rotation, targetRot, Time.deltaTime * rotateSpeed);
}

如下图所示,我们只需要在上述基础上,从脚底向下发射一条射线(红色线),射线检测碰撞的法线(黄色线)会与向量Vector3.Up形成一个角度a,角度a与坡度b(绿色线与蓝色线夹角)相等,因此求得角度a的值便知坡面的坡度。

坡度
得知坡度后,只需要根据坡度调整Rigidbody刚体的移动方向Move Direction即可。

实现原理

🎈 实现代码

protected override void Update()
{base.Update();//计算当前的移动速度speed = walkThreshold + ((sprintThreshold - walkThreshold) * sprintFactor);//获取方向Vector3 direction = GetInputDirection();//判断是否在坡面上if (IsOnSlope(out Vector3 hitNormal)){direction = Vector3.ProjectOnPlane(direction, hitNormal).normalized;}//驱动刚体rb.velocity += direction * speed * Time.deltaTime;//目标旋转值Quaternion targetRot = Quaternion.Euler(new Vector3(0f, Vector3.SignedAngle(transform.forward, direction, Vector3.up), 0f)) * transform.rotation;//插值方式进行旋转transform.rotation = Quaternion.Lerp(transform.rotation, targetRot, Time.deltaTime * rotateSpeed);
}//是否在斜坡上
private bool IsOnSlope(out Vector3 hitNormal)
{Ray ray = new Ray(transform.position + Vector3.up * .1f, Vector3.down);if (Physics.Raycast(ray, out RaycastHit slopeHit, 1f)){hitNormal = slopeHit.normal;float slopeAngle = Vector3.Angle(hitNormal, Vector3.up);if (slopeAngle < maxSlopeAngle){return true;}}hitNormal = Vector3.zero;return false;
}

maxSlopeAngle用于限制人物可以爬坡的最大角度,当实际坡度大于该值时,人物不可以向上爬坡。


http://chatgpt.dhexx.cn/article/l9UIKq67.shtml

相关文章

UnityVR--组件2--Rigidbody--移动控制

移动的方式有transform.Translate&#xff08;&#xff09;、rigidbody.velocity&#xff08;&#xff09;、rigidbody.MovePosition&#xff08;&#xff09;等多种。本篇使用rigidbody的方式&#xff0c;并向着相机朝向的方向控制移动。也就是继上一篇“第三人称相机控制”&a…

第二十五章 Unity 刚体Rigidbody

在物理学中&#xff0c;静止和匀速直线运动是物体的平衡状态&#xff0c;如果给该物体施加某一个力的话&#xff0c;物体的平衡状态就会改变&#xff0c;当然这个真理的前提是理想状态。我们知道在现实世界中&#xff0c;由于重力和摩擦力的存在&#xff0c;任何一个物体都不可…

Unity:使用RigidBody

There are mainly two ways of moving a gameObject in Unity: 在Unity中移动游戏对象的方式主要有两种&#xff1a; Changing Position Coordintes: By directly changing the position of a gameObject without much consideration to its physics or other such components…

Rigidbody刚体组件详解

【组件界面】 【作用】 有刚体组件的物体受物理引擎控制&#xff0c;表现得像物理世界中的物体&#xff0c;例如受重力作用、受摩擦力推力等各种力作用、遇到墙会停下来不能穿过去。在Unity中&#xff0c;若某物体不带有碰撞器&#xff0c;仍会被穿过。碰撞器的作用在于检测空…

Unity API详解——Rigidbody类

Rigidbody类的功能是用来模拟GameObject对象在现实世界中的物理特性&#xff0c;包括重力、阻力、质量、速度等。对RIgidbody对象属性的赋值代码通常放在脚本的OnFixedUpdate()方法中。本博客主要介绍Rigidbody类的一些实例属性和实例方法&#xff0c;最后对Rigidbody类中功能相…

Unity 3D 刚体(Rigidbody)|| Unity 3D 刚体实践案例

Unity 3D 中的 Rigidbody 可以为游戏对象赋予物理特性&#xff0c;使游戏对象在物理系统的控制下接受推力与扭力&#xff0c;从而实现现实世界中的物理学现象。 我们通常把在外力作用下&#xff0c;物体的形状和大小&#xff08;尺寸&#xff09;保持不变&#xff0c;而且内部…

【Unity3D】刚体组件Rigidbody

1 前言 刚体&#xff08;Rigidbody&#xff09;是运动学&#xff08;Kinematic&#xff09;中的一个概念&#xff0c;指在运动中和受力作用后&#xff0c;形状和大小不变&#xff0c;而且内部各点的相对位置不变的物体。在 Unity3D 中&#xff0c;刚体组件赋予了游戏对象一些运…

【Unity】11.2 刚体(Rigidbody)

分类&#xff1a;Unity、C#、VS2015 创建日期&#xff1a;2016-05-02 一、简介 Rigidbody&#xff08;刚体&#xff09;组件可使游戏对象在物理系统的控制下来运动&#xff0c;刚体可接受外力与扭矩力&#xff0c;使游戏对象像在真实世界中那样进行运动。 任何游戏对象&…

【Physics】一、Rigidbody 刚体

文章目录 1、刚体组件2、刚体脚本2.1、获取刚体2.2、添加力2.3、Move 点击访问官网 物理系统 、刚体概述 、 刚体 (Rigidbody) 1、刚体组件 刚体 (Rigidbody) 使游戏对象的行为方式受物理控制。刚体可以接受力和扭矩&#xff0c;使对象以逼真的方式移动。任何游戏对象都必须包…

Unity物理组件之刚体Rigidbody

一、刚体组件简介 1、刚体简介 刚体&#xff1a;Rigidbody,属于物理类组件 作用&#xff1a;添加了刚体组件的游戏物体&#xff0c;可以在物体系统的控制下来运动&#xff0c;刚体可接受外力和扭矩力用来保证游戏对象像在真实世界中那样进行运动。任何游戏对象只有添加了刚体…

【Untiy学习笔记】Rigidbody组件及其常用函数

前言 提示&#xff1a;声明&#xff1a;此篇文章是个人学习笔记&#xff0c;并非教程&#xff0c;所以内容可能不够严谨。可作参考&#xff0c;但不保证绝对正确。如果你发现我的文章有什么错误&#xff0c;非常欢迎指正&#xff0c;谢谢哦。 本文大部分内容来自官方文档&…

mac快速锁屏方法

方法一. 快捷键&#xff1a;controlcommandQ。 方法二. 点击左上角apple logo&#xff0c;锁定屏幕。 方法三&#xff08;快捷方便&#xff09;. 系统偏好设置->调度中心->触发角->选一个角&#xff08;左上、左下、右上、右下&#xff09;->锁定屏幕或者将显示器…

mac修改cmd+ctrl+q锁定屏幕快捷键

mac里的cmdctrlq快捷键是系统快捷键&#xff0c;用作“锁定屏幕”&#xff1a; 这个快捷键优先级很高&#xff0c;导致无法设置其为其他应用快捷键&#xff08;如qq&#xff09;。 下面的方法可以把“锁定屏幕”改成其他快捷键&#xff0c;从而腾出cmdctrlq来给应用程序&#…

mac 设置mysql登录快捷键_史上最详细的苹果Macbook快捷键使用

电脑快捷键可以帮助你提高工作效率&#xff0c;是使用电脑过程中经常用到的&#xff0c;苹果电脑的快捷键和普通PC不太一样&#xff0c;对于新手来说&#xff0c;经常找不到或不知道快捷键是什么&#xff0c;经常要去查&#xff0c;所以这边系统城小编跟大家介绍macbook快捷键的…

Mac提高效率的快捷键

分享常用的一些快捷键&#xff0c;欢迎补充&#xff0c;一起提高办公效率 目录 常用按键介绍系统管理关机和睡眠偏好设置触摸板、键盘和鼠标 窗口管理&#xff08;最小化、关闭、退出&#xff09;目录&#xff08;文件夹&#xff09;文本和文件操作撤销、重做复制、剪切全选查找…

mac系统修改锁屏快捷键

mac 自带了锁屏的快捷键&#xff0c;我忘了是什么了,点击屏幕左上角的苹果图标&#xff0c;就能看到。反正比较麻烦&#xff0c;没windows下方便&#xff0c;。 习惯了在windows下&#xff0c;按winL键来锁屏。在mac下&#xff0c;怎么改成commandL来锁屏呢&#xff1f; 方法…

macbook 常用键盘快捷键大全 mac os 苹果电脑

为了让刚开始使用 Mac 的新手更快地上手&#xff0c;特整理了这一份“最值得你记住的 Mac 常用快捷键列表”&#xff0c;希望可以帮助到大家更快地学习和查找 macOS 的键盘快捷键&#xff0c;以此提高 Mac 的操作效率…… 与 Windows 的差异 一切开始前&#xff0c;我们先来认识…

mac键盘快捷键大全

macos下都有哪些Mac 键盘快捷键呢?不少果粉抱怨高上大的macbook不好用,相比于之前习惯了Windows操作的用户们,转战到mac的阵营还真是会觉得不大习惯呢。觉得不好用的朋友很可能就在于你不知道mac的这些快捷键呐,下文小编就为大家整理好mac的一些常用快捷键,需要的朋友快去…

MacOS VSCode 常用快捷键配置

&#x1f4cc; 2023-03-28 更新 VSCode 回到上一步光标位置 &#xff08;macOS&#xff09;默认快捷键&#xff1a; 回退上一次编辑&#xff1a;ctrl - 跳转下一次编辑位置&#xff1a;ctl shift - &#xff08;建议修改&#xff09;修改快捷键&#xff1a; 快捷键中搜索…

MAC OS常用快捷键一览

切换输入法&#xff1a;Cmd Space 截屏&#xff1a;Shift Cmd 3 部分截屏&#xff1a;Shift &#xff0b; Cmd &#xff0b; 4 屏幕反色快捷键&#xff1a;Option &#xff0b; Cmd &#xff0b; F5 &#xff08;需要勾选反色选项&#xff09; 复制/剪切/粘贴/全选&#xff…