[unity] ブロック崩しをあのアプリ風にする #12 セーブとロード+おまけ

ステージの進行管理もできたことなのでそろそろセーブ機能を実装します。
おまけもあるよ!



セーブ機能


もっともお手軽なのはUnity標準機能のPlayerPrefsを利用することです。
暗号化などもうちょっと複雑なことをやるのであればAssetsのEasySave2などが有名なようですが、有料なので今回はPlayerPrefsを使います。

ゲームの管理なのでGameManagerに追記します。

 void Start () {
//ロード
        currentStage = PlayerPrefs.GetInt ("clearStage",-1) +1;
        Init (currentStage);
 }
//〜中略〜

    public void NextStage(int clearStg){
//セーブ
        PlayerPrefs.SetInt("clearStage" , clearStg);
        currentStage = clearStg + 1;
        Init (currentStage);
    }

Start()でロード、次のステージセットのタイミングでクリアステージをセーブしてます。保存できる型はfloat、int、stringで、上の例ではPlayerPrefs.SetInt("キー" , 値)で保存してます。
ロードはPlayerPrefs.GetInt ("キー",デフォルト値)で、第2引数を指定するとキーに値がまだ設定されてない場合にデフォルト値が帰ってきます。
これで、途中でゲームを終了しても続きからプレイできるようになりました。

これだけです。


。。。


あまりに単純なのでちょっと拍子抜けしました。


記事的にも進行度合い的にもどうなんだ?ということで少し演出面を強化してみたいと思います。

ブロックの色を動的に変える


本家をみてみるとライフが多いブロックほど黒っぽくて少ないものは白っぽくなってます。おまけに当たった瞬間ちょっと光ってますね。(敢えてリンクは貼りませんググってください)
この辺をやってみたいと思います。

新しくBlock_Colorというスクリプトを書いていきます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Block_Color : MonoBehaviour {

//Block_lifeが呼ぶ
    public void ChangeColor(int life){
        StartCoroutine("Flush",life);
    }
    IEnumerator Flush(int life){
        bool fla = true;
        while (fla) {
            GetComponent<Renderer> ().material.color =new Color(1,1,1);
            fla = false;
            yield return null;
        }
//R基準の補正 100以上は同じ色 上限を160,下限を60とする
        int r = life > 100 ? 160 : life+60;
        r = 230 - r;
        GetComponent<Renderer> ().material.color =new Color(r/255f,(r+30)/255f,(r+30)/255f);
    }
}

色の変化だけならChangeColor内に書いてしまえばいいんですがフラッシュさせる為にコルーチンを使っています。1フレームだけ白くして、あとはlifeに応じた色にしてます。
色の指定はColor(float,float,float)です。引数は左から赤、緑、青の数値を0~1fで指定します。通常rgb指定だと0~255指定が一般的なのでその数値を255で割ってあげれば変換できます。

19行目からlifeを元に色を決定してます。

まず赤の要素を決めます。ブロックのライフはやろうと思えばいくらでも上げられるので上限を100に設定して、超えていれば160、それ以下なら60上乗せします。
この限界値が0~255でないのは、ブロックのカラーが完全な白や黒にはならないからです。
rgbカラーは各要素が255に近づくほど白に近くなります。ゲームでは数字が低いほど白に近づきます。なので20行目で変換しています。230の値を高くすればより白に近づきます。
それを次の行で設定してますが、緑の値と青の値には補正をかけています。色合いの補正です。

あくまで個人的な感覚なので色々いじってもらえればと思います。

アタッチするときは一気に選択すれば一回で済みます。


これをBlock_lifeから呼び出しておきます。

public class Block_life : MonoBehaviour {

    public int life = 2;
    Text numText;
    private Block_Color blockColor;

    void Start(){
        GameObject child = gameObject.transform.Find ("Canvas/Text").gameObject;
        numText = child.GetComponent<Text>();
        numText.text = life.ToString();
        blockColor = this.GetComponent<Block_Color>();
        blockColor.ChangeColor(life);
    }

    void OnCollisionEnter(Collision col){
        if(col.gameObject.CompareTag("Ball")){
            life -= 1;
            blockColor.ChangeColor(life);
        }
        if (life <= 0) {
            Destroy (gameObject);
        }
        numText.text = life.ToString();
    }
}

ハイライトの部分を追加しました。
で、こんな感じになりました。


それっぽくなってきたんじゃないでしょうか。
セーブ&ロードはお手元で確認してもらえればベネ。

コメント