Unity中的组件AnimationCurve定义曲线实在太方便了。以至于做相关开发的时候,也想给策划等其他人员来用。因此想把此功能开放到程序功能里面。经过一段时间的分析和研究,完成了如下效果。
经过分析,实现该组件的功能需要如下几个关键点:
1:通过对关键帧的坐标和其切线,得出相关的曲线函数。
2:UGUI根据函数画线及相关UI功能的实现。
1:通过分析AnimationCurve的特性,发现该曲线由关键帧和每帧的左右切线插值来形成。于是就翻了下大学数学课本,能有这种特性的插值算法,当属Hermite算法了。于是就针对该算法实现了对C#的相关编码。其核心插值算法如下:
public float GetValue(float v)
{
if(data == null || data.Count == 0)
{
return 0.5f;
}
if (v < data[0].x0 || v > data[data.Count - 1].x1)
{
return 0.5f;
}
SegmentData seg = data.Find(item => item.IsContain(v));
return seg.y0 * Fh0(v, seg) + seg.d0 * FH0(v, seg) + seg.y1 * Fh1(v, seg) + seg.d1 * FH1(v, seg);
}
2:接下来就是针对该算法进行画线了,在此我找了一款插件SpringGUI,他是针对UGUI做出了高度的扩展,我在其中FunctionalGraph做出了改动,把原来的中心坐标系,改成了0~1坐标区域。并改了GUI实现部分代码,实现了坐标轴数值显示。后面模仿AnimationCurve组件实现对关键帧的操作。效果如下图
通过由以上两步关键步骤的实现。再添加拖动关键帧,对关键帧的左右曲线分别处理,保存添加曲线等功能。完整的实现AnimationCurve组件。详细源码请于如下链接下载查看:
最后希望此篇博客对想了解AnimationCurve组件原理的同学们有所帮助。
LazerYvTian 发布了26 篇原创文章 · 获赞 7 · 访问量 1万+ 私信 关注