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; // } }
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; } } }
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; } } } } }