Código de sistema de partículas obsoleto Unity 5.5

Antes de 5.5 se podían acceder a las variables del sistema de partículas a través de ParticleSystem y eran de lectura / escritura. Ahora se accede a través de ParticleSystem.MainModule y, por lo tanto, una gran cantidad de código se ha vuelto obsoleto. El Actualizador de API no ha podido solucionar la mayoría de los problemas. He leído la nueva documentación, pero no puedo entender cómo se supone que se usarán los nuevos tipos de variables. Por ejemplo, en JetParticleEffect.cs, esta línea genera una advertencia:

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

La advertencia dice: ‘ParticleSystem.startLifetime’ está obsoleto: la propiedad ‘startLifetime’ está obsoleta. Use main.startLifetime o main.startLifetimeMultiplier en su lugar. ‘

He intentado lo siguiente:

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

Creo que la respuesta tiene algo que ver con las variables constantes minMaxCurve, ya que comstack:

 m_OriginalLifetime = m_System.main.startLifetime.constant; 

Pero casi no hay explicación en los documentos. ¿Alguien puede arrojar algo de luz sobre esto?

Además, ¿dónde encajan los nuevos multiplicadores? Supongo que anteriormente podrías hacer esto:

 particle.startSize *= myMultiplier 

… ¿ahora deberías hacer esto?

 particle.main.startSizeMultiplier = myMultiplier 

particle.startLifetime:

En primer lugar, lo que Unity hizo en Unity 5.5 fue agregar nuevos futuros al ParticleSystem . También expusieron alguna API de ParticleSystem que estaba oculta anteriormente.

ParticleSystem.MainModule.startLifetime ahora es un tipo de MinMaxCurve lugar de flotar como ParticleSystem.startLifetime .

Al hacer esto, ahora tiene más opciones como modificar el startLifetime como una curva.

Leer o escribir en ParticleSystem.MainModule.startLifetime depende del valor de ParticleSystem.MainModule.startLifetime.mode que se establece a través del Editor o mediante el código.

enter image description here

El valor predeterminado de ParticleSystem.MainModule.startLifetime.mode es ParticleSystemCurveMode.Constant

Entonces tu m_OriginalLifetime = m_System.main.startLifetime.constant; está bien.

Si startLifetime se startLifetime dinámicamente o aleatoriamente a otro modo durante el tiempo de ejecución, entonces tendrá que hacer algo como esto:

 ParticleSystem m_System = GetComponent(); 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:

Lo mismo se aplica a particle.startSize . La propiedad particle.startSize ahora es m_System.main.startSize;

Aunque no puede hacer m_System.main.startSize.constant *= myMultiplier; porque su código anterior era particle.startSize *= myMultiplier .

Necesita obtener m_System.main.startSize , modificarlo y luego asignar el m_System.main.startSize modificado nuevamente a m_System.main.startSize .

particle.startSize *= myMultiplier debe ser:

 ParticleSystem m_System = GetComponent(); 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 

Entonces, ¿para qué se utilizan particle.main.startSizeMultiplier y particle.main.startSize ?

Estas dos variables también se pueden usar para cambiar startLifetime y startSize . Su principal ventaja es que es muy eficiente. No es necesario que haga una copia de MinMaxCurve como hicimos anteriormente, para cambiar startSize o startSizeMultiplier .

 ParticleSystem m_System = GetComponent(); ParticleSystem.MainModule main = m_System.main; main.startSizeMultiplier = 5; 

y

 ParticleSystem m_System = GetComponent(); ParticleSystem.MainModule main = m_System.main; main.startLifetimeMultiplier = 8; 

Úselos si su ParticleSystem.MainModule.startLifetime.mode es constante. Esto cambiará el multiplicador de por vida global o el multiplicador de tamaño general de manera eficiente.


Cambio de color y modos de color

Color :

Hay un operador implícito que le permite usar:

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

pero startColor no es realmente el tipo de Color . La variable startColor ahora es un tipo de ParticleSystem.MinMaxGradient .

Así es como debería cambiar la partícula 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; 

Gradiente :

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

Aleatorio entre dos colores :

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

Aleatorio entre dos gradientes :

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

Color aleatorio :

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