Пример #1
0
    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);
        }
    }