0 支持
(120 ポイント)
MUNを使用したAndroidアプリを、端末にインストールしたのですが、Connectを押した後にGame Start が出てきません。

PCではうまくいきました。

回答よろしくお願いします。

回答 1

0 支持
(3.8k ポイント)
様々要因が考えられるので、何度か問答を繰り返すことになるかも知れませんが。

FAQ : Android 向けにビルドしたアプリケーションで MUN サーバに接続できないのですが、どうすれば良いですか?
https://bit.ly/2WIT7qq

上述にあるように、Unity の PlayerSettings にある Android タブ内の Other Settings -> Configuration -> Internet Access について、「Require」に設定が変更されているでしょうか?

Auto のままだとAndroidのアプリ権限が取得できず、MUNを使ったネットワーク接続ができません。
(120 ポイント)
回答ありがとうございます。
 Internet Access は「Require」してあります。
(3.8k ポイント)
設定上は大丈夫だと思いますが、接続が上手くいっていないのが気になるので、新規シーンを作り、そこに空のオブジェクトを追加し、コンポーネントに
・MonobitView コンポーネント
・以下のコードが書かれたスクリプト Network.cs
の2つを追加した状態で、シーンをビルドし動かしてみてください。

----------------------------------------------------------------------------------------------------------------------
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MonobitEngine;

public class Network : MonobitEngine.MonoBehaviour
{
    public static List<string> logMsg = new List<string>();

    void Start()
    {
        MonobitNetwork.autoJoinLobby = true;
        MonobitNetwork.ConnectServer("ConnectionTest");
    }

    void OnGUI()
    {
        foreach (string str in logMsg)
        {
            GUILayout.BeginHorizontal();
            GUILayout.Label(str);
            GUILayout.EndHorizontal();
        }
    }

    public void OnConnectedToMonobit()
    {
        logMsg.Add("OnConnectedToMonobit");
    }

    public void OnConnectToServerFailed(MonobitEngine.DisconnectCause cause)
    {
        logMsg.Add("OnConnectToServerFailed : cause = " + cause.ToString());
    }

    public void OnJoinedLobby()
    {
        logMsg.Add("OnJoinedLobby");
        MonobitNetwork.CreateRoom("TestRoom");
    }

    public void OnCreatedRoom()
    {
        logMsg.Add("OnCreatedRoom");
    }

    public void OnCreateRoomFailed(object[] msg)
    {
        logMsg.Add("OnCreateRoomFailed : errorCode = " + msg[0] + ", message = " + msg[1]);
    }

    public void OnJoinedRoom()
    {
        logMsg.Add("OnJoinedRoom");
    }

    public void OnJoinRoomFailed(object[] msg)
    {
        logMsg.Add("OnJoinRoomFailed : errorCode = " + msg[0] + ", message = " + msg[1]);
    }
}
----------------------------------------------------------------------------------------------------------------------

上記コードで、PC でも Android でも接続状況が画面上に表示されるようになりますので、どの段階で失敗しているかが確認できると思います。
(120 ポイント)
回答ありがとうございます。
コメントにあるシーンを制作し、androidにビルドしたのですが、
なにも表示されません。
(3.8k ポイント)
ネットワーク接続の最初の段階で詰まっているということでしょうか。
GUI表示できるかどうか確認したいので、上記で示したソースについて
--------------------------------------------------------------------------------------------------
    void Start()
    {
        MonobitNetwork.autoJoinLobby = true;
        MonobitNetwork.ConnectServer("ConnectionTest");
    }
--------------------------------------------------------------------------------------------------
について
--------------------------------------------------------------------------------------------------
    void Start()
    {
        logMsg.Add("Connection Start");
        logMsg.Add("ServerType = " +
                                 MonobitNetworkSettings.MonobitServerSettings.HostType.ToString());
        logMsg.Add("ConnectionType = " +
                                MonobitNetworkSettings.MonobitServerSettings.HostProtocol.ToString());
        logMsg.Add("AuthId = " +
                                 MonobitNetworkSettings.MonobitServerSettings.AuthID);

        MonobitNetwork.autoJoinLobby = true;
        MonobitNetwork.ConnectServer("ConnectionTest");
    }
--------------------------------------------------------------------------------------------------
に変えた場合、どうなりますか?

(結果が表示された場合でも、"AuthID = " の行については、このQ&Aには掲載しないでください)
(120 ポイント)
回答ありがとうございます。
Connection Start
ServerType = MunTestServer
ConnectionType = UDP
と表示されます。
(3.8k ポイント)
表示はされているようですね…。

Assets/Monobit Unity Networking/Resources/MonobitServerSettings.asset のインスペクタで Server Connect の項目があるのですが(デフォルトは5000)、これは「サーバ接続を開始してから、接続できなかったことを検知するための時間」です。

仮にサーバ側に接続できなかった場合、
--------------------------------------------------------------------------------------------------
    public void OnConnectToServerFailed(MonobitEngine.DisconnectCause cause)
    {
        logMsg.Add("OnConnectToServerFailed : cause = " + cause.ToString());
    }
--------------------------------------------------------------------------------------------------
のログで OnConnectToServerFailed : cause ~ と出るはずなのですが。

付け加えて何点かお聞きしたいのですが、

Q1. "Connection Start" のログが表示されてから、気持ち30秒くらい放置しても、表示される内容に追加されることはありませんか?

Q2. ConnectionType を TCP に設定した場合、Android 側でも接続は可能ですか?

Q3. (通信料的に問題がなければ) ConnectionType を UDP のままで、Android 端末を非Wifi (3G/4Gなど)に設定することで、接続することは可能ですか?

Q4. Android 側で何か個別のセキュリティソフト(Android用Nortonセキュリティとか)を入れていますか?

多分 Q2, Q3 の回答次第ですが、モノビットのMUNが特定のNAT越えに対応していないのかも知れませんね。
(120 ポイント)
回答ありがとうございます。
A1.追加されませんでした。
A2.ConnectionTypeはどこで変えることが出来ますか?
A3.無理でした。
A4.特に入っていないです。
(3.8k ポイント)
編集
> A2.ConnectionTypeはどこで変えることが出来ますか?

Assets/Monobit Unity Networking/Resources/MonobitServerSettings.asset のインスペクタのProtocolで変更できます。現状UDPに設定していると思われますので、一度それをTCPに変更して接続してみてください。

Q2 に対して接続できるのであれば UDP ホールパンチングに失敗していると思うので、モノビットに問い合わせするしかないかと。
Q2 の問い対して「接続できない」場合だと端末に問題がありそうなので、何らかの対処法はありそうな気がしますが。
(120 ポイント)
回答ありがとうございます。
AssetsにMonobit Unity Networkingがありません。
(3.8k ポイント)
https://imgur.com/a/7L8faqc
MUNのパッケージをインポートした状態ですと、デフォルト位置が Assets/Monobit Unity Networking/Resources/MonobitServerSettings.asset になるのですが。
ディレクトリ変更している、ということでしょうかね…。

MUNを使用している場合であればどこかに存在するはずなので、Assets 以下のディレクトリを選択した状態で、Project 検索窓から「MonobitServerSettings」などでワード検索してみてください。
https://imgur.com/a/kHiyMOI
(120 ポイント)
回答ありがとうございます。
TCPに変更後、
Connection Start
ServerType = MunTestServer
ConnectionType = TCP
が表示されます。
(3.8k ポイント)
> TCPに変更後、
> Connection Start
> ServerType = MunTestServer
> ConnectionType = TCP
> が表示されます。

ということは「TCPに切り替えても接続できなかった」ということで良いのでしょうか。
何となくAndroid端末の不具合な気がします。(特にMUNで作成したUnityのアプリのネットワーク接続権限に対する許可が下りていない、機内モードで動かしている、など)
(120 ポイント)
回答ありがとうございます。
複数Android端末を持っているので、2つの端末を使用してテストしてみましたが、つながりませんでした。
(3.8k ポイント)
2つの携帯で試しているのであれば問題なさそうな気がするのですが、可能であれば、2つの端末をPCにUSB接続した上で、AndroidSDK に含まれている adb を使い、ターミナルまたはコマンドプロンプトから

   adb shell getprop ro.product.cpu.abi

を実行した上での結果(Androidデバイスに搭載されているCPUアーキテクチャ[ABI]の種類)を教えてください。
※ 調べ方がわからない場合、可能であればですが、使用されているAndroid端末の製品名を教えてください。

ここで仮に一部のAndroid端末のCPUアーキテクチャ(armeabi-v7a, arm64-v8a, x86 以外)だと、Unity および MUN ではサポートされていません(対応されていない代表的なデバイスとして、主に google が推奨している mips 系統がありますが、これでの動作はライブラリが存在しないため無理です)。
(3.8k ポイント)
加えて、可能であれば http://www.monobitengine.com/mun/ に置かれている MUNサーバをダウンロードしてPC上でサーバを動かし、そのPCに対してAndroid端末を接続できるかどうか、どういったログが表示されるか確認する方法などがありますが、そういった方法は試せるでしょうか?
(120 ポイント)
回答ありがとうございます。
コマンドプロンプトで実行したら、
adb server version (37) doesn't match this client (41); killing...
* daemon started successfully
adb.exe: more than one device/emulator
と出てきました。
2つの端末はどちらもhuaweiで、端末名は
ANE-LX2J
BAH2-W19
です。
(3.8k ポイント)
編集
> adb.exe: more than one device/emulator
は、デバイスを2台ともPCに接続している状態だから出現するエラー文ですね。どちらかの端末をPCから切り離せば(PCに1台だけ接続している状態にすれば)このエラー文が消え、デバイスの端末ABIが確認できるのですが。

ひとまず、端末名を教えていただきありがとうございます。ANE-LX2J については ABI の種類だけは分かったので、こちらで以下の点に留意して動かしてみてください。方法の説明として杜撰な部分もありますので、不明なところがあれば追加で質問をお願いします。

1. ANE-LX2J は arm64-v8a で動作していますので、ビルドの際に
 UnityEditor は Unity2017.4.16 以降、または Unity 2018.2 以降を使う
 (これ以下のバージョンでプロジェクトを作成している場合、
  プロジェクトのバージョンアップが必要なので、バックアップを取ってから
  アップグレードされた Unity でプロジェクトをインポートする。)

2. Android でビルドを行なう際、ビルド設定
  http://www.monobitengine.com/doc/mun/contents/Platform/Build_Android.htm
 について、以下の2点を設定する。
  i) IL2CPP を指定する。
   http://www.monobitengine.com/doc/mun/contents/Platform/image/image29.png
  ii) ARM64 にのみチェックを入れる。
   http://www.monobitengine.com/doc/mun/contents/Platform/image/image30.png

3. Unity から Android の apk を作成した後に、エクスプローラ(MacであればFinder)からプロジェクトのフォルダを開き、Assets ディレクトリと同じ場所にある Temp/StagingArea ディレクトリを開き、その中にある AndroidManifest.xml を見つけ、その AndroidManifest.xml  を Assets/Plugins/Android にコピーする。

4. 上記の AndroidManifest.xml を開き、以下の定義が書かれていることを確認する。

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

この定義がなければ接続できないので、存在しない場合 <manifest> ~ </manifest> 内に記述する。

5. 上記のAndroidManifest.xml を開き、上述の <uses-permission> の定義が書かれている箇所に以下の3行を追記する。
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>

5. この状態で改めて Android でビルドする。
(120 ポイント)
回答ありがとうございます。
上記を追加しても無理でした。
(3.8k ポイント)
編集
何に原因があるのか見当を付けるために、一度Gigafile便で以下のzipファイルをダウンロードして動かしてみてもらえますでしょうか。

https://28.gigafile.nu/0517-bae1a49a225761f9e4fc13b04cd9891d7

ダウンロードパスワード:MUN
zip解凍パスワード:rcv

http://www.monobitengine.com/doc/mun/contents/Sample/SimpleChat.htm
上記サンプルについて、接続ログも含めて表示できるようにカスタマイズしたものを、MunTestServer 向けに接続可能にした、TCPとUDPのサンプルapkが入っています。

これを adb install などで android デバイスにインストールして動かして、上述の SimpleChat 通りに動かせるかどうか試みて、その結果を教えてください。

ちなみに同一環境はないのですが、Samsung Galaxy S8(Android 9.0) では問題なく動作しているので、これで動かなければおそらくAndroid 10.0 だろうと思われる ANE-LX2J, BAH2-W19 のデバイスに対応していないのが原因、これで動けば Unity ビルド設定上の問題だと思います。(後者であれば Q2A で解決できる問題の可能性があるかもしれませんが、前者であれば個人の解決は無理なので、モノビットに問い合わせするしかないかもですね)
(120 ポイント)
回答ありがとうございます。
上手く動作しました。
(3.8k ポイント)
編集
なるほど…となるとかなり絞り込める気がします。
以下のどこかに原因があるはずなので教えてください。

1. 現在使用している Unity のバージョン
2. 現在使用している MUN のバージョン
3. Unity 上で Edit -> Preferences -> External Tools に登録している以下の項目
 ・Android -> JDK の場所と、JDK のバージョン
 ・Android -> Android SDK の場所と、Android SDK のバージョン
 ・Android -> Android NDK の場所と、Android NDK のバージョン
(120 ポイント)
回答ありがとうございます。
1. 2017.4.34f1
2. MUNのバージョンはどこで確認できますか?
3.JDKの場所:N:/unity_android/jdk
SDKの場所:N:/unity_android/sdk
NDKの場所:N:/unity_android/ndk/android-ndk-r13b
バージョンのみかたがわからないです。
(3.8k ポイント)
>  MUNのバージョンはどこで確認できますか?

Unity上で以下のスクリプトを組み込み、デバッグログで確認して教えてください。

         void Awake() {
                Debug.Log("MunVer : " + MunDLL.GetVersion());
                Debug.Log("MunInfoVer : " + MunDLL.GetInformationalVersion());
        }

> JDKの場所:N:/unity_android/jdk
> SDKの場所:N:/unity_android/sdk
> NDKの場所:N:/unity_android/ndk/android-ndk-r13b
> バージョンのみかたがわからないです。

JDK のバージョンは N:/unity_android/jdk/bin をコマンドラインで開き、
  ./java.exe -version
で調べて教えてください。

SDK のバージョンは N:/unity_android/sdk/tools をコマンドラインで開き、
  ./android list targets
で調べて教えてください。

NDK のバージョンは、N:/unity_android/ndk/android-ndk-r13b 内にある source.properties 内に「Pkg.Revision = ~~~~~」と書かれていますので、この行をコピーして教えてください。
(120 ポイント)
回答ありがとうございます。
MUNのバージョンは、2.7.0.0です。
NDKのバージョンは、13.1.3345770です。
すいません、コマンドラインで開くというのがわからないです。
(3.8k ポイント)
> すいません、コマンドラインで開くというのがわからないです。

該当するディレクトリをエクスプローラで開き、shiftキーを押しながら右クリックして「PowerShellを開く」または「コマンドプロンプトを開く」を選んで開いてください。
(120 ポイント)
回答ありがとうございます。
JDK:1.8.0_231
SDK:Name: Android API 29
        Type: Platform
        API level: 29
        Revision: 3
これであってます?
(3.8k ポイント)
なるほどです。
Android SDK のバージョンは Android 10 向け(API 29)のもののようですが、Android NDK のバージョンが r13b(13.1.3345770)で結構古いですね。
Unity で Android + IL2CPP でビルドする場合、最低でも r16b 以降のバージョンアップは必要だと思います(Unityドキュメントにも r16b 以降を推奨する旨が書かれています)
https://docs.unity3d.com/ja/2017.4/Manual/android-sdksetup.html

付け加えるならば、 Unity2017.4.33 で Android 10 に対応させる Fix Update があったのですが( https://issuetracker.unity3d.com/issues/android-api-level-29-and-28-is-not-available-in-latest-unity-2017-dot-4 )、この Fix が正常な動作を示すかどうか Unity 提供側は保証していない雰囲気があります( https://blogs.unity3d.com/jp/2019/03/05/android-support-update-64-bit-and-app-bundles-backported-to-2017-4-lts/ にある通り、Unity2017.4 のサポートは 2020年3月までなので、この件について現状 Unity に問い合わせても無理かもしれません)。

一応自分の環境(先に apk をgigafile便で送らせてもらった環境)をお伝えしておくと、

Unity : 2019.3.0f6
MUN : 2.7.0
JDK:1.8.0_172
SDK : Android API 24 (Android 7.0 以降)
NDK : Android NDK r19b(19.0.5232133)
 
です。MUN自体はUnity5.0以降をサポートしているようですが、あくまで動作保証の範疇であり、現実的ではないと思います。現状のUnityやAndroid(GooglePlayApps)の事情などから考えると、Android での実行や頒布を考える上では、Unity と NDK のバージョンを上げる必要はあるかと思います。

なお NDK については個別に
https://developer.android.com/ndk/downloads?hl=ja
から直接ダウンロードして展開し、Unity 上で Edit -> Preferences -> External Tools -> Android NDK の場所として手動指定するのが良策です。
(120 ポイント)
回答ありがとうございます。
最新のNDKはダウンロードしましたが、NDKの場所を指定したら、
NDK 21.0.6113669 is incompatible with IL2CPP,
IL2CPP requiresw r13b (64-bit) (13.1.3345770).
と言われました。
(3.8k ポイント)
> NDK 21.0.6113669 is incompatible with IL2CPP,
> IL2CPP requiresw r13b (64-bit) (13.1.3345770).

まずUnityのバージョンを(2018.2以降に)上げてください。

どうしてもUnityのバージョンを上げられない事情があるとするならば、そのエラーチェックは先に挙げた NDK ディレクトリ内の source.properties にある「Pkg.Revision = ~~~~~」と書かれた箇所について、無理矢理 13.1.3345770 と書き換え「NDK r21 を NDK r13 とUnity側に認識させて通す」方法も考えられますが、その後の動作については保障できません。
(120 ポイント)
回答ありがとうございます。
今使っているバージョンじゃないとapkの出力が出来ないので、バージョンは上げられないです。
無理やり書き換えたら、出力が出来ませんでした。
(3.8k ポイント)
「今使っているバージョンじゃないとapkの出力が出来ない」ということ自体が問題だと思います。

現状公開されている Unity 2019 以降であれば、UnityHub を介して「特段 Android 向け開発に必要なパッケージはプリインストール可能な状態にしている( https://yanpen.net/unity/install_android-sdk-ndk_from_unity_hub/ )」ので、apkの出力ができない理由がわかりません。
(120 ポイント)
遅くなってすいません。
回答ありがとうございます。
Unityの更新等をしてみて、またわからないことがあったら質問させていただきます。
...