ぬるーむ

Unity初心者が誰もが知っているゲームの模倣をしています。個人的な備忘録ですが、入門書を読み終えたばかりの初心者の方は「こんなへなちょこでもいいのか!」「俺の方がうまく作れる」と作成意欲がわいたりするかもしれません。

Unityでぷよぷよを作ってみた 8


スポンサードリンク

猶予を持たせる

ぷよがくっついてから消えるまでの間と消えた後落下するまでの間のそれぞれに猶予を持たせる。

public event EventHandler<EventArgs> Falled;
private static List<Puyo> droppablePuyoes = new List<Puyo>();
private enum State { Normal, FreeFall, Vanish, Wait }
private int chainCount;

private void Update()
{
    switch (state)
    {
        case State.Normal:
        //落下、移動、回転、固定などの処理
            break;

        case State.FreeFall:
            //自由落下処理
            break;

        case State.Vanish:
            //消去可能ぷよを取得
            var vanishable = field.GetVanishablePuyoes();

            if (vanishable.Count > 0)
            {
                //0.1秒後に消去を実行
                StartCoroutine(CoroutineWait(0.1f, () =>
                {
                    chainCount++;

                    //ぷよを消去
                    vanishable.ForEach(p => p.Vanish());
                    
                    //落下可能ぷよを取得
                    droppablePuyoes = field.GetDroppablePuyoes();

                    //0.5秒後に自由落下または、次の組ぷよの作成を実行
                    StartCoroutine(CoroutineWait(0.5f, () =>
                    {
                        if (droppablePuyoes.Count > 0) state = State.FreeFall;
                        else
                        {
                            //通常へ遷移
                            TransitionToNormal();
                        }
                    }));
                }));
            }
            else
            {
                //通常へ遷移
                TransitionToNormal();
            }

            break;

        case State.Wait:
            //待機処理
            break;
    }
}

//指定した秒数待機し、指定した処理を実行
private IEnumerator CoroutineWait(float seconds, Action callback)
{
    state = State.Wait;
    yield return new WaitForSeconds(seconds);
    callback();
}

private void TransitionToNormal()
{
    chainCount = 0;
    state = State.Normal;
    //この組ぷよ自身の消去と新しい組ぷよの作成
    OnFalled();
}

//落下終了後のイベント。組ぷよ作成時に設定
protected virtual void OnFalled()
{
    Falled?.Invoke(this, EventArgs.Empty);
}