NHKにて
今朝のニュースでBitsummitの様子が流れてましたね。有名どころ?な開発者の方々がインタビューされていて、「ああ、このゲームはこの人が作っているんだー」とか興味深く拝見させていただきました。
皆さん、受け答えが堂々とされていてハキハキ喋る姿に、滑舌が悪くて喫茶店で碌に注文できない私は尊敬するばかりでした。
私:「えっと、アメリカンのM(エム)で」
店員:「L(エル)ですか?」
M(エム)だってば。そんなんばっかり。
実は・・・
前々から自作のダサいロゴは一新したかったので、デザイナーの方に頼んでロゴを作ってもらいました。
◇プロジェクト(Stab of Bee Project)ロゴ
Y U C C Aさんに作成していただきました。シンプルでおしゃれ
◇アプリタイトル(Cutie Circuit)ロゴ
mika pinkpaletteさんに作成していただきました。スウィートで可愛い
やはり専門の方に頼むと出来が違うなと思いますね。自分じゃ出来ないし。
こちらの細かい要望も取り込んで頂き、本当に感謝致します。
どちらも現在制作中のアップデート版でありがたく使用させていただきます。
アップデート版
GW明けにはリリースしたいとか言いながら早二週間が経ちました。気持ち的には早々にリリースしたいのですが、作り込む量が増える=不具合(バグ)が増える、という方程式の呪縛が解けずにバグを書いては消し、書いては消しのI Love Youなので、進捗ペースは牛歩戦術よろしくノロノロとしたものになっています。
最近発生したバグの中でも頭を抱えたのが、オブジェクトがinactiveになるとコルーチンは停止するが、その後、オブジェクトがactiveになってもコルーチンは動き出さない(再開しない)、ってやつ。
(注:この動作自体はUnityのバグではなく、この動作仕様を理解せずに作り込んだアプリが不具合になる、という意味です)
不具合の詳細
具体的には追加ステージの以下の動作をするオブジェクトを作ったんです。
ドットが波打つような壁
これは立方体のオブジェクトを列単位に順番にDotweenを使ってジャンプさせて、最後の列のジャンプが完了したら一から再開する。という単純なロジックなのですが、最後の列のジャンプが完了するのをコルーチンで待たせています。
だが、ジャンプ動作が一回完了したら止まってしまう。という不具合が発生
他にも同様なアニメ動作をするオブジェクトを作ったんですが、それらも同様に動作が一回完了したら止まってしまい繰り返してくれない。うーん・・・
原因
実はこのオブジェクトはCutieCircuitの中ではPlayerの位置に合わせて場所を移動させて表示します。
こんな感じ。
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); } }
これで待ち状態のコルーチンが終了することができます。
進捗報告
ロゴ製作者の方に「エンディングのクレジットにお名前を載せます!!」とか張り切って言っちゃったので完成版がリリースできるように頑張ります。
現在の進捗は
- 追加ステージ=完成
- エンディング=完成
- ストーリー関連のイベント処理=頑張る、頑張るよ・・・
- ショップ画面=(∩゚д゚)アーアーきこえなーい