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で公開するかもしれません!

 

LJL2016 Report3

現在開催中のLJL2016 公式ページはこちら

今回は2月3,5,6日に行ったLJL2016の運営の仕事の様子を書きたいと思います。

まず仕事の流れは
①機材準備・動作チェック
②ミーティング
③Twitchの放送を見ながら、集団戦シーンやスーパープレイシーンをTwitter投稿用に録画する。
④試合後、試合のデータFileを公式HPに反映させる。

①,②に関しては、前回と同様なので省略します。

③について、
私たち運営チームは毎回、運営室のスクリーンで実際のゲームの映像を見ています。
※実際の配信ではそこでの映像から5分ディレイを入れてTwitch配信しています。(オンライン上でプレイなので不正防止のため)
私の今回の役割は、運営室のスクリーンを見ながら、スーパープレイシーンが起こった時間を記憶しておき、Twitch配信上でその時間になったら、OBS(Open Broad Caster Software)で録画します。
そこで録画した動画を、Slackを使ってPR(Twitter)担当の方に渡す、というのが今回の役割でした。

④について、
1試合ごとのゲームの記録のデータを公式HPに反映します。
こちらの反映をすることにより、ランキングの変動が起こるので、忘れてはいけない重要な仕事でした。

私が今回携わらせていただける仕事の中でこの動画担当が一番重要だと思いました。
動画を録画する時間も30秒以内に収めなければいけないので(Twitter用なので)集団戦が長引いた場合はタイミングがシビアでした。

毎回、配信についてや、運営についての話をしたりするのは、すごいためになるし面白いです。これからは、もっといろいろなことができるようになりたいです。

以上です!

 

LJL2016 Report 2

現在開催中のLJL2016 公式ページはこちら

1月23,27,29,30日に行ったLJL2016の運営の仕事の様子を書きたいと思います。

まず仕事の流れは
①機材準備・動作チェック
②ミーティング
③TeamSpeak3管理+Twitchコメントチェック

今回は開幕戦同様、TeamSpeak管理の担当だったので以上の流れになります。
次回以降、動画担当や、モデレーター担当になった際には③がそちらになります。

まず、①ですが
オフィスにある機材を運びセッティングし、
動かない機材等があった場合は調達or交換など臨機応変に対応します。

②は映像・放送チーム、実況解説の方を交えた台本の読み合わせをします。
なにか不備や、ここはこうしたほうが等改善点はここで提案します。

③は開幕戦同様TeamSpeak3管理をしつつ、
Twitch放送コメントのチェックをしています。
開幕戦と違う点は、オンラインなので試合前に選手の点呼を行う点です。

現在私は、運営側としてLJLをもっと盛り上げられるようにできないかと考えています。
なぜかというと、映像・配信はそちらのチームがいるからです。
共に作業させていただいている中で、現在開発してると耳にしたのが
ファンサイトの作成とLOLの公式アプリの作成です。
日本鯖がもうすぐくるだろうこの時期の開発はとても良いと感じました。

私もなにか運営側としてのエンタテイメントシステムを考えながら次回からも活動していきたいと思います。

余談ですが、企業の方から
今の日本のe-sports事情と昔のフランスのe-sports事情が似ていると伺ったので、また詳しく調査したいと思います。

今回は、これで以上です!

LJL2016開幕戦レポート

1323101 榊原諒です。

今回1月17日(日)に開催されたLJL2016開幕戦に、
株式会社SANKO様の技術運営スタッフとして参加させていただきました!
LJLの公式ページはこちら

LJL_K1

まず、率直な感想としては、とてもたのしかったです!
私は、初めてこのような大会を生で見たのですがこんなに盛り上がって、お客様もたくさんくるのかと驚き興奮しました。
LJL_K2また、選手もインターネットでは知っていたり、知らない選手たち(プロゲーマーの方々)を見れてよかったです!
LJL_K5コスプレイヤーのパフォーマンス等もありました笑
LJL_K4
ここからは私が実際にやったことを説明します。
①選手PC,デバイスのセッティング
②ゲーム内での試合の進行
③BAN/PICK,試合時のVCの録音
④Twitch放送画面でのコメントのチェック
⑤PC,モニター,デバイスの梱包

このようなオペスペースで仕事をしました。

LJL_3

LJL_1

その中でも私たちの作業ブースはこんな感じでした。

LJL_2

まず①の選手PC,デバイスのセッティングですが、
選手が会場いりする前に,キーボード等を取り外したり、PCをすぐにTS3とLOLを起動できるようにしたり、ヘッドフォンのノイズチェックをしました。
10台分の配線が絡まり合ったり、場所によって調子が悪いものがでたりしたのでなかなか大変でした。
改善点としては、セッティングの際にもっとわかりやすくセッティングしておくべきだというところです。

次に②のゲーム内での試合の進行ですが、
まず選手達を集合させるチャットルームをたてて、ゲームルームを作成し、選手達を集合させて順番並びさせて、準備OKか聞いてゲームスタートという進行をしました。
ここは順調でしたが、選手のデバイストラブルなどにより大会の運営側と連携を密に取ることが大変でした。なぜかというと、MCでつなぐかCMでつなぐか選手インタビューでつなぐか等時間の使い方を考えなければいけないからです。

次に③のBAN/PICK,試合時のVCの録音ですが、
選手達のBAN/PICK,試合時のVCの録音をしました。これは録音だけでなく不正なことを言ってないかというチェックもしています。また、そのチェックで不正があった際に証拠として録音を提出します。
これはさほど大変ではなかったですがBAN/PICKと試合開始の間にコーチが抜けなければいけないところ、機材の都合で一試合目の手際が悪かったところが反省点です。

次に④のTwitch放送画面でのコメントのチェックですが、
こちらは、荒らしコメントのBANではなく、音ずれがあるや画像ずれがある等の放送上のトラブルをコメントで発見したら事実確認をして放送担当の方に修正してもらうという内容でした。
こちらも問題なく行うことができました。

最後に⑤のPC,モニター,デバイスの梱包をしました。
今回PC,モニター50セット-G-tune様 デバイス50セットlogicool様にお借りしていたものを元の箱に戻す作業をしました。
こちらは肉体労働でした笑
機材の扱いは次につながるので重要ですね。

これからの課題としては
Riot様が大会の運営をSANKOに任せていただけるように、
いろいろなことができるようになりたいと思います。

具体的には
①大会配信のスペクト画面のカメラ移動技術
②リプレイをしっかり、上手にやる
(ユーザーのコメントでリプレイ要望が多かったので)
③選手デバイスのセッティングがスムーズに行えるようにする。
(オフラインのみ)
だと感じました。
次は23日(土)にオンライン大会の運営スタッフとして関わってきます。