【Unity自制手册】基于Unity中物体移动相关方法和API集锦(动图详解)


在这里插入图片描述


👨‍💻个人主页:@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏unity每日一记


⭐相关文章: 线性差值函数以及平滑阻尼的运用和实践(Lerp AND SmoothDamp)

⭐相关文章:基础不牢,地动山摇系列 ------ 软硬通吃 unity常用API

⭐相关文章:关于游戏剧情模式中用到的基础简单API

⭐相关文章:控制游戏人物移动的细节到底有多少?

⭐相关文章:坦克炮管旋转发射炮弹(向量基础,射线碰撞,物体实例化)


文章目录

  • ⭐基于Unity中物体移动相关方法和API集锦⭐
    • 👨‍💻0.SmoothDamp先快后慢的移动
    • 👨‍💻1.MoveTowards匀速步频实现两点间的移动
    • 👨‍💻2.Lerp()差值实现镜头跟随移动
    • 👨‍💻3,实时更新位置的差值进行镜头的同步移动
    • 👨‍💻4.监听键盘进行实时位置更新
      • 妙用:监控键盘的移动---悬浮移动,上下有摆动
    • 👨‍💻5.translate与实时监听相配套
    • 👨‍💻6.刚体力进行牵引移动
    • 👨‍💻7.刚体力的瞬移
    • 👨‍💻8.通过控制Rigibody的速度来进行移动控制
    • 👨‍💻9.通过控制Rigibody的MovePosition来进行移动控制


⭐基于Unity中物体移动相关方法和API集锦⭐


👨‍💻0.SmoothDamp先快后慢的移动



👨‍💻1.MoveTowards匀速步频实现两点间的移动


在这里插入图片描述

这里的重点是匀速,实现两点间的移动

void FixedUpdate(){gameObject.transform .position =Vector3.MoveTowards(car.transform.position ,storn.transform.position,0.5f);}

👨‍💻2.Lerp()差值实现镜头跟随移动


  • 利用线性差值进行镜头的慢迁移

请添加图片描述

 void LateUpdate(){transform.position = Vector3.Lerp(transform.position, cube.position, Time.deltaTime);}

👨‍💻3,实时更新位置的差值进行镜头的同步移动


其实最简单的方法就直接把相机作为组件挂载上去即可

  • 纯碎位置的实时更新:

请添加图片描述

 void LateUpdate(){offset = cube.position - transform.position;transform.position +=offset;}
  • 使用Translate的实时更新–TransLate是物体朝某一个方向的移动
    这时不适合于镜头的移动,只适合物体的移动,也就是说适合放在FixedUpdate里面,不适合放在LateUpdate里面,原因如下
    请添加图片描述

此时的镜头的抖动效果并不是地形的原因,而是每帧时位置累加的原因
但是放在FixedUpdate里面就不会出现该情况

所以实现镜头的同步跟随纯粹的位置实时即可,或者直接将相机组件作为移动物体的子组件,保持固定位置


👨‍💻4.监听键盘进行实时位置更新


在这里插入图片描述

也就是键盘进行wsad移动

 void FixedUpdate(){a = gameObject.transform.position.x+Input.GetAxis("Horizontal");b = gameObject.transform.position.y;c = gameObject.transform.position.z + Input.GetAxis("Vertical"); //此时z轴一直是固定值,c作为y轴的参数后,移动距离只能在[-1,1]之间变化move = new Vector3(a,b,c);gameObject.transform.position = move ;}

妙用:监控键盘的移动—悬浮移动,上下有摆动


  void FixedUpdate(){a = transform.position.x+Input.GetAxis("Horizontal");c = transform.position.z + Input.GetAxis("Vertical"); //此时z轴一直是固定值,c作为y轴的参数后,移动距离只能在[-1,1]之间变化move = new Vector3(a,c,b);transform.position = move ;}

在这里插入图片描述

重点在于z轴在固定区域进行上下移动,原因为c的参数是固定的因为z轴未作变化,所以y轴一直都是在不变的z轴位置上进行键盘监听,而范围刚好是是[-1,1]


👨‍💻5.translate与实时监听相配套


在这里插入图片描述

private void Update(){//坦克的移动 = 大小*方向transform.Translate(Input.GetAxis("Vertical") *Vector3.forward*moveSpeed *Time.deltaTime );//坦克的旋转 = 大小*轴向transform.Rotate(Input.GetAxis("Horizontal") *Vector3.up *RotateSpeed *Time .deltaTime );//头部炮管的旋转 = 大小*轴向Head.transform.Rotate(Input.GetAxis ("Mouse X") *Vector3.up*HeadSpeed*Time .deltaTime );//左键发射炮弹if(Input.GetMouseButtonDown(0)){Fire();}}public override void Fire() {throw new System.NotImplementedException();}
}

👨‍💻6.刚体力进行牵引移动


前提是牵引力要大于物体的质量

 void Update(){cc.AddForce(0 ,0 ,10f);}

请添加图片描述


👨‍💻7.刚体力的瞬移


将物体瞬间移动到指定位置的坐标,所以前提得获取指定位置得坐标

在这里插入图片描述

 private void FixedUpdate(){xx.MovePosition(Vector2 (1,0) );}

👨‍💻8.通过控制Rigibody的速度来进行移动控制


[SerializeField] private float moveSpeed_X;
[SerializeField] private float moveSpeed_Y;
private Rigidbody2D rigidbody2D;
private void Start()
{//获取挂载脚本的物体的刚体组件rigidbody2D = GetComponent<Rigidbody2D>();
}
private void Update()
{//水平方向float horizontal = Input.GetAxis("Horizontal");//竖直方向float vertical = Input.GetAxis("Vertical");rigidbody2D.velocity=new Vector2 (horizontal*moveSpeed_X*Time.deltaTime, vertical* moveSpeed_Y * Time.deltaTime);//也可以只改变x或y的值rigidbody2D.velocity = new Vector2(horizontal * moveSpeed_X * Time.deltaTime, rigidbody2D.velocity.y);rigidbody2D.velocity = new Vector2(rigidbody2D.velocity.x, vertical * moveSpeed_Y * Time.deltaTime);
}

👨‍💻9.通过控制Rigibody的MovePosition来进行移动控制


    private float vertical;private float horizontal;private Rigidbody rigidbody;  //玩家的刚体组件private Vector3 moveDerictor; //移动的方向public  float  velocity = 1f;     //移动的速度private void Awake(){rigidbody = GetComponent<Rigidbody>();}private void FixedUpdate(){vertical   =  Input.GetAxis("Vertical") ;horizontal =  Input.GetAxis("Horizontal") ;if(Input.GetAxis("Vertical")!= 0 || Input.GetAxis("Horizontal")!= 0){moveDerictor = new Vector3(horizontal, 0, vertical);moveDerictor = moveDerictor.normalized;   //将方向变成单位向量rigidbody.MovePosition( transform .position + moveDerictor * velocity * Time.deltaTime); //速度*方向 = 向量}}

⭐相关文章: 线性差值函数以及平滑阻尼的运用和实践(Lerp AND SmoothDamp)

⭐相关文章:基础不牢,地动山摇系列 ------ 软硬通吃 unity常用API

⭐相关文章:关于游戏剧情模式中用到的基础简单API

⭐相关文章:控制游戏人物移动的细节到底有多少?

⭐相关文章:坦克炮管旋转发射炮弹(向量基础,射线碰撞,物体实例化)


你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2660240.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

python打包项目pyinstaller的使用及问题解决

前言 在使用python编写了一个小程序之后&#xff0c;希望能够将其打包为一个可执行文件&#xff0c;如exe格式&#xff0c;这样就能够在其他电脑上安装使用&#xff0c;因此&#xff0c;打包python项目是一个普遍的需求。 配置 平台&#xff1a;windows10 工具&#xff1a;vi…

像美团一样商家入驻的小程序功能

美团一样的商家入驻小程序可以促进本地化商家的线上线下融合&#xff0c;为本地商家和用户提供更好的服务和体验&#xff0c;是一种数字化转型和创新&#xff0c;想要开发像美团一样的商家入驻小程序&#xff0c;需要具备以下功能&#xff1a; 1、不同行业独立频道 为本地化的…

6、LLaVA

简介 LLaVA官网 LLaVA使用Vicuna(LLaMA-2)作为LLM f ϕ ( ⋅ ) f_\phi() fϕ​(⋅)&#xff0c;使用预训练的CLIP图像编码器 ViT-L/14 g ( X v ) g(X_v) g(Xv​)。 输入图像 X v X_v Xv​&#xff0c;首先获取feature Z v g ( X v ) Z_vg(X_v) Zv​g(Xv​)。考虑到最后一…

4.Python数据序列

Python数据序列 一、作业回顾 1、面试题 有一物,不知其数,三三数之余二,五五数之余三,七七数之余二,问物几何? 白话文:有一个数字,不知道具体是多少,用3去除剩2,用5去除剩3,用7去除剩2个,问这个数是多少?1 ~ 100以内的整数 while循环: # 初始化计数器 i = …

01_软件测试

01_软件测试 学习目标 1、能复述软件测试的定义 2、能说出7种测试分类的区别 3、能说出质量模型的重点5项 4、能说出测试流程的6个步骤 5、能说出测试模板8个要素 认识软件及测试 什么是软件 软件&#xff1a;控制计算机硬件工作的工具 软件的基本组成 软件生产过程 什么是软…

力扣算法-Day14

第202题. 快乐数 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结…

Rocky9 1.28安装kubernetes

1.环境准备 二进制安装比较复杂&#xff0c;但是也比较稳定&#xff0c;适用于线上环境使用。   本笔记参考自&#xff1a;https://github.com/cby-chen/Kubernetes &#xff0c;针对文中内容&#xff0c;有部分镜像无法拉取等&#xff0c;还有一部分有点小问题&#xff0c;…

2024-软件测试工程师面试题,面试前一天刷效果更佳。

bug的定义&#xff0c;bug的周期 软件bug是指软件程序的漏洞和缺陷&#xff0c;测试工程师或用户所发现和提出的软件可改进的细节、或与需求文档存在差异的功能实现等生命周期中缺陷状态&#xff1a;新建-->指派-->已解决-->待验-->关闭 发现BUG-->提交BUG--&g…

如何本地部署Nextcloud结合cpolar搭建专属私有云盘远程访问(内网穿透)

文章目录 摘要1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 摘要 Nextcloud,它是ownCloud的一个分支,是一个文件共享服…

高智能氛围感知兼具运动与豪华质感 EMEYA开启百万纯电新时代

在纯电动汽车成为刚需的时代&#xff0c;售价百万的纯电轿车应该拥有怎样的体验&#xff1f; 最近&#xff0c;路特斯推出一款百万纯电四门超跑轿车——EMEYA&#xff0c;这款车11月广州车展亮相并开启预定后&#xff0c;3小时内便订单即破300辆。一款百万级的电动汽车为何受到…

51单片机(STC8)-- GPIO输入输出

文章目录 I/O口相关寄存器端口数据寄存器端口模式配置寄存器&#xff08;PxM0&#xff0c;PxM1&#xff09;端口上拉电阻控制寄存器(PxPU)关于I/O的注意事项 配置I/O口I/O设置demoI/O端口模式LED控制&#xff08;I/O输出&#xff09;按键检测&#xff08;I/O输入&#xff09; S…

openGauss学习笔记-175 openGauss 数据库运维-备份与恢复-导入数据-管理并发写入操作示例

文章目录 openGauss学习笔记-175 openGauss 数据库运维-备份与恢复-导入数据-管理并发写入操作示例175.1 相同表的INSERT和DELETE并发175.2 相同表的并发INSERT175.3 相同表的并发UPDATE175.4 数据导入和查询的并发 openGauss学习笔记-175 openGauss 数据库运维-备份与恢复-导入…

vue3+vite组件中使用Cesium粒子系统

一、注意事项 1.图片的引用路径必须从根目录&#xff08;即index.html所在的目录&#xff09;开始&#xff0c;如果使用相对路径&#xff0c;也要返回到根目录再转到对应的目录。 //第一种&#xff0c;直接从根目录开始 image: src/assets/particles/Blowing Snow.png//第二种…

Flink Kafka[输入/输出] Connector

本章重点介绍生产环境中最常用到的Flink kafka connector。使用Flink的同学&#xff0c;一定会很熟悉kafka&#xff0c;它是一个分布式的、分区的、多副本的、 支持高吞吐的、发布订阅消息系统。生产环境环境中也经常会跟kafka进行一些数据的交换&#xff0c;比如利用kafka con…

贝叶斯算法的故事丨机器学习一文解读

今天分享的内容是贝叶斯算法的核心原理与应用&#xff0c;接下来&#xff0c;通过一个小故事让你快速理解贝叶斯。 杰克是一位聪明的探险寻宝家&#xff0c;有一天&#xff0c;他得到了一张藏宝图&#xff0c;上面标记了宝藏可能埋藏的几个地点&#xff1a;一个古老的城堡、一个…

《深入理解C++11:C++11新特性解析与应用》笔记四

第四章 新手易学&#xff0c;老兵易用 4.1 右尖括号>的改进 在 C98 中&#xff0c;有一条需要程序员规避的规则:如果在实例化模板的时候出现了连续的两个右尖括号 >&#xff0c;那么它们之间需要一个空格来进行分隔&#xff0c;以避免发生编译时的错误。C98 会将>&g…

什么是番茄时钟?如何利用番茄时钟提升工作/学习效率?

番茄时钟的由来“传说” ​ 弗朗西斯科西里洛在上大学期间&#xff0c;一度苦于学习效率的低下&#xff0c;一直不能专注于学习&#xff0c;或学习一会就会分心&#xff0c;于是他找了一个定时器&#xff0c;每次学习时他都设定一个时间进行倒计时&#xff0c;如此反复&#x…

25、Qt设备识别(简单的密钥生成器)

一、说明 在很多商业软件中&#xff0c;需要提供一些可以试运行的版本&#xff0c;这样就需要配套密钥机制来控制&#xff0c;纵观大部分的试用版软件&#xff0c;基本上采用以下几种机制来控制。 1、远程联网激活&#xff0c;每次启动都联网查看使用时间等&#xff0c;这种方…

获取b站合集视频时长最新可用代码(2023.12.28)小白也能用

在网上搜索获取b站分集视频时长的代码&#xff0c;发现大部分都过时了 原链接&#xff1a;已过时代码链接 我对原代码做出了部分修改&#xff0c;以下代码于2023.12.28测试&#xff08;Edge浏览器&#xff09; javascript: (function() {var hour 0;var minute 0;var secon…

labuladong日常刷题-双指针 | LeetCode 83删除排序链表中的重复元素 5最长回文子串

双指针操作链表与字符串 LeetCode 83 删除排序链表中的重复元素 2023.12.28 题目链接labuladong讲解[链接] ListNode* deleteDuplicates(ListNode* head) {/*暴力求解ListNode* cur new ListNode();ListNode* prenode cur;cur->next head;cur cur->next;while(cu…