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; } }