【Unity入门】物体5种移动方法

目录

  • 一、通过修改位置来实现移动
  • 二、通过物理系统实现位移
  • 三、通过CharacterController组件
  • 四、通过输入控制物体移动

一、通过修改位置来实现移动

利用修改Transform组件的position的两种常用方法。

  1. 使用Translate()函数
/*物体将向x方向移动1.5单位*/
transform.Translate(1.5f,0,0);
  1. 直接指定新的位置
/*将物体放在(1.5f,0,0)的位置上*/
transform.position = new Vector3(1.5f,0,0);

将上述两种方法在 void Update()实现每一帧物体向x方向移动1.5个单位,具体代码如下:

  void Update(){   transform.Translate(1.5f,0,0);//或transform.position += new Vector3(1.5f,0,0);}

注意:此处1.5为啥要写1.5f,根据C#的语法规定,直接写1.5会被认为double类型的数,而这里需要flaot类型数,三个数据只要其中一个带有f就行。

由于电脑无法保证稳定的帧率,会出现帧率高,物体移动就快,帧率低,物体移动就慢。而在游戏开发大部分情况中,我们应该确保”每秒移动同样的距离”,因此,我们应该做如下修改。

	void Update(){   transform.Translate(1.5f*Time.deltaTime,0,0);//或transform.position += new Vector3(1.5f*Time.deltaTime,0,0);}

此处*Time.deltatime是确保每秒移动同样的距离。

Time.deltatime 是两帧之间的间隔,如帧率为60帧/秒,则Time.deltatime =0.0167秒,或者帧率为10帧/秒,则Time.delatatime = 0.1秒。所以Time.delatatime是一个随帧率改变而改变的数值,确保物体每秒移动的数值是一样的。

ps:Time.deltatime是一个很小的数值,因此与他相乘的数值应该大些。

二、通过物理系统实现位移

适用于对已经挂载刚体组件的物体
以下是常用的两种方法

  1. 利用AddForce()对物体施加力改变位置
	public Rigidbody rb;void Update(){   rb.AddForce(100,0,0);}

注意:一定要给物体挂载刚体,物体才会收到力的作用

此处AddForce()的参数为Vector3类型,该参数用一个向量表示力,且符合牛顿力学

这里表示每帧(时间)对物体轴方向施加100N的力,根据牛顿力学,力至少持续一点时间才会引起物体速度的变化。所以此处必有位移,具体的位移,由你施加的力跟每帧的时间有关。在游戏开发中,我们只需要一边测试一边修改,确保一个合适数值即可。

  1. 直接修改物体的速度
    此处表示物体在X轴以10m/s的速度移动,y轴跟z轴方向速度保持不变。
    此方法相比上一个方法能让物体直接跳过加速度引起速度变化的步骤,使物体能够匀速运动。

注意:物理系统对于时间是非常敏感的。

举个例子:我们需要子弹0.1秒后击中目标,当更新频率不一定,子弹0.3秒才击中目标,这不是我们想要的。

当设备运行不流畅的时候,帧率下降,Time.deltatime会变大,不在适用。所以我们应该做如下修改,利用 FixedUpdate()函数,可以保证稳定的间隔。获取两段Update之间的时间间隔为Time.deltatime,而获得两次FixedUpdate之间的时间间隔为Time.fixedDeltaTime,一般Time.fixedDeltaTime是一个固定的值(默认为0.0.2秒,可通过Edit——Project Setting——Time来修改)。

修改代码如下:

	public Rigidbody rb;void FixedUpdate(){   rb.AddForce(10*Time.fixedDeltaTime,0,0);//或rb.velocity = new Vector3(10*Time.fixedDeltaTime,rb.velocity .y,rb.velocity.z);}

三、通过CharacterController组件

	private void Start(){_playerCC = this.GetComponent<CharacterController>();}void FixedUpdate(){   _playerCC.Move(new Vector3(1.5f*Time.deltaTime,0,0););}

四、通过输入控制物体移动

第一种方法

	void Update(){   float horizontal = Input.GetAxis("Horizontal");float vetical = Input.GetAxis("Vetical");transform.Translate(horizontal*speed*Time.deltaTime,vetical*speed*Time.deltaTime,0);//或transform.position += new Vector3(horizontal*speed*Time.deltaTime,vetical*speed*Time.deltaTime,0);}

此处的speed为一个变量,我们可以通过修改speed来控制物体移动的距离。

假设我们定义 float speed =10;

即此处每帧最大的位移为1100.0167=0.167米。

第二种方法

	public Rigidbody rb;public float speed;void FixedUpdate(){   float horizontal = Input.GetAxis("Horizontal");float vetical = Input.GetAxis("Vetical");rb.AddForce(horizontal*speed*Time.fixedDeltaTime,vetical*speed*Time .fixedDeltaTime,0);//或rb.velocity = new Vector3(horizontal*speed*Time.fixedDeltaTime,vetical*speed*Time.fixedDeltaTime,rb.velocity.z);}

第三种方法

    private void Start(){_playerCC = this.GetComponent<CharacterController>();}public void FixedUpdate() {Vector3 motionValue = Vector3.zero;/*获取键盘输入*/float h_InputValue = Input.GetAxis("Horizontal");//左右移动float v_InputValue = Input.GetAxis("Vertical");//前后移动motionValue += this.transform.forward * v_InputValue * moveSpeed * Time.fixedDeltaTime;//前后方向的位移motionValue += this.transform.right * h_InputValue * moveSpeed * Time.fixedDeltaTime;//左右方向的位移_playerCC.Move(motionValue);}

通过上述的三种方法,我们就可以实现,每当按下相应的键,物体就会往相应的方向移动一定的距离。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

18、vue3(十八):菜单权限,按钮权限,打包,发布nginx

目录 一、菜单权限和路由拆分 1.思路分析 2.深拷贝插件 3.代码实现 4.效果展示

Javascript 嵌套函数 - 递归函数 - 内置函数详解

Javascript 嵌套函数 - 递归函数 - 内置函数详解 目录 Javascript 嵌套函数 - 递归函数 - 内置函数详解 一、嵌套函数 二、递归函数 三、内置函数 在了解了函数的定义和函数调用外&#xff0c;下面我们来介绍一下JavaScript中几种特殊的函数。 JavaScript特殊函数有3种&a…

AVL树-详细解析【数据结构】

AVL树是首个被发明的自平衡二叉查找树&#xff0c;在1962年由两位苏联科学家G.M. Adelson-Velsky和E.M. Landis提出。AVL树得名于发明者的首字母。在AVL树中&#xff0c;任何节点的两个子树的高度最大差别为一&#xff0c;确保了树的平衡度&#xff0c;使得查找操作相比于普通的…

JavaScript数组分组groupBy

JavaScript 最近发布了一个方法 Object.groupBy&#xff0c;可以对可迭代对象中的元素进行分组。 语法&#xff1a; Object.groupBy(items, callbackFn)items 被分组的可迭代对象&#xff0c;如 Array。 callbackFn 对可迭代对象中的每个元素执行的函数。 举个例子&#…

173.【2023年华为OD机试真题(C卷)】用连续自然数之和来表达整数(双指针法实现JavaPythonC++JS)

🚀你的旅程将在这里启航!本专栏所有题目均包含优质解题思路,高质量解题代码,详细代码讲解,助你深入学习,深度掌握! 文章目录 【华为OD机试AB必刷题目】题目描述解题思路题解代码Python题解代码JAVA题解代码C/C++题解代码JS题解代码代码OJ评判结果代码讲解Python题解代码…

【Qt QML 入门】TextEdit

TextEdit可以显示多行可编辑的格式化文。默认是无边框的&#xff0c;可以和父控件完美融合。 import QtQuick import QtQuick.Window import QtQuick.ControlsWindow {id: winwidth: 800height: 600visible: trueTextEdit {id: textEditanchors.centerIn: parenttext: "He…

并发编程中常见的设计模式

文章目录 一、 终止线程的设计模式1. 简介2. Tow-phase Termination&#xff08;两阶段终止模式&#xff09;—优雅的停止线程 二、避免共享的设计模式1. 简介2. Immutability模式—想破坏也破坏不了3. Copy-on-Write模式4. Thread-Specific Storage模式—没有共享就没有伤害 三…

Python之构造函数

参考&#xff1a; Python之构造函数_构造函数 python-CSDN博客 构造函数的特点&#xff1a; 创建对象&#xff1b;给对象的成员变量赋值 构造函数和成员函数之间的区别&#xff1a; 成员函数需要被手动调用&#xff0c;但是&#xff0c;构造函数在创建对象的过程中是自动被…

八大排序——快速排序(霍尔 | 挖空 | 前后指针 | 非递归)

我们今天来讲讲八大排序中的快速排序&#xff0c;快速排序最明显的特点就是排序快&#xff0c;时间复杂度是O&#xff08;N* logN&#xff09;&#xff0c;但是坏处就是如果排序的是一个逆序的数组的时候&#xff0c;时间复杂度是O&#xff08;N^2&#xff09;,还不用我们的插入…

被带偏的中国云计算,重归正途

文 | 智能相对论 作者 | 叶远风 阿里云战略聚焦公共云&#xff0c;对整个云计算市场而言都是一场自我审视。 从市场背景、行业发展、中外对比等多个方面&#xff0c;业界舆论给出了大量详实的数据分析&#xff0c;已经对阿里云为什么要聚焦公共云有了结论&#xff0c;这里不…

会 C# 应该怎么学习 C++?

会 C# 应该怎么学习 C&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「C的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&a…

Vue3源码梳理:响应式系统的前世今生

响应性数据的前世 js的程序性: 一套固定的&#xff0c;不会发生变化的执行流程 1 &#xff09;没有响应的数据 // 定义商品对象 const product {price: 10,quantity: 2 }// 总价格 let total product.price * product.quantity console.log(总价格&#xff1a;${total}) //…

【Linux】项目自动化构建工具 - make/Makefile

背景 会不会写makefile&#xff0c;从侧面说明了一个人是否具备完成大型工程的能力。一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefile定义了一系列的规则来指定&#xff0c;哪些文件需要先编译&#xff0c;哪些文件需要后编…

云渲染技术下的虚拟现实:技术探索与革新思考

虚拟现实&#xff08;含增强现实、混合现实&#xff09;是新一代信息技术的重要前沿方向&#xff0c;是数字经济的重大前瞻领域&#xff0c;将深刻改变人类的生产生活方式&#xff0c;产业发展战略窗口期已然形成。但是虚拟现实想要深入改变影响我们的生活&#xff0c;以下技术…

数据结构和算法-最小生成树(prim和krusakal)和最短路径问题(BFS和dijkastra和floyd)

文章目录 最小生成树总览生成树广度优先生成树深度优先生成树最小生成树Prim算法Kruskal算法Prim vs KrusakalPrim的实现Kruskal的实现 小结 最短路径问题单源最短路径问题BFS求无权图的单源最短路径小结Dijkastra算法算法时间复杂度不适用情况 每一对顶点的最短路径问题Floyd算…

C语言目录

以下是根据韦东山C快速学习视频&#xff0c;一天时间过了一下&#xff0c;个人觉得收获很大 : 目录&#xff1a; C语言复习之变量&#xff1a;https://blog.csdn.net/qqmrchen124/article/details/135045434 C语言之结构体,变量赋值等: https://blog.csdn.net/qqmrchen124/arti…

SQL Server 远程连接服务器数据库

本文解决sql server的远程连接问题。需要开启防火墙&#xff0c;开启端口&#xff0c;并处理权限不足的报错: 【use 某数据库】The server principal "[server]" is not able to access the database "[database]" under the current security context. 【…

探秘 AJAX:让网页变得更智能的异步技术(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

低代码发展现状调研和思考

低代码开发是近年来迅速崛起的软件开发方法&#xff0c;让编写应用程序变得更快、更简单。有人说它是美味的膳食&#xff0c;让开发过程高效而满足&#xff0c;但也有人质疑它是垃圾食品&#xff0c;缺乏定制性与深度。你认为低代码到底是美味的膳食还是垃圾食品呢&#xff0c;…