IEnumerator FallCoroutine() { stationary = false; //gameObject.layer = LayerMask.NameToLayer("TileMoving"); if (jitter && jitter.enabled) { yield return(new WaitForSeconds(Helpers.Rand(jitterTimeMin, jitterTimeMax))); jitter.ResetPos(); jitter.enabled = false; } falling = true; if (roomIndex != -1) { LevelGenerator.I.ClearTileToPos(this); //drop tiles above this one int testRoomIndex = this.roomIndex; int testTileY = posY + 1; while (true) { if (testTileY == 0) { testRoomIndex += 1; testTileY = 4; } if (testTileY > 4) { testTileY = 1; testRoomIndex -= 1; if (testRoomIndex < 0) { break; } } var testRoom = LevelGenerator.I.rooms[testRoomIndex]; var testTile = testRoom.tileTable[posX, testTileY]; if (testTile != null && testTile.stationary) { testTile.SetFalling(); } else { break; } testTileY += 1; } } while (true) { float distanceToPlayer = Mathf.Abs(transform.position.y - MainController.I.player.transform.position.y); if (distanceToPlayer > 100) { Destroy(); yield break; } distanceToPlayer = Mathf.Abs(distanceToPlayer); var hit = Physics2D.Raycast(transform.position + new Vector3(0.5f, 0.8f, 0), Vector3.down, 1.6f, LayerMasks.tile); if (hit) { //Tile hit? var other = hit.transform.GetComponent <TileView>(); if (other && other.canBeCrushed) { other.Crush(); } else if (other && !other.falling) { //Stop moving falling = false; stationary = true; if (LevelGenerator.I.SetTileToPos(this, other.posY, other.roomIndex)) { yield break; } transform.position = new Vector3(posX, (-this.roomIndex * 4) + posY, 0); if (distanceToPlayer < 8) { if (impact) { impact.Play2DSound(); } if (dusty) { dusty.Play(); } } yield break; } } { //Move transform.position += Vector3.down * fallSpeed * Time.deltaTime; //Player hit var hitP = Physics2D.CircleCast(transform.position + Vector3.one * 0.5f, 0.4f, Vector3.down, 0.25f, LayerMasks.player); if (hitP) { var player = hitP.collider.GetComponent <PlayerView>(); player.CheckCrushingDeath(); } } yield return(true); } }