LoginSignup
7
4

More than 3 years have passed since last update.

【Unity】NWPathMonitorを使ったネイティブプラグインUniNWPathMonitorを作ってみた

Last updated at Posted at 2020-08-20

Unityにはネットワーク接続確認の機能Application.internetReachabilityが存在しますが、あえてNWPathMonitorを使ったSwiftのネイティブプラグインを作ってみました。

iOSのネットワーク接続状態の検出にはReachabilityよりシンプルなNWPathMonitorを使いましょう。 - Qiita
Swift周りの処理はコチラの記事を参考にさせて頂きました。

Swift側

UniNWPathMonitor.swift
monitor.pathUpdateHandler = { path in
    if path.status == .satisfied {
        // connected
        self._onCallback("1")
    } else {
        // No connected
        self._onCallback("0")
    }
}

NWPathMonitorインスタンス(monitor)を使って接続中であれば"1"、切断中であれば"0"を予めセットしておいたコールバックで返却します。

Objective-C++側

API_AVAILABLE(ios(12.0))
UniNWPathMonitor *_monitor;

今回NWPathMonitorを使うにあたって、iOS12以降が必須となるため、API_AVAILABLEでiOS12以降が必須であることを宣言します。

UniNWPathMonitorBridge.mm
[_monitor setCallbackOnCallback:^(NSString * value) {
    UnitySendMessage("UniNWPathMonitor", "Noti", [value UTF8String]);
}];

UniNWPathMonitorに対しコールバックをセットします。
コールバックが返ってきたらUnitySendMessageを使ってUnity側のに接続情報を返却します。

Objective-C++の記述は以前執筆したコチラの記事を参考にして頂ければと思います。
【Unity】最近のUnityでC#からSwiftを実行する最短実装 - Qiita

Unity側

Unity側ではこのような使い方になります。
UniNWPathMonitorにStartMonitorを実行しコールバックをセットするだけです。

Sample.cs
void Start()
{
    UniNWPathMonitor.StartMonitor();
    UniNWPathMonitor.onChangeNetworkStatus += status =>
    {
        if (status == UniNWPathMonitor.NetworkStatus.satisfied)
            // 接続中
        else
            // 切断中
    };
}

anim.gif
実際作ったものはコチラ。WifiのオンオフをしてUnity側でコールバックを受け取っています。切り替えてUnityにコールバックが返るまで少しラグが発生するようです。

最後に

冒頭で申し上げたとおり、ぶっちゃけUnityの場合はApplication.internetReachabilityが存在するため本プラグインは不要です。※筆者が作ってみたかったから作ってみたというやつです。

自分にとっては、実際に作ってみて学びは多かったです。初めて出てきたSwiftのコールバック文法や、iOS12以降を必須にする方法など、現在勉強中のSwiftの事を知る機会が出来て良かったです。


以下に全ソースアップしているので、ご参考にどうぞ。
https://github.com/baobao/UniNWPathMonitor

開発環境

  • Unity2019.4.4f1
  • Xcode11.6
  • iPhone6S iOS13.6
7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4