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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

1回答

1932閲覧

unityのルーム作成について

koryo

総合スコア26

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2016/03/11 06:46

こんにちは
オンラインゲームを作ろうと思いルーム作成のスクリプトを、

C#

1using UnityEngine; 2using System.Collections; 3using System.Net; 4public class Connector : MonoBehaviour { 5 6 // 自分のIPアドレス 7 private string myIP = ""; 8 // 接続先のIPアドレス 9 private string servIP = ""; 10 // 接続が完了したときtrue 11 private bool isConnected = false; 12 public GameObject prefPlayer = null; 13 14 // Use this for initialization 15 void Start() 16 { 17 string hostname = Dns.GetHostName(); 18 19 // ホスト名からIPアドレスを取得 20 IPAddress[] adrList = Dns.GetHostAddresses(hostname); 21 foreach (IPAddress address in adrList) 22 { 23 myIP = address.ToString(); 24 servIP = myIP; 25 } 26 } 27 28 // Update is called once per frame 29 void Update() 30 { 31 32 } 33 34 void OnGUI() 35 { 36 // 未接続のとき、接続用UIを表示 37 if (!isConnected) 38 { 39 40 // ゲームサーバーになるボタン 41 if (GUI.Button(new Rect(10, 10, 200, 30), "ゲームサーバーになる")) 42 { 43 if (Network.InitializeServer(20, 25000, false) == NetworkConnectionError.NoError) 44 { 45 procConnect(); 46 } 47 else 48 { 49 Debug.Log("ゲームサーバー初期化エラー"); 50 } 51 52 } 53 54 // IPの編集 55 servIP = GUI.TextField(new Rect(10, 50, 200, 30), servIP); 56 57 // クライアントになるボタン 58 if (GUI.Button(new Rect(10, 80, 200, 30), "上のゲームサーバーに接続")) 59 { 60 if (Network.Connect(servIP, 25000) == NetworkConnectionError.NoError) 61 { 62 procConnect(); 63 } 64 else 65 { 66 Debug.Log("接続エラー"); 67 } 68 69 } 70 } 71 } 72 private void procConnect() 73 { 74 isConnected = true; 75 76 // プレイヤーを出現させる 77 StartCoroutine("instantiatePlayer"); 78 } 79 80 private IEnumerator instantiatePlayer() 81 { 82 // 接続が完了するまで待つ 83 while (!Network.isServer && !Network.isClient) 84 { 85 yield return null; 86 } 87 88 // 接続したので出場 89 Vector3 pos = new Vector3(Random.Range(-5f, 5f), Random.Range(-2.5f, 2.5f)); 90 Network.Instantiate(prefPlayer, pos, Quaternion.identity, 0); 91 } 92 93 94}

このようにかいたところ、先に「上のゲームサーバーに接続」を押すとUGUIが消えて
誰かが「ゲームサーバーになる」ボタンを押さない限り動かせなくなります。
先に「上のゲームサーバーに接続」を押してもUGUIが消えないようにするにはどうすればいいですか?(「ゲームサーバーになる」ボタンが押された後ならUGUIが消えるようにしたいです)
あと、ルームに2人以上入った状態で1人がゲームをやめてもプレイヤーのプレファブが消えず誰かのプレイヤーと一緒に動いてしまいます。
通信が切れたらプレファブを消すにはどうすればいいですか?
もしこのスクリプトを変えるより簡単な方法があったら教えてください。
回答よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

接続先のサーバーが無い状態で Network.Connect() を実行すると
その中から戻ってこないのでは無いでしょうか?
Connect() でブロックしてしまうと OnGUI() も終了できず、
結果として表示を更新できない、というような事になっているのでは
ないかと推察します。
処理に時間がかかるような物はあまり OnGUI() の中で実行しない方が
いいと思いますし、Network.Connect() をコルーチンで実行するように
するなど、構成を変えてみてはどうでしょうか?

投稿2016/03/11 07:41

HiroshiWatanabe

総合スコア2160

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

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

koryo

2016/03/12 08:44 編集

コルーチンを2回使うんですね。今まで1つのプログラムに1回しか使っていなかったのでその発想はなかったです。並べ替えかと思っていましたが、うまくいきました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問