/// <summary> /// Adds the required particle events to track particles. /// </summary> public void AddRequiredParticleEvents() { if (playgroundSystem != null) { // Hookup events birthEvent = GetEventFromType(EVENTTYPEC.Birth); if (birthEvent == null) { birthEvent = PlaygroundC.CreateEvent(playgroundSystem); birthEvent.broadcastType = EVENTBROADCASTC.EventListeners; birthEvent.eventType = EVENTTYPEC.Birth; } birthEvent.particleEvent += OnParticleBirthEvent; deathEvent = GetEventFromType(EVENTTYPEC.Death); if (deathEvent == null) { deathEvent = PlaygroundC.CreateEvent(playgroundSystem); deathEvent.broadcastType = EVENTBROADCASTC.EventListeners; deathEvent.eventType = EVENTTYPEC.Death; } deathEvent.particleEvent += OnParticleDeathEvent; collisionEvent = GetEventFromType(EVENTTYPEC.Collision); if (collisionEvent == null) { collisionEvent = PlaygroundC.CreateEvent(playgroundSystem); collisionEvent.broadcastType = EVENTBROADCASTC.EventListeners; collisionEvent.eventType = EVENTTYPEC.Collision; } collisionEvent.particleEvent += OnParticleCollisionEvent; } }
void Start() { if (referenceObject == null || particles == null) { return; } // Create and setup the birth event birthEvent = PlaygroundC.CreateEvent(particles); birthEvent.broadcastType = EVENTBROADCASTC.EventListeners; birthEvent.eventType = EVENTTYPEC.Birth; // Create and setup the death event deathEvent = PlaygroundC.CreateEvent(particles); deathEvent.broadcastType = EVENTBROADCASTC.EventListeners; deathEvent.eventType = EVENTTYPEC.Death; // Hook up the event listeners to the delegates birthEvent.particleEvent += OnParticleDidBirth; deathEvent.particleEvent += OnParticleDidDie; // Create a parent for all followers (for Hierarchy convenience) followerParent = new GameObject("Followers").transform; followerParent.parent = transform; // Get the trail renderer (if available) and its time referenceTrailRenderer = referenceObject.GetComponent <TrailRenderer>(); if (referenceTrailRenderer != null) { trailTime = referenceTrailRenderer.time; } // Set an extra amount of followers if required (a trail's time will exceed a particle's) int extra = followerLifetime <= 0? Mathf.CeilToInt(Mathf.Abs(particles.lifetime - trailTime) + (trailTime - particles.lifetime)) + 2 : Mathf.CeilToInt(Mathf.Abs(particles.lifetime - followerLifetime) + (followerLifetime - particles.lifetime)) + 2; if (particles.lifetime <= 1f) { extra++; } // Create the follower cache (this will be iterated through and reused whenever a particle rebirths) referenceObjectsCache = new PlaygroundFollower[cacheSize > 0? cacheSize : particles.particleCount + Mathf.CeilToInt(particles.particleCount * extra)]; for (int i = 0; i < referenceObjectsCache.Length; i++) { GameObject clone = (GameObject)Instantiate(referenceObject); referenceObjectsCache[i] = new PlaygroundFollower(clone.transform, clone, clone.GetComponent <TrailRenderer>(), 0, 0); referenceObjectsCache[i].transform.parent = followerParent; if (referenceObjectsCache[i].trailRenderer != null) { referenceObjectsCache[i].trailRenderer.time = 0; } referenceObjectsCache[i].gameObject.SetActive(false); } }
void Awake() { // Create and setup the birth event birthEvent = PlaygroundC.CreateEvent(particles); birthEvent.broadcastType = EVENTBROADCASTC.EventListeners; birthEvent.eventType = EVENTTYPEC.Birth; // Create and setup the death event deathEvent = PlaygroundC.CreateEvent(particles); deathEvent.broadcastType = EVENTBROADCASTC.EventListeners; deathEvent.eventType = EVENTTYPEC.Death; // Hook up the event listeners to the delegates birthEvent.particleEvent += OnParticleDidBirth; deathEvent.particleEvent += OnParticleDidDie; // Setup the followers followerParent = new GameObject("Followers").transform; followerParent.parent = transform; referenceTrailRenderer = referenceObject.GetComponent <TrailRenderer>(); if (referenceTrailRenderer != null) { trailTime = referenceTrailRenderer.time; } int extra = followerLifetime <= 0? Mathf.CeilToInt(Mathf.Abs(particles.lifetime - trailTime) + (trailTime - particles.lifetime)) + 2 : Mathf.CeilToInt(Mathf.Abs(particles.lifetime - followerLifetime) + (followerLifetime - particles.lifetime)) + 2; if (particles.lifetime <= 1f) { extra++; } referenceObjectsCache = new PlaygroundFollower[cacheSize > 0? cacheSize : particles.particleCount + Mathf.CeilToInt(particles.particleCount * extra)]; for (int i = 0; i < referenceObjectsCache.Length; i++) { GameObject clone = (GameObject)Instantiate(referenceObject); referenceObjectsCache[i] = new PlaygroundFollower(clone.transform, clone, clone.GetComponent <TrailRenderer>(), 0, 0); referenceObjectsCache[i].transform.parent = followerParent; if (referenceObjectsCache[i].trailRenderer != null) { referenceObjectsCache[i].trailRenderer.time = 0; } referenceObjectsCache[i].gameObject.SetActive(false); } }