0811ゼミ

0811ゼミ

# 研究目的

  • ゲームの通信方式にはクライアントサーバ方式とp2p方式がある
  • データの安全性やチート対策などでクライアントサーバ方式が主流
  • サーバに接続してマルチプレイなどのデータ同期を実現させているため、低速
  • 高速かつ安全に通信を行たい
    • 並列分散フレームワークChristieがある
    • Christieを利用してp2pで通信を行う
  • ゲーム開発で主に使用されているUnityに対応するためにChristieをC#へ書き換えを行う

# 今週の進捗

  • 講義でチャットアプリをUnityで作ってました
    • postするのにcookieにkeyを書き込む必要があり、しんどかった
    • iosの仕様でバックグラウンド動作に苦しめられた
  • Unity初心者勉強会を開催します
  • GameJam+というイベントの運営と英語ミーティングがすることが確定

# C#でWebRequestでpost時にcookieにkeyを書き込む

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
private IEnumerator WebRequest(){

  //1.UnityWebRequestを生成
  UnityWebRequest request = UnityWebRequest.Post("http://", "post data");
  
  //HTTPヘッダーの設定
  request.SetRequestHeader("key", "KEY");    

  //2.SendWebRequestを実行し、送受信開始
  yield return request.SendWebRequest();

  //3.isNetworkErrorとisHttpErrorでエラー判定
  if(request.isHttpError || request.isNetworkError) {
    //4.エラー確認
    Debug.Log(request.error);
  }
  else{
    //4.結果確認
    Debug.Log(request.downloadHandler.text);
  }
}
  • postの例ではpython3で実装…

    • post関数の引数にcookieを仕込める実装
  • Headerにkeyを書き込んでもpostできない

    • そもそもUnityWebRequestにcookieを書き込む処理が実装されていない
  • C#でWebRequest自力実装することに

C#にはCookieContainerというcookieを書き込めるクラスがあったのでそれを利用

1
2
3
 // cookie書き込み
  CookieContainer cc = new CookieContainer ();
  cc.Add (new Uri (url), new Cookie ("key", key));
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
private void PostMessage () {
  // 投げるjsonデータ
  string postData = "{\"to\":\"someone\",\"content\":\"aaaaaaaaaaaallllllililili\"}";
  byte[] byteArray = Encoding.UTF8.GetBytes (postData);

  // cookie書き込み
  CookieContainer cc = new CookieContainer ();
  cc.Add (new Uri (url), new Cookie ("key", key));

  // リクエストの作成
  HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
  req.Method = "POST";
  req.ContentType = "application/json";
  req.ContentLength = byteArray.Length;
  req.CookieContainer = cc;

  // ストリームに送信するデータを書き込む
  Stream dataStream = req.GetRequestStream ();
  dataStream.Write (byteArray, 0, byteArray.Length);
  dataStream.Close ();

  // 送信
  HttpWebResponse res = (HttpWebResponse) req.GetResponse ();

  for (int i = 0; i < res.Headers.Count; i++) {
    Debug.Log (res.Headers[i]);
  }
}

# iosのバックグラウンドの動作時間

チャットアプリだが、サーバー側は先生が用意しているのでそれを利用

push通知を飛ばしたいので、バックグラウンド動作時にサーバーからgetしてきたい

  • Unityのコルーチン(非同期処理)を使うとその後の処理が返ってこない

    • yield return null 1フレーム待つ →返ってこない
  • await/async (C#の便利非同期処理)も 返ってこない

  • Invoke(“function”, 1) という数秒待って関数を実行する関数も動作しない

  • なんならwhile(true)でループさせてても一定時間で処理が止まる

iOS 13におけるバックグラウンド時間 iOS 13で利用可能なバックグラウンド時間は、以前のバージョンのiOSと比較して大幅に短縮されました。iOS 13上で私たちのiOSアプリを使用して、接続したままの状態で他のアプリに切り替えた場合、その接続を維持したまま再び戻るためのバックグラウンド時間は約30秒に設定されているようです。これはOSによって制御されるもので、私たちがこれを制御する術がありません。私たちはこの問題の解決策を常に調査しており、将来的にはより良い方法を提供できると期待しています。

# Unity初心者勉強会

# GameJam+開催?

https://gamejamplus.com/#/

  • ブラジル発 (日本の開催会場は0っぽい)
  • GGJみたいな感じだが、各都市で優勝チームを決めてセミファイナル、ファイナルと進んでいく模様
  • 審査員やセミファイナルまでの間に優勝チームに付くプロをこちらが探さないといけない??
  • 15日に英語でオンライン会議する予定…(相手はポルトガル語話者)
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy