質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

1回答

2682閲覧

Unityを使用した画像データのMySQLへの保存とUnityでの表示

north

総合スコア8

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2016/11/28 02:30

編集2016/11/28 02:33

###Unityを使用した画像データのMySQLへの保存とUnityでの表示

###発生している問題・エラーメッセージ
ご覧いただきありがとうございます。
現在Unityを使用して簡単なシューチングゲームを作成しているのですがその機能の一つとしてランキング機能(ユーザー名、スコア、画面のスクリーンショットの表示)を作成しております。
UnityとPHPを使用した画像データ(画面のスクリーンショット)の送受信なのですが方法がわからず困っております。サーバーへの送信部分は一応書いたのですがform.AddBinaryDataのところでNULLが出てしまっています。
文字列や数値は送受信ができているのが確認できております。
受信はJsonを使用しているのですがJsonだとバイナリーは対応していないと出てきたのですが方法はありますでしょうか?

送信部分 using UnityEngine; using System.Collections; using System.IO; public class Score : MonoBehaviour { // スコアを表示するGUIText public GUIText scoreGUIText; // ハイスコアを表示するGUIText public GUIText highScoreGUIText; // スコア private int score; // ハイスコア private int highScore; // PlayerPrefsで保存するためのキー private string highScoreKey = "highScore"; string m_url = 該当のURL string PlayerName; Texture2D tex; byte[] pngdata; bool isCreate = true; // Use this for initialization void Start () { Initialize(); } // Update is called once per frame void Update () { // スコアがハイスコアより大きければ if (highScore < score) { highScore = score; } // スコア・ハイスコアを表示する scoreGUIText.text = score.ToString(); highScoreGUIText.text = "HighScore : " + highScore.ToString(); } // ゲーム開始前の状態に戻す private void Initialize() { // スコアを0に戻す score = 0; highScore = 0; // ハイスコアを取得する。保存されてなければ0を取得する。 //highScore = PlayerPrefs.GetInt(highScoreKey, 0); } public IEnumerator LoadScreenshot() { yield return new WaitForEndOfFrame(); tex = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false); tex.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0); tex.Apply(); pngdata = tex.EncodeToPNG(); Destroy(tex); } // ポイントの追加 public void AddPoint(int point) { score = score + point; } public void SetName(string name) { PlayerName = name; } // ハイスコアの保存 public void Save() { // ハイスコアを保存する PlayerPrefs.SetInt(highScoreKey, highScore); PlayerPrefs.Save(); StartCoroutine("SetScore"); // ゲーム開始前の状態に戻す Initialize(); } //サーバーにハイスコアを送信 IEnumerator SetScore() { WWWForm form = new WWWForm(); form.AddField("name", PlayerName); form.AddField("score", score); form.AddField("frameCount", Time.frameCount.ToString()); form.AddBinaryData("fileUpload", pngdata, "screenShot.png", "image/png"); WWW result = new WWW(m_url, form.data); yield return result; if(result.error == null) { Debug.Log("登録完了"); } } }
php $name = $_REQUEST['name']; $score = $_REQUEST['score']; $screen = $_REQUEST['screen']; print($screen); $sql = "INSERT INTO Score(name, score, screen) VALUES('$name', '$score', 'screen')"; $result_flag = mysql_query($sql); //クエリ文の実行 if(!$result_flag) { die('INSERTクエリーが失敗しました。'.mysql_error()); }
受信部分 IEnumerator GetScore() { WWW result = new WWW(url); yield return result; if (result.error == null) { rdbUserGet = new JSONObject(result.text); for (int ii = 0; ii < rdbUserGet.Count; ii++) { JSONObject jsonPos = rdbUserGet[ii]; JSONObject jsonName = jsonPos.GetField("name"); JSONObject jsonScore = jsonPos.GetField("score"); PlayerName = jsonName.str; Score = jsonScore.str; if (PlayerName == "" || Score == "") continue; top = new GameObject("name_" + ii); score = new GameObject("score_" + ii); GUIText Text = top.AddComponent<GUIText>(); GUIText Text2 = score.AddComponent<GUIText>(); Text.fontSize = 20; Text2.fontSize = 20; Text.text = Rank + ":" + PlayerName; Text2.text = Score; top.transform.position = new Vector3(0.1f, 0.6f + move, 0); score.transform.position = new Vector3(0.5f, 0.6f + move, 0); a = top.GetComponent<GUIText>().color; a.a = 0.0f; top.GetComponent<GUIText>().color = a; score.GetComponent<GUIText>().color = a; move -= 0.05f; Rank += 1; Debug.Log("名前:" + PlayerName + "スコア:" + Score); } } else { string error = result.error; Debug.LogError("www Error:" + result.error); } }
php $query = "SELECT name, score FROM Score Order by score desc"; if($result = mysql_query($query)) { $user = array(); // 結果をオブジェク形式で出力. while($row = mysql_fetch_assoc($result)) { //print($row['name']); //print($row['score']); //$user[] = array('name'=> $row->name, 'score'=> $row->score); $user[] = $row; //var_dump($user); } // 出力結果が空の時は、nullを出し、JSON形式で変換. if(empty($user)) { $user = null; echo json_encode( $user ); } else { echo json_encode( $user ); } // 結果を解放 //$result->close(); }

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
Unity5.4使用
PHP5.3
Json使用

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

>form.AddBinaryDataのところでNULLが出てしまっています。
LoadScreenshotが呼び出されていないようですが、別の所で呼んでいるのでしょうか。
この完了をきちんと待ってから送信処理を行う必要があるかと思います。

>Jsonだとバイナリーは対応していない
バイナリデータを文字列化してJSONに入れるか、
スクショだけJSONとは別にDLするかのどちらかになると思います。
(画像のDL・表示処理は遅いので、ユーザビリティー的にも先にスコア等の必須部分を読み込み→必要に応じて後からスクショを読み込み、の方がスマートかと思います)

投稿2016/11/28 06:30

sakura_hana

総合スコア11427

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

north

2016/11/28 09:30

ご回答ありがとうございます。 LoadScreenshotは別の所で呼び出しております。 自分でもデバッグ機能で追っていきましたら yield return new WaitForEndOfFrame(); より下が実行されておらず、そのままSetScore()が呼び出されていましたのでそれでNULLのなっているところまでは分かったのですがここからどう修正すればいいのかというところで悩んでおります。 呼び出すタイミングとしてはゲームオーバーになった瞬間に呼び出したいので Save関数内で呼び出そうと思ったのですがこちらでもNULLが出たので・・・・ 情報不足申し訳ありませんでした。 JSONはご回答いただきました先にPHP側で一度文字列に変換→Unity側で再度変換という方法で試してみたいと思います。
sakura_hana

2016/11/28 10:43

恐らく呼び出し側を StartCoroutine("LoadScreenshot"); StartCoroutine("SetScore"); こんな感じにしているのではないでしょうか。 StartCoroutineは呼び出したメソッドの結果を待たずに次に進む為、これだとLoadScreenshotの処理終了前に送信してしまいます。 呼び出し側のメソッドもIEnumeratorにして yield LoadScreenshot(); とするか、デリゲートを使用することでLoadScreenshotの処理を待つことが出来ます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問