Esempio n. 1
0
        void SpawnAllParticles(Vector3 _pos, Vector2 _initSpeed, int count = -1, float delay = 0f, bool waitBetweenDropSpawn = true)
        {
            IsWaterInScene = true;

            int auxCount = 0;

            // while (true)
            //{
            for (int i = 0; i < WaterDropsObjects.Length; i++)
            {
                MetaballParticleClass MetaBall = WaterDropsObjects[i].GetComponent <MetaballParticleClass>();

                if (MetaBall.Active == true)
                {
                    continue;
                }

                MetaBall.LifeTime = LifeTime;
                WaterDropsObjects[i].transform.position = transform.position;
                MetaBall.Active      = true;
                MetaBall.witinTarget = false;

                if (_initSpeed == Vector2.zero)
                {
                    _initSpeed = initSpeed;
                }

                if (DynamicChanges)
                {
                    _initSpeed = initSpeed;
                    MetaBall.transform.localScale = new Vector3(size, size, 1f);
                    SetWaterColor(FillColor, StrokeColor);
                }

                WaterDropsObjects[i].GetComponent <Rigidbody2D>().velocity = _initSpeed;


                // Count limiter
                if (count > -1)
                {
                    auxCount++;
                    if (auxCount >= count && !Dynamic)
                    {
                        break;
                    }
                }
            }

            alreadySpawned = true;


            // }
        }
Esempio n. 2
0
        IEnumerator loop(Vector3 _pos, Vector2 _initSpeed, int count = -1, float delay = 0f, bool waitBetweenDropSpawn = true)
        {
            yield return(new WaitForSeconds(delay));

            _breakLoop = false;

            IsWaterInScene = true;

            int auxCount = 0;

            while (true)
            {
                for (int i = 0; i < WaterDropsObjects.Length; i++)
                {
                    if (_breakLoop)
                    {
                        yield break;
                    }

                    MetaballParticleClass MetaBall = WaterDropsObjects [i].GetComponent <MetaballParticleClass> ();

                    if (MetaBall.Active == true)
                    {
                        continue;
                    }

                    MetaBall.LifeTime = LifeTime;
                    WaterDropsObjects [i].transform.position = transform.position;

                    MetaBall.Active      = true;
                    MetaBall.witinTarget = false;

                    if (_initSpeed == Vector2.zero)
                    {
                        _initSpeed = initSpeed;
                    }

                    if (DynamicChanges)
                    {
                        _initSpeed = initSpeed;
                        MetaBall.transform.localScale = new Vector3(size, size, 1f);
                        SetWaterColor(FillColor, StrokeColor);
                    }

                    WaterDropsObjects [i].GetComponent <Rigidbody2D> ().velocity = _initSpeed;


                    // Count limiter
                    if (count > -1)
                    {
                        auxCount++;
                        if (auxCount >= count && !Dynamic)
                        {
                            yield break;
                        }
                    }

                    if (waitBetweenDropSpawn)
                    {
                        yield return(new WaitForSeconds(DelayBetweenParticles));
                    }
                }
                yield return(new WaitForEndOfFrame());

                alreadySpawned = true;

                if (!Dynamic)
                {
                    yield break;
                }
            }
        }
Esempio n. 3
0
    IEnumerator Refraction()
    {
        // FixedUpdate終わりまで待つ
        yield return(new WaitForFixedUpdate());

        m_lightpoint.LineReset();
        // 変数宣言
        m_dirVec = m_lightpoint.transform.right;    // 初期方向
        m_pos    = m_lightpoint.transform.position; // 初期位置
        m_color  = m_lightpoint.vertColor;
        bool EnterWater = false;                    // 水に当たっているか
        int  i          = 0;

        while (i++ < 200)
        {
            // 水か光を通さないものに当たっているか
            ray = Physics2D.Raycast(m_pos, m_dirVec, 50,
                                    LayerMask.GetMask("Default", "PostProcessing"), 0, 2);
            // 枠に当たったら位置をLineRendererに伝えて終了
            if (ray.collider.gameObject.layer == LayerMask.NameToLayer("Default"))
            {
                if (FrameLayerProcessing(ray.transform.tag, false))
                {
                    break;
                }
                continue;
            }
            else if (!EnterWater && ray.collider.gameObject.layer ==
                     LayerMask.NameToLayer("PostProcessing")) // 水だったら
            {
                // 水の粒が規定値よりあるか
                if (!ray.transform.GetComponent <MetaballParticleClass>().
                    CountWater())
                {
                    m_pos = ray.point + m_dirVec * Vector2.Distance(ray.point, ray.transform.position) * 2;
                    continue;
                }

                ray = ray.transform.GetComponent <MetaballParticleClass>().WaterNormalVec(ray);
                // 空気から水への屈折したベクトルを取得
                m_dirVec = Refractioning(GetRefractiveIndex(RefractiveIndex.Air),
                                         GetRefractiveIndex(RefractiveIndex.Water),
                                         m_dirVec, ray.normal);

                m_pos = ray.point;

                AddLineRenderer();
                m_color = ray.transform.GetComponent <MetaballParticleClass>().
                          spRend.color;
                EnterWater = true;
            }

            // 水の中にいるとき
            if (EnterWater)
            {
                Collider2D[] collider2D = new Collider2D[1];
                Vector2      raypos     = m_pos;
                int          k          = 0;
                while (EnterWater && k++ < 200)
                {
                    // まだ水の中にいるか
                    int hitnum = Physics2D.OverlapCircleNonAlloc(m_pos, 0.2f,
                                                                 collider2D, WaterLayer);
                    if (hitnum == 0)    // 水から抜けた時
                    {
                        ray = Physics2D.Raycast(m_pos, -m_dirVec, 5,
                                                WaterLayer, 0, 2);
                        ray      = ray.transform.GetComponent <MetaballParticleClass>().WaterNormalVec(ray);
                        m_dirVec = Refractioning(GetRefractiveIndex(RefractiveIndex.Water),
                                                 GetRefractiveIndex(RefractiveIndex.Air),
                                                 m_dirVec, -ray.normal);

                        m_pos = MetaballParticleClass.nearPoint(ray.point, ray.point + ray.normal,
                                                                (Vector2)ray.transform.position + ray.normal * 0.114f, false);
                        Debug.DrawRay(m_pos, m_dirVec, Color.blue); // 0.126f 0.085f 0.112f

                        AddLineRenderer();

                        EnterWater = false;
                    }
                    // 水の中に不透過オブジェクトがあるかどうか
                    else if (ray = Physics2D.Raycast(raypos,
                                                     m_dirVec, 0.3f, FrameLayer, 0, 2))
                    {
                        EnterWater =
                            FrameLayerProcessing(ray.transform.tag, EnterWater);
                        if (!EnterWater)
                        {
                            yield break;
                        }
                    }
                    else
                    {
                        raypos = m_pos;
                        // 基準位置を方向に進める
                        m_pos += m_dirVec * 0.3f;
                    }
                }
            }
        }
    }