Slide 1

Slide 1 text

いつか使えるKotlin/Native With Unity

Slide 2

Slide 2 text

検証リポジトリ https://github.com/MizoTake/KotlinNativeWithUnity

Slide 3

Slide 3 text

・あるど ・元iOSアプリ開発者で今はゲームを仕事で作ってます ・前回(2019/09)の技術書典7で Unity + CircleCI の話を寄稿してました ・好きなVtuber: MonsterZ MATE ・P5Rやりたい(限定版買って積んでる) ・ポケモン ソードでサルノリ選びました

Slide 4

Slide 4 text

Kotlin/NativeとUnityの話

Slide 5

Slide 5 text

Kotlin/Nativeって何?

Slide 6

Slide 6 text

Kotlin/Nativeとは Kotlin/Native is a technology for compiling Kotlin code to native binaries, which can run without a virtual machine. It is an LLVM based backend for the Kotlin compiler and native implementation of the Kotlin standard library. Kotlin / Nativeは、Kotlinコードをネイティブバイナリにコンパイルするための技術で あり、仮想マシンなしで実行できます。KotlinコンパイラおよびKotlin標準ライブラリの ネイティブ実装用のLLVMベースのバックエンドです。 (Google先生翻訳) 参考: https://kotlinlang.org/docs/reference/native-overview.html#why-kotlinnative

Slide 7

Slide 7 text

Kotlinでマルチプラットフォーム向けに 実行バイナリやライブラリを吐き出す技術

Slide 8

Slide 8 text

Kotlin/Nativeとは Target Platforms ● iOS (arm32, arm64, simulator x86_64) ● MacOS (x86_64) ● Android (arm32, arm64) ● Windows (mingw x86_64, x86) ● Linux (x86_64, arm32, MIPS, MIPS little endian, Raspberry Pi) ● WebAssembly (wasm32) 参考: https://kotlinlang.org/docs/reference/native-overview.html#target-platforms

Slide 9

Slide 9 text

Kotlin/Nativeとは ・IntelliJ Ideaで新規プロジェクトが作れ開発可能 - 今回はMultiplatform Library

Slide 10

Slide 10 text

もしかして…

Slide 11

Slide 11 text

Kotlinだけ書いたら ネイティブプラグイン共通化できる?

Slide 12

Slide 12 text

きっかけ ・「UnityのスマホネイティブプラグインをKotlin/Nativeで共通化する」書いた - https://qiita.com/MizoTake/items/68a5ca7b4846a378a21b ・Unite2019でhttp2の講演をみたこと - https://www.slideshare.net/UnityTechnologiesJapan002/unite-tokyo-2019ht tp2 ・Unity + Kotlin/Natvieやってる人いなくない?(記事が見当たらない)

Slide 13

Slide 13 text

やりたいこと ・Kotlin/Native使ってネイティブプラグインの共通化(Windows/macOS...etc) ・http2通信までできたらすごそう!(よくわからんけど!) ・ライブラリを使えばどういう機能が手軽に扱えるか知りたい

Slide 14

Slide 14 text

今回できたこと ・Kotlin/Native使ってネイティブプラグインの共通化(Windows/macOS...etc) →一応できた(Android/iOS/Windows/macOS) ・http2通信までできたらすごそう!(よくわからんけど!) →http1.1通信はできたが、ライブラリが対応してそうだったけど時間が足りず… ・ライブラリを使えばどういう機能が手軽に扱えるか知りたい →ktorというのを使ってみた(Windowsのセットアップ沼った)

Slide 15

Slide 15 text

検証の概要

Slide 16

Slide 16 text

検証の流れ Unity Kotlin/Native 各プラットフォーム 描画 url渡す response返す Unity Kotlin/Native 各プラットフォーム 描画 メソッド呼 び出し Platform毎の 返り値返す Platform名取得 HTTP通信GETメソッドで文字列取得

Slide 17

Slide 17 text

検証結果

Slide 18

Slide 18 text

検証結果

Slide 19

Slide 19 text

結果 文字列やりとり Windows Mac Android iOS js ローカル処理 〇 〇 〇 〇 ? 非同期処理 (ktor) 〇 〇 〇 × ? ※GitHubで探すとiOSで非同期処理やれてる人もいるので自分の書き方が悪いようだが修正間に合わず …

Slide 20

Slide 20 text

妄想図 Unity Kotlin/Native 各プラットフォーム Kotllin/Native書けばネイティブプラグインが共通化できて動く!?

Slide 21

Slide 21 text

現実 Kotlin/Native Unity C++ Objective-C++ iOS Android Native/Editor やってみました

Slide 22

Slide 22 text

どうして…

Slide 23

Slide 23 text

どうしてこうなった?(前提定義) ※NativeはWinやmacなどのデスクトップなどを Kotlin/Nativeでは指してるそうです

Slide 24

Slide 24 text

どうしてこうなった?(前提定義) こういう感じで共通定義をします(Common.kt)

Slide 25

Slide 25 text

どうしてこうなった?(前提定義) 各プラットフォームごとの実装(Native.kt)

Slide 26

Slide 26 text

どうしてこうなった?(前提定義) 各プラットフォームごとの実装(iOS.kt)

Slide 27

Slide 27 text

どうしてこうなった?(前提定義) 各プラットフォームごとの実装(Android.kt)

Slide 28

Slide 28 text

どうしてこうなった?(Desktop/Editor) ・extern “C” で開放はされてる ・.hを見ると呼び出す方法が書いてるけどC#で呼びだす方法がわからない!

Slide 29

Slide 29 text

どうしてこうなった?(Desktop/Editor) ・なんでstructネストさせてるのか

Slide 30

Slide 30 text

Unityで書くには余計なお世話…

Slide 31

Slide 31 text

どうしてこうなった?(iOS) ・そもそも extern “C” の口がない

Slide 32

Slide 32 text

どうしてこうなった?(Android) ・基本的に素直に.jarで吐き出されるのでProjectに入れてC#で呼べば解決 ・細かく検証できてないがPropertyはメソッドでラップしないと呼べないぽい

Slide 33

Slide 33 text

他にも大変だったところがちょろちょろ ● gradleわからん ● Kotlin/Native + Unity の情報ないし!Kotlin/Nativeの情報も多くない! ● iOSはsuspendCoroutineが使えない(kotlinの非同期処理の書き方のひとつ) ● Nativeの吐き出したファイルは変換が必要 ○ WindowsのWrapperを作るときはdllから一旦libに変換(手順)して最終的にdllにする ○ macOSのWrapperを作るときはdylibからbundleへの変換が必要 (Xcodeで可能) ● Windowsで非同期通信する `ktor-client-curl` の導入がわからなかった ○ 公式のgradleを見てcurlのインストールpathが固定なのを確認 Windowsの環境変数をいじる羽目になった ○ msys64のpathを取得しないといけないのに GitBashのcurlへpathが優先されてしまってエラーで導入できなかった ○ msys64のpathを見てもcurlがきちんと導入されてないと行けなかった (Kotlin/Native公式GitHubに手順があった )

Slide 34

Slide 34 text

テスト大事 ネイティブプラグイン開発でレイヤーごとの挙動確認は大切 - Kotlin/NativeはKotlinでTestが書ける - WindowsはTestのプロジェクトでログ吐き出すようにしてexeで確認 - macOSはXcodeでObjective-C++のテストコードを書いて確認

Slide 35

Slide 35 text

パフォーマンス計測 Kotlin/NativeからAPIを叩いて レスポンス受けるまで UnityWebRequestからAPIを叩いて レスポンス受けるまで 521.90ms 15.65ms ※初めてパフォーマンス計測したので間違ってたらすみません。

Slide 36

Slide 36 text

Unityでの使いどころ ● 端末の設定言語取得 ● 各プラットフォーム毎の固有ファイルパス取得(ネイティブのAPI提供されてるも のとか) ● …

Slide 37

Slide 37 text

どこなんだろう?

Slide 38

Slide 38 text

まとめ ● Kotlin/Native + Unityとりあえず動く! ● 需要がどこにあるかわからない! ● ラッパーとか書くフローがどうにかなれば結構良いのじゃないだろうか ● Kotlin/Nativeのパフォーマンスは今後に期待?(独自GCで遅いというのも見か けた) ● 興味を持った人は色々試して公開してってください! ● 需要やパフォーマンス、フローが緩和されたら「いつか使える」はず!