Unity 5.5过时的粒子系统代码

10

在5.5版本之前,可以通过ParticleSystem访问粒子系统变量,并进行读写操作。现在,它们通过ParticleSystem.MainModule进行访问,因此很多代码已经过时了。但API Updater不能解决大部分的问题。我已经阅读了新的文档,但我无法弄清楚如何使用新的变量类型。例如,在JetParticleEffect.cs中,这一行会引起警告:

// set the original properties from the particle system
m_OriginalLifetime = m_System.startLifetime;

警告信息如下:“ParticleSystem.startLifetime”已经过时:“startLifetime属性已被弃用,请使用main.startLifetime或main.startLifetimeMultiplier替代。”

我尝试了以下方法:

m_OriginalLifetime = m_System.main.startLifetime;
// error: Cannot implicitly convert type 'UnityEngine.ParticleSystem.MinMaxCurve' to 'float'

我相信答案与 minMaxCurve 常量变量有关,因为这段代码可以编译:

m_OriginalLifetime = m_System.main.startLifetime.constant;

但是文档中几乎没有解释。有人能对此进行解释一下吗?

另外,新的倍增因子适用于哪里?我假设之前你可以这样做:

particle.startSize *= myMultiplier

现在你应该这样做吗?

particle.main.startSizeMultiplier = myMultiplier

m_OriginalLifetime = (float)m_System.main.startLifetime;m_OriginalLifetime = (float)m_System.main.startLifetime; - jdweng
我昨天为这个问题打了一个很长的答案。正要发布它,你就把它删除了。懒得再打一遍,但这个问题让我想起了这个链接:http://meta.stackoverflow.com/questions/338427/question-deleted-by-op-while-in-the-process-of-posting-answer。 - Programmer
1
非常抱歉,我认为之前的问题表述不够清晰,在重新阅读后,我感到自己没有做足够的研究来证明向社区提问的必要性。现在我已经阅读了所有相关文档,并且觉得我的新问题更加精确。 - Absinthe
1个回答

21

particle.startLifetime:

在 Unity 5.5 中,Unity 添加了一些新功能到 ParticleSystem 并公开了一些之前隐藏的 ParticleSystem API。

ParticleSystem.MainModule.startLifetime 现在是一种 MinMaxCurve 类型,而非像 ParticleSystem.startLifetime 一样是 float 类型。

通过这样做,您现在可以更多地选择,例如将 startLifetime 修改为曲线。

读取或写入 ParticleSystem.MainModule.startLifetime 取决于 ParticleSystem.MainModule.startLifetime.mode 的值,该值通过编辑器或代码设置。

enter image description here

ParticleSystem.MainModule.startLifetime.mode 的默认值为 ParticleSystemCurveMode.Constant。

所以你的 m_OriginalLifetime = m_System.main.startLifetime.constant; 是正确的。

如果在运行时将 startLifetime 动态或随机更改为其他 模式,则您需要执行以下操作:

ParticleSystem m_System = GetComponent<ParticleSystem>();
ParticleSystem.MainModule main = m_System.main;

ParticleSystem.MinMaxCurve minMaxCurve = main.startLifetime;

if (minMaxCurve.mode == ParticleSystemCurveMode.Constant)
{
    m_OriginalLifetime = m_System.main.startLifetime.constant;
}
else if (minMaxCurve.mode == ParticleSystemCurveMode.Curve)
{
    AnimationCurve animCurveLifetime = m_System.main.startLifetime.curve;
}
...

particle.startSize:

particle.startSize 属性已经变为 m_System.main.startSize;

虽然你不能再使用 m_System.main.startSize.constant *= myMultiplier;, 因为你的旧代码是 particle.startSize *= myMultiplier

你需要获取 m_System.main.startSize,对其进行修改,然后将修改后的 m_System.main.startSize 再次赋值回 m_System.main.startSize

particle.startSize *= myMultiplier 应改为:

ParticleSystem m_System = GetComponent<ParticleSystem>();
ParticleSystem.MainModule main = m_System.main;

ParticleSystem.MinMaxCurve minMaxCurve = main.startSize; //Get Size

minMaxCurve.constant *= myMultiplier; //Modify Size
main.startSize = minMaxCurve; //Assign the modified startSize back

那么,particle.main.startSizeMultiplierparticle.main.startSize有什么作用呢?

这两个变量也可以用于改变startLifetimestartSize。它的主要优点是非常高效。与上文中我们复制MinMaxCurve来改变startSizestartSizeMultiplier不同,使用这两个变量不需要进行复制。

ParticleSystem m_System = GetComponent<ParticleSystem>();
ParticleSystem.MainModule main = m_System.main;
main.startSizeMultiplier = 5;
and
ParticleSystem m_System = GetComponent<ParticleSystem>();
ParticleSystem.MainModule main = m_System.main;
main.startLifetimeMultiplier = 8;

如果你的ParticleSystem.MainModule.startLifetime.mode是常量,请使用它们。这将有效地改变整体寿命乘数或整体尺寸乘数。


更改颜色和颜色模式

颜色:

有一个隐式运算符可以让你使用:

ParticleSystem.MainModule main = trailPartical.main;
main.startColor = Color.red;

但是startColor实际上并不是Color类型。现在,startColor变量是ParticleSystem.MinMaxGradient类型。

这是你应该改变粒子startColor的方式:

//Create Color
ParticleSystem.MinMaxGradient color = new ParticleSystem.MinMaxGradient();
color.mode = ParticleSystemGradientMode.Color;
color.color = Color.red;

//Assign the color to your particle
ParticleSystem.MainModule main = trailPartical.main;
main.startColor = color;

渐变:

public ParticleSystem particleSystem;

void Start()
{
    //Create Gradient key
    GradientColorKey[] gradientColorKey;
    gradientColorKey = new GradientColorKey[3];
    gradientColorKey[0].color = Color.red;
    gradientColorKey[0].time = 0f;
    gradientColorKey[1].color = Color.blue;
    gradientColorKey[1].time = 0.5f;
    gradientColorKey[2].color = Color.green;
    gradientColorKey[2].time = 1f;

    //Create Gradient alpha
    GradientAlphaKey[] gradientAlphaKey;
    gradientAlphaKey = new GradientAlphaKey[3];
    gradientAlphaKey[0].alpha = 1.0f;
    gradientAlphaKey[0].time = 0.0f;
    gradientAlphaKey[1].alpha = 0.5f;
    gradientAlphaKey[1].time = 0.5f;
    gradientAlphaKey[2].alpha = 1f;
    gradientAlphaKey[2].time = 1f;

    //Create Gradient
    Gradient gradient = new Gradient();
    gradient.SetKeys(gradientColorKey, gradientAlphaKey);

    //Create Color from Gradient
    ParticleSystem.MinMaxGradient color = new ParticleSystem.MinMaxGradient();
    color.mode = ParticleSystemGradientMode.Gradient;
    color.gradient = gradient;

    //Assign the color to particle
    ParticleSystem.MainModule main = particleSystem.main;
    main.startColor = color;
}
在两种颜色之间随机选择一个颜色。
//Create Color from Gradient
ParticleSystem.MinMaxGradient color = new ParticleSystem.MinMaxGradient();
color.mode = ParticleSystemGradientMode.TwoColors;
color.colorMin = Color.red;
color.colorMax = Color.green;

//Assign the color to the particle
ParticleSystem.MainModule main = particleSystem.main;
main.startColor = color;

两个渐变之间的随机数:

public ParticleSystem particleSystem;

void Start()
{

    //Create Gradient key Min
    GradientColorKey[] gradientColorKeyMin;
    gradientColorKeyMin = new GradientColorKey[3];
    gradientColorKeyMin[0].color = Color.red;
    gradientColorKeyMin[0].time = 0f;
    gradientColorKeyMin[1].color = Color.blue;
    gradientColorKeyMin[1].time = 0.5f;
    gradientColorKeyMin[2].color = Color.green;
    gradientColorKeyMin[2].time = 1f;

    //Create Gradient alpha Min
    GradientAlphaKey[] gradientAlphaKeyMin;
    gradientAlphaKeyMin = new GradientAlphaKey[3];
    gradientAlphaKeyMin[0].alpha = 1.0f;
    gradientAlphaKeyMin[0].time = 0.0f;
    gradientAlphaKeyMin[1].alpha = 0.5f;
    gradientAlphaKeyMin[1].time = 0.5f;
    gradientAlphaKeyMin[2].alpha = 1f;
    gradientAlphaKeyMin[2].time = 1f;

    //Create Gradient key Max
    GradientColorKey[] gradientColorKeyMax;
    gradientColorKeyMax = new GradientColorKey[3];
    gradientColorKeyMax[0].color = Color.red;
    gradientColorKeyMax[0].time = 0f;
    gradientColorKeyMax[1].color = Color.blue;
    gradientColorKeyMax[1].time = 0.5f;
    gradientColorKeyMax[2].color = Color.green;
    gradientColorKeyMax[2].time = 1f;

    //Create Gradient alpha Max
    GradientAlphaKey[] gradientAlphaKeyMax;
    gradientAlphaKeyMax = new GradientAlphaKey[3];
    gradientAlphaKeyMax[0].alpha = 1.0f;
    gradientAlphaKeyMax[0].time = 0.0f;
    gradientAlphaKeyMax[1].alpha = 0.5f;
    gradientAlphaKeyMax[1].time = 0.5f;
    gradientAlphaKeyMax[2].alpha = 1f;
    gradientAlphaKeyMax[2].time = 1f;

    //Create Gradient Min
    Gradient gradientMin = new Gradient();
    gradientMin.SetKeys(gradientColorKeyMin, gradientAlphaKeyMin);

    //Create Gradient Max
    Gradient gradientMax = new Gradient();
    gradientMax.SetKeys(gradientColorKeyMax, gradientAlphaKeyMax);


    //Create Color from Gradient
    ParticleSystem.MinMaxGradient color = new ParticleSystem.MinMaxGradient();
    color.mode = ParticleSystemGradientMode.TwoGradients;
    color.gradientMin = gradientMin;
    color.gradientMax = gradientMax;

    //Assign the color to the particle
    ParticleSystem.MainModule main = particleSystem.main;
    main.startColor = color;
}

随机颜色:

public ParticleSystem particleSystem;

void Start()
{

    //Create Gradient key Min
    GradientColorKey[] gradientColorKeyMin;
    gradientColorKeyMin = new GradientColorKey[3];
    gradientColorKeyMin[0].color = Color.red;
    gradientColorKeyMin[0].time = 0f;
    gradientColorKeyMin[1].color = Color.blue;
    gradientColorKeyMin[1].time = 0.5f;
    gradientColorKeyMin[2].color = Color.green;
    gradientColorKeyMin[2].time = 1f;

    //Create Gradient alpha Min
    GradientAlphaKey[] gradientAlphaKeyMin;
    gradientAlphaKeyMin = new GradientAlphaKey[3];
    gradientAlphaKeyMin[0].alpha = 1.0f;
    gradientAlphaKeyMin[0].time = 0.0f;
    gradientAlphaKeyMin[1].alpha = 0.5f;
    gradientAlphaKeyMin[1].time = 0.5f;
    gradientAlphaKeyMin[2].alpha = 1f;
    gradientAlphaKeyMin[2].time = 1f;

    //Create Gradient key Max
    GradientColorKey[] gradientColorKeyMax;
    gradientColorKeyMax = new GradientColorKey[3];
    gradientColorKeyMax[0].color = Color.red;
    gradientColorKeyMax[0].time = 0f;
    gradientColorKeyMax[1].color = Color.blue;
    gradientColorKeyMax[1].time = 0.5f;
    gradientColorKeyMax[2].color = Color.green;
    gradientColorKeyMax[2].time = 1f;

    //Create Gradient alpha Max
    GradientAlphaKey[] gradientAlphaKeyMax;
    gradientAlphaKeyMax = new GradientAlphaKey[3];
    gradientAlphaKeyMax[0].alpha = 1.0f;
    gradientAlphaKeyMax[0].time = 0.0f;
    gradientAlphaKeyMax[1].alpha = 0.5f;
    gradientAlphaKeyMax[1].time = 0.5f;
    gradientAlphaKeyMax[2].alpha = 1f;
    gradientAlphaKeyMax[2].time = 1f;

    //Create Gradient Min
    Gradient gradientMin = new Gradient();
    gradientMin.SetKeys(gradientColorKeyMin, gradientAlphaKeyMin);

    //Create Gradient Max
    Gradient gradientMax = new Gradient();
    gradientMax.SetKeys(gradientColorKeyMax, gradientAlphaKeyMax);


    //Create Color from Gradient
    ParticleSystem.MinMaxGradient color = new ParticleSystem.MinMaxGradient();
    color.mode = ParticleSystemGradientMode.RandomColor;
    color.gradientMin = gradientMin;
    color.gradientMax = gradientMax;


    //Assign the color to the particle
    ParticleSystem.MainModule main = particleSystem.main;
    main.startColor = color;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接