public LevelData() { brushes = new Brush[0]; lights = new UFLevelStructure.Light[0]; ambSounds = new AmbSound[0]; events = new UFLevelStructure.Event[0]; spawnPoints = new SpawnPoint[0]; particleEmitters = new UFLevelStructure.ParticleEmitter[0]; pushRegions = new PushRegion[0]; decals = new Decal[0]; climbingRegions = new ClimbingRegion[0]; boltEmitters = new BoltEmitter[0]; targets = new UFTransform[0]; entities = new Entity[0]; items = new Item[0]; clutter = new Clutter[0]; triggers = new Trigger[0]; movingGeometry = new Brush[0]; movingGroups = new MovingGroup[0]; geoRegions = new GeoRegion[0]; }
public void Set(UFLevelStructure.ParticleEmitter emit) { ParticleSystem ps = gameObject.AddComponent <ParticleSystem>(); this.timeOn = emit.timeOn; this.timeOnRandomize = emit.timeOnRandomize; this.timeOff = emit.timeOff; this.timeOffRandomize = emit.timeOffRandomize; ParticleSystem.MainModule psMain = ps.main; psMain.loop = true; psMain.playOnAwake = emit.emitterInitiallyOn; ParticleSystem.ShapeModule psShape = ps.shape; switch (emit.type) { case UFLevelStructure.ParticleEmitter.EmitterShape.plane: psShape.shapeType = ParticleSystemShapeType.Box; psShape.scale = new Vector3(emit.planeExtents.x, emit.planeExtents.y, 0.1f); psShape.randomDirectionAmount = 0.1f * emit.randomDirection / 90f; break; case UFLevelStructure.ParticleEmitter.EmitterShape.sphere: psShape.shapeType = ParticleSystemShapeType.Cone; psShape.angle = emit.randomDirection; psShape.radius = emit.SphereRadius; break; default: psShape.enabled = false; break; } //RedFaction emits in y-direction, Unity in z. psShape.rotation = new Vector3(-90f, 0f, 0f); float rMin = emit.radius - emit.radiusRandomize; float rMax = emit.radius + emit.radiusRandomize; psMain.startSize = new ParticleSystem.MinMaxCurve(2f * rMin, 2f * rMax); float decMin = emit.decay - emit.decayRandomize; float decMax = emit.decay + emit.decayRandomize; psMain.startLifetime = new ParticleSystem.MinMaxCurve(decMin, decMax); float velMin = emit.velocity - emit.velocityRandomize; float velMax = emit.velocity + emit.velocityRandomize; psMain.startSpeed = new ParticleSystem.MinMaxCurve(velMin, velMax); ParticleSystem.EmissionModule psEmission = ps.emission; float spwMin = 1f / (emit.spawnDelay + emit.spawnRandomize); if (float.IsInfinity(spwMin) || float.IsNaN(spwMin)) { spwMin = 0f; } float spwMax = Mathf.Min(50f, 1f / (emit.spawnDelay - emit.spawnRandomize)); psEmission.rateOverTime = new ParticleSystem.MinMaxCurve(spwMin, spwMax); int maxParticles = Mathf.CeilToInt(spwMax * decMax); psMain.maxParticles = Mathf.Min(200, maxParticles); psMain.startColor = emit.particleColor; float time = emit.decay; if (emit.gravity) { psMain.gravityModifierMultiplier = emit.gravityMultiplier; } else { psMain.gravityModifierMultiplier = 0f; } ParticleSystem.SizeOverLifetimeModule psSolt = ps.sizeOverLifetime; if (emit.growthRate != 0f) { psSolt.enabled = true; float finalSize = (emit.radius + emit.growthRate * time) / emit.radius; AnimationCurve curve = AnimationCurve.Linear(0f, 1f, 1f, finalSize); psSolt.size = new ParticleSystem.MinMaxCurve(1f, curve); } ParticleSystem.VelocityOverLifetimeModule psVolt = ps.velocityOverLifetime; if (emit.acceleration != 0f) { psVolt.enabled = true; float finalVel = (emit.velocity + emit.acceleration * time) / emit.velocity; AnimationCurve curve = AnimationCurve.Linear(0f, 1f, 1f, finalVel); psVolt.speedModifier = new ParticleSystem.MinMaxCurve(1f, curve); } ParticleSystem.ColorOverLifetimeModule psColt = ps.colorOverLifetime; if (emit.fadeColor != emit.particleColor) { psColt.enabled = true; Gradient gradient = UFUtils.GetLinearGradient(emit.particleColor, emit.fadeColor); psColt.color = new ParticleSystem.MinMaxGradient(gradient); } if (emit.randomOrient) { psMain.startRotation = new ParticleSystem.MinMaxCurve(0f, 360f); } ParticleSystem.CollisionModule psCollision = ps.collision; if (emit.collidWithWorld) { psCollision.enabled = true; psCollision.type = ParticleSystemCollisionType.World; psCollision.quality = ParticleSystemCollisionQuality.High; float lifeTimeLoss = emit.dieOnImpact ? 1f : 0f; psCollision.lifetimeLoss = new ParticleSystem.MinMaxCurve(lifeTimeLoss); float bounce = emit.bounciness / 15f; psCollision.bounce = new ParticleSystem.MinMaxCurve(bounce); float stick = emit.stickieness / 15f; psCollision.dampen = new ParticleSystem.MinMaxCurve(stick); psCollision.enableDynamicColliders = false; psCollision.radiusScale = 0.1f; //TODO: explodeOnImpact, collidWithLiquids, playCollisionSounds } ParticleSystem.NoiseModule psNoise = ps.noise; if (emit.swirliness > 0) { psNoise.enabled = true; float swirly = emit.swirliness / 15f; psNoise.strength = swirly; psNoise.scrollSpeed = 2f; psNoise.octaveCount = 2; } //TODO: pushEffect, loopAnim, forceSpawnEveryFrame, directionDependentVelocity }