- Home /
Two questions about building particle systems from scripts
Hi,
I'm trying to build a particle system at runtime. Here is the relevant part of the code:
elementHierarchyArray[h].AddComponent("EllipsoidParticleEmitter");
elementHierarchyArray[h].AddComponent("ParticleRenderer");
elementHierarchyArray[h].renderer.material.shader = Shader.Find("Particles/Additive (Soft)");
elementHierarchyArray[h].renderer.material.mainTexture = testMaterialParticle;
elementHierarchyArray[h].particleEmitter.Emit(100);
So it adds an emitter and renderer (I don't need an animator), sets the shader to additive(soft), adds the texture contained in an inspector-defined variable, and emits 100 particles.
My questions: 1. Although this all seems to work, it throws up the following error:
Instantiating material due to calling renderer.material during edit mode. This will leak materials into the scene. You most likely want to use renderer.sharedMaterial instead.
But when I change the relevant lines above to this:
elementHierarchyArray[h].renderer.sharedMaterial.shader = Shader.Find("Particles/Additive (Soft)");
elementHierarchyArray[h].renderer.sharedMaterial.mainTexture = testMaterialParticle;
I get this error:
NullReferenceException
And the particles all show up as pink squares. Does anyone know what I'm doing wrong here?
My second questions is, how can I get the particle emitter added in a script to emit in one shot? At the moment, all the particles appear gradually. Obviously in the inspector you can select it to be one shot, but I need to be able to add this via script, and there doesn't seem to be anything about it in the script reference (unless I'm being blind). I've tried various ways to access a boolean called oneShot etc. but it doesn't seem to exist.
Thank you! S
Answer by syclamoth · Oct 11, 2011 at 10:42 AM
The problem is that you never assign the renderer's material! That means that you are trying to edit a null material, and so none of that works. Try assigning a 'blank' material, or set up the material ahead of time, and then apply whatever modification you want to do after assigning a material to modify.