2.1K Views
October 25, 24
スライド概要
2024/10/11に実施されたHololab Conference 2024のセッションスライドです。
■セッションアーカイブはこちら
ーーー
■公式HP
https://hololab.co.jp/
■公式Twitter
https://twitter.com/HoloLabInc
ViteとTypeScriptで実現する Unity WebGLネイティブプラグイン開発の改善 HoloLab Tech Showcase 2024 株式会社ホロラボ 堤海斗 1
アジェンダ 1. はじめに 2. UnityとWebGLネイティブプラグイン 3. WebGLネイティブプラグイン開発の課題 4. プラグイン開発の改善 5. おわりに © 2024 HoloLab Inc. All rights reserved 2
はじめに © 2024 HoloLab Inc. All rights reserved 3
自己紹介 堤海斗 ソフトウェアエンジニア 普段は にー兄さんという名前で活動 業務でUnityを使ったARアプリ開発や Webフロント系の開発 Babylon.js勉強会運営 2024年度Microsoft MVP (Web)受賞 © 2024 HoloLab Inc. All rights reserved 4
本日のお話 UnityのWebGLネイティブプラグイン開発はツライことがある その一部を「JS外部化」と「TypeScript化」で解決してみる試みをご紹介 Lightning Talkかつ本日最後のセッションですので、 どうぞお気を楽にしてご覧下さい~ © 2024 HoloLab Inc. All rights reserved 5
UnityとWebGLネイティブプラグイン © 2024 HoloLab Inc. All rights reserved 6
Unity WebGLネイティブプラグインとは WebGLビルドされたUnityプロジェクトで ブラウザから使えるJavaScriptコードを呼び出すしくみ WebブラウザやサードパーティのJavaScript SDKなどが扱える 使用例) FirebaseをWebGLで使う(Unity SDKはWebGLサポートされていない) ファイル選択やWebSocketなどそのままでは動かない機能 © 2024 HoloLab Inc. All rights reserved 7
プラグインの作り方
.jslib ファイルの中にJavaScript関数を記述
mergeInto(LibraryManager.library, {
HelloString: function (strPtr) {
window.alert(UTF8ToString(strPtr));
},
});
C#からDLL呼び出しにより実行
class WebGLPlugin{
[DllImport("__Internal")]
private static extern void HelloString(string str);
}
© 2024 HoloLab Inc. All rights reserved
8
動作原理 UnityのWebGLビルドはIL2CPPビルドの後にEmscriptenによるビルドがされる jslibファイルもその過程で *.framework.js へ展開される 参考:https://docs.unity3d.com/ja/2022.3/Manual/IL2CPP.html © 2024 HoloLab Inc. All rights reserved 9
WebGLネイティブプラグイン開発の課題 © 2024 HoloLab Inc. All rights reserved 10
特殊なJavaScriptコードがもたらす弊害 jslibに記述するJavaScriptコードは特殊 なぜか? -> UnityやEmscriptenの仕様に依存しているから 主に下記のようなツラミがあった モジュール性の欠如 開発体験の悪さ © 2024 HoloLab Inc. All rights reserved 11
コードのモジュール化が難しい import/requireによる参照が(容易に)できない -> 結果、巨大なjslibが出来上がってしまう メンテナンス難易度が上がる 開発体験の悪さ 特殊な環境ゆえにエディタによるコード補完がうまく効かない(JS由来の部分もある) 型検査がうまくできないのでビルドして初めてわかるエラーも多い しかし!jslib変更後のビルドは時間がかかる © 2024 HoloLab Inc. All rights reserved 12
プラグイン開発体験の改善 © 2024 HoloLab Inc. All rights reserved 13
JS外部化:Emscriptenからの解放 特殊なJSコードになるのはEmscriptenへの 依存が原因 -> JS外部化して自前でビルドしよう! Unity・Emscripten非依存になるため 開発環境の選択肢が広がる -> TypeScript / Vite / pnpm / Biomeなど モダンツールを導入しよう © 2024 HoloLab Inc. All rights reserved 14
プラグイン構成と 名前空間を介したAPIアクセス © 2024 HoloLab Inc. All rights reserved 15
例)WebSocket通信 © 2024 HoloLab Inc. All rights reserved 16
C#とTypeScriptの処理を つなげる C#からは名前によるメソッドの参 照が必要(DllImportで指定) TypeScriptからはEmscripten独自 のAPIコールが必要 (UTF8ToStringなど) jslibが二つをつなぐ役割をすることで グローバルな名前空間を介して アクセスするフローを実装(jslib→) © 2024 HoloLab Inc. All rights reserved 17
jslib由来のAPIを型定義 jslib特有のAPIは存在するがブラウザ の名前空間にしかないので、型定義で 対応する 文字列ポインタ・関数ポインタ UTF8ToString / StringToUTF8 dynCall_xxx SendMessage などもしっかり型が付いた状態で使用 可能 © 2024 HoloLab Inc. All rights reserved 18
改善によって得られた恩恵 動作確認のイテレーションが高速化 jslibを変更しないのでビルドキャッシュが効いてビルドが爆速に 一部はUnityを介さずWebフロント単体で動作確認できる TypeScriptやViteによって堅牢で高速に、モジュラリティのあるコードが書けるように モダンWebフロント開発ツールを活用できる この方法の課題 main.jsを別途ビルドする必要がある サードパーティをバンドルするとmain.jsが肥大化する main.jsをコミットするとコンフリクトの原因に(解決も困難) © 2024 HoloLab Inc. All rights reserved 19
おわりに © 2024 HoloLab Inc. All rights reserved 20
まとめ WebGLネイティブプラグインはjslibを作成しEmscriptenを通してビルドされる 特殊な環境制約により開発体験が悪いことがある JS外部化・TypeScript化によって解決を試みた 開発体験が向上したのと同時にデメリットもあった 自分なりに開発体験向上を目指して試行中の段階です。 もしご参考になりましたら幸いです。 © 2024 HoloLab Inc. All rights reserved 21
参考文献 [Unity]WebGLのプラグインをモダンに書く方法 https://qiita.com/yaegaki/items/71cdebc7798784aa3464 とても参考になりました Async/await with jslib plugin?(Unity Discussions) https://discussions.unity.com/t/async-await-with-jslib-plugin/877967 Unity WebGL C# <=> JS (jslib) https://qiita.com/gtk2k/items/9c2679d612e9b5ac7b2e WebGL: ブラウザースクリプトとの相互作用 https://docs.unity3d.com/ja/2022.3/Manual/webglinteractingwithbrowserscripting.html © 2024 HoloLab Inc. All rights reserved 22