1. 程式人生 > >Unity3d學習之路-簡單粒子製作

Unity3d學習之路-簡單粒子製作

簡單粒子製作

實現要求

製作一個粒子系統魔法球,點選魔法球,產生特效,特效粒子沿著一定的軌跡運動

實現過程

製作魔法球和特效粒子

  • 魔法球又分為光暈與星光兩個粒子系統,這個粒子系統的製作和資源是參考
    部落格傳送門
  • 特效粒子的Start Speed為0(因為之後的程式碼將會去設定速度,這裡防止初始速度的影響),Shape使用的是Box,其他設定見完整專案。

賣家秀

實現沿路徑移動

在遊戲開始的時候,得到粒子將要經過的點的座標,然後計算出粒子按照時間變化速度的向量應該怎樣變化,並分別繪製成x軸,y軸,z軸的速度隨時間變化曲線。這樣就可以實現粒子沿著設定的路徑移動。這裡使用AnimationCurve來儲存不同座標軸的數值變化曲線,AnimationCurve生成的曲線還可以用於曲線地形,曲線軌跡等。在該曲線中插入的關鍵幀是Keyframe,建構函式引數中的float.PositiveInfinity

代表構造Keyframe時候,幀與幀之間變化時曲線切線正切值為無窮大,也就是90度。

  • 程式碼如下
public struct FrameDate
{
    //方向
    public Vector3 direction;
    //距離
    public float distance;
    public FrameDate(Vector3 dir, float dis)
    {
        direction = dir;
        distance = dis;
    }
}

public class ParticlePath : MonoBehaviour
{
    //粒子系統
public ParticleSystem particle; //路徑指定達到的點的座標 public List<Vector3> points; //每個座標軸的速度變化曲線 private AnimationCurve curveX = new AnimationCurve(); private AnimationCurve curveY = new AnimationCurve(); private AnimationCurve curveZ = new AnimationCurve(); //關鍵幀所需要儲存的資訊 private Queue<FrameDate> frames = new Queue<FrameDate>(); void Start() { if (points.Count > 1) { //設定粒子發生點 particle.transform.position = points[0]; //路徑的總長 float totalDistance = 0; for (int i = 1; i < points.Count; i++) { //與下一個點距離 float dis = Vector3.Distance(points[i], points[i - 1]); //向下一個點方向 Vector3 dir = points[i] - points[i - 1]; dir.Normalize(); frames.Enqueue(new FrameDate(dir, dis)); totalDistance += dis; } float time = 0; while (frames.Count > 0) { //關鍵幀的資料 FrameDate data = frames.Dequeue(); //將當前時刻和座標軸值作為關鍵幀新增進曲線 curveX.AddKey(new Keyframe(time, data.direction.x, float.PositiveInfinity, float.PositiveInfinity)); curveY.AddKey(new Keyframe(time, data.direction.y, float.PositiveInfinity, float.PositiveInfinity)); curveZ.AddKey(new Keyframe(time, data.direction.z, float.PositiveInfinity, float.PositiveInfinity)); //設定下一時刻的關鍵幀 time += (data.distance / totalDistance); } //設定粒子隨著時間變化的速度 var velocity = particle.velocityOverLifetime; velocity.enabled = true; velocity.space = ParticleSystemSimulationSpace.Local; //單位時間需要移動的長度 float distancePerTime = totalDistance / particle.startLifetime; velocity.x = new ParticleSystem.MinMaxCurve(distancePerTime, curveX); velocity.y = new ParticleSystem.MinMaxCurve(distancePerTime, curveY); velocity.z = new ParticleSystem.MinMaxCurve(distancePerTime, curveZ); } } }
  • 繪製的軌跡如下
    inspector
    curves

實現效果

單個粒子特效

多個粒子特效

小結

用程式碼控制粒子,就是控制粒子的屬性,讓粒子的行為達到我們想要的效果。讓粒子沿著特定路線移動因為繪製的曲線變化時候都是90度,所以軌跡有些生硬,有部落格寫了視覺化編輯曲線,而不是在遊戲執行時候生成曲線,這樣更容易調整變化的軌跡,部落格連結,本次作業也是參考該部落格。在執行時候改變粒子的方向也不一定先繪製速度變化曲線,可以在執行時候根據時間來實時改變粒子的速度。

完整專案請點選傳送門