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

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

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

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Unity

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

1回答

2550閲覧

【Unity】グローバルIPを使った2人対戦のオンラインゲーム(P2P対戦)アプリ

abushi

総合スコア13

C#

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Unity

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2018/09/16 03:37

編集2018/09/16 03:40

前提・実現したいこと

UnityでAndroid向けにターン制のオンライン対戦ゲームを作成しようと思っています。
今までゲーム作成の経験はありません。サーバー↔ブラウザのWebアプリは作ったことがあります。
今回は2人対戦なので、マッチングはサーバーを介して行い、その後の対戦部分はサーバーを介さずにクライアント同士がソケット通信でデータを送りあうものを作ろうと思っています。
標準ライブラリのSystem.Net.Socketsを使って実装しています。

困っていること

以下の様なソースコードでは動きませんでした。

IPAddress[] lIp = Dns.GetHostAddresses(Dns.GetHostName()); foreach (var iIp in lIp) { if (iIp.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) { return iIp.ToString(); //localhostの値しか帰ってこない } } return lIp[0].ToString(); //localhostの値しか帰ってこない

・ホスト端末のグローバルのIPアドレスが取得できない。
・ソケット通信のサンプルコードはたくさん見つかるが、同一ネットワーク内のサンプルしかみつからない

補足情報(FW/ツールのバージョンなど)

・Unity:5.3.2
・.NetFramework:不明(多分static using が使えないので4.6以前)
※すみません、Unityプロジェクトだからか、プロパティで見られずよくわかりませんでした
・VisualStudio:Community 2017

そのほか

・グローバルIPアドレスを取得するサイトを叩くのは、余計な負荷を人様のサーバーにかけるので良くないと思いやめました。
・ソケット通信にこだわるつもりはないので、プッシュ型の代替案などあれば教えていただけると幸いです。
・Android端末同士でのP2P通信の実装を行ったことがありアドバイスがある方がいましたらハマリどころなど教えていただけると幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

このような場合、ホスト側のポートを空ける必要があります。
こうなるとポート開放やルーティングの設定を行う必要がありますが、一般の人にはその知識がないのがほとんどです。

Unityのネットワーク機能(UNET)のマッチングサービスやPhotonを使えば、これらを行わずに通信できるようになるので、おすすめです。
あるいは、自分でサーバーを立てて、それを経由させる形で行う方法もあります。

投稿2018/09/16 05:45

fiveHundred

総合スコア9778

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

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

abushi

2018/09/17 02:11

すぐにご回答いただき、ありがとうございます。 すみません、書き方が悪くてお伝えしきれなかったのですが、テキストの写経でパケットキューを使用したTCP通信などの部分の実装が終わっており、ローカル内でのソケット通信はできるのです。 C#で自分のグローバルIPアドレスを取得する方法がわかればあとはそのIPアドレスを使ってソケット通信をまちうけるだけなのですが、方法をご存じないでしょうか。 自分でサーバーを立てて経由させる場合は、サーバーに状態を管理しておきクライアント側から定期的にリクエストを送ってプレイヤー同士が通信しているように見せるという理解であっておりますでしょうか。
abushi

2018/09/17 02:29

五月雨で申し訳ありません。もう少し自分で調べて見たところ、パケットキューやルーティングテーブル以外にNAT越えの仕組みを用意する必要があることなどをしりました。 fiveHundredさまに教えていただいたUNETやPhotonを使用して実装してみようと思います。 教えていただき本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問