/CamelAndSnake

Measure which concatenation is more readable. The measure target are CamelCase and snake_case.

Primary LanguageC#

目的

開始から終了まで動くものを Unity で作ってみることです。

概要

このプロジェクトは Unity での開発を勉強するためのものです。開発期間は 1 週間をめどにしました (しかし 2 週間ほどかかりました) 。

ラクダとヘビ

このプロジェクトのタイトルです。

遊び方

このアプリでは、キャメルケースとスネークケースとで認識にかかる時間を測ることができます。

最初にいくつかの設定をしたら測定が始まります。実際に測定するのはタップ時間です。タッチ開始で句が表示されます。句を認識したらタッチを終えます。最初に設定した回数を終えると結果がでます。

概要

プログラミング言語の識別子ではスペースを使えないことが多いです。識別子は複数の英単語で構成するのが一般的です。スペースが使えないときのメジャな単語の区切り方にキャメルケースとスネークケースとがあります。

キャメルケースはスネークケースより読みづらいです。私はそう思っていますがキャメルケースはメジャな区切り方なので、実はキャメルケースの方が読みやすいのかもしれません。自分の感覚だけで主張していても他人には伝わりません。こちらから積極的に主張しなくても、対立に巻き込まれてしまうことがあるので防御力をあげておきましょう。防御力は実際に測定して根拠を増やすことです。

シーン

Title

タイトルです。

タイトル画面

Settings

設定シーンです。パスカルケースにするかどうか、表示する順番をランダムにするかどうか、そして測定回数を決めます。

設定画面

Play

プレイシーンです。タッチ開始で句が表示されるので、何が書いてあるかわかったらタッチを終えることで測定します。

プレイ画面 プレイ画面

Result

結果シーンです。キャメルケースとスネークケースとでどちらが認識しやすかったかを表示します。

認識しやすさは 1 秒あたりの単語の認識数です。2 単語以上で句としています。HelloWorldを特定の方法で区切ったものが句です。単語の長さは測定結果に影響しません。AnimatorTimeも 1 単語で、Animatorの認識の方が時間がかかるとか表示に時間がかかるとかで調整しません。どちらを認識しても 1 単語を認識するのにかかった時間として測定します。

結果画面

実装面の反省

このプロジェクトは文字だけのアプリです。文字はUI.Textで簡単に表示できるので、実装のメインはアニメーションにしました。

やったこと

文字のアニメーションがプロジェクトのメインなのでCharacterAnimationクラスを作りましたが、カプセル化できなかったので使えませんでした。Result.NumberFlashクラスでも同じような実装をしています。文字幅とカーニングを扱うクラスを用意した方が良かったと思います。

RecordTheAnimatorIdとはプログラムから作ることにしました。どちらもフィールドを指定することだけが役割で、フィールド指定についてくるコードがあること、フィールドが変わりやすいこととが理由です。TheAnimatorIdは int 値を得るために enum ではなく class になっています。

プレイ設定はシーンをまたぐデータなのでSceneStriderを作りました。同じようにシーンをまたぐRecordPlayerPrefsに保存したのでプレイ設定でも使った方が良かったです。DontDestroyOnLoadでやってみたかっただけですが、Startで無条件で指定しているので最後まで残ってしまいます。

アニメーションでは編集のしやすさのためにPassThrough値を多用しました。複数のアニメーションを繋げるときに、一つのアニメーションにしてしまうと編集しづらいと思ったからです。一つのアニメーションになっていると全体で一度でも使うパラメータが最初から最後まで表示されます。アニメーションを編集しやすい単位に区切るためにPassThroughを使いました。これは動作中ずっと真値で、これを使ってトランジションをいつも有効にします。Has Exit TimeTransition Duration1にすることとで、一つのアニメーションが終わり次第移動するようにできました。

アニメータコントローラの制御はスクリプト側におきました。アニメータコントローラでもアニメーションイベントでスクリプトを制御できますがどちらかに統一した方が把握しやすいからです。スクリプトからアニメータコントローラを制御するために、アニメータコントローラは特定の状態になったらスクリプトの指示を待つようにしています。よく使ったのはDidCompleteメソッドでGetCurrentAnimatorStateInfoが指定の状態になっているかどうかテストするという状況です。

やらなかったこと

目標にしている開発期間のためにやらなかったことをまとめます。

このアプリではタッチしたところに文字がでます。指で隠れないように少し右にずらしています。しかし、いつも右にずらすので画面の右側をタッチすると文字が画面の外にでてしまいます。すぐに思いつく方法は画面の右側をタッチした場合は、左側に文字を出す、というものです。表示する文字を折り返したり、小さくしたりするような処理は認識時間に影響しますが、この表示の調整はタッチ位置に影響してはいけません。表示を調整できないとなると左右のどちらかに出す方法では画面の半分しか使えないことになります。次の方法はタッチ位置から画面の上方に表示するというものです。タッチデバイスの大きさからして、表示する場所は真ん中か下かの 2 通りになると思います。下の場合は指の角度が鉛直に近くなるので、タッチからずらす量は、真ん中の場合よりも多くなります。特にタッチデバイスが視線と平行に近づくと、文字の表示位置はもうほとんど真ん中をタッチしたときと同じかもしれません。結局タッチ位置に合わせて文字を表示することにしたのが間違いだと思ったので、表示位置の調整は見送りました。

測定誤差やサンプルのばらつきのために、引き分けになることがあります。引き分けの処理は入れ忘れました。

句のデータはテキストファイルに保存しましたが、読み込みシーンを作っても良かったなと思います。

途中で気づきましたが、一番上にプロジェクト名前空間をおくべきでした。

フレームレートの出しわけ。デバグのみで出すようにするべきかと思いましたが、測定誤差に大きく関わってくるので完成版でも必要な情報でした。でも新しくデザインするのは見送りました。

やろうとしたけど出来なかったこと

日の出アニメーション。スリットを下にスクロールしたときの文字のアニメーションをやりたかったですができませんでした。地平線から太陽がでてくるようなアニメーションです。手前に遮蔽物があればいいですが、ないかのようにアニメーションしようとするといいやり方が思い浮かびませんでした。日の出アニメーションではスケールは変わりませんが、今回はスケールを変えることにしました (そうすると x 軸での回転ができるので今回は代替日の出アニメーションもやめました) 。

回転する後光のパーティクル実装。結果シーンでサーチライトが回転しているアニメーションがありますが、最初はパーティクルで試していました。できなかったのでUI.Imageをスクリプトで回転しました。

やらないと決めたこと

検定。測定誤差とサンプルとで、比較に有意な差があるかどうかを検定できると思います。有意な差がない場合は引き分けということにする、と前提します。そうすると 1 勝 3 分と 2 勝 2 敗 (引き分けを 1.5 勝と期待してこの例を選びました) とでは印象が違いすぎると思いました。何回かプレイすることを期待しているので、検定するのは一回一回のプレイではなくて、各プレイ結果のサンプルなります。

実装ルールについて

イベント関数でやること

Awakeではエディタで設定するpublic値を検証します。

Startでは自身を初期化します。子や兄弟、親などはUpdateにします。

メンバの順序

  1. static
  2. public field
  3. private field
  4. property
  5. constructor
  6. public method
  7. event metiond
  8. private metiond

メソッドはアルファベット順ですが、フィールドは雰囲気です。

public 設定の固定

Awakeでプライベートフィールドに固定するやり方もありそうですが、publicのまま使うことにしました。デバグ中などエディタで見えているところを変えても動きが変わらないのは切り分けを間違えると思ったからです。代わりに他のスクリプトから操作できてしまいますが、操作しないのが作法ということにしました。

アニメータコントローラとスクリプトとのお互いの制御

ゲームコントローラなどのスクリプトで制御します。アニメータコントローラからは制御しません。プレイにほとんど影響しないような場合はゲームコントローラ -> スクリプトの方向も作るかもしれません。

クレジット

フォント

  • Inconsolata
  • MadokaRunes
  • Planetarium
  • gomarice_goma_block
  • tokyodrifter

それとUnity