Ejemplo n.º 1
0
 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];
 }
Ejemplo n.º 2
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
    }