マスコットアプリ文化祭2017に勢いで参加する(5)【動画付き】 #東北きりたん

こんにちは。ヤマヤタケシです。
とべ東北きりたんプロジェクト!

土日は結構、コード書きました!
メモもたくさんたまりました!

現状の状況はこの記事の最後に動画があります。

やっと、スタートからゴールとか、チェリーを全部とったらゴールがでるとか、基本的な仕組みはできました!
パーツが増えると、いろいろややこしくなって作業速度が落ちますね。
修正するとエラーがでて、それを修正するのに時間がかかるし・・・。
ぐぬぬ。
かといって、仕様書とか書き続けても、モノは進まないし。

というわけで、作業途中をコンテンツ化するヤーツです。
— 作業メモ —
フォントを縁取りしたい。タイトルと同じ色で。なんかあるんかね?
Outlineコンポーネントあった!さすがやで。

そして、手書き風なフォントに変更。
おつとめフォント

Gimpで縁取りした「すたーと」はボツ。「はじめる」にした。まじめ感。

ふんわり遊べる雰囲気をだしたい。けどゲームはガチみたいな。

ステージデータは量産したいから誰かに手伝ってもらいたいなぁ・・・。
Unityとかデータのやり取りとかの問題もあるけど。
ステージは色んな人が作って欲しいので、ステージ名と作者情報を出すようにする。
「東北きりたん」は東北を盛り上げるためのプロジェクトだろうし。
ステージを作るということで参加意識とともにきりたん、きりたんぽ、秋田とつながる。
富山県を盛り上げたい気持ちもあるけど。

作者名は作った人の自己満足のためにある。署名。まあ見てくれる人は見てくれるかもしれないけど。
名前にしようと思ったが、twitterアカウントにした。けど、やっぱ自由な文字列にした。

背景のドット感はちょっと割り切ろう・・・。解像度の違いというかテイストの違いは気になってはいる。

余白の美学。UIのPanelを使うと簡単に指定できる。レイアウトは美学。

ここらでパーツを全部つなぎ合わせよう。勢いで!そう、いきおいで!

スクリプト名は考えない。ただオブジェクト名に合わせるんだ。
Root-> Root.cs
Goal -> Goal.cs
みたいな!
UnityはGUIDで管理してくれているのでパスに依存しない。
この辺がプロトタイプに向いていると言われる所以だろう。
変更に柔軟。

Root.csを根っこに持たせる。
このクラスは他のクラスからのイベントを受けてアプリ全体をコントロールする。
ハブ的な。
プレイングじゃないマネージャー的な。
どんどん下に振るぜ!
設計はだいたい脳内にある。
ここからはタスク単位でやろう。

ぐぬぬ。ボタンの素材が必要。gimpでやろうとしたけどうまくいかない・・・。
inkscapeをダウンロード。ベクトルでやろう。
…横道にそれすぎだ。
ただの四角でいいや・・。

ディレクトリの階層をすてる。小さいゲームに階層は効率が悪い。
投資と回収の割が合わない。規模によってやり方を変えるのは当然。
全てはアウトプットのために組み立てられる。
前例主義はその原則を忘れてただ臆病に閉じこもってしまう。

Resetという関数名はMonoBehaviorによって使用済みか・・・。
別の名前を考えるのがしんどい。 -> Init にした。-> Initialize にした。長いけど。
1シーンで何回もループさせる設計にしたので変数の初期化はは大事。
捨てて生み直す方が楽だけど、柔軟な対応ができるし、この規模ならいけるっしょ・・・?

悩んだ末、 BroadcastMessage を活用することにした。
ゲームのイベントに対していろんなオブジェクトが反応する。
個別処理は参照を持つしかないが、全体的な情報伝達はこれを使おう。仕事では使わないけど。
interfaceを用意して、実装してってのは今回の規模だと不要と判断。
-> 問題があったのでやめた。

gameObject.BroadcastMessageじゃダメか・・・。
Activeなオブジェクトにしか届かない。
まあ、その仕様は正しいとは思うが、全部を初期化しようという目論見は崩れ落ちてしまった。
マニュアル 曰く
Note that messages will not be sent to inactive objects (ie, those that have been deactivated in the editor or with the SetActive function).
だってさ。

浮かんだアイディアをすぐに試したくなる。
例えば、タイトルに静止画を置くよりゲームのキャラが動いてる方がいいかな?
とか、キャラが出てるなら、自動で飛び回ったりしてほしいなとか。
そういうのはTODOに逃がして、今のタスクを終わらせよう。

自由に飛び続けてクリアまでのタイムを最小にしたい。
ステージもそんなに多くないから、流れを維持したい。
しかし、飛んでいる位置が不定だと、すぐにゴールしちゃって意味分からない。
ということで、チェリーを取ってからゴールに行くようにする。
チェリーが生きてきた。

初期化は明示的にやれってことだろうしプレファブを作れとかシーンを遷移しろと言われている気がしてきた。
今回はワンシーンにこだわっているし、頑張ろう。
いちいち呼ぶか。。。
オブジェクトのActive状態を切り替えたいのに、ActiveじゃないとBroadcastが届かない・・・。
GetComponentsInChildrenとか使えってことか。

あー、東北きりたんのボイスもあるのかー。すげーなー。
しかし、ゲームに使えるちょうどいいのがないなー。
え、VOICEROID+ 東北きりたん EX ダウンロード版|ダウンロード版 !?

こ、これがあれば、ゲームにピッタリなボイスが作れる!?
ほ、ほしい!・・・。こうやって横道にそれるから進まない。
アカンでしかし。
時代がしらないところで進んでいた。ボーカロイドだけじゃなかった。
そういう知識のアップデートができるのも個人制作のいいところだ。
「知らない」っていうリスクはある。知っていることは、考える土台。

GetComponentとかするよりは、Unityのインスペクタで直接参照貼ったほうが楽だし、柔軟だ。
スピード、スピードだ!

* DONE 処理の流れを整理する。
起動時:エラーが出ない程度にそれぞれは初期化する。 -> Awake();
順序に依存する処理は上から順番に初期化する。 -> Root.Start -> Module.Initialize();
ゲームのリセット時も同じく、 -> Root.GameReset -> Module.Initialize();
* DONE 画面のレイアウト:ステージの名前
* DONE 画面のレイアウト:経過秒数
* DONE 画面のレイアウト:作者情報
* DONE タイトルを出す。
* DONE 起動すると Root.cs がいろいろ整える
* DONE タイトルに静止画を置くよりゲームのキャラが動いてる方がいい
* DONE チェリーを全部取ったらゴールが発動
** DONE チェリーに判定をつける。
** DONE チェリーの数を監視。
** DONE ゴールを隠す
** DONE チェリーが0ならゴールが出現
* DONE タイトルでタップするとゲームが始まる
** DONE タイトル消す
** DONE ステージを貯める
** DONE ステージだす
** DONE きりたんを初期位置へー>初期位置はなし
** DONE UIを出す
** DONE ステージ情報を更新
* DONE ゴールに判定をつける
ゴールにCircleCllider2Dを追加。
衝突したときの処理はプレイヤー側かギミック側のどちらでやるのかを迷う。
Unityの仕組みとして、両方にOnなんとかが呼ばれるのだけど。
コードが肥大化しないためになるべく分散する方にしよう。
つまり、ギミック側のイベントで処理する。
そこからプレイヤーのメソッドを呼ぶだろうけど。

    void OnTriggerEnter2D(Collider2D other)
    {
        Debug.Log("Goal" + other.name);
    }

よし、ゴールに反応した。
* TODO ゴールにいったらラップタイムを表示して、すべてのステージをクリアしたらトータルリザルトを出す。
ノンストップゲームにしようと思ったが、「緊張と緩和」を作ったほうが面白いし、気持ちが楽。
ノンストップは緊張しかないからツラいよね。
甘やかされた現代。。。。
* DONE ステージ開始
* DONE ゴールについたら「ゴール」をだす。
* DONE 「岩」は跳ね返るし、乗れる。
* TODO リセットボタンで戻る
* TODO 今の加速しすぎるので、一定時間だけ噴射。タップのタイミングで調整。連打すれば同じくらいに加速できる。
* TODO タイトルでスタートを押すとゴールが出現
* TODO キャラが出てるなら、自動で飛び回ったりしてほしいなとか。
* TODO ステージデータはとりあえずシーンにぶら下げる。
* TODO 「ゴール」でクリア。タイムアタック。
* TODO 「針」で一定時間操作不能。
* TODO タイムアタックのルール
* TODO html5で出力:Unityとかのロゴは消せるのか調査?
* TODO グーグルアナリティクスを埋める
* TODO WEBに公開
* TODO 「ゴール」のアニメーション。ひゅーん、どん!。ふわっときえる。
* TODO 操作方法を変えたい。ドラッグで方向転換。
* TODO はじめるをボタンにする。それ以外のところは今まで通り。
おっと、意外とむずい。
入力の当たり判定をちゃんとやんないとな・・・。
どのみち必要だった。
InputManagerの出番。
うーん、これもまた「体験の向上」ネタか。まだゲームとして通っていない。
泣く泣く、保留。
どうも、思いついたらすぐやりたくなってしまう。
* TODO ラップタイムの表示
** TODO ラップタイムの記録 Battle.TimeHistory をコメントアウトしてある

まあ、とりあえず今はこんな感じです。

そんじゃまた。