Пример #1
0
    // Use this for initialization
    void Awake()
    {
        if (partiSystem == null)
            partiSystem = this.GetComponent<ParticleSystem> ();
        hasParticles = (partiSystem != null);

        if (placeFallingParticles == null && placeFallingParticles)
            placeFallingParticles = this.GetComponent<PlaceFallingParticles> ();
        if (placeFallingParticles == null)
            setPeakPoint = false;

        if (getParentTarget && this.transform.parent != null) {
            parentWind = this.transform.parent.GetComponentInParent<ParticleWind>();
        }
        if (parentWind == null) {
            getParentTarget = false;
        }
        ps = new ParticleSystem.Particle[0];

        windTarget = Random.insideUnitSphere;
        windTarget.Scale (windStrength);
        wind = windTarget;
    }
Пример #2
0
        public override void Bind(Entity entity, Main main, bool creating = false)
        {
            if (ParticleSystem.Get(main, "Snow") == null)
            {
                ParticleSystem.Add(main, "Snow",
                                   new ParticleSystem.ParticleSettings
                {
                    TextureName           = "Particles\\default",
                    EffectFile            = "Effects\\ParticleSnow",
                    MaxParticles          = 50000,
                    Duration              = TimeSpan.FromSeconds(SnowFactory.MaxLifetime),
                    MinHorizontalVelocity = -1.0f,
                    MaxHorizontalVelocity = 1.0f,
                    MinVerticalVelocity   = -1.0f,
                    MaxVerticalVelocity   = 1.0f,
                    Gravity                    = new Vector3(0.0f, 0.0f, 0.0f),
                    MinRotateSpeed             = 0.0f,
                    MaxRotateSpeed             = 0.0f,
                    MinStartSize               = 0.05f,
                    MaxStartSize               = 0.15f,
                    MinEndSize                 = 0.05f,
                    MaxEndSize                 = 0.15f,
                    MinColor                   = new Vector4(0.5f, 0.5f, 0.5f, 1.0f),
                    MaxColor                   = new Vector4(0.5f, 0.5f, 0.5f, 1.0f),
                    EmitterVelocitySensitivity = 1.0f,
                    BlendState                 = BlendState.Opaque,
                    Material                   = new Components.Model.Material {
                        SpecularIntensity = 0.0f, SpecularPower = 1.0f
                    },
                });
                ParticleSystem.Add(main, "Wind",
                                   new ParticleSystem.ParticleSettings
                {
                    TextureName           = "Particles\\wind",
                    EffectFile            = "Effects\\ParticleVolume",
                    MaxParticles          = 10000,
                    Duration              = TimeSpan.FromSeconds(SnowFactory.MaxWindLifetime),
                    MinHorizontalVelocity = -1.0f,
                    MaxHorizontalVelocity = 1.0f,
                    MinVerticalVelocity   = -1.0f,
                    MaxVerticalVelocity   = 1.0f,
                    Gravity                    = new Vector3(0.0f, 0.0f, 0.0f),
                    MinRotateSpeed             = -1.0f,
                    MaxRotateSpeed             = 1.0f,
                    MinStartSize               = 20.0f,
                    MaxStartSize               = 30.0f,
                    MinEndSize                 = 30.0f,
                    MaxEndSize                 = 45.0f,
                    MinColor                   = new Vector4(1.0f, 1.0f, 1.0f, 0.2f),
                    MaxColor                   = new Vector4(1.0f, 1.0f, 1.0f, 0.2f),
                    EmitterVelocitySensitivity = 1.0f,
                    BlendState                 = BlendState.AlphaBlend,
                });
            }

            entity.CannotSuspendByDistance = true;
            Transform transform = entity.GetOrCreate <Transform>("Transform");

            ParticleWind wind = entity.GetOrCreate <ParticleWind>("Wind");

            ParticleEmitter emitter = entity.GetOrCreate <ParticleEmitter>("Emitter");

            emitter.Add(new Binding <Vector3>(emitter.Jitter, wind.Jitter));

            ParticleEmitter windEmitter = entity.GetOrCreate <ParticleEmitter>("WindEmitter");

            windEmitter.Add(new Binding <Vector3>(windEmitter.Jitter, wind.Jitter));

            Property <Vector3> dir = new Property <Vector3>();

            transform.Add(new Binding <Vector3, Quaternion>(dir, x => Vector3.Transform(Vector3.Down, x), transform.Quaternion));
            wind.Add(new Binding <Quaternion>(wind.Orientation, transform.Quaternion));

            emitter.Add(new Binding <Vector3, float>(emitter.Position, x => new Vector3(0, x * ParticleWind.StartHeightMultiplier, 0), wind.Speed));
            windEmitter.Add(new Binding <Vector3, float>(windEmitter.Position, x => new Vector3(0, x * ParticleWind.StartHeightMultiplier * 2, 0), wind.Speed));

            emitter.AddParticle = delegate(Vector3 position, Vector3 velocity, float prime)
            {
                Vector3 kernelCoord = (position + wind.Jitter) / wind.KernelSpacing;
                float   distance    = wind.RaycastDistances[Math.Max(0, Math.Min(ParticleWind.KernelSize - 1, (int)kernelCoord.X)), Math.Max(0, Math.Min(ParticleWind.KernelSize - 1, (int)kernelCoord.Z))];
                if (distance > 0)
                {
                    float lifetime = Math.Min(distance / wind.Speed, SnowFactory.MaxLifetime);
                    if (lifetime > prime)
                    {
                        emitter.ParticleSystem.AddParticle(main.Camera.Position + Vector3.Transform(position, transform.Quaternion), dir.Value * wind.Speed.Value, lifetime, -1.0f, prime);
                    }
                }
            };

            windEmitter.AddParticle = delegate(Vector3 position, Vector3 velocity, float prime)
            {
                Vector3 kernelCoord = (position + wind.Jitter) / wind.KernelSpacing;
                float   distance    = wind.RaycastDistances[Math.Max(0, Math.Min(ParticleWind.KernelSize - 1, (int)kernelCoord.X)), Math.Max(0, Math.Min(ParticleWind.KernelSize - 1, (int)kernelCoord.Z))];
                if (distance > 0)
                {
                    float lifetime = Math.Min((distance + ParticleWind.StartHeightMultiplier) / wind.Speed, SnowFactory.MaxWindLifetime);
                    if (lifetime > prime)
                    {
                        windEmitter.ParticleSystem.AddParticle(main.Camera.Position + Vector3.Transform(position, transform.Quaternion), dir.Value * wind.Speed.Value, lifetime, -1.0f, prime);
                    }
                }
            };

            this.SetMain(entity, main);
            emitter.ParticleType.Value     = "Snow";
            windEmitter.ParticleType.Value = "Wind";

            entity.Add("KernelSpacing", wind.KernelSpacing);
            entity.Add("ParticlesPerSecond", emitter.ParticlesPerSecond);
            entity.Add("WindParticlesPerSecond", windEmitter.ParticlesPerSecond);
            entity.Add("Wind", wind.Speed);

            entity.Add(new PostInitialization
            {
                delegate()
                {
                    wind.Update();
                    emitter.Prime(Vector3.Zero);
                    windEmitter.Prime(Vector3.Zero);
                }
            });
        }