Unity3d學習之路-簡單粒子製作
阿新 • • 發佈:2018-11-15
簡單粒子製作
實現要求
製作一個粒子系統魔法球,點選魔法球,產生特效,特效粒子沿著一定的軌跡運動
實現過程
製作魔法球和特效粒子
- 魔法球又分為光暈與星光兩個粒子系統,這個粒子系統的製作和資源是參考
- 特效粒子的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);
}
}
}
- 繪製的軌跡如下
實現效果
小結
用程式碼控制粒子,就是控制粒子的屬性,讓粒子的行為達到我們想要的效果。讓粒子沿著特定路線移動因為繪製的曲線變化時候都是90度,所以軌跡有些生硬,有部落格寫了視覺化編輯曲線,而不是在遊戲執行時候生成曲線,這樣更容易調整變化的軌跡,部落格連結,本次作業也是參考該部落格。在執行時候改變粒子的方向也不一定先繪製速度變化曲線,可以在執行時候根據時間來實時改變粒子的速度。
完整專案請點選傳送門