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

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

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

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

Unity

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

Q&A

解決済

1回答

2277閲覧

unityのText更新

miiichat

総合スコア72

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

Unity

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

0グッド

0クリップ

投稿2019/06/18 14:56

編集2019/06/18 14:58

こういうデータが送られてきて

{"request":"wait","requestID":5934938,"roomID":33149990} public class JsonData { public string request; public int requestID; public int roomID; public string data; }
private int roomID; private int requestID; private string roomStatus; public Text messageText; public Text requestidtx; public Text roomidtx; public Text roomStatusTx;

を更新する

ws.OnMessage += (object sender, MessageEventArgs e) => { Debug.Log("receive: " + e.Data); JsonData data = JsonUtility.FromJson<JsonData>(e.Data); if (data.request == "wait") { if (data.requestID == requestID) { Debug.Log("wait"); roomStatus = "wait"; roomStatusTx.text = roomStatus; changeRoomID(data.roomID); }                  ・                  ・                  ・ public void clear() { JsonData data = new JsonData(); data.request = "databaseclear"; changeRoomID(-1); changeRequestID(-1); roomStatus = ""; messageText.text = ""; roomStatusTx.text = ""; Debug.Log("clear" + JsonUtility.ToJson(data)); ws.Send(JsonUtility.ToJson(data)); } public void changeRequestID(int i) { requestID = i; requestidtx.text = i.ToString(); } public void changeRoomID(int i) { roomID = i; Debug.Log(roomID); roomidtx.text = i.ToString(); }
WebSocket Error Message: An error has occurred during an OnMessage event. UnityEngine.Debug:Log(Object) PositionSync:<OnSyncStartButtonDown>b__14_1(Object, ErrorEventArgs) (at Assets/PositionSync.cs:125) WebSocketSharp.Ext:Emit(EventHandler`1, Object, ErrorEventArgs) WebSocketSharp.WebSocket:error(String, Exception) WebSocketSharp.WebSocket:messagec(MessageEventArgs) WebSocketSharp.WebSocket:message() WebSocketSharp.<>c__DisplayClass174_0:<startReceiving>b__1(WebSocketFrame) WebSocketSharp.<>c__DisplayClass83_0:<ReadFrameAsync>b__3(WebSocketFrame) WebSocketSharp.<>c__DisplayClass77_0:<readPayloadDataAsync>b__0(Byte[]) WebSocketSharp.<>c__DisplayClass56_0:<ReadBytesAsync>b__0(IAsyncResult) System.Threading._ThreadPoolWaitCallback:PerformWaitCallback()

clear()での-1の更新はできますが、、、

###追記

if (data.request == "wait") { if (data.requestID == requestID) { Debug.Log("data.request: " + data.request); Debug.Log("data.requestID: " + data.requestID); Debug.Log("data.roomID: " + data.roomID); Debug.Log("data.data: " + data.data); Debug.Log("wait"); roomStatus = "wait"; Debug.Log(roomStatus); Debug.Log(nameof(roomStatus)); roomStatusTx.text = "wait"; Debug.Log(data.roomID); //Debug.Log("request:wait:roomID= " + data.roomID.ToString()); //changeRoomID(data.roomID); }

roomStatusTx.text = "wait";

がおかしいみたいです。
inspectorのTextは"wait"なってますが、scene,game画面は20秒後ぐらいに更新されます。
そのままだとDebug.Log(data.roomID);が表示されませんが、
コメントアウトすると表示されます。

これは大丈夫ですが changeRoomID(-1); changeRequestID(-1); changeRequestID(UnityEngine.Random.Range(0, 9999999)); これはダメでした。 changeRoomID(data.roomID); public void changeRoomID(int i) { roomID = i; Debug.Log(roomID); roomidtx.text = i.ToString(); } これのroomidtx.text = i.ToString(); の部分が多分ダメ見たいです。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using WebSocketSharp; using UniRx; using System; using System.Text.RegularExpressions; using System.Linq; [Serializable] public class JsonData { public string request; public int requestID; public int roomID; public string data; } public class PositionSync : MonoBehaviour { [SerializeField] private string _serverAddress; [SerializeField] private int _port; [SerializeField] private Transform _syncObjTransform; //Share transform [SerializeField] private SyncPhase _nowPhase; private WebSocket ws; private int roomID; private int requestID; private string roomStatus; public Text messageText; public Text requestidtx; public Text roomidtx; public Text roomStatusTx; public enum SyncPhase { Idling, Syncing } private void Awake() { _nowPhase = SyncPhase.Idling; } /// <summary> /// Get Down Start Sync Button /// </summary> public void OnSyncStartButtonDown() { //var ca = "ws://" + _serverAddress + ":" + _port.ToString(); var ca = "ws://192.168.33.11:8080"; Debug.Log("Connect to " + ca); ws = new WebSocket(ca); //Add Events //On catch message event ws.OnMessage += (object sender, MessageEventArgs e) => { Debug.Log("receive: " + e.Data); JsonData data = JsonUtility.FromJson<JsonData>(e.Data); // Debug.Log("data.request: " + data.request); // Debug.Log("data.requestID: " + data.requestID); // Debug.Log("data.roomID: " + data.roomID); // Debug.Log("data.data: " + data.data); // Debug.Log(10 + int.Parse(data.roomID)); if (requestID == data.requestID) { //Debug.Log("reserve myrequestID:" + data); } if (data.request == "wait") { if (data.requestID == requestID) { Debug.Log("data.request: " + data.request); Debug.Log("data.requestID: " + data.requestID); Debug.Log("data.roomID: " + data.roomID); Debug.Log("data.data: " + data.data); Debug.Log("wait"); roomStatus = "wait"; Debug.Log(roomStatus); Debug.Log(nameof(roomStatus)); // roomStatusTx.text = roomStatus; Debug.Log(data.roomID); //Debug.Log("request:wait:roomID= " + data.roomID.ToString()); changeRoomID(data.roomID); } } else if (data.request == "connect") { if (requestID == data.requestID) { roomStatus = "connect"; Debug.Log(roomStatus); roomStatusTx.text = roomStatus; changeRoomID(data.roomID); } } else if (data.request == "roomMessage") { if (data.roomID == roomID) { print(data.data); } } }; //On error event ws.OnError += (sender, e) => { Debug.Log("WebSocket Error Message: " + e.Message); _nowPhase = SyncPhase.Idling; }; //On WebSocket close event ws.OnClose += (sender, e) => { Debug.Log("Disconnected Server"); }; ws.Connect(); _nowPhase = SyncPhase.Syncing; } /// <summary> /// Get Down Stop Sync Button /// </summary> public void OnSyncStopButtonDown() { ws.Close(); } } public void intoRoom() { if (_nowPhase == SyncPhase.Syncing && roomStatus != "wait") { JsonData data = new JsonData(); data.request = "RoomRequest"; changeRequestID(UnityEngine.Random.Range(0, 9999999)); data.requestID = requestID; Debug.Log("Sent intoRoom request" + JsonUtility.ToJson(data)); ws.Send(JsonUtility.ToJson(data)); } } public void sentRoomMessage(string message) { JsonData data = new JsonData(); data.request = "roomMessage"; data.roomID = roomID; data.data = message; Debug.Log("Sent intoRoom request" + JsonUtility.ToJson(data)); ws.Send(JsonUtility.ToJson(data)); } public void onPushSentButton() { if (_nowPhase == SyncPhase.Syncing && roomStatus == "connect") { sentRoomMessage(messageText.text); } } public void clear() { JsonData data = new JsonData(); data.request = "databaseclear"; changeRoomID(-1); changeRequestID(-1); roomStatus = ""; messageText.text = ""; roomStatusTx.text = ""; Debug.Log("clear" + JsonUtility.ToJson(data)); ws.Send(JsonUtility.ToJson(data)); } public void changeRequestID(int i) { requestID = i; requestidtx.text = i.ToString(); } public void changeRoomID(int i) { roomID = i; Debug.Log(roomID); roomidtx.text = i.ToString(); } }

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

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

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

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

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

sakura_hana

2019/06/19 04:48

うろ覚えなのですが、この書き方の場合ってOnMessageの外で書いた変数をそのまま使えましたっけ? 「Debug.Log(roomidtx);」などとやって正常に通るか確認してみてください。
miiichat

2019/06/20 09:36 編集

Debug.Log(roomidtx);はダメでした。 roomStatusTx.text = roomStatus; roomidtx.text = i.ToString(); テキスト更新は先に書いたほうは一応通って更新されますが、エラーがでて後のは処理されないみたいです。
miiichat

2019/06/20 09:57

onmessageのなかで Text ROOMIDTEXT = GameObject.Find("roomidtx").GetComponent<Text>(); Debug.Log(ROOMIDTEXT); もダメでした。
miiichat

2019/06/20 10:26

自己解決しました。 回答本当にありがとうございました!!!
guest

回答1

0

自己解決

SynchronizationContext context; void Start() { context = SynchronizationContext.Current; } ・ ・ ・ context.Post(__ => { changeRoomID(data.roomID); }, null); context.Post(__ => { changeRoomStatus("wait"); }, null);

UIとかTextとかはメインスレッド?じゃないとエラーとか見た気がして調べたらできました。

websocketは別スレッド?なのかな。勉強します

投稿2019/06/20 10:31

miiichat

総合スコア72

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問