0

私のゲームでは、豊富な収集品があり、プレイヤーがすでに収集してシーンに戻った場合、個々の収集品がリスポーンしないようにします。たとえば、1 つのシーンにこれらの収集品が 100 ほどある場合、プレイヤーがそれらの 1 つを収集し、シーンを離れてから戻った場合、収集したものはリスポーンしませんが、残りはリスポーンします。

いくつかの調査の後、収集された収集物と収集されていない収集物を保存するためにデータのシリアル化を使用することになっていると思いますが、これを行う方法がわからず、概念は私にとってまったく新しいものです。誰かが私に何をすべきか説明してもらえますか?

ありがとう

4

1 に答える 1

1

PlayerPrefs を使用して、プレーヤーの現在の状態を保存します。

オプションは次のとおりです。

  1. PlayerPrefs はブール値をサポートしていないため、整数 (0 を false、1 を true) を使用して、各収集物に 1 つの整数を割り当てることができます。長所:実装が簡単。短所:保存されたオブジェクトの数が非常に多く、読み取り/書き込みにより多くのワークロードが必要な場合、メモリを使いすぎます。

  2. 1 つの整数を複数の収集物に割り当て、それらをビットごとに格納し、前後に変換します。長所: メモリが少なく、格納されている多数のオブジェクトの読み取り/書き込みが高速です。短所: 各整数の数を int32 のビット数に制限します。つまり32です。

  3. すべての収集品に大きな文字列を割り当て、前後に変換します。長所: true/false 以外の状態を保存することも、暗号化を使用してデータをハッキングから保護することもできます。短所:何も思いつきません。

オプション1:

//store
PlayerPrefs.SetKey("collectible"+i, isCollected?1:0);

//fetch
isCollected = PlayerPrefs.GetKey("collectible"+i, 0) == 1;

ビット単位:

int bits = 0;//note that collectiblesGroup1Count cannot be greater than 32
for(int i=0; i<collectiblesGroup1Count; i++) 
    if(collectibleGroup1[i].isCollected)
       bits |= (1 << i);

//store
PlayerPrefs.SetKey("collectiblesGroup1", bits);

//fetch
bits = PlayerPrefs.GetKey("collectiblesGroup1", 0);//default value is 0
for(int i=0; i<collectiblesGroup1Count; i++) 
    collectibleGroup1[i].isCollected = (bits && (1 << i)) != 0;

文字列アプローチ:

string bits = "";//consists of many C's and N's each for one collectible
for(int i=0; i<collectiblesCount; i++) 
    bits += collectibleGroup1[i].isCollected ? "C" : "N";

//store
PlayerPrefs.SetKey("collectibles", bits);

//fetch
bits = PlayerPrefs.GetKey("collectibles", "");
for(int i=0; i<collectiblesCount; i++) 
    if(i < bits.Length)
        collectible[i].isCollected = bits[i] == "C";
    else
        collectible[i].isCollected = false;
于 2016-12-10T12:42:18.437 に答える