【Unity】如何优雅地实现任何线性效果?
在游戏中,我们经常想实现一些动画效果。比如:物体缓慢转动、沿不规则路线运动、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】如何优雅地实现任何线性效果?相关推荐
- Unity URP世界空间后处理扫描圈效果Shader
实现原理 见这篇文章Unity Shader-深度相关知识总结与效果实现(LinearDepth,Reverse Z,世界坐标重建,软粒子,高度雾,运动模糊,扫描线效果)_puppet_master的 ...
- unity 随机数_Unity 雨水滴到屏幕效果
文章目录 前言 一.实现过程 1.代码 2.代码分步解析 总结 参考 前言 本文主要介绍用unity实现雨水滴到屏幕的效果,文章介绍的是基础实现,读完这篇文章再去实现复杂效果会更得心应手些.我们先看更 ...
- Unity学习笔记(4)-----粒子效果的实现
Unity学习笔记(4)-–粒子效果的实现 一.效果展示 下面用若干张张动图展示效果: 大概就是这样,并不是很难. 实际效果要比图中的好一点(顺畅得多). 实现步骤 大致可以分为如下几个步骤,然后逐个 ...
- Unity 之 ShaderGraph 实现自发光和能量护盾效果入门级教程
Unity 之 ShaderGraph 实现自发光和能量护盾效果入门级教程 前言 一,效果展示 二,原理介绍 三,发光效果 2.1 准备工作 2.2 开始制作 2.3 实际使用 四,护盾效果 2.1 ...
- Unity实用小工具或脚本——可折叠伸缩的多级(至少三级)内容列表(类似于Unity的Hierarchy视图中的折叠效果)
目录 一.前言 二.实现 2.1.创建ScrollView 2.2.制作层级预设体BaseLevelPartObj 2.3.设置该预设体的初始化处理方法 2.4.读取Hierarchy的内容并创建UI ...
- pyqt5可以写手机apk吗_不需要写代码,直接在unity实现手机可以跑的毛发效果
大家好, 我是炭窑居士, 好久不见 这次由我和好友fxyyoung一起给大家带来原创的毛发效果案例:不需要写代码,直接在unity实现手机可以跑的毛发效果! 效果如下面两图,是我们在unity里面直接 ...
- Unity实现模拟仿真飞机起飞降落效果
Unity实现模拟仿真飞机起飞降落效果 前言 在最近的项目中,我实现了一个简单的飞机起飞.降落功能,运用了初中物理速度.加速度,以及Unity的Translate函数实现的.实现的难度一般,效果还可以 ...
- unity给头发添加物理_不需要写代码,直接在unity实现手机可以跑的毛发效果
马上注册,加入CGJOY,让你轻松玩转CGJOY. 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 大家好, 我是炭窑居士, 好久不见 这次由我和好友fxyyoung一起给大家带来原创的毛发 ...
- 着色器编程_unity中的基础纹理,使用Unity Shader实现基础纹理的渲染效果
学习通过使用Unity Shader实现基础纹理的渲染效果 目录 学习通过使用Unity Shader实现基础纹理的渲染效果 问1:详细描述一下漫反射纹理.高度纹理.法线纹理.渐变纹理和遮罩纹理? 问 ...
最新文章
- c# unity PlayerPrefs 游戏存档,直白点就是讲游戏数据本地保存下来
- “编程能力差的程序员,90%会输在这点上”谷歌AI专家:其实都是瞎努力
- IDEA Project Structure 配置说明
- java excel添加公式_JAVA实现EXCEL公式专题(四)——字符串函数
- 【Vegas2010】cnblogs(博客园)排名原来是这样算的~
- php Hash Table(四) Hash Table添加和更新元素
- linux判断内存并释放,linux 内存清理/释放命令
- Bootstrap研究2-布局系统杂记
- 这就是八成女性不爱用刷脸支付的原因!支付宝:一周内给安排上
- 如何弹出一个模式窗口来显示进度条 .
- SublimeText3 插件的使用和本身的配置
- 《Linux内核分析》第三周笔记 构造一个简单的Linux系统MenuOS
- 【Hoxton.SR1版本】Spring Cloud Gateway之Filter详解
- BIM项目分享---港珠澳大桥的BIM应用与管理
- 数据包络分析方法与maxdea软件_北大经济学博士张川川:经济学实证分析方法与论文写作经验分享会(国庆网络专场)...
- 用户画像 客户消费模型表
- 企业微信商户号是什么?如何开通?
- eclipse debug 多线程
- 【资料】wod旗帜,纹章
- 工具类之十七 基于zxing的二维码生成工具类
热门文章
- 外国用户和国内用户看待浏览器的问题
- [附源码]java毕业设计网上书店系统
- 当遇到error: stray ‘\241‘ in program错误的解决方法
- Microsoft Toolkit(win8.1激活工具)v2.5.2 绿色版
- 利用LSTM 做文本分类
- iOS 图片自由裁剪
- JAVA中RandomAccess接口
- Flutter:bottomNavigationBar图标白色的解决办法
- java毕业设计毕业论文答辩管理系统Mybatis+系统+数据库+调试部署
- Android视图绘制流程完全解析(二)