Unity – R-Diary http://blog.shirai.la/sakakibara Diary Wed, 28 Feb 2018 23:25:00 +0000 ja hourly 1 https://wordpress.org/?v=5.1.6 Unity PlayerPrefsとファイルの書き出しと読み込みを使ったプレイログ取得・利用 http://blog.shirai.la/sakakibara/2016/07/07/study1/ http://blog.shirai.la/sakakibara/2016/07/07/study1/#respond Thu, 07 Jul 2016 06:27:51 +0000 http://blog.shirai.la/sakakibara/?p=37 続きを読む Unity PlayerPrefsとファイルの書き出しと読み込みを使ったプレイログ取得・利用]]> 今回私は

作成したゲーム中でプレイのログをとり、そのログを使ってリプレイ機能を実装するために、ファイルの読み書きとPlayerPrefs機能を利用しました。

まず、参考にしたサイトはこちらです。

UnityでCSVを書き出す

PlayerPrefsスクリプトリファレンス

使用言語C#

まずは、Streamwriterを使ってファイルにログを書き出す部分です。

using System.IO

public class (クラス名) : MonoBehaviour{

StreamWriter sw;
FileInfo fi;

public void start(){

fi = new FileInfo(Application.datapath + “(ファイル名).txt”);
sw = fi.AppendText();
sw.WriteLine(“書き出し”);
sw.Flush();
sw.Close();

}

}

Unity C#ではStreamWriterを使用するときはまずFileInfoインスタンスを書き出すファイルのパスを与えて宣言する必要があります。
その際の”Application.datapath”はプロジェクトの”Asset”フォルダの直下を指しているので、そこに書き出したtxtファイルが保存されることになります。
“Application.datapath”を書かずに任意のパスに保存することも可能です。

次にStreamWriterのインスタンスに”AppendText”メソッドを適用することでStreamWriterがファイルを書き出す準備ができます。

その後はC#同様”WriteLine”メソッドを使って改行ありで書きだしを行っています。
改行なしの書き出しを行いたい場合はこの部分を”Write”メソッドに変更します。

最後に大切なのがStreamWriterインスタンスのFlush()とClose()この処理を行うことで、ファイルに書き出しが完了します。

 


 

次に読み込み処理です。

今回はStreamReaderで読み込んでListに保存して利用するようにしました。
また私は文字列でなく数字を扱っていたのでListに保存した読み込んだ文字列をそれぞれの型(int,double)に変換して利用しました。

string line = “”;
List<string> List = new List<string> ();

System.IO.StreamReader tReader = (

new System.IO.StreamReader (Application.dataPath + “(ファイル名)”, System.Text.Encoding.Default)
);

while ((line = tReader.ReadLine ()) != null) {

List.Add (line);

}

tReader.Close ();

まずグローバルにstring型の変数と空のListを作成します。

次にStreamReaderでファイルを読み込み、while分で一行ずつ読み込んで配列に入れています。

最後にStreamReaderを閉じましょう。

 

これでファイルの書き込み、読み込みはできます。しかし、連続プレイのログをとる場合一プレイごとにログにしたいのです。

 


 

そこで私はPlayerPrefs機能を利用しセーブデータを毎回作成し、それをファイル名につけたすことで、一人ひとりのプレイログをとり、さらにリアルタイムにログを利用することができました。

 

まずはセーブとロードの関数を作成します。

 

const string FileNum = “filenum”;

void SaveFile(int file){

PlayerPrefs.SetInt (FileNum, file);
PlayerPrefs.Save ();

}

int LoadFile(){

return PlayerPrefs.GetInt (FileNum, -1);

}

これでPlayerPrefsは利用できるので、次にゲームがスタートしたらセーブデータのカウントを増やすように設定しました。

SaveFile(LoadFile()+1);

この処理でセーブファイルの数値が1足されました。

この後にLoadFileを使ったファイル名のログデータを取ることでそのログを利用するように実装しました。

図
図にするとこんな感じです

 

まずファイルの保存名ですが

ファイルの指定の部分を

fi = new FileInfo (Application.dataPath+ “PlayLog”+LoadFile()+”.txt”);

このように変更します。こうすることで

ファイルがPlayLog1 PlayLog2という風に作成されていきます。

 

読み込み側も同様に

System.IO.StreamReader uReader = (

new System.IO.StreamReader (Application.dataPath + “PlayLog” + LoadFile () + “.txt”, System.Text.Encoding.Default)

);

while ((line = uReader.ReadLine ()) != null) {

List.Add (line);
countmax++;

}

ここで新たに追加したのがcountmaxという変数です。

こちらはListを利用した際にListの最大値を超えて数値を設定したりするとエラーをはいたりしたので,配列がいくつあるのかをカウントする変数として用意しました。

これでプレイごとのログを利用できるようになったので配列を利用することでリプレイ機能を実装できました!

 


 

まぁ、最後にString→int,double型に変換したのでそちらも参考までにのせておきます。

public static int StringToInt(string s){

return int.Parse (s);

}

public static double StringToDouble(string s){

return double.Parse (s);

}

List<int> i =List.ConvertAll (new System.Converter<string,int> (StringToInt));
List<double> d =List.ConvertAll (new System.Converter<string,double> (StringToDouble));

今回はConverterを利用しましたが、他にもやり方はいろいろあるようです!
ラムダ式とか….数式は難しいです。

 

それではよかったらPlayerPrefsを使ってみてください!

サンプル等はGithubで公開するかもしれません!

 

]]>
http://blog.shirai.la/sakakibara/2016/07/07/study1/feed/ 0