Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Unityネイティブプラグインの勧め

682 views

Published on

Unityネイティブプラグインの勧め]
KLab 福岡Meetup#2

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Unityネイティブプラグインの勧め

  1. 1. Unityネイティブプラグイン の勧め
  2. 2. 自己紹介 ● 名前:牧野龍太郎 ● 勤務先:KLab福岡事業所勤務 ● 職種:クライアントエンジニア ● 2015年KLab入社(在籍期間自体は10年以上) ● 主な経歴 ○ 携帯サイトのサーバサイド(Java)開発、および運用 ○ ゲームアプリのクライアント(iOS,Android)、サーバサイド開 発、および運用 ○ 現在Unityネイティブプラグインの開発に従事
  3. 3. もくじ ● モバイルゲームに必要な機能について ● 共通ライブラリとは ● ネイティブプラグインとは ● ネイティブプラグインの実装事例
  4. 4. ● モバイルゲームに必要な機能について ● 共通ライブラリとは ● ネイティブプラグインとは ● ネイティブプラグインの実装事例
  5. 5. KLabでは様々なモバイルゲームを作っています アクション ゲーム リズムゲーム シミュレーション ゲーム etc... RPG
  6. 6. モバイルゲームに必要な機能とは?
  7. 7. ゲームとしてまず必要になるのがゲームのコア部分の機能 パズルゲーム ・パズル要素 ・ステージ ・クリア要素 ・etc... リズムゲーム ・音楽に合わせたタップパ ターンを表示 ・タップ判定 ・クリア要素 ・etc... RPG ・レベルやスキルなどの 成長要素 ・キャラクターや武器、魔 法などのエフェクト ・ストーリー ・etc... などゲームによって様々ですが
  8. 8. モバイルゲームを作るには コア部分以外にも必要となる機能がある
  9. 9. たとえば・・・ ● プラットフォーム上(App Store, Google Play)の課金処理 ● Push通知 ● データ引き継ぎ機能 ● アプリ内チャット機能 ● 知人へのシェア機能 ● etc...
  10. 10. でも それぞれのゲームでコア部分以外の機能を アプリごとに作るのは面倒だし効率が悪い
  11. 11. ゲームのコア部分以外の共通機能を抽出して 再利用できるようにしよう ↓↓ 共通ライブラリを作ろう!
  12. 12. ● モバイルゲームに必要な機能について ● 共通ライブラリとは ● ネイティブプラグインとは ● ネイティブプラグインの実装事例
  13. 13. 共通ライブラリとは ゲームのコア機能以外の 共通機能を抽出してライブラリ化 ゲームA ゲームコア機能 コア機能以外 ゲームB ゲームコア機能 コア機能以外 共通部分を ライブラリ化! ゲームC ゲームコア機能 共通ライブラリ ゲームD ゲームコア機能 共通ライブラリを 別のアプリに組み込み 共通ライブラリ
  14. 14. KLabではアプリ開発者がゲーム開発に集中できるように 共通部分のライブラリ化を推進しています
  15. 15. KLabでライブラリ化している機能
  16. 16. KLabでライブラリ化している機能 ライブラリ名 サーバサイドシステムの有無 クライアントライブラリの有無 クライアント開発基本ライブラリ ◯ チャットシステム ◯ ◯ ストア課金ライブラリ ◯ ◯ 統合アカウントシステム ◯ ◯ UIコンポーネント ◯ KPIレポートシステム ◯ 運用管理システム ◯
  17. 17. KLab福岡で手がけているライブラリ ライブラリ名 サーバサイドシステムの有無 クライアントライブラリの有無 クライアント開発基本ライブラリ ◯ チャットシステム ◯ ◯ ストア課金ライブラリ ◯ ◯ 統合アカウントシステム ◯ ◯ UIコンポーネント ◯ KPIレポートシステム ◯ 運用管理システム ◯
  18. 18. 私が担当しているライブラリ ライブラリ名 サーバサイドシステムの有無 クライアントライブラリの有無 クライアント開発基本ライブラリ ◯ チャットシステム ◯ ◯ ストア課金ライブラリ ◯ ◯ 統合アカウントシステム ◯ ◯ UIコンポーネント ◯ KPIレポートシステム ◯ 運用管理システム ◯
  19. 19. クライアント開発基本ライブラリでやってること KLabではゲーム開発に主にUnityを使っていますが、そのUnityから利用できるiOS, Androidのネイティブプラグインを提供することが目的
  20. 20. ● スマホゲームに必要な機能について ● 共通ライブラリとは ● ネイティブプラグインとは ● ネイティブプラグインの実装事例
  21. 21. ネイティブプラグイン ネイティブプラグインとは ネイティブ(主にiOS, Android)の各開発言語(C, C++, Objective-C, Java)で書かれたライ ブラリで、Unityの開発言語であるC#から直接呼び出して利用できます アプリ側のコード(C#) Android (C, C++, Java) iOS (C, C++, Objective-C)
  22. 22. ネイティブプラグインを作るメリット ● ネイティブでしか提供されていない機能を使える ● iOS, Androidの最新機能のサポート
  23. 23. iOSやAndroidのネイティブ層からしか取得できない情報や、利用できない機能をUnityか ら呼び出して使うことができる ● 例 ○ ディスク容量やバッテリー容量取得 ○ Androidのローカル通知機能 ○ Android NやiOS10から提供されたリッチなPush通知の利用 ネイティブでしか提供されていない機能を使える
  24. 24. アプリ側 ネイティブプラグイン側 加えて、iOSとAndroidで共通的なインターフェースを提供することで、Unityからの 利用を容易にすることができる Unityからの 呼び出し(C#) 共通IF(C#) Androidでの 処理 iOSでの 処理
  25. 25. iOS, Androidの最新OSで追加された機能も、ネイティブプラグインで実装することで、 Unityをバージョンアップせずに利用できる iOS, Androidの最新機能のサポート ● 例 iPhone Xのためのセーフエリア取得用API
  26. 26. UnityからネイティブAPIの呼び出し方 P/Invoke C, C++などのネイティブコードをC#から呼び出せる AndroidJavaObject JNIを経由してAndroidのクラスを呼び出せる
  27. 27. P/Invoke // C#側 // 1. 定義 [DllImport("__Internal")] private static extern int naitiveMethod() // 2. ネイティブ側を呼び出し public static int CallNaitiveMethod() { // ネイティブからの戻り値 int returnValue = naitiveMethod(); }
  28. 28. AndroidJavaObject // C#側 // 1. ネイティブ連携用のクラスを生成 AndroidJavaObject unityBridge = new AndroidJavaObject("com.hoge.fuga.UnityBridge"); // 2. ネイティブ側を呼び出し int retValue = unityBrige.CallStatic<int>("nativeMethod",1);
  29. 29. ● スマホゲームに必要な機能について ● 共通ライブラリとは ● ネイティブプラグインとは ● ネイティブプラグインの実装事例
  30. 30. 置き換え後の処理 既存の処理 ネットワーク通信機能をC#の既存APIから、ネイティブ実装に置き換え ネットワーク通信機能をネイティブ実装した話 HttpWebRequest ゲームサーバ アプリ側からの呼 び出し(C#) アプリ側からの呼 び出し(C#) Android iOS 共通IF
  31. 31. ネイティブ実装に置き換えた目的
  32. 32. System.Net.HttpWebRequestを利用した通信機能において、特定の条件で通信エラー が発生 ● 通信エラー時に復帰後も通信リトライが無限に続く場合がある ● WiFiが接続されても3G/4Gで通信を継続してしまう場合がある エラーがアプリの実装によるものかAPIのバグなのかが判別が付かなかった 既存の機能の不具合を解消したい
  33. 33. HttpWebRequestは、SSL通信においてサポートされていない機能(SNI)があり、インフラ 面でも置き換えるメリットがあった。 ※ SNI(Server Name Indication) SSL/TLSの拡張仕様 サポートされていない機能を使いたい
  34. 34. ネイティブプラグインの構成 ネイティブ側で使用したAPI、およびライブラリ ● iOS ○ NSURLSession ■ iOS7から使える通信クラス ● Android ○ Okhttp ■ サードパーティライブラリ ■ Androidでも内部的に使用されている
  35. 35. ● 既存の実装に比較して通信が安定した ○ その結果、通信異常関連のユーザーからの問い合わせやレビューが激減 ■ 約40% → 10%未満となった ● 通信機能自体の処理が把握できるようになった ○ どんな処理をしているかが把握しやすくなった ○ 問題が発生しても開発者側で対応することが可能になった 置き換えたことによるメリット
  36. 36. 実際に問題を解決した話
  37. 37. 特定の環境での通信エラー ● Okhttpにはネットワーク接続が失敗した場合などに暗黙的にリトライを行う機能がある ● サーバへの二重更新防止するためにリトライをOFFにしたが、一部の環境(NTTのフレッツ光など)だと通 信エラーが発生した ○ 具体的にはIPv6閉鎖網でのIPv4フォールバックが行われずエラーとなっていた 問題を解決した話その1
  38. 38. IPV4ネットワーク IPv6閉鎖網 アプリ IPV6ネットワーク ①IPv6での接続に失敗 サーバ 問題発生時の処理 ②IPv4フォールバックでリト ライしないので、そのまま通 信エラーで終了 一部の環境のみで以下の通信エラーが発生
  39. 39. IPV4ネットワーク IPv6閉鎖網 アプリ IPV6ネットワーク サーバ 問題対応後の処理 サーバへのリクエストを一回でも投げた後のみリトライ不可とし、それ以外はリトライを許可するようにした ③リクエストを1回でも投 げた後はリトライしない(二 重更新防止) ①IPv6での接続に失敗 ②IPv4フォールバックのリト ライで接続に成功
  40. 40. 問題を解決した話その2 オブジェクトの参照が増えすぎてクラッシュ ● AndroidJavaProxy経由でC#側の関数呼び出しを行った所、「global reference table overflow」エ ラーが発生した ○ 具体的にはダウンロードの進捗表示のために、ダウンロードしたファイルサイズを返す処 理
  41. 41. 1リクエストにつき複数回呼ばれる処理で、Android側のGCが間に合わず、回収されないJavaオ ブジェクトの参照が増えていき、最終的にクラッシュ C#側Android側 サーバ ファイル ③進捗表示①ダウンロード 処理 ②ファイル サイズを返す オブジェクト Java オブジェクト 生成された オブジェクトが 溜まっていく 参照が溢れて クラッシュ!
  42. 42. Androidから呼び出す方法自体を見直し、C#側から定期的にサイズを取得する処理を呼び出す ことによって解決 C#側Android側 サーバ ファイル ③進捗表示 ①ダウンロード 処理 ②ファイル サイズを取得 生成されたオブジェクトは 即時解放される
  43. 43. ● ゲームの機能を共通化することで、ゲーム開発者はゲームのコア機能部分の実装 に集中できる ● ネイティブプラグインを使うことで、Unity上でネイティブの機能を十分に利用できる ● ゲームエンジンのアップデートを待つことなく、開発者側で問題が解決できる まとめ
  44. 44. 今後もKLabでは共通化を推進していきます
  45. 45. KLabは Unity・iOS・Androidなどの技術の垣根を越えて 開発ができる環境です
  46. 46. ご興味ある方は http://www.klab.com/jp/recruit/
  47. 47. 最後に
  48. 48. 共同開発パートナー募集! KLabでは共同開発パートナーに 紹介したライブラリを提供しています ご興味ある方は「KG SDK」で検索してください!

×