1. unity物体移动方式之坐标变换(可能会出现穿过刚体的情况,但是简单快捷)

1.1直接对物体坐标进行操作

Transform.Translate(Vector3 translation),Space relativeTo)
  • 前一个变量是物体的移动速度,这里的速度是一个矢量,既包含大小写包含方向。

  • 后一个变量是相对坐标系,这里的相对坐标系有两个值,一个是世界坐标,一个是自身坐标,如果第一个坐标不填写的话,默认为自身坐标系。

  • Transform.Translate()的内部实现其实也是 transform.position += 这种方式

  • 写在Update里面

    transform.Translate(Vector3.up * Time.deltaTime, Space.Self);
    transform.Translate(new Vector3 (1,1,1) * Time.deltaTime, Space.World);
    
  • Time.deltaTime代表后一帧时间减去前一帧时间,相当于每一帧时间的间隔,不加Time.deltaTime代表每帧的移动速度,加了就代表每秒的移动速度,可用于平衡不同电脑不同帧数导致的差异。

  • 因为 Update 的帧间隔与电脑性能有关,而物体受力和帧间隔时间有关会导致物体受力不均匀从而导致物体异常抖动(不是很理解这句话)

  • 可以写在 Fixupdate(固定物理帧) 中解决,因为 Update 帧间隔不固定,而 Fixupdate
    固定0.02s Fixupdate里建议使用Time.fixedDeltaTime

1.2或者直接修改transform的position的值

transform.position +=  (target - gameObject.transform.position) * moveSpeed * Time.deltaTime;
transform.position +=  (target - gameObject.transform.position).normalized * moveSpeed * Time.deltaTime;
  • Vector3.normalized就是把一个方向向量变成单位向量(平方和为一),忽略两个点之间的距离的影响,强调方向

  • 不加这个归一化向量的话,当目标离我越远,我移动越快,越靠近目标就我的移动就越慢
    加了归一化就我的坐标变化速度就主要受moveSpeed影响

1.3 通过一个函数得到下一帧物体要到达的位置再进行移动

1.3.1 以固定的速度移动到目标位置

public static Vector3 MoveTowards(Vector3 current, Vector3 target, float maxDistanceDelta)
  • 将物体从current位置沿直线移动到target位置。
  • maxDistanceDelta是每次调用移动的距离。
  • 返回值是current + maxDistanceDelta,如果这个值超过了target,返回值就是target。(就是说每次调用只往target方向移动 maxDistanceDelta 这么远)
  • 如果要实现匀速运动那就得多次调用(写在Updata或者FixeUpdata里)
transform.position = Vector3.MoveTowards(transform.position, target.transform.position, Time.deltaTime * speed);

1.3.2 平滑一点到达目标位置

public static Vector3 SmoothDamp(Vector3 current, Vector3 target, ref Vector3 currentVelocity, float smoothTime, float maxSpeed)
  • 将物体从current位置沿直线移动到target位置。
  • currentVelocity 当前速度
  • smoothTime 平滑时间
  • maxSpeed 最大速度(不需要Time.deltaTime 底层实现已解决帧数问题)
  • 返回值是
transform.position = Vector3.SmoothDamp(transform.position, target.transform.position, ref velocity,smoothTime,speed);

1.3.3 在规定时间内到达地点

public static float Lerp(float a, float b, float t)  //每次走ab直接距离的t倍
{return a + (b - a) * Clamp01(t);
}
public static float Clamp01(float value)            //限制是小数
{if (value < 0f)return 0f;if (value > 1f)return 1f;return value;
}public static Vector3 Lerp(Vector3 a, Vector3 b, float t)   {t = Mathf.Clamp01(t);return new Vector3(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t, a.z + (b.z - a.z) * t);}
  • 将物体从current位置沿直线移动到target位置。
  • t 是一个百分比 详情看下面例子
  • 返回值是下一帧我应该在的位置
    Vector3 target;float lerpDuration = 4;     //完成运动所需时间float _timeElapsed = 0;     //记录运行时间private void Update(){_timeElapsed += Time.deltaTime;     //计算时间的比例if (_timeElapsed < lerpDuration)    //如果在规定时间内 第一次走距离的 1/4 第二次走剩下距离的 2/4transform.position = Vector3.Lerp(transform.position, target, _timeElapsed / lerpDuration);else                                //如果超出时间就直接到达  如果不这样写会永远到不了transform.position = target;}

2. unity物体移动方式之刚体力的添加(涉及物理引擎的移动方法)

在刚体上添加不同方向的力,从而实现物体的移动,还可以添加力的方式(移动速度与物理特性有关如质量、阻力和重力),但每执行一次只能添加一次力,要想持续运动还得持续调用该方法

  • Vector3 force:力(矢量)
  • Vector3 position:施加力的位置
  • ForceMode mode :力的方式
public void AddForce(Vector3 force)
public void AddForceAtPosition(Vector3 force, Vector3 position,ForceMode mode);

关于作用力方式 ForceMode 的功能注解

ForceMode 为枚举类型,用来控制力的作用方式,有4个枚举成员

  1. ForceMode.Force:默认方式,使用刚体的质量计算,以每帧间隔时间为单位计算动量。
  2. ForceMode.Acceleration:在此种作用方式下会忽略刚体的实际质量而采用默认值1.0f,时间间隔以系统帧频间隔计算(默认值为0.02s)
  3. ForceMode.Impulse:此种方式采用瞬间力作用方式,即把时间的值默认为1,不再采用系统的帧频间隔。
  4. ForceMode.VelocityChange:此种作用方式下将忽略刚体的实际质量,采用默认质量1.0,同时也忽略系统的实际帧频间隔,采用默认间隔1.0。

2D中ForceMode2D只有Force和Impulse
3D中有Force、Acceleration、Impulse和VelocityChange

gameObject.GetComponent<Rigidbody>().AddForce(fore);

3. unity物体移动方式之刚体速度变换(涉及物理引擎的移动方法)

3.1对刚体速度进行操作,赋予物体一个持续不变的速度

功能说明: 此属性用于设置或返回刚体的速度值,其使用说明如下。

  1. 在脚本中无论是给刚体赋予一个Vector3类型的速度向量v,还是获取当前刚体的速度v,v的方向都是相对世界坐标系而言的。

  2. velocity的单位是米每秒,而不是帧每秒,其中米是Unity默认的长度单位。

public Vector3 velocity{get;set;}r1.velocity=new Vector3(0.0f,0.0f,-15.0f);

3.2 使用MovePosition() (2D的)

public void MovePosition(Vector2 position)

在Rigidbody2D的BodyType为Kinematic是不会受到重力和AddForece()等相关函数影响的 ,直接把物体移动到目标位置但是有物理效果

  • Vector2 position:目标位置
    private void FixedUpdate(){var pos = dir * (speed * Time.fixedTime);        //dir 目标方向  speed速度gameObject.GetComponent<Rigidbody2D>().MovePosition(transform.position+ pos);}

详情:
UnityAPI:velocity属性——刚体速度
Unity中的ForceMode——纠正《UnityAPI解析——陈泉宏》一书 关于ForceMode的注解
unity物体移动三种方式之——AddForceAtPosition(一)
物体移动——三种方法
Unity Movetowards方法
【Unity】如何优雅地移动物体?8种方式

Unity学习01-unity物体移动三种方式相关推荐

  1. pyecharts学习(part1)--绘制图表的三种方式

    学习笔记,仅供参考,有错必究 文章目录 pyecharts学习 绘制图表的三种方式 绘制的图表生成HTML jupyter notebook 内嵌展示 pyecharts生成图片 pyecharts学 ...

  2. 【Spring MVC学习】WebApplicationContext初始化的三种方式

    ApplicationContext是Spring的核心,Context我们通常解释为上下文环境,我想用"容器"来表述它更容易理解一些,ApplicationContext则是&q ...

  3. Spring学习总结3——配置datasource三种方式

    为什么80%的码农都做不了架构师?>>>    jdbc.properties文件信息 ##Oracle 11g jdbc.driverClassName=oracle.jdbc.O ...

  4. 【CSDN软件工程师能力认证学习精选】vue.js 三种方式安装(vue-cli)

    CSDN软件工程师能力认证(以下简称C系列认证)是由中国软件开发者网CSDN制定并推出的一个能力认证标准.C系列认证历经近一年的实际线下调研.考察.迭代.测试,并梳理出软件工程师开发过程中所需的各项技 ...

  5. Unity中创建游戏物体的三种方法:

    通过new GameObject(); 通过Instantiate(): 通过GameObject.CreatePrimitive(): 总结: 1)new GameObject()可通过字符串名字来 ...

  6. Unity技术手册 - 创建物体有几种方式?

    往期文章分享 点击跳转=><导航贴>- Unity手册,系统实战学习 点击跳转=><导航贴>- Android手册,重温移动开发

  7. 【Unity基础】人物控制的三种方式(键盘)、(鼠标)、(键鼠)

    先看效果: (键鼠): 人物会随着指针转动,WASD控制人物移动. 鼠标 键盘就是去除掉键鼠的看向鼠标指针,改成看向最后方向 代码: using System.Collections; using S ...

  8. Java学习笔记——显示当前日期的三种方式

    一.Date类:这是一种过时的表达方式 import java.util.Date; Date date = new Date();System.out.println((1900+date.getY ...

  9. java如何显示当天世界_Java学习笔记——显示当前日期的三种方式

    一.Date类:这是一种过时的表达方式 import java.util.Date;Date date = new Date(); System.out.println((1900+date.getY ...

  10. Unity3D获取游戏对象组件的三种方式

    Unity获取游戏对象组件的三种方式 用Find查询 1. GameObejct go = GameObject.Find("对象名").GetComponent<获取对象上 ...

最新文章

  1. 薛宇 AI boom
  2. Android Studio使用总结
  3. 线段树/树状数组问题 | 问题集合
  4. 《老子》第八十一章 信言不美,美言不信
  5. 老男孩python21期作业_(禁闲聊)绘画讨论10个群第176期作业展示
  6. 深入浅出 ASP.NET Core 与 Docker 入门课程说明
  7. Linux Top使用说明
  8. 系统学习深度学习(二十七)--CTC
  9. 烽火fr2600怎么web登录_烽火路由器回收,烽火交换机回收,烽火无线AP回收
  10. 自媒体是什么?三大媒体平台详细介绍,不了解的赶紧看着吧!
  11. c语言快捷键的使用方法,电脑快捷键的使用方法
  12. Linux分卷压缩后,Windows解压缩
  13. c语言10k ntc 测温表,10KNTC热敏电阻对照表.doc
  14. L1-1 寻找250(10 分)
  15. 弘辽科技:拼多多推广计划怎么设置划算?如何做好推广?
  16. Android播放音乐案例分享
  17. STM32+光敏模块
  18. 【车载】TCS/ASR/TRC牵引力控制系统
  19. 【独立版】零点城市社交电商V2.1.8.5全开源+VUE前端,新增券码等插件
  20. 《悟透JavaScript》诞生历程精美配乐视频

热门文章

  1. 信息系统项目管理师计算题(进度管理总浮动时间、自由浮动时间、工期)
  2. 思维导图使用技巧:手把手教你怎么画思维导图
  3. 线阵相机、镜头及光源的选型
  4. 腾达路由器设置成中继模式
  5. ENVI5.3处理高分五号影像数据
  6. python评分卡模型 简书_评分卡模型开发-定量特征筛选
  7. MD5加密----------
  8. 产品经理——产品方法论
  9. 淘口令 java,抓包获取淘口令的解决方案
  10. 计算机专业有没有3D打印,3D打印技术属于哪个专业_招生问答