原カバンは鞄のお店ではありません。

Unityを使ったゲーム制作のあれこれを綴っていきます。

Unityでコルーチンが復帰しない場合の対処について

NHKにて

 今朝のニュースでBitsummitの様子が流れてましたね。有名どころ?な開発者の方々がインタビューされていて、「ああ、このゲームはこの人が作っているんだー」とか興味深く拝見させていただきました。

皆さん、受け答えが堂々とされていてハキハキ喋る姿に、滑舌が悪くて喫茶店で碌に注文できない私は尊敬するばかりでした。
 私:「えっと、アメリカンのM(エム)で」
 店員:「L(エル)ですか?」
M(エム)だってば。そんなんばっかり。

 

実は・・・

前々から自作のダサいロゴは一新したかったので、デザイナーの方に頼んでロゴを作ってもらいました。

 

◇プロジェクト(Stab of Bee Project)ロゴ

f:id:Karvan:20180522231639p:plain

Y U C C Aさんに作成していただきました。シンプルでおしゃれ

 

◇アプリタイトル(Cutie Circuit)ロゴ

f:id:Karvan:20180522231838p:plain

mika pinkpaletteさんに作成していただきました。スウィートで可愛い

 

やはり専門の方に頼むと出来が違うなと思いますね。自分じゃ出来ないし。
こちらの細かい要望も取り込んで頂き、本当に感謝致します。

 

どちらも現在制作中のアップデート版でありがたく使用させていただきます。

 

 アップデート版

GW明けにはリリースしたいとか言いながら早二週間が経ちました。気持ち的には早々にリリースしたいのですが、作り込む量が増える=不具合(バグ)が増える、という方程式の呪縛が解けずにバグを書いては消し、書いては消しのI Love Youなので、進捗ペースは牛歩戦術よろしくノロノロとしたものになっています。

 

最近発生したバグの中でも頭を抱えたのが、オブジェクトがinactiveになるとコルーチンは停止するが、その後、オブジェクトがactiveになってもコルーチンは動き出さない(再開しない)、ってやつ。
(注:この動作自体はUnityのバグではなく、この動作仕様を理解せずに作り込んだアプリが不具合になる、という意味です)

 

不具合の詳細

具体的には追加ステージの以下の動作をするオブジェクトを作ったんです。

f:id:Karvan:20180522232730g:plain

ドットが波打つような壁

 

これは立方体のオブジェクトを列単位に順番にDotweenを使ってジャンプさせて、最後の列のジャンプが完了したら一から再開する。という単純なロジックなのですが、最後の列のジャンプが完了するのをコルーチンで待たせています。

 

だが、ジャンプ動作が一回完了したら止まってしまう。という不具合が発生

 

他にも同様なアニメ動作をするオブジェクトを作ったんですが、それらも同様に動作が一回完了したら止まってしまい繰り返してくれない。うーん・・・

 

原因

実はこのオブジェクトはCutieCircuitの中ではPlayerの位置に合わせて場所を移動させて表示します。

 

f:id:Karvan:20180522232841g:plain

こんな感じ。

Playerが横を通ったら一旦非表示にして、Playerの前方に再配置して表示する。

 

この処理のため、オブジェクトがinactiveとactiveの状態を繰り返すのですが、上記で述べたようにactive状態になっても一旦停止したコルーチンは再開しないため、ジャンプが終わる前にinactive状態になると、待ち状態のコルーチンが永遠に待ち状態のままで二度と再開しないという結果になっていました。

 

対処法

別に一回こっきりの動作でもいいかなぁ、とも思ったのですが、それではゲーム画面が余りに寂しい画になるので対処法をGoogle先生に尋ねてみると、以外にあっさりと答えが見つかりました。

 

OnEnableとOnDisableを使う

 

OnEnableメソッドはGameObjectがactiveになった時に呼ばれるイベント関数で、逆にinactiveになった時に呼ばれるイベント関数がOnDisableとなっています。

 

なので、OnDisableが呼ばれたらコルーチンを停止し、OnEnableが呼ばれたらコルーチンを再開すればいい。

 

    /// <summary>
    /// ウェーブ動作
    /// </summary>
    public void CubeWaveSeq()
    {
    	// ウェーブ動作のIEnumeratorを保持する
        CurrentCor = StartCoroutine(CubeWaveSeqPrc());
    }
    
    /// <summary>
    /// ウェーブ動作(実体)
    /// </summary>
    /// <returns></returns>
    private IEnumerator CubeWaveSeqPrc()
    {

        OnSequence = true;
        CubeSequence = DOTween.Sequence();

        for (int iLoop = ColorWallObjList.Count-1; iLoop >= 0; iLoop--)
        {
            GameObject[] objArray = new GameObject[4];
            objArray = ColorWallObjList[iLoop];

            // 順番にジャンプする
            for (int iCnt = 0; iCnt < 2; iCnt++)
            {
                CubeSequence.Join(
                    objArray[iCnt].transform.DOLocalJump(Vector3.zero, 1.0f, 1, 0.5f)
                                                .SetRelative(true)
                     );
            }
            
            CubeSequence.SetDelay(0.1f);

        }

        CubeSequence.OnComplete(SequenceComp);

        CubeSequence.Play();

        yield return CubeSequence.WaitForStart();

        // Wave完了待ち
        while (OnSequence)
        {
            yield return null;
        }

    }
    /// <summary>
    /// Sequenceの完了コールバック
    /// </summary>
    public void SequenceComp()
    {
        OnSequence = false;
    }
    
    /// <summary>
    /// Active時動作
    /// </summary>
    void OnEnable()
    {
        if (CurrentCor != null)
        {
            StartCoroutine(CurrentCor);
        }
    }

    /// <summary>
    /// InActive時動作
    /// </summary>
    void OnDisable()
    {
        if (CurrentCor != null)
        {
            StopCoroutine(CurrentCor);
        }
    }

 これで待ち状態のコルーチンが終了することができます。

 

進捗報告

ロゴ製作者の方に「エンディングのクレジットにお名前を載せます!!」とか張り切って言っちゃったので完成版がリリースできるように頑張ります。

現在の進捗は

  • 追加ステージ=完成
  • エンディング=完成
  • ストーリー関連のイベント処理=頑張る、頑張るよ・・・

 

 

 

 

 

  • ショップ画面=(∩゚д゚)アーアーきこえなーい

 

 

 

◇プライバシーポリシー

●個人情報の利用目的

当ブログでは、メールでのお問い合わせ、メールマガジンへの登録などの際に、名前(ハンドルネーム)、メールアドレス等の個人情報をご登録いただく場合がございます。

これらの個人情報は質問に対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、個人情報をご提供いただく際の目的以外では利用いたしません。

●個人情報の第三者への開示

当サイトでは、個人情報は適切に管理し、以下に該当する場合を除いて第三者に開示することはありません。

・本人のご了解がある場合
・法令等への協力のため、開示が必要となる場合

個人情報の開示、訂正、追加、削除、利用停止
ご本人からの個人データの開示、訂正、追加、削除、利用停止のご希望の場合には、ご本人であることを確認させていただいた上、速やかに対応させていただきます。

アクセス解析ツールについて

当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。

このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。
この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。

●免責事項

当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。

当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。

当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

●プライバシーポリシーの変更について

当サイトは、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直しその改善に努めます。

修正された最新のプライバシーポリシーは常に本ページにて開示されます。