Unity3d – パーティクル生成ハードウェア 8
1.課題内容
シンプルな粒子生成
- 参照リソースの要件に従ってパーティクル システムを作成します。リソースを参照してください。
- セクション 3.3 の概要を使用し、コード制御を使用して、さまざまなシナリオでさまざまな効果を持たせることができます。
2. 構成
- まず、シーン内に新しい空のオブジェクトを作成します。
- 次に、このオブジェクトにコンポーネント「パーティクル システム」を追加します。
- パーティクル コンポーネントは、[コンポーネント] -> [エフェクト] -> [パーティクル システム] で追加します。
- ここでの要件はコードの実装であるため、パーティクル システムを直接設定する必要はありません。したがって、スクリプトを作成したら、スクリプトの作成を開始できます。
3. コード部分
第一歩:
ParticleData クラスを作成して、位置、時間、角度などの各パーティクルの基本情報を保存し、各パーティクルの動きをより適切に設定できるようにします。
public class ParticleData{
public float radius = 0f, angle = 0f, time = 0f;
public ParticleData(float radius, float angle, float time) {
this.radius = radius;
this.angle = angle;
this.time = time;
}
}
ステップ2:
パーティクル システム、パーティクル オブジェクト、および情報を保存するための配列を定義します。さらに、カラー グラデーションもあります。前者はパーティクルの属性と位置を設定するために使用され、後者はパーティクルの色の変更に使用されます。
private ParticleSystem particlesys; // 粒子系统
private ParticleSystem.Particle[] particleArr; // 粒子数组
private ParticleData[] particles; // 粒子数据数组
public Gradient colorGradient; // 粒子颜色渐变
ステップ 3:
パーティクルの移動に必要なパラメータを設定し、動作中に適切な調整を行います。
public int count = 10000; // 粒子数量
public float size = 0.03f; // 粒子大小
public float minRad = 1f; // 最小半径
public float maxRad = 3f; // 最大半径
public bool clock = true; // 顺时针|逆时针
public float speed = 2f; // 速度
public float pingPong = 0.002f; // 游离范围
ステップ 4:
各パーティクルの位置、角度などの情報を初期化し、ランダム関数を使用してパーティクルをランダムにします。同時に、ここでは以前の作品を参照し、プロポーションを使用してパーティクルを中心に集中させ、ランダムに分散させることで、ランダム性を失うことなくサブイメージをより印象的にすることができます。
// 随机每个粒子距离中心的半径,通过比例调节粒子更加集中于中心,但会随机的分散开
float midRadius = (maxRad + minRad) / 2;
float minRate = Random.Range(1.0f, midRadius / minRad);
float maxRate = Random.Range(midRadius / maxRad, 1.0f);
float radius = Random.Range(minRad * minRate, maxRad * maxRate);
// 随机每个粒子的角度
float angle = Random.Range(0.0f,360.0f);
float theta = angle / 180 * Mathf.PI;
// 随机每个粒子的游离起始时间
float time = Random.Range(0.0f, 360.0f);
//给每个粒子赋值,并保存粒子数据
particles[i] = new ParticleData(radius, angle, time);
ステップ 5:
アップデート機能。パーティクルの動きは、各フレーム内のパーティクルの位置を設定することによって実現されますが、これはさまざまなモーション グラフィックスに従って設定する必要があります。まず時計回りか反時計回りかを判断します。時計回りは値を引くことを意味し、反時計回りは値を加算することを意味します。ここではラジアンの公式を使用します。ラジアンと半径から円弧の長さが求められ、各移動の距離が求められます。 (スピード)。
if (clock) // 顺时针旋转
particles[i].angle -= (i % tier + 1) * (speed / particles[i].radius / tier);
else // 逆时针旋转
particles[i].angle += (i % tier + 1) * (speed / particles[i].radius / tier);
同時に、角度を加算および減算するとパーティクルの角度が 360 を超える可能性があるため、次のコマンドを使用してパーティクルの角度が 0 ~ 360 の間にあることを確認します。
particles[i].angle = (360 + particles[i].angle) % 360.0f;
ステップ 6:
角度を設定した後、粒子の位置を具体的に設定する必要があります。ここでは、上記の粒子によって保存された角度情報を使用する必要があります。円運動の場合、数学によると、粒子と遠い点の間の距離このときは等しいので粒子は円運動をします。
particleArr[i].position = new Vector3(particles[i].radius * Mathf.Cos(theta), 0f, particles[i].radius * Mathf.Sin(theta));
円運動に加えて、他のより興味深い粒子の運動も可能です。たとえば、次のコマンドを使用すると、粒子がハートの形で移動します。原則として、この関数のイメージはハートの形です。具体的には、座標は( 16 sin 2 x , 13 cosx − 5 cos 2 x − 2 cos 3 x − cos 4 x ) (16sin^2x, 13cosx - 5cos2x - 2cos3x-cos4x) となります。( 16秒_ _2 ×、13コスx−5コス2倍−2cos3x _ _ _−cos 4 x )と少し複雑な関数ですが、1行変更するだけで実装できるのでとても簡単です。
particleArr[i].position = new Vector3(0.1f * particles[i].radius * 16 * Mathf.Sin(theta) * Mathf.Sin(theta) * Mathf.Sin(theta), 0.1f * particles[i].radius *(13 * Mathf.Cos(theta) - 5 * Mathf.Cos(theta * 2) - 2 * Mathf.Cos(theta * 3) - Mathf.Cos(4 * theta)), 0f);
ステップ 7:
さらに、半径内のパーティクルをランダムに叩く必要もありますが、ここでは組み込みの PingPong 機能を使用することで、パーティクルがよりランダムでより美しくなります。
particles[i].radius += Mathf.PingPong(particles[i].time / minRad / maxRad, pingPong) - pingPong / 2.0f;
4. ゲームの画像、ビデオ、およびコード アドレス。
動画サイト:https://www.bilibili.com/video/av75156279/
または hw8.mov
コードアドレス: https://github.com/ouzj5/3dgame/tree/master/hw8