Esempio n. 1
0
        public override object WriteTo(object obj)
        {
            obj = base.WriteTo(obj);
            if (obj == null)
            {
                return(null);
            }

            ParticleSystem.TriggerModule o = (ParticleSystem.TriggerModule)obj;
            if (m_colliders == null)
            {
                for (int i = 0; i < o.maxColliderCount; ++i)
                {
                    o.SetCollider(i, null);
                }
            }
            else
            {
                for (int i = 0; i < Mathf.Min(o.maxColliderCount, m_colliders.Length); ++i)
                {
                    o.SetCollider(i, FromID <Component>(m_colliders[i]));
                }
            }

            return(obj);
        }
Esempio n. 2
0
    public void Activate(float delay, Vector3 position, float flyTime)
    {
        StartCoroutine(ActivateMagnet());

        IEnumerator ActivateMagnet() //Use coroutine to enable and disable the magnet easily with yields
        {
            //Prepare particle system to be attracted by the magnet if it isn't already or is configured improperly
            if (!_triggerModule.enabled || _triggerModule.inside != ParticleSystemOverlapAction.Callback)
            {
                GameObject clone = new GameObject();
                clone.AddComponent <BoxCollider2D>().size = new Vector2(500, 500);
                clone.transform.parent = transform;

                _triggerModule.enabled = true;
                _triggerModule.inside  = ParticleSystemOverlapAction.Callback;
                _triggerModule.SetCollider(0, clone.GetComponent <BoxCollider2D>());
            }

            yield return(new WaitForSeconds(delay));

            _targetPosition  = position; //Assign position to variable. Then gets referenced in OnParticletrigger
            _magnetActivated = true;
            yield return(new WaitForSeconds(flyTime));

            _magnetActivated = false;
        }
    }
Esempio n. 3
0
 void Start()
 {
     ps = GetComponent <ParticleSystem>();
     collisionEvents = new List <ParticleCollisionEvent>();
     ParticleSystem.TriggerModule trigger = ps.trigger;
     player = GameObject.FindWithTag("Player").GetComponent <Player>();
     trigger.SetCollider(0, player.gameObject.GetComponent <Collider>());
 }
Esempio n. 4
0
 void OnEnable()
 {
     _ps_system  = GetComponent <ParticleSystem>();
     _ps_trigger = _ps_system.trigger;
     //_ps_particles = new ParticleSystem.Particle[_ps_system.maxParticles];// Before Unity 5.5
     _ps_particles = new ParticleSystem.Particle[_ps_system.main.maxParticles];            // Since Unity 5.5
     for (int i = 0; i < target.Length; i++)
     {
         _ps_trigger.SetCollider(i, target[i].GetComponent <Collider>());
     }
 }
Esempio n. 5
0
    public override IEnumerator WiatForStart()
    {
        for (int i = 0; i < pS.Length; i++)
        {
            ParticleSystem.TriggerModule psTrigger = pS[i].trigger;
            psTrigger.SetCollider(0, rb.gameObject.GetComponent <CircleCollider2D>());
        }

        yield return(new WaitForSeconds(1f));

        rb.bodyType     = RigidbodyType2D.Dynamic;
        rb.gravityScale = 0.5f;
    }
Esempio n. 6
0
    public void Splash()
    {
        ParticleSystem ps = Instantiate(splashParticles);

        ps.transform.position = player.transform.position;

        // Set particle velocity according to velocity
        ParticleSystem.MainModule newMain = ps.main;
        float speed = Mathf.Abs(player.rb.velocity.y / 2f);

        newMain.startSpeed = new ParticleSystem.MinMaxCurve(speed * 0.8f * 1.5f, speed * 1.2f * 1.5f + 1);

        // Set particle quantity according to velocity
        ParticleSystem.EmissionModule newEmission = ps.emission;
        newEmission.rateOverTimeMultiplier = Mathf.Pow(player.rb.velocity.y, 2) / (900f) * 300f + 50;

        ParticleSystem.TriggerModule newTrigger = ps.trigger;
        newTrigger.SetCollider(0, splashZone._collider);

        ps.Play();
    }
Esempio n. 7
0
    private void Start()
    {
        ParticleSystem.TriggerModule t = GetComponentInChildren <ParticleSystem>().trigger;
        GameObject[]     g             = GameObject.FindGameObjectsWithTag("WaterTarget");
        SphereCollider[] colliders     = new SphereCollider[g.Length];

        int i = 0;

        foreach (GameObject a in g)
        {
            colliders[i] = a.GetComponent <SphereCollider>();
            i++;
        }


        i = 0;
        foreach (SphereCollider a in colliders)
        {
            t.SetCollider(i, a);
            i++;
        }

        secondFinger = GameObject.FindGameObjectWithTag("IndexBoneR2");
    }
Esempio n. 8
0
        void LateUpdate()
        {
            if (target[0] == null)
            {
                return;
            }

            //If you are not changing target during runtime, skip this:
            for (int i = 0; i < target.Length; i++)
            {
                _ps_trigger.SetCollider(i, target[i].GetComponent <Collider>());
            }

            _ps_particles = new ParticleSystem.Particle[_ps_system.main.maxParticles];
            int numParticlesAlive = _ps_system.GetParticles(_ps_particles);

            for (int i = 0; i < numParticlesAlive; i++)
            {
                float[] dist = new float[target.Length];
                switch (targetSelection)
                {
                case TSOP.random:
                    index = Mathf.Abs((int)_ps_particles[i].randomSeed) % target.Length;
                    break;

                case TSOP.closest:
                    for (int j = 0; j < target.Length; j++)
                    {
                        dist[j] = Vector3.Distance(_ps_particles[i].position, target[j].position);
                    }
                    //index = System.Array.IndexOf(dist, dist.Min());// slower than comparing in foreach.
                    float minValue = float.MaxValue;
                    int   minindex = -1;
                    index = -1;
                    foreach (float num in dist)
                    {
                        minindex++;
                        if (num <= minValue)
                        {
                            minValue = num;
                            index    = minindex;
                        }
                    }
                    break;
                }
                //Debug.Log(index);
                float   ted      = (target[index].position - this.transform.position).sqrMagnitude + 0.001f;
                Vector3 diff     = target[index].position - _ps_particles[i].position;
                float   diffsqrm = diff.sqrMagnitude;
                float   face     = Vector3.Dot(_ps_particles[i].velocity.normalized, diff.normalized);
                float   f        = Mathf.Abs((ted - diffsqrm) / ted) * ted * (face + 1.001f);
                //_ps_particles[i].velocity = Vector3.ClampMagnitude(_ps_particles[i].velocity + diff * speed * 0.01f * f, maxSpeed);
                float t = 0;
                t += Time.deltaTime / (homingDelay * 0.01f + 0.0001f);
                _ps_particles[i].velocity = Vector3.ClampMagnitude(Vector3.Slerp(_ps_particles[i].velocity, _ps_particles[i].velocity + diff * speed * 0.01f * f, t), maxSpeed);

                /*
                 * if (Vector3.Distance(_ps_particles[i].position, target[index].position) < dyingRange) {
                 *      //_ps_particles[i].lifetime = 0f;// Before Unity 5.5
                 *      _ps_particles[i].remainingLifetime = 0f;// Since Unity 5.5
                 * }
                 */
            }
            _ps_system.SetParticles(_ps_particles, numParticlesAlive);
        }