首页 > 其他分享 >移动

移动

时间:2024-10-18 16:12:28浏览次数:3  
标签:Vector3 transform V3 position 移动 speed public

几种常用的移动方式

一、使用Transform组件

场景中的每个游戏对象都拥有一个 Transform 组件,用于存储该对象的位置、旋转、缩放等基础属性,此种方式的原理就是通过 Update 函数每帧更新其位置来达到移动目的。

1.transform.position
最基础的移动方式,每一帧+=计算好的新位置

    public float speed = 3.0f;
    void Update()
    {
        transform.position += new Vector3(0, 0, speed * Time.deltaTime);
    }

2.transform.Translate
每帧向某方向移动多少距离,此种方法和上一种没有太大区别,但当需要坐标转换时,使用此方法可省略转换步骤。
translate(V3 向量,坐标系(留空默认为 Space.Self))

  public float speed = 3.0f;
   void Update()
   {
       transform.Translate(Vector3.forward * Time.deltaTime * speed);
   }

二、使用Vector3插值方法

Vector3 类型可以存储物体的位置、方向。上述的 transform 组件的基本信息就是由 Vector3 类型存储的,所以可以 V3 自带的类方法通过对位置的一些运算得到相对平滑的参数,其移动本质还是修改物体的 position。

**1.Vector3.Lerp
两个向量之间的线性差值,适用于从某点移动到某点(或跟随某物体),缓动效果。这里线性移动是由时间参数控制的,若写成 Speed*Time.deltaTime 则理论上永远也抵达不了
Lerp(当前位置(V3),目标位置(V3),时间(float)) 时间越小,缓动效果越慢

    public Transform target; //被跟随的物体
    public float speed = 3.0f;
    void Update()
    {
        Vector3 lerp =  Vector3.Lerp(transform.position, target.position, Time.deltaTime * speed);
        transform.position = lerp;
    }

2.Vector3.Slerp
两个向量之间的球形(弧线)差值,适用于从某点移动到某点(或跟随某物体),缓动效果,当前位置与目标位置距离越远,效果越明显
Slerp(当前位置(V3),目标位置(V3),时间(float)) 时间越小,缓动效果越慢

    public Transform target; //被跟随的物体
    public float speed = 3.0f;
    void Update()
    {
        Vector3 slerp =  Vector3.Slerp(transform.position, target.position, Time.deltaTime * speed);
        transform.position = slerp;
    }

3.Vector3.MoveTowards
和 Lerp 函数基本相同,但此函数多了一个最大速度限制,且是匀速朝目标运动,而 Lerp 和 Slerp 则是将抵达位置时放缓(减速)
MoveTowards(当前位置(V3),目标位置(V3),最大速度(float))
速度参数:取正向目标靠近,取负则远离目标

    public Transform target; //被跟随的物体
    public float speed = 1.0f;
    void Update()
    {
        Vector3 movetowards =  Vector3.MoveTowards(transform.position, 
		target.position, Time.deltaTime * speed);
        transform.position = movetowards;
    }

4.Vector3.SmoothDamp
官方翻译为:“平滑阻尼”,无比丝滑的从 A 移动到 B 点,速度可控,比较适用于摄像机跟随,Lerp 也比较适用于摄像机跟随,这俩的区别在于
SmoothDamp(当前位置(V3),目标位置(V3),当前速度(ref:V3),所需时间(float),最大速度(float,可选),Time.deltaTime(默认)(可选))
当前速度:一开始赋值为 0,每次调用该方法自动修改此参数,注意设为全局变量,且为 ref
所需时间:该值越小,越快抵达目标

    public Transform target; //被跟随的物体
    public Vector3 currentVelocity = Vector3.zero; //当前速度
    public float smoothTime = 0.3f; //所需时间
    void Update()
    {
        Vector3 smoothdamp = Vector3.SmoothDamp(transform.position,
		target.position, ref currentVelocity, smoothTime);
        transform.position = smoothdamp;
    }

三、使用刚体(Rigidbody)组件

Rigidbody 组件通过物理模拟来控制一个物体的位置,当使用此组件控制物体移动时,应在 FixedUpdate 函数中更新数据,该方法会在每一次执行物理模拟前被调用,这样要比 Update 函数更加精确。

1.AddForce
添加一个方向的力到刚体,刚体将开始移动,这种方式适合模拟外力作用下的刚体运动,如子弹。但注意,此力是累加的,不适合重复施加力来模拟物体!
AddForce(有方向的力(V3),力的模式(默认:ForceMode.Force))
ForceMode(力的模式):

  • Force(可持续的力,受质量影响)
  • Acceleration(可持续的加速度,不受质量影响)
  • Impulse(一个瞬间冲击力,受质量影响)
  • VelocityChange(一个瞬间速度变化,不受质量影响)
    public float forceNumber = 20f;
    public Rigidbody rig; //获取当前物体的刚体组件
    void FixedUpdate()
    {
        Vector3 force = new Vector3(0, 0, forceNumber);//定义力的方向和大小
        rig.AddForce(force, ForceMode.Force);
    }

2.MovePosition
移动刚体到一个新的位置,与Vector3.MoveTowards在于它会模拟物理效果
MovePosition(新的位置(V3))

    public Vector3 speed = new Vector3(0, 0, 1);
    public Rigidbody rig; //获取当前物体的刚体组件
    void FixedUpdate()
    {
        rig.MovePosition(transform.position + speed * Time.deltaTime);
    }

3.Velocity
瞬间给一个物体速度

    public Vector3 high = new Vector3(0, 0, 10);
    public Rigidbody rig; //获取当前物体的刚体组件
    private void FixedUpdate() {
        rig.velocity += high * Time.deltaTime;
    }

四、使用角色控制器(Character Controller)组件

角色控制器是 Unity 推出的特别用于角色移动的组件,使用角色控制器的物体有刚体的效果,但不会翻滚(意思是运动仅受限于碰撞体,不受其他因素影响),很适合角色移动。还可以设置斜坡参数,一定坡度自动抬升。

1.SimpleMove
以一定速度移动角色,以秒为单位,无需乘以时间,具备重力
SimpleMove(有方向的力(V3))

  public float speed = 5;
   public CharacterController cc;
   void Update() {
       cc.SimpleMove(transform.forward * speed);
   }

2.Move
以一定速度移动角色,不具备重力,需要自行计算下落
Move(有方向的力(V3))

    public float speed = 5;
    public CharacterController cc;
    void Update() {
        cc.Move(transform.forward * speed * Time.deltaTime);
    }

总结

简单区分以上几种方式,可分为物理移动和非物理移动,应自行区分何种物体应该使用何种方式。
如关卡中的移动障碍应用非物理移动,因为不需要相关障碍进行物理运算。
如摄像机跟随人物移动,简单方式可直接作为角色的子物体或直接算出偏移量,直接加给摄像机的 position,但太生硬,所以考虑加入 Lerp 或 SmoothDamp,让摄像机跟随更加平滑。
如角色移动,若使用非物理方式,则无法与环境交互,若使用刚体组件,则可能发生碰撞倾倒,处理比较复杂,可以考虑使用角色控制器。
对于 V3 插值函数的应用,可对某些运动转换更加流畅的处理。

标签:Vector3,transform,V3,position,移动,speed,public
From: https://www.cnblogs.com/comradexiao/p/18474504

相关文章

  • WebGIS、桌面GIS、移动GIS、三维GIS的区别
    GIS是一种基于计算机的工具,它可以对空间信息进行分析和处理(简而言之,是对地球上存在的现象和发生的事件进行成图和分析)。 GIS技术把地图这种独特的视觉化效果和地理分析功能与一般的数据库操作(例如查询和统计分析等)集成在一起。1  WebGISWebGIS是建立在Web技术上的一种......
  • 基于SSM移动端物流开发系统(安卓手机端+源码+定制开发)
    博主介绍:  ✌我是java程序员,一名专注于Java技术领域的程序员,全网拥有10W+粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台的优质作者。通过长期分享和实战指导,我致力于帮助更......
  • Vue3 - 详细实现移动端H5网页调用摄像头拍照功能,微信公众号网页h5页面打开本地摄像头
    前言PC网站端,请访问这篇文章。在vue3手机移动端开发中,详解H5页面/微信公众号网页调用浏览器摄像头并拍照完整示例,在手机浏览器上开启摄像头并拍照上传服务器或保存到本地功能(实时预览使用图片临时路径或base64数据),切换转换前置摄像头与后置摄像头,vue3手机H5打开摄像......
  • 高效数据移动指南 | 如何快速实现数据库 Oracle 到 Apache Doris 的数据同步?
    在现代企业中,数据无处不在,贯穿于各个业务环节和系统之间。无论是跨系统的数据集成、多地域的数据协同,还是实时应用的数据同步,数据的一致性和及时性都至关重要。在数字化转型的过程中,如何确保不同系统、地域、设备之间的数据同步,成为了企业面临的重要挑战。本专题将基于实践经验,从......
  • 解决移动端项目在PC端打开后宽度占满屏幕的问题
    问题描述移动端的项目在PC端打开后,对于带有固定定位的元素,宽度沾满的整个视窗的宽度。即使body,html限制了最大宽度<body><divclass="box"></div></body><style>body{max-width:500px;margin:0;background:#aaa;height:1......
  • 中国移动怎么查流量?推荐4种查询方式!(移动怎么查流量)
    对于手机剩余流量,可能很多人并不知道怎么查看,而且有时候自己用超了都不知道。直到10086发来短信,提醒本月已经超支了多少流量,额外扣费了多少钱才慌了。其实,可以通过10086非常的简单就能够查询到手机剩余的流量,而且方法还很多,都非常的简单。移动查流量怎么查第一种最直......
  • 移动开发(三):使用.NET MAUI打包第一个安卓APK完整过程
     之前给大家介绍过使用使用.NETMAUI开发第一个安卓APP,今天给大家介绍如何打包成APK,然后安装到安卓手机正常运行。这里还是沿用之前搭建好的应用程序。首先确保项目可以正常运行,具体如下图: 一、修改AndroidManifest.xml配置APP基本信息权限首先设置AndroidManifest.......
  • 2024年移动端CRM应用排名:客户管理的新趋势
    移动端CRM应用正重塑企业的客户管理方式,带来诸多优势。它们使销售团队能够随时访问客户数据,从而迅速响应客户需求,提升销售效率。同时,这些应用通过整合多种沟通方式,加强了与客户的互动,增强了关系纽带。数据的实时同步确保了销售决策的时效性和准确性,而优化的客户服务流程则通过快速......
  • 实现Linux to go !ubuntu装入移动硬盘,实现在不同电脑运行。
    一.准备一个u盘制作启动盘1.下载ubuntu镜像文件Ubuntu20.04.6LTS(FocalFossa)2.使用Rufus制作Ubuntu启动盘        下载Rufus-轻松创建USB启动盘   注意此操作会清空u盘!二.移动硬盘磁盘分区1.下载DiskGenius软件,选中自己的移动硬盘2.选......
  • vue3+vite+ts+vue3-qr-reader实现移动端h5+pc端调起摄像头核销二维码
    1、首先我们看示例图:h5:pc:  2、我们开始做第一步就是装依赖:yarnadd vue3-qr-reader或者npminstall vue3-qr-reader我记得装完后还需要装一个 yarnadd-Dsass 3、封装一个组件公用:组件位置你们自己定我写在了components/QrScanner/ind......