public void OnAttractParticles(ParticleSystem particleSystem, float attractionForce) { ParticleTargetFulfillment particleTargetFulfillment = targetMapping[particleSystem]; int particleCount = particleTargetFulfillment.particleCount; ParticleSystem.Particle[] particles = particleTargetFulfillment.particles; ParticleTargetType particleTargetType = particleTargetFulfillment.particleTargetType; Transform targetTransform = particleTargetFulfillment.targetTransform; PlayerView playerView = particleTargetFulfillment.playerView; PlayerFacade playerFacade = particleTargetFulfillment.playerFacade; for (int i = 0; i < particleCount; ++i) { particles[i].position += attractionForce * (targetTransform.position - particles[i].position).normalized + ((1f - (attractionForce / targetAttraction)) * particles[i].velocity * Time.deltaTime); } switch (particleTargetType) { case ParticleTargetType.Aether: OnAttractAether(particleSystem, particles, particleCount, targetTransform, playerView); break; case ParticleTargetType.Respawn: OnAttractRespawn(particles, particleCount, targetTransform, playerFacade); break; } particleSystem.SetParticles(particles, particles.Length); }
public void OnTargetEnd(ParticleSystem particleSystem) { ParticleTargetFulfillment particleTargetFulfillment = targetMapping[particleSystem]; targetMapping[particleSystem] = new ParticleTargetFulfillment() { tweening = false }; particleSystem.Clear(); ParticleTargetType particleTargetType = particleTargetFulfillment.particleTargetType; int particleCount = particleTargetFulfillment.particleCount; int fulfilledParticleCount = particleTargetFulfillment.fulfilledParticleCount; switch (particleTargetType) { case ParticleTargetType.Aether: OnAetherEnd(particleTargetFulfillment.playerView, particleCount - fulfilledParticleCount); break; case ParticleTargetType.Respawn: OnRespawnEnd(particleTargetFulfillment.playerFacade); break; } }
private void OnAttractAether(ParticleSystem particleSystem, ParticleSystem.Particle[] particles, int particleCount, Transform targetTransform, PlayerView playerView) { ParticleTargetFulfillment particleTargetFulfillment = targetMapping[particleSystem]; for (int i = 0; i < particleCount; ++i) { if (particles[i].lifetime >= 0 && (particles[i].position - targetTransform.position).magnitude < 1) { particles[i].lifetime = -1; particleTargetFulfillment.fulfilledParticleCount++; aetherGainTrigger.Fire(playerView); } } targetMapping[particleSystem] = particleTargetFulfillment; }
public void Target(ParticleTargetRequest particleTargetRequest) { ParticleSystem particleSystem = particleTargetRequest.particleSystem; if (!targetMapping.ContainsKey(particleSystem)) { targetMapping.Add(particleSystem, new ParticleTargetFulfillment() { tweening = false }); } ParticleTargetFulfillment particleTargetFulfillment = targetMapping[particleSystem]; if (particleTargetFulfillment.tweening) { return; } particleTargetFulfillment = new ParticleTargetFulfillment() { tweening = true, particles = new ParticleSystem.Particle[particleTargetRequest.particleCount], particleCount = particleTargetRequest.particleCount, fulfilledParticleCount = 0, targetTransform = particleTargetRequest.targetTransform, particleTargetType = particleTargetRequest.particleTargetType, playerView = particleTargetRequest.playerView, playerFacade = particleTargetRequest.playerFacade, itemType = particleTargetRequest.itemType, }; particleSystem.Emit(particleTargetRequest.particleCount); particleSystem.GetParticles(particleTargetFulfillment.particles); targetMapping[particleSystem] = particleTargetFulfillment; targetHashtable["time"] = particleTargetRequest.targetTime; targetHashtable["onupdate"] = (Action <object>)(attractionForce => { OnAttractParticles(particleSystem, (float)attractionForce); }); targetHashtable["oncompleteparams"] = particleSystem; iTween.ValueTo(gameObject, targetHashtable); }