つかぱい.com

どうせなら好きなことを書いていたい

【Terminal】Starshipの設定メモ

公式が結構詳しいのでその辺読んだようがいいと思う。

Starship_ガイド

以下は自分用の手順

自分のmacにインストールしてみる。

home brew でインストール
brew install starship

viでfishのコンフィグの末尾に設定を追加して有効化する。 vi ~/.config/fish/config.fish

これを追加する。 starship init fish | source

f:id:ferrari458tukapai:20200410124412p:plain

Fishのこの状態が

f:id:ferrari458tukapai:20200410124416p:plain

こんな感じに見た目が変わっていた。

Tools/hyper# #development/terminal

【Unity】簡単なTimer機能の実装したときにやったこと

Unityでタイマー機能をググってみたのだけれどもいまいちピンとくるものがなかったのでひとまずやったことをメモする。

事前準備

f:id:ferrari458tukapai:20200326081431p:plain

CanvasにTimeオブジェクトを作成してCanvasと紐付けをする。

当初Scoreだけを実装していたのでScoreの値がCanvasに直接くっついている状態だった。

f:id:ferrari458tukapai:20200326081542p:plain

スクリプトに新しくTimerスクリプトを作成

仕様は以下のようにした

  • 60秒からカウントダウンする。
  • ScoreUIの下に整数部分だけを表示する。
  • カウントが0になったらカウントをストップする。

60秒からカウントダウンする。

まず固定値で1分を設定する。

Updateで使うTime.deltaTimeがInt型だとエラーになってしまうのんでFloat型で60秒を宣言する。

private float countTime = 60;

描画するテキストオブジェクトは以下を宣言する。

public Text timeCount;

最初は単純にカウントダウンができるかを確認したかったのでUpdateをこんな感じで実装してみた。

    void Update()
    {
        countTime -= Time.deltaTime;   
     timeCount.text = countTime.ToString();
    }

f:id:ferrari458tukapai:20200326081733g:plain

こんな感じになる

ScoreUIの下に整数部分だけを表示する。

しかし、今の実装だと小数点以下も見えてしまうので仕様上と違う

ここ描画は整数のみの部分を切り出した実装としたいのでコードの追加する。

//整数とする変数を追加
private int second;

    // Update is called once per frame
    void Update()
    {
        countTime -= Time.deltaTime;
        second = (int)countTime;
       //(int)countTimeでint型に変換して表示させる。
            timeCount.text = second.ToString();
    }

f:id:ferrari458tukapai:20200326081843g:plain

こんな感じに整数でTimeが表示された。

カウントが0になったらカウントをストップする。

整数までカウントダウンできるようになったが、このままだとマイナスのカウントが永遠と描画されてしまう。

タイマーをストップする基準は * カウントが0になったらそれ以上カウントしない なのでif文でカウントが0になったら0のままにする制御を追加する。

        if (countTime <= 0)
        {
            second = 0;
            timeCount.text = "0";
        }

一度テストしてみる。 ここでは60秒も待つと長いので、5秒で0のままになるかを数える。

f:id:ferrari458tukapai:20200326081925g:plain

描画は0で止まっているのでOK

今後の課題

  • 今はタイマーを動かすことだけしかできないので、今後ゲームオーバーの制御などをするときの制御などからアクセスしやすいように改良したい。
  • Timeの箇所とタイマー数値オブジェクトを今回切り離して実装したけれども後々考えるとレンダリングスクリプトで書けば一つにできるやんと後で気づいたので修正したい。

development/Starry_Hill

UnityでScriptをアタッチしたオブジェクトを削除したい。

やりたいこと:落ちゲーのようにたくさんの同一オブジェクトを作ってぶつかった物だけを消したい

ググってもうまい回答を探すのが難しかったので個人的にうまくいったことだけを載せています。

※余裕があったら何でそうなるのかは調べますが、ご存知の方がいればコメントしていただけると嬉しいです。

結論

Destroy(gameObject);で設定するとうまくいった。

変更した実装

今までの実装

今までは、インスペクターで自分のオブジェクト名を指定して削除する仕様にしていた。 この場合はすでにGameObjectがscene内内にいる場合は有効 でも、ファクトリーっぽく自動生成される場合はちょっと困った。

 void OnCollisionEnter2D(Collision2D collision)  { // 衝突したとき
        // もし、衝突したものの名前が目標オブジェクトだったら
        if (collision.gameObject.name == targetObjectName) {
      //今までは一個だけのオブジェクトを削除していたのでオブジェクトの名称を直接してしていた。
            GameObject DestroyObject = GameObject.Find(DestoryObjectName);
            Destroy(DestroyObject); 
        }

うまくいった実装

こっちの実装ではアタッチしているgameobjectを取得して削除する、という仕様に切り替えた でも、何で公式に書いているようにDestroy(this);で消さないの?ということもあると思うが、thisの場合だとなぜかうまく消えなかったのでこっちを採用した。 その辺りは、バージョンなどが関係するのかな、わからんけど

 void OnCollisionEnter2D(Collision2D collision)  { // 衝突したとき
        // もし、衝突したものの名前が目標オブジェクトだったら
        if (collision.gameObject.name == targetObjectName) {
                //複数の同じオブジェクトを生成してぶつかった物を削除するのであれば
                //シンプルにgameObjectをさして削除するとオブジェクトが消える
            Destroy(gameObject);    
        }
    }
}

UnityでCanvasをカメラのサイズと合わせたい時の設定方法

通常のCanvasオブジェクトだと非常に大きくて Gemeビューで数値調整は調整が大変だった。 SceneビューでMainCameraに収まるようにしたかったのでその時のメモ

やり方

Canvasオブジェクトの中にCannvasコンポーネントからRenderModeを変更する。

通常は”ScreenSpace-Overray”の設定になっていると思うのでここをメインカメラの枠内に収まるように”ScreenSpace-Camera”に変更する。

f:id:ferrari458tukapai:20200308183301p:plain

変更後、RenderCameraにMainCameraをセットする。

選択方法は右の◎のアイコンから選択してもいいし、ヒエラルキーからオブジェクトをドラッグ&ドロップしても良い

f:id:ferrari458tukapai:20200308183150p:plain

選択後の確認方法

選択後はSceneビューでカメラの枠にテキスト情報などが収まっていればOK

f:id:ferrari458tukapai:20200308183226p:plain

開発/Starry_Hill

Rubyで小数点以下の計算をする時に気をつける事

忘れがちなのでメモ

問題だったところ

ふと全国の小学生の中からタレントって何人くらいいるだろうなって思ってRubyで計算してみたところ0が結果として出力されたのでちょっと期待と違うなーって思った。

~  irb                                                     17.8m  Wed Mar  4 21:49:20 2020
irb(main):001:0> 405/644900
=> 0

解決策

なんでかなと思ったがRubyには便利なClassオフジェクトがあるので一度確認をしてみる

irb(main):003:0> (405/644900).class
=> Integer

想定していたみたいに、小数点以下の割り算をする場合はデータ型をFloatにしてあげないといけないのんでこのように変更

irb(main):005:0> 405/644900.to_f
=> 0.0006280043417584122

こうする事で浮動小終点の計算ができる

おまけ

でも調べたいのはおよそ何パーセントいるんだよって事なので、こんなに細かい数字はいらない。。。

なので余計な部分はfloor関数を使って下の部分をカットすることにした。

irb(main):008:0> (405/644900.to_f).floor(5)
=> 0.00062

このくらいになると割と現実的に使えそうな数字になってきたんのでいいのではないだろうか

ちなみに全国の0〜13歳でタレントになっている確率はおおよそ0.06%なのでSSRを100ガチャで当てるよりもレアだぞ!

irb(main):009:0> (405/644900.to_f * 100).floor(2)
=> 0.06