详解Unity的几种移动方式实现_unity 移动-程序员宅基地

技术标签: unity  详解Unity  

前言

最近在学习如何制作 FPS 游戏,学习了如何使用角色控制器来控制角色的移动跳跃等等,结合之前学到的使用 transform,刚体等使物体移动,不同的移动方式适用于不同的场景,今天就来简要盘点一下各种移动方式以及其优劣之处,若有不对之处,请多多指教。

前排提醒:本文仅代表个人观点,以供交流学习,若有不同意见请评论留言,笔者一定好好学习,天天向上。

视频讲解:
详解Unity的几种移动方式实现_BiLiBiLi


一、使用 Transform 组件

Unity 场景中的每个游戏对象都拥有一个 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。需视情况和需求来选择 V3 的 4 种插值方法。Mathf 类中也有这些方法,不过参数是 float,使用方法大致相同,读者若感兴趣,自行学习吧。

1. Vector3.Lerp

两个向量之间的线性差值,适用于从某点移动到某点(或跟随某物体),缓动效果
这里线性移动是由时间参数控制的,若写成 Speed*Time.deltaTime 则理论上永远也抵达不了,但这里就不讨论如何用 Lerp 实现匀速了,以后再写。
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,默认:ForceMode.Force))

ForceMode(力的模式):
Force(可持续的力,受质量影响)
Acceleration(可持续的加速度,不受质量影响)
Impulse(一个瞬间冲击力,受质量影响)
VelocityChange(一个瞬间速度变化,不受质量影响)
笔者对于这些东西的区别有点懵,还是大家自己悟吧,例图演示的是第一种力,20 的向 Z 的力
在这里插入图片描述

    public float forceNumber = 20f;
    public Rigidbody rig; //获取当前物体的刚体组件
    void FixedUpdate()
    {
        Vector3 force = new Vector3(0, 0, forceNumber);
        rig.AddForce(force, ForceMode.Force);
    }
2. MovePosition

移动刚体到一个新的位置,移动的同时受到物理模拟的影响
MovePosition(新的位置(V3))
在这里插入图片描述

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

瞬间给一个物体恒定的速度,将该物体提升到这个速度,保持。相比较 AddForce 更加适合跳跃功能。每次跳跃都是恒定高度,做跳跃的话,图二记得每次跳跃完置零就行。
在这里插入图片描述

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

在这里插入图片描述

    public Vector3 high = new Vector3(0, 10, 0);
    public Rigidbody rig; //获取当前物体的刚体组件
    private void Update() {
        if(Input.GetKeyDown(KeyCode.J))
        {
            rig.velocity = high;
        }
    }

四、使用角色控制器(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);
    }

五、总结与参考资料

1.总结

简单区分以上几种方式,可分为物理移动和非物理移动,读者应自行区分何种物体应该使用何种方式。

  • 如关卡中的移动障碍应用非物理移动,因为不需要相关障碍进行物理运算。
  • 如摄像机跟随人物移动,简单方式可直接作为角色的子物体或直接算出偏移量,直接加给摄像机的 position,但太生硬,所以考虑加入 Lerp 或 SmoothDamp,让摄像机跟随更加平滑。
  • 比如角色移动,若使用非物理方式,则无法与环境交互,若使用刚体组件,则可能发生碰撞倾倒,会产生很多方向的力,处理比较复杂,所以考虑使用角色控制器,仅在发生碰撞时限制物体运动,不会导致很多奇怪的情况发生。
  • 对于 V3 插值函数的应用,可对某些运动转换更加流畅的处理,具体用法读者自行拓展。

本篇中我还有好多没有理清楚的地方,日后理清楚了会再修改,若读者对其中的一些片段有些不同的看法,请留言讨论。

2.参考资料

1.https://blog.csdn.net/jiumengdz/article/details/78537758
2.https://www.cnblogs.com/claireyuancy/p/7266586.html
3.https://www.sohu.com/a/211459755_667928
4.https://www.cnblogs.com/CasualAttachment/p/7308993.html
5.https://blog.csdn.net/six_sex/article/details/51114083
6.https://blog.csdn.net/renkai0406/article/details/63800248
7.https://blog.csdn.net/weixin_44370124/article/details/90080871

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43147385/article/details/123892842

智能推荐

leetcode 172. 阶乘后的零-程序员宅基地

文章浏览阅读63次。题目给定一个整数 n,返回 n! 结果尾数中零的数量。解题思路每个0都是由2 * 5得来的,相当于要求n!分解成质因子后2 * 5的数目,由于n中2的数目肯定是要大于5的数目,所以我们只需要求出n!中5的数目。C++代码class Solution {public: int trailingZeroes(int n) { ...

Day15-【Java SE进阶】IO流(一):File、IO流概述、File文件对象的创建、字节输入输出流FileInputStream FileoutputStream、释放资源。_outputstream释放-程序员宅基地

文章浏览阅读992次,点赞27次,收藏15次。UTF-8是Unicode字符集的一种编码方案,采取可变长编码方案,共分四个长度区:1个字节,2个字节,3个字节,4个字节。文件字节输入流:每次读取多个字节到字节数组中去,返回读取的字节数量,读取完毕会返回-1。注意1:字符编码时使用的字符集,和解码时使用的字符集必须一致,否则会出现乱码。定义一个与文件一样大的字节数组,一次性读取完文件的全部字节。UTF-8字符集:汉字占3个字节,英文、数字占1个字节。GBK字符集:汉字占2个字节,英文、数字占1个字节。GBK规定:汉字的第一个字节的第一位必须是1。_outputstream释放

jeecgboot重新登录_jeecg 登录自动退出-程序员宅基地

文章浏览阅读1.8k次,点赞3次,收藏3次。解决jeecgboot每次登录进去都会弹出请重新登录问题,在utils文件下找到request.js文件注释这段代码即可_jeecg 登录自动退出

数据中心供配电系统负荷计算实例分析-程序员宅基地

文章浏览阅读3.4k次。我国目前普遍采用需要系数法和二项式系数法确定用电设备的负荷,其中需要系数法是国际上普遍采用的确定计算负荷的方法,最为简便;而二项式系数法在确定设备台数较少且各台设备容量差..._数据中心用电负荷统计变压器

HTML5期末大作业:网页制作代码 网站设计——人电影网站(5页) HTML+CSS+JavaScript 学生DW网页设计作业成品 dreamweaver作业静态HTML网页设计模板_网页设计成品百度网盘-程序员宅基地

文章浏览阅读7k次,点赞4次,收藏46次。HTML5期末大作业:网页制作代码 网站设计——人电影网站(5页) HTML+CSS+JavaScript 学生DW网页设计作业成品 dreamweaver作业静态HTML网页设计模板常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 明星、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 军事、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他 等网页设计题目, A+水平作业_网页设计成品百度网盘

【Jailhouse 文章】Look Mum, no VM Exits_jailhouse sr-iov-程序员宅基地

文章浏览阅读392次。jailhouse 文章翻译,Look Mum, no VM Exits!_jailhouse sr-iov

随便推点

chatgpt赋能python:Python怎么删除文件中的某一行_python 删除文件特定几行-程序员宅基地

文章浏览阅读751次。本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc大模型,只是展现它原本的实力。对于颠覆工作方式的ChatGPT,应该选择拥抱而不是抗拒,未来属于“会用”AI的人。AI职场汇报智能办公文案写作效率提升教程 专注于AI+职场+办公方向。下图是课程的整体大纲下图是AI职场汇报智能办公文案写作效率提升教程中用到的ai工具。_python 删除文件特定几行

Java过滤特殊字符的正则表达式_java正则表达式过滤特殊字符-程序员宅基地

文章浏览阅读2.1k次。【代码】Java过滤特殊字符的正则表达式。_java正则表达式过滤特殊字符

CSS中设置背景的7个属性及简写background注意点_background设置背景图片-程序员宅基地

文章浏览阅读5.7k次,点赞4次,收藏17次。css中背景的设置至关重要,也是一个难点,因为属性众多,对应的属性值也比较多,这里详细的列举了背景相关的7个属性及对应的属性值,并附上演示代码,后期要用的话,可以随时查看,那我们坐稳开车了······1: background-color 设置背景颜色2:background-image来设置背景图片- 语法:background-image:url(相对路径);-可以同时为一个元素指定背景颜色和背景图片,这样背景颜色将会作为背景图片的底色,一般情况下设置背景..._background设置背景图片

Win10 安装系统跳过创建用户,直接启用 Administrator_windows10msoobe进程-程序员宅基地

文章浏览阅读2.6k次,点赞2次,收藏8次。Win10 安装系统跳过创建用户,直接启用 Administrator_windows10msoobe进程

PyCharm2021安装教程-程序员宅基地

文章浏览阅读10w+次,点赞653次,收藏3k次。Windows安装pycharm教程新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入下载安装PyCharm1、进入官网PyCharm的下载地址:http://www.jetbrains.com/pycharm/downl_pycharm2021

《跨境电商——速卖通搜索排名规则解析与SEO技术》一一1.1 初识速卖通的搜索引擎...-程序员宅基地

文章浏览阅读835次。本节书摘来自异步社区出版社《跨境电商——速卖通搜索排名规则解析与SEO技术》一书中的第1章,第1.1节,作者: 冯晓宁,更多章节内容可以访问云栖社区“异步社区”公众号查看。1.1 初识速卖通的搜索引擎1.1.1 初识速卖通搜索作为速卖通卖家都应该知道,速卖通经常被视为“国际版的淘宝”。那么请想一下,普通消费者在淘宝网上购买商品的时候,他的行为应该..._跨境电商 速卖通搜索排名规则解析与seo技术 pdf

推荐文章

热门文章

相关标签