在游戏中,我们经常想实现一些动画效果。比如:物体缓慢转动、沿不规则路线运动、UI淡入淡出、颜色变化、等等。
其实这些效果的背后,都跟一个函数有关系–Lerp
当你了解并掌握这个函数,实现上面的效果对你来说都非常简单。
在本文中,我将分享一下:

  • 使用经验
  • 使用误区
  • 不规则路线的移动

什么是线性插值 ?

两个向量之间的任意值。如图:
向量A,向量B。他们之间的线段AB。在线段AB之间的值,就是线性插值。

对应的 Unity 的 Lerp 函数 Lerp(A, B, 比率t);
比率范围时 0~1 的情况下:
当比率是0时,那插值等于A点。
当比率是1时,插值等于B点。

Unity Lerp 相关函数有哪些?

  • Material.Lerp : 材质之间的插值
  • Vector2.Lerp : 向量之间的插值
  • Vector3.Lerp : 向量之间的插值
  • Mathf.Lerp : 浮点数之间的插值
  • Color.Lerp : 颜色之间的插值

到此为止,如果你理解什么是线性插值。那你应该知道怎么在 Unity 里使用它了。
但是,如果你就此满足。你可能会在漏掉一些细节,从而导致不理想的效果。

使用经验

移动

我们先简单用 Lerp 函数实现物体的 在 1S 内移动。
代码如下:

public class Lerp : MonoBehaviour
{// 终点public Vector3 targetPosition;// 开始位置public Vector3 startPosition;// 持续时间public float lerpDuration = 1f;// 记录运行时间private float _timeElapsed = 0;private void Start(){transform.position = startPosition;}void Update(){// 记录这一帧移动的位置Vector3 valueToLerp;_timeElapsed += Time.deltaTime;if ((_timeElapsed < lerpDuration)){valueToLerp  = Vector3.Lerp(startPosition, targetPosition, _timeElapsed / lerpDuration);transform.position = valueToLerp;}else{valueToLerp = targetPosition;}transform.position = valueToLerp;}
}

效果:

好的,这么一个移动效果就完成了。

取线段的任意一点

换个角度,我们也可以取得 AB 线段上的任意一点的坐标。

代码如下:

public class GetPoint : MonoBehaviour
{// 坐标点Apublic Vector2 a;//  坐标点Bpublic Vector2 b;// 比值public float ratio;private void Update(){var position = Vector3.Lerp(a, b, ratio);transform.position = position;}
}

效果如下:

其他的线性变化效果其实也是同理,只不过你使用的函数方法可能不一样。

文字淡入淡出

![淡入淡出.gif](https://cdn.nlark.com/yuque/0/2022/gif/1256055/1664379245737-f3395f14-280e-47d8-a7f4-3d1f62348c5a.gif

public class FadeToBlack : MonoBehaviour
{public float targetValue = 0;CanvasRenderer elementToFade;void Start(){elementToFade = gameObject.GetComponent<CanvasRenderer>();StartCoroutine(LerpFunction(targetValue, 0.8f));}IEnumerator LerpFunction(float endValue, float duration){while (true){float time = 0;float startValue = elementToFade.GetAlpha();// 淡出while (time < duration){elementToFade.SetAlpha(Mathf.Lerp(startValue, endValue, time / duration));time += Time.deltaTime;yield return null;}elementToFade.SetAlpha(endValue);// 淡入time = 0;while (time < duration){elementToFade.SetAlpha(Mathf.Lerp(endValue, startValue, time / duration));time += Time.deltaTime;yield return null;}elementToFade.SetAlpha(startValue);}}}

渐变

public class LerpMaterialColour : MonoBehaviour
{private Text text;public Color targetColor = new Color(0, 1, 0, 1); void Start(){text = gameObject.GetComponent<Text>();StartCoroutine(LerpFunction(targetColor, 5));}IEnumerator LerpFunction(Color endValue, float duration){float time = 0;Color startValue = text.color;while (time < duration){text.color = Color.Lerp(startValue, endValue, time / duration);time += Time.deltaTime;yield return null;}text.color = endValue;}
}

使用误区

我们平时可能会遇到过,有使用 Lerp 函数实现平滑移动的效果。
效果如下:

代码如下:

public class Lerp_Error1 : MonoBehaviour
{// 终点public Vector3 targetPosition;// 开始位置public Vector3 startPosition;private void Start(){transform.position = startPosition;}void Update(){transform.position = Vector3.Lerp(transform.position, targetPosition, Time.deltaTime);}

❎ 这使用其实不正确的。因为它实际在改变初始值,通过改变AB之间的距离来得出“插值”。这已经不属于线性插值计算了。

况且,想实现平滑移动的效果,我们其实可以使用 SmoothDamp() 方法。具体使用可以参考这篇文章 TODO。

怎么实现不规则运动?

刚刚我们很容易实现了直线运动,那如果我们能把不规则的路线用直线概括指出来,看起来物体只不过是在进行多段直线运动。

如果觉得还不错,可以点个赞。你的喜欢,是我最大的动力。

【Unity】如何优雅地实现任何线性效果?相关推荐

  1. Unity URP世界空间后处理扫描圈效果Shader

    实现原理 见这篇文章Unity Shader-深度相关知识总结与效果实现(LinearDepth,Reverse Z,世界坐标重建,软粒子,高度雾,运动模糊,扫描线效果)_puppet_master的 ...

  2. unity 随机数_Unity 雨水滴到屏幕效果

    文章目录 前言 一.实现过程 1.代码 2.代码分步解析 总结 参考 前言 本文主要介绍用unity实现雨水滴到屏幕的效果,文章介绍的是基础实现,读完这篇文章再去实现复杂效果会更得心应手些.我们先看更 ...

  3. Unity学习笔记(4)-----粒子效果的实现

    Unity学习笔记(4)-–粒子效果的实现 一.效果展示 下面用若干张张动图展示效果: 大概就是这样,并不是很难. 实际效果要比图中的好一点(顺畅得多). 实现步骤 大致可以分为如下几个步骤,然后逐个 ...

  4. Unity 之 ShaderGraph 实现自发光和能量护盾效果入门级教程

    Unity 之 ShaderGraph 实现自发光和能量护盾效果入门级教程 前言 一,效果展示 二,原理介绍 三,发光效果 2.1 准备工作 2.2 开始制作 2.3 实际使用 四,护盾效果 2.1 ...

  5. Unity实用小工具或脚本——可折叠伸缩的多级(至少三级)内容列表(类似于Unity的Hierarchy视图中的折叠效果)

    目录 一.前言 二.实现 2.1.创建ScrollView 2.2.制作层级预设体BaseLevelPartObj 2.3.设置该预设体的初始化处理方法 2.4.读取Hierarchy的内容并创建UI ...

  6. pyqt5可以写手机apk吗_不需要写代码,直接在unity实现手机可以跑的毛发效果

    大家好, 我是炭窑居士, 好久不见 这次由我和好友fxyyoung一起给大家带来原创的毛发效果案例:不需要写代码,直接在unity实现手机可以跑的毛发效果! 效果如下面两图,是我们在unity里面直接 ...

  7. Unity实现模拟仿真飞机起飞降落效果

    Unity实现模拟仿真飞机起飞降落效果 前言 在最近的项目中,我实现了一个简单的飞机起飞.降落功能,运用了初中物理速度.加速度,以及Unity的Translate函数实现的.实现的难度一般,效果还可以 ...

  8. unity给头发添加物理_不需要写代码,直接在unity实现手机可以跑的毛发效果

    马上注册,加入CGJOY,让你轻松玩转CGJOY. 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 大家好,  我是炭窑居士, 好久不见 这次由我和好友fxyyoung一起给大家带来原创的毛发 ...

  9. 着色器编程_unity中的基础纹理,使用Unity Shader实现基础纹理的渲染效果

    学习通过使用Unity Shader实现基础纹理的渲染效果 目录 学习通过使用Unity Shader实现基础纹理的渲染效果 问1:详细描述一下漫反射纹理.高度纹理.法线纹理.渐变纹理和遮罩纹理? 问 ...

最新文章

  1. c# unity PlayerPrefs 游戏存档,直白点就是讲游戏数据本地保存下来
  2. “编程能力差的程序员,90%会输在这点上”谷歌AI专家:其实都是瞎努力
  3. IDEA Project Structure 配置说明
  4. java excel添加公式_JAVA实现EXCEL公式专题(四)——字符串函数
  5. 【Vegas2010】cnblogs(博客园)排名原来是这样算的~
  6. php Hash Table(四) Hash Table添加和更新元素
  7. linux判断内存并释放,linux 内存清理/释放命令
  8. Bootstrap研究2-布局系统杂记
  9. 这就是八成女性不爱用刷脸支付的原因!支付宝:一周内给安排上
  10. 如何弹出一个模式窗口来显示进度条 .
  11. SublimeText3 插件的使用和本身的配置
  12. 《Linux内核分析》第三周笔记 构造一个简单的Linux系统MenuOS
  13. 【Hoxton.SR1版本】Spring Cloud Gateway之Filter详解
  14. BIM项目分享---港珠澳大桥的BIM应用与管理
  15. 数据包络分析方法与maxdea软件_北大经济学博士张川川:经济学实证分析方法与论文写作经验分享会(国庆网络专场)...
  16. 用户画像 客户消费模型表
  17. 企业微信商户号是什么?如何开通?
  18. eclipse debug 多线程
  19. 【资料】wod旗帜,纹章
  20. 工具类之十七 基于zxing的二维码生成工具类

热门文章

  1. 外国用户和国内用户看待浏览器的问题
  2. [附源码]java毕业设计网上书店系统
  3. 当遇到error: stray ‘\241‘ in program错误的解决方法
  4. Microsoft Toolkit(win8.1激活工具)v2.5.2 绿色版
  5. 利用LSTM 做文本分类
  6. iOS 图片自由裁剪
  7. JAVA中RandomAccess接口
  8. Flutter:bottomNavigationBar图标白色的解决办法
  9. java毕业设计毕业论文答辩管理系统Mybatis+系统+数据库+调试部署
  10. Android视图绘制流程完全解析(二)