1.实际效果
做游戏要的就是一些华丽的效果。比如物品的拾取特效,能量收集特效等等需要运动轨迹的地方。
利用贝塞尔曲线做的实际效果图:
(好吧这个效果图有点坑爹。不过尼玛不要嫌弃QQ截图就这样了)
单帧效果:
2.大致原理
感觉是不是很炫酷呀!做这样的效果首先要了解下贝赛尔曲线这个东东(好吧实际上你完全不需要理解这个东东只要知道有这个东西。然后公式什么的内事找百度就好)
一阶贝塞尔曲线(线段):
实际效果就是一个线性插值
来来来美少年们,一阶段的咱暂时不用,主要用的是二阶段的公式
二阶贝塞尔曲线(线段)
整个路径是由定点P0、P1、P2三个点来确定的。 效果如下:
接下来的三阶段,四阶段xx阶段你可以看下百度内容:
http://baike.baidu.com/view/60154.htm?fr=aladdin
3.项目代码
实际项目中的代码,只要根据公式计算就可以了。
提供一个简单的例子
using UnityEngine;
using System.Collections;
/// <summary>
/// 贝塞尔曲线
/// </summary>
public class BezierVFX : MonoBehaviour {
public Vector3 startPosition;
public Vector3 endPosition;
public Vector3 anchorPoint;
[SerializeField]
private float m_Duration;
private float m_survivalTime;//结束之后保留的时间
private float m_Time;
private bool m_Begin = false;
private Transform mTrans;
public Transform cachedTransform { get { if (mTrans == null) mTrans = transform; return mTrans; } }
void Start ()
{
m_Time = 0;
m_Begin = false;
}
void Update ()
{
if (!m_Begin)
{
return;
}
m_Time += Time.deltaTime;
float t = m_Time / m_Duration;
t = Mathf.Clamp01(t);
t = t * t;//曲线
Vector3 pos = (1 - t) * (1 - t) * startPosition + 2 * t * (1 - t) * anchorPoint + t * t * endPosition;
cachedTransform.position = pos;
if (m_Time > m_Duration+0.5f)
{
Destroy(gameObject);
m_Begin = false;
}
}
public void Begin(float fDuration)
{
m_Begin = true;
m_Duration = fDuration;
}
public void SetDuration(float fDuration)
{
m_Duration = fDuration;
}
}