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

article/2025/10/19 13:44:40

    移动的方式有transform.Translate()、rigidbody.velocity()、rigidbody.MovePosition()等多种。本篇使用rigidbody的方式,并向着相机朝向的方向控制移动。也就是继上一篇“第三人称相机控制”,相机随鼠标点击而旋转位置之后,我们让主角小人朝向相机看向的方向移动(越来越接近商业游戏的界面了)。

  本篇用到的API有:Rigidbody.MovePosition、rigidbody.MoveRotation、Vector3.Set、Vector3.Normalize、Camera.main、Vector3.RotateTowards、Vector3.RotateTowards、Mathf.Approximately、Camera.main   最终效果如下:


目录

  1. Rigidbody的作用

  2. 实现Rigidbody移动的过程分析

  3. 实现旋转的过程分析

  4. 脚本实现HeroMove


  1. Rigidbody的作用

  (1)Rigidbody组件:Rigidbody的重要性不用多说了,本专栏前面的文章已经多次使用和提及,凡是GameObject需要涉及物理力的影响,都需要添加此组件,并且大部分情况下需要配合Collider碰撞器使用。

   上图是Rigidbody组件的参数解释,详见官方手册Rigidbody 

  以及笔记【Untiy学习笔记】Rigidbody组件及其常用函数_一白梦人的博客

    (2)Rigidbody类:类中提供了关于重力、阻力、速度、移动、质量等与物理相关的方法。在本篇中,我们使用的是其中的  rigidbody.MovePosition()位置移动方法、 rigidbody.MoveRotation()旋转方法

  其他方法可以参照笔记:第十章 Rigidbody类

  2. 实现Rigidbody移动的过程分析

  (1)第一步:在初始化时使用GetComponent拿到挂在主角身上的Rigidbody组件;

rb=GetComponent<Rigidbody>();

  (2)第二步:获取键盘输入的横向坐标和纵向坐标(由W、A、S、D提供);

moveInput = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));

   这个Input.GetAxis中的坐标名字(Horizental和Vertical),是通过InputManager设置的,这些按键触发获取水平方向的值的改变:

(3)第三步:坐标转换。第二步得到的是X、Y方向的坐标,而实际在unity空间中移动的方向是X、Z方向,因此,使用Vector3.set方法将(X,Y,0)转换成(X,0,Y),并使用Vector3..Normalize()方法单位化此向量,得到移动的方向;

movement.Set(moveInput.x, 0, moveInput.y);
movement.Normalize();

  (4)第四步:Rigidbody.MovePosition实现移动

rb.MovePosition(rb.position + movement * moveSpeed * Time.DeltaTime);

  3. 实现旋转的过程分析

  (1)第一步:使用Mathf.Approximately(近似值)判断是否有横向和纵向的输入改变(键盘控制方向);

Mathf.Approximately(moveInput.x, 0);
Mathf.Approximately(moveInput.y, 0);

  Mathf类有很多有用且有趣的API,使设计的过程更加快捷,之后我们还会用到很多。

  (2)第二步:如果收到了键盘控制方向的命令,那就改变一下小人移动的方向,让它乘上主相机的方向,这里使用了一个四元数与三维向量相乘,它的几何意义是表示这个向量按照这个四元数进行旋转之后得到的新的向量。

movement = Quaternion.Euler(0, Camera.main.transform.eulerAngles.y, 0) * movement;

    然后用Vector3.RotateTowards()方法控制,将当前小人朝向的方向(transform.forwad)向目标前方旋转;

Vector3 lookForward = Vector3.RotateTowards(transform.forward, movement, rotateSpeed * Time.fixedDeltaTime, 360);

*Vector3 RotateTowards(当前向量, 目标向量,每次移动的最大角度(弧度),最大移动弧度):从当前角度向目标角度旋转,并且在旋转中控制增量,类似于球形插值。

   (3)第三步:使用Quaternion.LookRotation来改变朝向;

targetRotation = Quaternion.LookRotation(lookForward);

 *Quaternion.LookRotation(Vector3):官方文档翻译过来的解释就是“创建一个旋转,沿着forward(z轴)并且头部沿着upwards(y轴)的约束注视。也就是建立一个旋转,使z轴朝向view y轴朝向up”。看着就很迷……

  通过实验可以基本了解,这个意思就是将物体的前方(forward)按照传入的这个三维向量旋转,最终结果是这个物体看向传入的这个向量,最后返回一个旋转角度。详见解释:Quaternion.LookRotation实现原理_刺子的博客

(4)第四步:使用Rigidbody.MoveRotation()实现旋转。

rb.MoveRotation(targetRotation);

  4. 脚本实现HeroMove

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//对象:主角Hero(需要加载Rigidbody)
//作用:使用RigidBody控制物体移动
//主角的移动方向是主相机的朝向
public class HeroMove : MonoBehaviour
{private Rigidbody rb;private Vector2 movementInput; //获取横向或纵向的命令坐标private Vector3 movement; //移动的坐标位置(将之前的二维坐标转成这里的三维)public float moveSpeed = 2f;private float rotateSpeed = 3;private Quaternion targetRotation;void Start(){rb = GetComponent<Rigidbody>();}void FixedUpdate(){   //RigidBody属于物理层调用,主要在FixedUpdate()中movementInput = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));//获取Hero横向和纵向移动的坐标,这个输入由键盘决定movement.Set(movementInput.x, 0, movementInput.y); //将获取到的坐标转到三维向量中movement.Normalize();   //并且将这个三维向量单位化,得到移动的方向//检查横向和纵向是否有输入bool hInput = !Mathf.Approximately(movementInput.x, 0);bool vInput = !Mathf.Approximately(movementInput.y, 0);if(hInput || vInput){   //如果有移动命令,同时还可以获取主相机的旋转位置,获得其绕Y轴的旋转方向movement = Quaternion.Euler(0, Camera.main.transform.eulerAngles.y, 0) * movement;//四元数和向量相乘可以表示这个向量按照这个四元数进行旋转之后得到的新的向量。}Vector3 lookForward = Vector3.RotateTowards(transform.forward, movement, rotateSpeed * Time.fixedDeltaTime,360);//RotateTowards从当前方向向目标方向旋转//这里是Hero的正前方向着目标方向movement旋转,旋转的度数(rotateSpeed * Time.fixedDeltaTime),每次移动的最大角度//返回值为transform.forward+每次移动的最大角度//当这个值超过movement时,返回movementtargetRotation = Quaternion.LookRotation(lookForward);//物体的z轴与lookForward对齐//得到Hero的Rotation值:targetRotation//这个方法配合transform.rotation = Quaternion.LookRotation()使用rb.MovePosition(rb.position + movement * speed * Time.fixedDeltaTime);//先获取当前位置rb.position,然后使用MovePosition方法移动到目标位置rb.MoveRotation(targetRotation);  //实现旋转}
}

  补充:1. 加了刚体组件和碰撞器的主角,碰到其他碰撞器很容易摔倒,可以在刚体组件中约束它的X、Z轴不产生旋转

  2. 上一篇的相机跟随,为了让相机移动发生在主角移动之后,特地将相机的移动写在LateUpdate()中,而主角移动因为用到了物理系统的更新,就写在FixedUpdate()中。但它们两个的更新频率是不同的,一个根据逻辑帧的频率,一个是根据真实世界的时间频率,所以这样写会出现移动时卡顿的现象。

  解决办法:将相机跟随也写到FixedUpdate()中。  那么该如何确定哪个脚本先执行呢?可以到Edit->ProjectSetting->ScriptExecutionOrder当中调整执行顺序

  以上为使用Rigidbody组件实现移动的方法,另外在“管理阶层Managers”栏目中,将控制的方式修改为使用新版InputSystem和事件发送来实现,详见EventManager--事件中心3和新版InputSystem


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

相关文章

第二十五章 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…

Mac 键盘快捷键

Mac 键盘快捷键 您可以按下某些组合键来实现通常需要鼠标、触控板或其他输入设备才能完成的操作。 要使用键盘快捷键,请按住一个或多个修饰键,然后按快捷键的最后一个键。例如,要使用 Command-C(拷贝),请按住 Command 键并按 C 键,然后同时松开这两个键。Mac 菜单和键…