From ca83787bf06d6541a6d53c57ca543ef119789191 Mon Sep 17 00:00:00 2001 From: Sarbian Date: Sat, 19 Jul 2014 18:31:24 +0200 Subject: [PATCH] Fix the last reported NRE and improve the behaviors on Vessel and Debris .Die() call --- ModelMultiParticlePersistFX.cs | 39 ++++++++++++++----- MultiInputCurve.cs | 2 +- PersistentEmitterManager.cs | 67 +++++++++++++++++---------------- PersistentKSPParticleEmitter.cs | 3 +- SmokeScreenUtil.cs | 2 +- 5 files changed, 68 insertions(+), 45 deletions(-) diff --git a/ModelMultiParticlePersistFX.cs b/ModelMultiParticlePersistFX.cs index 5d23579..8ed295a 100644 --- a/ModelMultiParticlePersistFX.cs +++ b/ModelMultiParticlePersistFX.cs @@ -176,6 +176,7 @@ public List Instances public ModelMultiParticlePersistFX() { winID = baseWinID++; + //Print("Constructor"); } //~ModelMultiParticlePersistFX() @@ -184,10 +185,23 @@ public ModelMultiParticlePersistFX() // list.Remove(this); //} + + // if Die() is called for a debrit of vessel then all the + // vessel gameobject are removed without an OnDestroy call + // But an OnVesselDie message is send before, so we can + // Catch in time + public void OnVesselDie() + { + //Print("OnVesselDie : EJECT EJECT EJECT !"); + this.OnDestroy(); + } + private void OnDestroy() { + //Print("OnDestroy"); if (persistentEmitters != null) { + //Print("OnDestroy is GO !"); for (int i = 0; i < persistentEmitters.Count; i++) { persistentEmitters[i].Detach(0); @@ -198,6 +212,7 @@ private void OnDestroy() public override void OnEvent() { + //Print("OnEvent"); if (!activated || persistentEmitters == null) { return; @@ -215,6 +230,7 @@ public override void OnEvent() public override void OnEvent(float power) { + //Print("OnEvent " + power); if (persistentEmitters == null) { return; @@ -241,7 +257,8 @@ public override void OnEvent(float power) public void FixedUpdate() { - if (persistentEmitters == null) + //Print("FixedUpdate"); + if (persistentEmitters == null || this.hostPart == null || this.hostPart.rb == null) { return; } @@ -398,6 +415,7 @@ public void UpdateEmitters(float power) public void Update() { + //Print("Update"); if (persistentEmitters == null) { return; @@ -418,6 +436,8 @@ public void Update() public override void OnInitialize() { + //Print("Init"); + // Restore the Curve config from the node content backup // Done because I could not get the serialization of MultiInputCurve to work if (node_backup != string.Empty) @@ -440,20 +460,20 @@ public override void OnInitialize() } catch (Exception e) { - print("unable to load shader " + shaderFileName + " : " + e.ToString()); + Print("unable to load shader " + shaderFileName + " : " + e.ToString()); } } List transforms = new List(hostPart.FindModelTransforms(transformName)); if (transforms.Count == 0) { - print("Cannot find transform " + transformName); + Print("Cannot find transform " + transformName); return; } GameObject model = GameDatabase.Instance.GetModel(modelName); if (model == null) { - print("Cannot find model " + modelName); + Print("Cannot find model " + modelName); return; } model.SetActive(true); @@ -461,7 +481,7 @@ public override void OnInitialize() if (templateKspParticleEmitter == null) { - print("Cannot find particle emitter on " + modelName); + Print("Cannot find particle emitter on " + modelName); UnityEngine.Object.Destroy(model); return; } @@ -495,7 +515,7 @@ public override void OnInitialize() } catch (ArgumentException) { - print("ModelMultiParticleFXExt: " + renderMode + " is not a valid ParticleRenderMode"); + Print("ModelMultiParticleFXExt: " + renderMode + " is not a valid ParticleRenderMode"); } persistentEmitters.Add(pkpe); @@ -528,7 +548,7 @@ public void Restore() public override void OnLoad(ConfigNode node) { - //print("OnLoad"); + //Print("OnLoad"); Backup(node); emission = new MultiInputCurve("emission"); @@ -561,6 +581,7 @@ public override void OnLoad(ConfigNode node) public override void OnSave(ConfigNode node) { + //Print("OnSave"); ConfigNode.CreateConfigFromObject(this, node); emission.Save(node); energy.Save(node); @@ -577,9 +598,9 @@ public override void OnSave(ConfigNode node) distance.Save(node); } - private static void print(String s) + private static void Print(String s) { - MonoBehaviour.print("[ModelMultiParticlePersistFX] " + s); + MonoBehaviour.print("[SmokeScreen ModelMultiParticlePersistFX] " + s); } // TODO : move the whole UI stuff to a dedicated class - this is getting way to big diff --git a/MultiInputCurve.cs b/MultiInputCurve.cs index 686d3c8..7a94a4c 100644 --- a/MultiInputCurve.cs +++ b/MultiInputCurve.cs @@ -225,6 +225,6 @@ public void Save(ConfigNode node) private static void print(String s) { - MonoBehaviour.print("[MultiInputCurve] " + s); + MonoBehaviour.print("[SmokeScreen MultiInputCurve] " + s); } } \ No newline at end of file diff --git a/PersistentEmitterManager.cs b/PersistentEmitterManager.cs index e82d6af..5de7a75 100644 --- a/PersistentEmitterManager.cs +++ b/PersistentEmitterManager.cs @@ -16,13 +16,13 @@ [KSPAddon(KSPAddon.Startup.EveryScene, false)] internal class PersistentEmitterManager : MonoBehaviour { - public static PersistentEmitterManager Instance { get; private set; } + //public static PersistentEmitterManager Instance { get; private set; } - private static List persistentEmitters; + public static List persistentEmitters; private void Awake() { - PersistentEmitterManager.Instance = this; + //PersistentEmitterManager.Instance = this; persistentEmitters = new List(); @@ -31,6 +31,7 @@ private void Awake() private void OnDestroy() { + //Print("OnDestroy"); GameEvents.onGameSceneLoadRequested.Remove(new EventData.OnEvent(this.OnSceneChange)); } @@ -38,14 +39,25 @@ public static void Add(PersistentKSPParticleEmitter pkpe) { persistentEmitters.Add(pkpe); EffectBehaviour.AddParticleEmitter(pkpe.pe); + //print("[SmokeScreen PersistentEmitterManager]: Added 1 PersistentKSPParticleEmitter. Count = " + persistentEmitters.Count); + } + + public static void Remove(PersistentKSPParticleEmitter pkpe) + { + EffectBehaviour.RemoveParticleEmitter(pkpe.pe); + persistentEmitters.Remove(pkpe); + //print("[SmokeScreen PersistentEmitterManager]: Removed 1 PersistentKSPParticleEmitter. Count = " + persistentEmitters.Count); } private void OnSceneChange(GameScenes scene) { + //Print("OnSceneChange"); for (int i = 0; i < persistentEmitters.Count; i++) { EffectBehaviour.RemoveParticleEmitter(persistentEmitters[i].pe); - if (persistentEmitters[i].go.transform.parent == null) + //Print(" go is " + persistentEmitters[i].go); + //Destroy(persistentEmitters[i].go); + if (persistentEmitters[i].go != null) { Destroy(persistentEmitters[i].go); } @@ -62,37 +74,26 @@ public void FixedUpdate() { persistentEmittersCopy[i].EmissionStop(); } - - // If the gameObject is null ( when ? I forgot ... ) - // or the tranform parent is null ( Emitter detached from part so the particle are not removed instantly ) - // then the emitter won't be updated by the effect FixedUpdate Call. So update it here + + // If the gameObject is null clean up the emitter if (persistentEmittersCopy[i].go == null) { - Transform pecTransform = null; - - try - { - pecTransform = persistentEmittersCopy[i].go.transform; - } - catch (NullReferenceException) - { - // Destroy the gameobject so avoid exception handling in the future? - continue; - } - - if (persistentEmittersCopy[i].go.transform.parent == null) - { - persistentEmittersCopy[i].EmitterOnUpdate(Vector3.zero); + //Print("FixedUpdate cleanning null go"); + Remove(persistentEmittersCopy[i]); + // Make sure + Destroy(persistentEmittersCopy[i].go); + } + // if not and the tranform parent is null ( Emitter detached from part so the particle are not removed instantly ) + // then the emitter won't be updated by the effect FixedUpdate Call. So update it here + else if (persistentEmittersCopy[i].go.transform.parent == null) + { + persistentEmittersCopy[i].EmitterOnUpdate(Vector3.zero); - if (persistentEmittersCopy[i].pe.pe.particles.Count() == 0) - { - EffectBehaviour.RemoveParticleEmitter(persistentEmittersCopy[i].pe); - persistentEmitters.Remove(persistentEmittersCopy[i]); - if (persistentEmittersCopy[i].go != null) - { - Destroy(persistentEmittersCopy[i].go); - } - } + if (persistentEmittersCopy[i].pe.pe.particles.Count() == 0) + { + //Print("FixedUpdate cleanning parent go"); + Remove(persistentEmittersCopy[i]); + Destroy(persistentEmittersCopy[i].go); } } } @@ -100,6 +101,6 @@ public void FixedUpdate() private void Print(string s) { - MonoBehaviour.print(this.GetType().Name + " : " + s); + MonoBehaviour.print("[SmokeScreen " + this.GetType().Name + "] : " + s); } } \ No newline at end of file diff --git a/PersistentKSPParticleEmitter.cs b/PersistentKSPParticleEmitter.cs index 76b51f0..97765ab 100644 --- a/PersistentKSPParticleEmitter.cs +++ b/PersistentKSPParticleEmitter.cs @@ -139,6 +139,7 @@ public class PersistentKSPParticleEmitter // Detach the emitter from its parent gameobject and stop its emmission in timer seconds public void Detach(float timer) { + //Print("Detach"); this.endTime = Time.fixedTime + timer; if (this.go != null && this.go.transform.parent != null) { @@ -376,6 +377,6 @@ private Vector3 ParticleCollision(Vector3d pPos, Vector3d pVel, RaycastHit hit, private void Print(string s) { - MonoBehaviour.print(this.GetType().Name + " : " + s); + MonoBehaviour.print("[SmokeScreen " + this.GetType().Name + "] : " + s); } } \ No newline at end of file diff --git a/SmokeScreenUtil.cs b/SmokeScreenUtil.cs index 5a2caf8..4bfc6c3 100644 --- a/SmokeScreenUtil.cs +++ b/SmokeScreenUtil.cs @@ -296,7 +296,7 @@ public static bool AddLaunchPadColliders(RaycastHit hit) private static void print(String s) { - MonoBehaviour.print("[SmokeScreenUtil] " + s); + MonoBehaviour.print("[SmokeScreen SmokeScreenUtil] " + s); } } } \ No newline at end of file