unity物体四种移动方法总结

2023-11-15

目录

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

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

三.通过输入控制物体移动


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

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

1.使用Translate()函数。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5a2m5Lmg5L2_5oiR5b-r5LmQMTM=,size_9,color_FFFFFF,t_70,g_se,x_16

2.,直接指定新的位置

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5a2m5Lmg5L2_5oiR5b-r5LmQMTM=,size_12,color_FFFFFF,t_70,g_se,x_16

将上述两种方法在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()对物体施加力改变位置

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5a2m5Lmg5L2_5oiR5b-r5LmQMTM=,size_9,color_FFFFFF,t_70,g_se,x_16

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

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

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

2.直接修改物体的速度

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5a2m5Lmg5L2_5oiR5b-r5LmQMTM=,size_18,color_FFFFFF,t_70,g_se,x_16

 此处表示物体在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);
    }

三.通过输入控制物体移动

以键盘的WASD为例

参考unity的输入管理器的横轴输入与纵轴输入

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5a2m5Lmg5L2_5oiR5b-r5LmQMTM=,size_13,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5a2m5Lmg5L2_5oiR5b-r5LmQMTM=,size_13,color_FFFFFF,t_70,g_se,x_16

常利用Input.GetAxis()Input.GetAxisRaw()

两者区别,前者范围为-1~1,后者范围为1,0,1

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5a2m5Lmg5L2_5oiR5b-r5LmQMTM=,size_12,color_FFFFFF,t_70,g_se,x_16

输入以上代码,可以通过Console查看输入值。

由于

我们可以通过简单的相乘将物体移动联系起来,这里我们采用GetAxis()见下图

第一种方法

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;

即此处每帧最大的位移为1*10*0.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);
    }

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unity物体四种移动方法总结 的相关文章

  • halfShader 模型切割

    Shader Unlit halfShader Properties Diffuse Diffuse Color 1 1 1 1 MainTex Texture 2D white StartCutoff StartCutoff Range
  • unity粒子特效附上贴图后播放动画

    转自 http jingyan baidu com article f96699bbb1a0d6894f3c1b77 html 参考 http www unitymanual com thread 2993 1 1 html dsign a
  • unity game界面按下play会不断闪烁,按下暂停键(pause)或者中止/下一步(step),game界面的画面会接连变化

    没找到答案 改了两个下午的程序 改完还是这样 后来发现是FixedUpdate Update与OnDrawGizmos的问题 OnDrawGizmos是每帧都会绘制 用FixedUpdate理所当然就那啥了 分析的时候 就突然想到是不是这俩
  • 【UGUI】2D头顶血条制作

    前言 近期因为需要制作玩家和敌人头顶的2D血条 查找了很多博客 发现很多都拘束于Canvas的渲染模式必须要设定为ScreenSpace Overlay 还有应该是版本原因 我的是unity2019 1 11f1 用RecttTransfo
  • unity网络资源导入

    1 找到需要导入的文件 这里导入fbx格式 2 打开unity界面 在Asset目录下创建文件夹FBX 将需要导入的fbx预制体或整个文件夹拖入创建的FBX文件夹下 3 选中需要的fbx预制体并拖至场景中 4 双击定位到当前物体 5 找到需
  • Unity中按钮检测鼠标状态

    改方法主要是用于按钮检测鼠标的进入 滑出 点击 抬起 长按 长按停止 1 先将下面这个脚本挂载到需要检测鼠标状态的按钮上 using System Collections using System Collections Generic u
  • Unity中实现倒计时的几种方式

    1 Time time using UnityEngine public class TimeTest MonoBehaviour public float secound 10 void Update Timing private flo
  • GooglePlay提审警告(com.google.android.gms:play-services-safetynet:17.0.0)

    1 Goole在今年6月份出的新政策 不在使用safetynet 而使用Play Integrity API 2 项目本身没有使用过safetynet 3 使用了firebase 查阅资料 解决方案如下 implementation pla
  • Unity 键盘控制人物移动——之输入方式代码的编写

    键盘输入 控制人物移动 在我们制作游戏中最常见的需求之一就是使用键盘移动游戏角色 那么我们首先需要获取键盘输入 以下提供两种方法获取键盘 这里尽量通过截图解释让大家理解代码的含义 GetInput void FixedUpdate Move
  • VLC for unity 插件如何使用

    VLC for unity 插件如何使用 先去下载一个VLC播放器 安装完成后 然后导入插件链接https download csdn net my 这个插件我的另一个上传资源里有 或者到商店去下载 这个插件链接下载完是一个txt文档 里面
  • Unity旋转以及万向锁问题

    我之前研读了一些关于unity旋转相关的博客 一直想抽个时间写个总结 但是由于实习太忙一直没有写 趁着今天请了假晚上有时间把这段时间一些学习心得写出来 Unity inspector面板中的Rotation 在unity中 想必大家最先接触
  • unity3d切换场景Application.LoadLevel(1)含义

    Application LoadLevel 1 场景ID
  • 【Unity】如何让Unity程序一打开就运行命令行命令

    背景 Unity程序有时依赖于某些服务去实现一些功能 此时可能需要类似打开程序就自动运行Windows命令行命令的功能 方法 using UnityEngine using System Diagnostics using System T
  • 【转载】【Unity】WebSocket通信

    1 前言 Unity客户端常用的与服务器通信的方式有socket http webSocket 本文主要实现一个简单的WebSocket通信案例 包含客户端 服务器 实现了两端的通信以及客户端向服务器发送关闭连接请求的功能 实现上没有使用U
  • Unity学习笔记

    一 旋转欧拉角 四元数 Vector3 rotate new Vector3 0 30 0 Quaternion quaternion Quaternion identity quaternion Quaternion Euler rota
  • U3D游戏开发中摇杆的制作(NGUI版)

    在PC端模拟摇杆 实现控制摇杆让玩家或者物体移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine public clas
  • 游戏开发常见操作梳理之NPC任务系统

    多数游戏存在任务系统 接下来介绍通过NPC触发任务的游戏制作代码 using System Collections using System Collections Generic using UnityEngine
  • 游戏开发之常见操作梳理——武器装备商店系统(NGUI版)

    游戏开发中经常出现武器商店 接下来为你们带来武器装备商店系统的具体解决办法 后续出UGUI Json版本 敬请期待 武器道具的具体逻辑 using System Collections using System Collections Ge
  • 游戏开发常见操作梳理之角色选择一

    进入游戏后 我们经常会进入角色选择的界面 通常是左右两个按钮可以更改角色供玩家选择 对于这种界面我们通常使用数据持久化将角色信息存储起来 接下来的笔记中 我将使用自带的数据持久化系统对其进行操作 实现角色的选择页面 后续会更新xml系列的文
  • 游戏开发常见操作系列之敌人系统的开发一(U3D)

    在开发游戏的过程中 我们常常会出现一些敌人攻击我们玩家 并且实现掉血以及死亡的现象 敌人还会源源不断地生成 这是怎么制作的呢 接下来为大家提供方法 其中使用了NGUI 后续会更新其它方法 敬请期待 使用HUDText实现扣血时显示文本 直接

随机推荐

  • vue 纯前端导出 excel

    1 安装2个依赖 npm install file saver xlsx S 加载script 需要 npm install script loader D 2 在 src 目录下新建 vendor文件夹 用于存放 Blob js 和 Ex
  • 浅谈list的remove方法

    List list new ArrayList lt gt list add 11 list add 12 list add 13 list add 14 list add 15 list add 16 for Integer i 0 i
  • MATLAB 学习笔记(4)MATLAB 数组

    目录 MATLAB数组 MATLAB中的特殊阵列 MATLAB 魔方矩阵 MATLAB 多维数组 详细例子 MATLAB数组函数 详细示例 MATLAB数组排序 MATLAB单元阵列 注意 详细例子 MATLAB在单元格上阵列访问数据 MA
  • [Jenkins创建windows子节点]

    正常部署Jenkins有两种方式 一个是直接war或者msi的包在windows系统上搭建 但是windows搭建一般是自己本机进行测试 如果有多台机器同时持续集成的时候 windows并不是一个合适的方式 之前我们已经搭建了一个Rocky
  • 美团笔试题 淘汰分数

    美团笔试题 淘汰分数 某比赛已经进入了淘汰赛阶段 已知共有n名选手参与了此阶段比赛 他们的得分分别是a 1 a 2 a n 小美作为比赛的裁判希望设定一个分数线m 使得所有分数大于m的选手晋级 其他人淘汰 但是为了保护粉丝脆弱的心脏 小美希
  • TCP传输中使用AES加密和gizp压缩

    最近项目需求需要用到TCP传输 为了保证安全传输使用AES 为了使 传输过程中减 数据量小 使用gzip压缩 特此分享一哈 一 AES加密 关于AES的资料网上很多 个人觉得 加密与解密 第三版 很不错 这本书中P155开始讲AES 下载地
  • linux下c 和dlib实现人脸识别,人脸识别(dlib版)-1 dlib 安装及基础使用

    Dlib 是一个 C 工具库 包含机器学习算法 图像处理 网络及一些工具类库 在工业界 学术界都得到广泛使用 接下来的几篇文章中 我将会分享 dlib 库在人脸识别中的应用 这篇文章 将介绍dlib库的安装及基础使用 安装 推荐使用编译源码
  • pycharm如何连接hive数据库

    pip install pyhive from pyhive import hive 查询所有数据库 conn hive Connection host IP地址 username 用户名 database 数据库 auth NOSASL
  • 【华为OD机试真题 JAVA】找到它

    JS版 华为OD机试真题 JS 找到它 标题 找到它 时间限制 1秒 内存限制 65536K 语言限制 不限 找到它是个小游戏 你需要在一个矩阵中找到给定的单词 假设给定单词HELLOWORLD 在矩阵中只要能找到H gt E gt L g
  • 用加持了大模型的 Byzer-Notebook 做数据分析是什么体验

    Byzer Notebook 是专门为 SQL 而研发的一款 Web Notebook 他的第一公民是 SQL 而 Jupyter 则是是以 Python 为第一公民的 随着 Byzer 引擎对大模型能力的支持日渐完善 Byzer Note
  • IDA中的_OWORD

    IDA中的 OWORD 一个有意思的巧合 OWORD的含义 总结 阅读之前注意 本文阅读建议用时 5min 本文阅读结构如下表 项目 下属项目 测试用例数量 一个有意思的巧合 无 0 OWORD的含义 无 1 总结 无 0 一个有意思的巧合
  • ERP系统31.83版本发布,一键极速连接企业供应链!

    近日 ERP系统31 83版本正式发布 无处不在的互联网 正在改变企业与用户的连接方式 一旦享受过什么叫实时 就再也无法忍受延迟 一旦感受过什么叫便捷 就再也无法忍受繁琐 企业如何全方位提高服务效率和用户体验 此次升级的智邦国际ERP系统3
  • Excel表格中函数CEILING的用法

    今天查找Excel表格中CEILING函数的用法 解答的人说的天花乱坠 但是就是描述不清楚 自己去试验了一下 才清楚了 发个博客 CEILING函数是将参数Number向上舍入 沿绝对值增大的方向 为最接近的 significance 的倍
  • 《CTFshow-Web入门》09. Web 81~90

    Web 入门 索引 web81 题解 web82 题解 原理 web83 题解 web84 题解 web85 题解 web86 题解 web87 题解 原理 web88 题解 web89 题解 web90 题解 ctf web入门 索引 w
  • Unity3D——简单入门知识以及实现鼠标控制物体移动、旋转

    是时候拿出小本本整理一下最近游戏设计课程的东西辣 简单的背景知识 Unity3D由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏 建筑可视化 实时三维动画等类型互动内容的多平台的综合型游戏开发工具 是一个全面整
  • 用Python编写《唐僧大战白骨精》简单小游戏

    游戏规则 1 无论用户选择什么角色 都会以 唐僧 角色进行游戏 选择后会显示选择的角色以及攻击力和生命值 2 唐僧可以进行的选择有三个 练级 打BOSS 逃跑 当唐僧选择练级 生命值和攻击力会提升 当唐僧选择打BOSS 双方会交替互相攻击
  • 光线传感器的定义、组成、原理、类型及应用

    光线传感器的定义 光线传感器是一种可以检测光线强度的电子传感器 它可以检测到周围环境的光照强度 它是一种常用的传感器 用于检测环境的光线 可以用来控制电子设备的开关 例如自动灯光 安全系统 自动窗帘等 光线传感器的组成 光线传感器由光电探测
  • JMM内存模型

    Java内存模型即Java Memory Model 简称JMM JMM定义了Java 虚拟机 JVM 在计算机内存 RAM 中的工作方式 JVM是整个计算机虚拟模型 所以JMM是隶属于JVM的 如果我们要想深入了解Java并发编程 就要先
  • Python简单介绍

    在这里插入代码片 提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 Python概述 二 Python的特点 三 Python的缺点 四 Python的应用领域 前言 想要学会一门计算机语言 一定要对这门
  • unity物体四种移动方法总结

    目录 一 通过修改位置来实现移动 二 通过物理系统实现位移 三 通过输入控制物体移动 一 通过修改位置来实现移动 利用修改Transform组件的position的两种常用方法 1 使用Translate 函数 2 直接指定新的位置 将上述