Unity中人物移动的几种方式
1.使用Transform组件
(1)transform.position(最基础,最常用):
这是通过上下左右键控制人物运动的方法
//获取水平按键,左键或A 则值为-1f,右键或D 则值为1f
horizontal = Input.GetAxis("Horizontal");//获取垂直按键,上键或W 则值为-1f,下键或S 则值为1f
vertical = Input.GetAxis("Vertical");Vector2 position = transform.position;
position.x = position.x + speed * horizontal*Time.deltaTime;//Time.deltaTime在小技巧中有讲,speed在最开始赋值,或者外部赋值
position.y = position.y + speed * vertical * Time.deltaTime;
transform.position = position;注意: transform.position = position; // 通过transform获取位置会在人物与碰撞体碰撞时发生抖动,所以一般使用刚体的rigidbody2d.position
(2) transform.Translate(v3向量,坐标系):这个坐标系有两种,一种世界坐标系Space.World;一种局部坐标系Space.Self,当这个坐标系不写时,默认的为局部坐标系,这里可以看坐标系
这是局部坐标系:
这是世界坐标:
public float speed;
private void update( ){
//沿z轴移动,如果想要自己控制,参照(1)的写法
transform. Translate(new Vector3(0, 0, speed*Time. deltaTime ) , Space .World);}
2.使用 Vector3插值 (1是速度越来越慢,3是匀速,4是先匀速再速度越来越慢)
(1)Vector3.Lerp(当前位置(V3),目标位置(V3),速度(float)):线性移动由速度参数控制
速度越小,物体越慢,这里速度其实就是插值的比例(0~1),例如总路程为1,速度为0.5,第一次插值后两者距离为1*0.5,第二次插值为(1-(1*0.5)*0.5),缓动效果(越靠近目标越慢)(这里的缓动效果会无限接近目标,但是接近不了),一般用来控制相机的移动
public float speed;
public Transform target;//目标对象
private void Update(){
Vector3 V = Vector3.Lerp( transform.position,target. position, speed * Time .deltaTime);
transform.position = V;
}
(2) Vector3.Slerp(当前位置(V3),目标位置(V3),速度(float)):这就是通过抛物线的形式到达目标点(不常用)
(3)Vector3.MoveTowards(当前位置(V3),目标位置(V3),最大速度(float)):速度取正靠近目标,速度取负远离目标,注意这是做匀速直线运动靠近目标
(4)Vector3.SmoothDamp(当前位置(V3),目标位置(V3),当前速度(ref:V3),缓动时间(float),最大速度(float)):官方翻译为“平滑阻尼”,也就是移动过程中,逐渐变慢的抵达终点(这里缓动可以到达目标),这里的最大速度可以不用写,当前速度参数:应为全局变量,这个值由你每次调用这个函数时被修改所以是ref(这里的当前速度不用赋值),缓动间参数:该值越小,越快抵达目标
public float time;
public Vector3 cspeed = Vector3 . zero;
public transform t;
private void Update(){
Vector3 V = Vector3. SmoothDamp(transform.position, t.position,ref cspeed,
time*Time.deltaTime) ;}
transform. position = V;
3.使用刚体组件 :
(1)AddForce(有方向的力(V3),力的模式):这里就可以理解为给刚体了一个带有方向的力,
注意:1.建议放置在FixedUpdate函数下 2.移动物体需要添加刚体 3.适合模拟外力作用下的刚体运动(因此经常用来做发射子弹)4.此力为累加,不适合重复施加力来模拟物体
力的模式(ForceMode)总共有四种:
1.Force(叫持续的力,受质量影响) (默认),不写力的模式的时候就是这个(持续力,用质量)2.Impulse(一个瞬间冲击力,受质量影响)(瞬间力,用质量)
3.Acceleration(可持续的加速度,不受质量影响)(持续加速度,不用质量)
4.VelocityChange(一个瞬间速度变化,不受质量影响)(瞬间加速度,不用质量)
(2)MovePosition(新的位置(V3)):这里新的位置(V3)是transform.position+dir(移动的v3向量方向)*speed*Time.deltaTime
(3)Velocity:直接设置物体的速度(不用考虑质量)(注意这是一个属性,速度有方向和大小,所以是直接用v3矢量直接赋值表示速度的方向和大小),经常用来做人物的跳跃和移动
void Run()//这是奔跑移动函数
{
float moveDir = Input.GetAxis("Horizontal");
lookDirection = moveDir;乘上//这里如果Run放在update中最好是在speed后乘上Time.deltaTime
Vector2 playerVel = new Vector2(moveDir*speed,M_Rigidbody2D.velocity.y);
M_Rigidbody2D.velocity = playerVel;
}void Jump()//这是跳跃函数
{
if (Input.GetKeyDown(KeyCode.K))
{
Vector2 jumpVel = new Vector2(M_Rigidbody2D.velocity.x, jumpspeed);
M_Rigidbody2D.velocity = jumpVel;
}
}
注意这里的所有V3向量在2D平面游戏中都可以变成V2向量
Unity中人物移动的几种方式相关推荐
- 实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
贺邦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数 ...
- mysql 执行cmd,mysql命令行中执行sql的几种方式总结
1.直接输入sql执行 MySQL> select now(); +---------------------+ | now() | +---------------------+ | 2013 ...
- mysql的调用有哪三种方式_MySQL数据库之mysql命令行中执行sql的几种方式总结
本文主要向大家介绍了MySQL数据库之mysql命令行中执行sql的几种方式总结 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 1.直接输入sql执行 MySQL> se ...
- es重建字段类型_关于elasticsearch中更新数据的几种方式
作为一个成熟的框架,Elasticsearch里面提供了丰富的操作数据的api,本篇我们就来学习一下在es中更新数据的几种方式. (一)更新文档 (1)部分更新: java api: ` HashMa ...
- Django中Model继承的三种方式
Django中Model继承的三种方式 Django中Model的继承有三种: 1.抽象继承 2.多表继承 3.proxy model(代理model) 1.抽象继承 第一种抽象继承,创建一个通用父类 ...
- java直接调用复制文件,java中文件复制的4种方式,java文件的复制
java中文件复制的4种方式,java文件的复制 今天一个同事问我文件复制的问题,他一个100M的文件复制的指定目录下竟然成了1G多,吓我一跳,后来看了他的代码发现是自己通过字节流复制的,定义的字节数 ...
- android获取自定义属性,android 自定义控件中获取属性的三种方式(转)
第一种方法,直接设置属性值,通过attrs.getAttributeResourceValue拿到这个属性值. (1)在xml文件中设置属性值 android:layout_width="f ...
- Java中HashMap遍历的两种方式
第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Ma ...
- UE4学习-在虚幻编辑器中打开VS的三种方式
文章目录 方式一 方式二 方式三 在虚幻编辑器中打开VS的三种方式 方式一 在文件浏览器这里,选择C++类,然后在文件夹内,找到一个和截图中类似的图标,双击,即打开vs,并在vs中打开这个类的代码. ...
最新文章
- 深度学习框架大战,我该选哪个?
- 卡尔曼滤波器中的Q,R
- python软件是免费的吗-谁说程序员不懂浪漫?用Python每天自动给女朋友免费发短信...
- MySQL的IFNULL函数
- 四边形可以分为几类_四边形有几种类型
- android json转字符串数组,转换字符串到json数组出错
- 二阶振荡衰减 matlab,基于Matlab/Simulink的二阶控制系统仿真研究
- 织梦dedecms转WordPress方法(脚本一键转换)
- 新入职了一个卷王,一来就把性能提升4倍,这谁受的了~
- 重构(Refactoring)概要描述
- 数据结构上机实践第三周项目3- 求集合并集
- 九度OJ 1133:学分绩点 (加权平均数)
- NMEA0183格式GPS数据详解
- Java开发工程师如何做好职业规划和成长路线
- 工业相机IO口控制STM32输出PWM波
- 从底层谈webgis原理设计与实现(二)探究本质,WebGIS前端地图显示之地图比例尺换算原理...
- 地铁刷手机 android版,北京地铁全线支持刷安卓手机乘车 附攻略!
- WordPress网站屏蔽后台搜索词广告-奇它博客
- 什么是文件管理软件?你为什么需要它?
- 笔记本拆c面_继续拆解 C面下方还藏有玄机_神舟 战神GX8 PRO_笔记本评测-中关村在线...
热门文章
- ADC的过采样与欠采样
- 修改app实现,设为手机桌面(安卓)
- 157、在系统中查找重复文件
- XPS格式轻松处理!Aspose.Page即将支持C++语言平台!
- adroid再谈如何将android studio项目转换成eclipse
- iphone6s gpu Android,iPhone 7 GPU性能首曝:安卓全家被虐哭!
- 吃鸡登录界面一直服务器维护,绝地求生正式服停机维护到几点?吃鸡进不去怎么办?...
- ECharts 饼图实现自定义标签包含图标icon(圆形图标,矩形图标)
- TensorRT(10):python版本安装
- mysql中字符串和时间相互转换的方法