Unity3D 31种缓动曲线

2024-02-07 19:59
文章标签 31 曲线 unity3d 缓动

本文主要是介绍Unity3D 31种缓动曲线,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

因为太多了,而且在我项目里是策略实现,这三十多种搞完真的吐一口老血

如果有类似需要,建议是用文本替换去直接用现成的,(又吐一口老血)

《曲线演示与函数》

在这里插入图片描述

曲线的接口

public interface ICurve{// 0 <= x <= 1public float Evaluate(float x);}

获取曲线的方式

  public class BuiltInCurve{public static ICurve GetCurve(EaseCurve curveType){switch (curveType){case EaseCurve.Linear:return LinearCurve.Instance;case EaseCurve.InSine:return InSineCurve.Instance;case EaseCurve.OutSine:return OutSineCurve.Instance;case EaseCurve.InOutSine:return InOutSineCurve.Instance;case EaseCurve.InQuad:return InQuadCurve.Instance;case EaseCurve.OutQuad:return OutQuadCurve.Instance;case EaseCurve.InOutQuad:return InOutQuadCurve.Instance;case EaseCurve.InCubic:return InCubicCurve.Instance;case EaseCurve.OutCubic:return OutCubicCurve.Instance;case EaseCurve.InOutCubic:return InOutCubicCurve.Instance;case EaseCurve.InQuart:return InQuartCurve.Instance;case EaseCurve.OutQuart:return OutQuartCurve.Instance;case EaseCurve.InOutQuart:return InOutQuartCurve.Instance;case EaseCurve.InQuint:return InQuintCurve.Instance;case EaseCurve.OutQuint:return OutQuintCurve.Instance;case EaseCurve.InOutQuint:return InOutQuintCurve.Instance;case EaseCurve.InExpo:return InExpoCurve.Instance;case EaseCurve.OutExpo:return OutExpoCurve.Instance;case EaseCurve.InOutExpo:return InOutExpoCurve.Instance;case EaseCurve.InCirc:return InCircCurve.Instance;case EaseCurve.OutCirc:return OutCircCurve.Instance;case EaseCurve.InOutCirc:return InOutCircCurve.Instance;case EaseCurve.InBack:return InBackCurve.Instance;case EaseCurve.OutBack:return OutBackCurve.Instance;case EaseCurve.InOutBack:return InOutBackCurve.Instance;case EaseCurve.InBounce:return InBounceCurve.Instance;case EaseCurve.OutBounce:return OutBounceCurve.Instance;case EaseCurve.InOutBounce:return InOutBounceCurve.Instance;case EaseCurve.InElastic:return InElasticCurve.Instance;case EaseCurve.OutElastic:return OutElasticCurve.Instance;case EaseCurve.InOutElastic:return InOutElasticCurve.Instance;default:throw new ArgumentException("Invalid EaseCurve value", "curveType");}}}

曲线的枚举

namespace AirFramework
{public enum EaseCurve{Linear,         // 线性缓动,匀速运动InSine,         // 正弦加速缓动,开始缓慢,后来加速OutSine,        // 正弦减速缓动,开始快速,后来减速InOutSine,      // 正弦波缓动,先加速后减速InQuad,         // 二次方加速缓动,开始缓慢,后来加速OutQuad,        // 二次方减速缓动,开始快速,后来减速InOutQuad,      // 二次方波缓动,先加速后减速InCubic,        // 三次方加速缓动,开始缓慢,后来加速OutCubic,       // 三次方减速缓动,开始快速,后来减速InOutCubic,     // 三次方波缓动,先加速后减速InQuart,        // 四次方加速缓动,开始缓慢,后来加速OutQuart,       // 四次方减速缓动,开始快速,后来减速InOutQuart,     // 四次方波缓动,先加速后减速InQuint,        // 五次方加速缓动,开始缓慢,后来加速OutQuint,       // 五次方减速缓动,开始快速,后来减速InOutQuint,     // 五次方波缓动,先加速后减速InExpo,         // 指数加速缓动,开始缓慢,后来加速OutExpo,        // 指数减速缓动,开始快速,后来减速InOutExpo,      // 指数波缓动,先加速后减速InCirc,         // 圆形加速缓动,开始缓慢,后来加速OutCirc,        // 圆形减速缓动,开始快速,后来减速InOutCirc,      // 圆形波缓动,先加速后减速InOutBack,      // 先正弦减速后正弦加速缓动,开始快速,后来减速,再加速InBack,         // 回退加速(类似弹簧),开始缓慢,后来加速并回退一定距离,然后减速回弹OutBack,        // 回退减速(类似弹簧),开始快速,后来减速并回退一定距离,然后加速回InBounce,       // 弹跳加速缓动,开始缓慢,后来加速并反弹OutBounce,      // 弹跳减速缓动,开始快速,后来减速并反弹InOutBounce,    // 弹跳波缓动,先加速后减速并反弹InElastic,      // 弹性加速缓动,开始缓慢,后来加速并弹性拉伸OutElastic,     // 弹性减速缓动,开始快速,后来减速并弹性拉伸InOutElastic,   // 弹性波缓动,先加速后减速并弹性拉伸}}

以下是曲线的实现

using System;namespace AirFramework
{#region Linearpublic class LinearCurve : Singleton<LinearCurve>, ICurve{public float Evaluate(float x){return x;}}#endregion#region Sinepublic class InSineCurve : Singleton<InSineCurve>, ICurve{public float Evaluate(float x){return -(float)Math.Cos((double)(x * 1.5707964f)) + 1f;}}//2public class OutSineCurve : Singleton<OutSineCurve>, ICurve{public float Evaluate(float x){return (float)Math.Sin((double)(x * 1.5707964f));}}//3public class InOutSineCurve : Singleton<InOutSineCurve>, ICurve{public float Evaluate(float x){return -0.5f * ((float)Math.Cos((double)(Math.PI * x)) - 1f);}}#endregion#region Quad//4public class InQuadCurve : Singleton<InQuadCurve>, ICurve{public float Evaluate(float x){return x * x;}}//5public class OutQuadCurve : Singleton<OutQuadCurve>, ICurve{public float Evaluate(float x){return 1f - (1f - x) * (1f - x);}}//6public class InOutQuadCurve : Singleton<InOutQuadCurve>, ICurve{public float Evaluate(float x){return x < 0.5f ? 2f * x * x : 1f - 2f * (1f - x) * (1f - x);}}#endregion#region Cubic//7public class InCubicCurve : Singleton<InCubicCurve>, ICurve{public float Evaluate(float x){return x * x * x;}}//8public class OutCubicCurve : Singleton<OutCubicCurve>, ICurve{public float Evaluate(float x){var t = x - 1f;return t * t * t + 1f;}}//9public class InOutCubicCurve : Singleton<InOutCubicCurve>, ICurve{public float Evaluate(float x){return x < 0.5f ? 4f * x * x * x : 1f + 4f * (x - 1f) * (x - 1f) * (x - 1f);}}#endregion#region Quart//10public class InQuartCurve : Singleton<InQuartCurve>, ICurve{public float Evaluate(float x){return x * x * x * x;}}//11public class OutQuartCurve : Singleton<OutQuartCurve>, ICurve{public float Evaluate(float x){var t = x - 1f;return 1f - t * t * t * t;}}//12public class InOutQuartCurve : Singleton<InOutQuartCurve>, ICurve{public float Evaluate(float x){return x < 0.5f ? 8f * x * x * x * x : 1f - 8f * (x - 1f) * (x - 1f) * (x - 1f) * (x - 1f);}}#endregion#region Quint//13public class InQuintCurve : Singleton<InQuintCurve>, ICurve{public float Evaluate(float x){return x * x * x * x * x;}}//14public class OutQuintCurve : Singleton<OutQuintCurve>, ICurve{public float Evaluate(float x){var t = x - 1f;return t * t * t * t * t + 1f;}}//15public class InOutQuintCurve : Singleton<InOutQuintCurve>, ICurve{public float Evaluate(float x){return x < 0.5f ? 16f * x * x * x * x * x : 1f + 16f * (x - 1f) * (x - 1f) * (x - 1f) * (x - 1f) * (x - 1f);}}#endregion#region Expo//16public class InExpoCurve : Singleton<InExpoCurve>, ICurve{public float Evaluate(float x){return x == 0f ? 0f : (float)Math.Pow(2f, 10f * (x - 1f));}}//17public class OutExpoCurve : Singleton<OutExpoCurve>, ICurve{public float Evaluate(float x){return x == 1f ? 1f : -(float)Math.Pow(2f, -10f * x) + 1f;}}//18public class InOutExpoCurve : Singleton<InOutExpoCurve>, ICurve{public float Evaluate(float x){if (x == 0f) return 0f;if (x == 1f) return 1f;return x < 0.5f ? 0.5f * (float)Math.Pow(2f, 10f * (2f * x - 1f)) : 0.5f * (-(float)Math.Pow(2f, -10f * (2f * x - 1f)) + 2f);}}#endregion#region Circpublic class InCircCurve : Singleton<InCircCurve>, ICurve{public float Evaluate(float x){return 1f - (float)Math.Sqrt(1f - x * x);}}//20public class OutCircCurve : Singleton<OutCircCurve>, ICurve{public float Evaluate(float x){return (float)Math.Sqrt(1f - (x - 1f) * (x - 1f));}}//21public class InOutCircCurve : Singleton<InOutCircCurve>, ICurve{public float Evaluate(float x){return x < 0.5f ? 0.5f * (1f - (float)Math.Sqrt(1f - 4f * x * x)) : 0.5f * ((float)Math.Sqrt(1f - 4f * (x - 1f) * (x - 1f)) + 1f);}}#endregion#region Back//22public class InBackCurve : Singleton<InBackCurve>, ICurve{private const float c1 = 1.70158f;private const float c2 = c1 * 1.525f;public float Evaluate(float x){return c2 * x * x * x - c1 * x * x;}}//23public class OutBackCurve : Singleton<OutBackCurve>, ICurve{private const float c1 = 1.70158f;private const float c2 = c1 * 1.525f;public float Evaluate(float x){return x * x * ((c1 + 1) * x + c1) + 1;}}//27public class InOutBackCurve : Singleton<InOutBackCurve>, ICurve{public float Evaluate(float x){const float c1 = 1.70158f;const float c2 = c1 * 1.525f;return (float)(x < 0.5f ? 2 * x * x * ((c2 + 1) * 2 * x - c2) : (float)(1 + Math.Pow(2 * x - 2, 3) + c2 * Math.Pow(2 * x - 2, 2)) / 2);}}#endregion#region Elastic//24public class InElasticCurve : Singleton<InElasticCurve>, ICurve{public float Evaluate(float x){const float c4 = (2 * (float)Math.PI) / 3;return (float)((x == 0) ? 0 : ((x == 1) ? 1 : -Math.Pow(2, 10 * x - 10) * Math.Sin((x * 10 - 10.75) * c4)));}}//25public class OutElasticCurve : Singleton<OutElasticCurve>, ICurve{public float Evaluate(float x){const float c4 = (2 * (float)Math.PI) / 3;return (float)((x == 0) ? 0 : ((x == 1) ? 1 : Math.Pow(2, -10 * x) * Math.Sin((x * 10 - 0.75) * c4) + 1));}}//26public class InOutElasticCurve : Singleton<InOutElasticCurve>, ICurve{public float Evaluate(float x){const float c5 = (2f * (float)Math.PI) / 4.5f;return (float)((x == 0) ? 0 : ((x == 1) ? 1 : (x < 0.5f ? -(Math.Pow(2, 20 * x - 10) * Math.Sin((20 * x - 11.125f) * c5)) / 2 : (Math.Pow(2, -20 * x + 10) * Math.Sin((20 * x - 11.125f) * c5)) / 2 + 1)));}}#endregion#region Bounce//28public class InBounceCurve : Singleton<InBounceCurve>, ICurve{public float Evaluate(float x){return 1 - OutBounceCurve.Instance.Evaluate(1 - x);}}//29public class OutBounceCurve : Singleton<OutBounceCurve>, ICurve{public float Evaluate(float x){const float n1 = 7.5625f;const float d1 = 2.75f;if (x < 1 / d1){return n1 * x * x;}else if (x < 2 / d1){return n1 * (x -= 1.5f / d1) * x + 0.75f;}else if (x < 2.5 / d1){return n1 * (x -= 2.25f / d1) * x + 0.9375f;}else{return n1 * (x -= 2.625f / d1) * x + 0.984375f;}}}//30public class InOutBounceCurve : Singleton<OutBounceCurve>, ICurve{public float Evaluate(float x){return x < 0.5f? (1 - Evaluate(1 - 2 * x)) / 2: (1 + Evaluate(2 * x - 1)) / 2;}}#endregion
}

这篇关于Unity3D 31种缓动曲线的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/688773

相关文章

PR曲线——一个更敏感的性能评估工具

在不均衡数据集的情况下,精确率-召回率(Precision-Recall, PR)曲线是一种非常有用的工具,因为它提供了比传统的ROC曲线更准确的性能评估。以下是PR曲线在不均衡数据情况下的一些作用: 关注少数类:在不均衡数据集中,少数类的样本数量远少于多数类。PR曲线通过关注少数类(通常是正类)的性能来弥补这一点,因为它直接评估模型在识别正类方面的能力。 精确率与召回率的平衡:精确率(Pr

Unity3D自带Mouse Look鼠标视角代码解析。

Unity3D自带Mouse Look鼠标视角代码解析。 代码块 代码块语法遵循标准markdown代码,例如: using UnityEngine;using System.Collections;/// MouseLook rotates the transform based on the mouse delta./// Minimum and Maximum values can

Unity3D 运动之Move函数和translate

CharacterController.Move 移动 function Move (motion : Vector3) : CollisionFlags Description描述 A more complex move function taking absolute movement deltas. 一个更加复杂的运动函数,每次都绝对运动。 Attempts to

Linux 删除 当前下的 mysql-8.0.31 空文件夹

在Linux中,如果你想要删除当前目录下的名为mysql-8.0.31的空文件夹(即该文件夹内没有任何文件或子文件夹),你可以使用rmdir命令。但是,如果mysql-8.0.31文件夹并非完全为空(即它包含文件或子文件夹),rmdir命令会失败。 如果你的目标是删除mysql-8.0.31文件夹及其内部的所有内容(无论是否为空),你应该使用rm命令结合-r(或-R,它们是等价的)选项来递归地删

Unity3D在2D游戏中获取触屏物体的方法

我们的需求是: 假如屏幕中一个棋盘,每个棋子是button构成的,我们希望手指或者鼠标在哪里,就显示那个位置的button信息。 网上有很多获取触屏物体信息的信息的方法如下面代码所示: Camera cam = Camera.main; // pre-defined...if (touch.phase == TouchPhase.Bagan)){ // 如果触控点状态为按下Ray

Matlab中BaseZoom()函数实现曲线和图片的局部放大

BaseZoom工具下载链接: 链接:https://pan.baidu.com/s/1yItVSinh6vU4ImlbZW6Deg?pwd=9dyl 提取码:9dyl 下载完之后将工具包放置合适的路径下,并在matlab中“设置路径”中添加相应的路径; 注:可以先运行如下图片中的语句,看看是否报错;如果报如下错误,说明matlab未安装“Image Processing Toolbox”工

尝试用java spring boot+VUE3实现前后端分离部署(8/31)

前言         这几天开学了,公司这边几个和学校对接的项目都挺忙的,然后我又开始有点闲的情况了。问大佬能不能继续看看若依的项目,大佬让我自己去学了。在看若依的项目的时候在想,python的FLASK后端实现和JAVA spring boot的实现差别大不大,两者实现的思路估计大差不差,那具体的代码逻辑和代码实现又有多大差别,java面向对象的编程思想又是怎么体现的。这些想法迫使我将原来使用

Unity3D Shader详解:只画顶点或只画线框

在Unity3D开发中,Shader是控制渲染过程的关键组件,它允许开发者自定义物体的渲染方式。有时,为了特定的视觉效果,我们可能需要只渲染模型的顶点或者只显示其线框。下面,我们将详细探讨这两种效果的技术实现,并给出相应的代码示例。 对惹,这里有一个游戏开发交流小组,大家可以点击进来一起交流一下开发经验呀! 只画顶点 在Unity中直接“只画顶点”的概念可能不是非常直观,因为顶点本身只是模型

[C/C++入门][进制原理]31、求分数序列和

题目来自于信息学奥赛 1078 分析: 这道题看起来比较复杂,实际上只需要通过两个公式,一次性求出分母和分子,然后把这个求出来的数加入到变量和中。甚至都不需要知道总共游哪些数。数组都用不上。循环就能解决。 #include <iostream>#include <iomanip> // 用于格式化输出using namespace std;int main() {double s

基于yolov8的包装盒纸板破损缺陷测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的包装盒纸板破损缺陷检测系统是一种高效、智能的解决方案,旨在提高生产线上包装盒纸板的质量检测效率与准确性。该系统利用YOLOv8这一前沿的深度学习模型,通过其强大的目标检测能力,能够实时识别并标记出包装盒纸板上的各种破损缺陷,如划痕、撕裂、孔洞等。 在系统中,首先需对包含破损缺陷的包装盒纸板图像进行数据采集和标注,形成训练数据集。随后,利用这些数据进行模型训练,使