SlideShare a Scribd company logo
1 of 48
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Unityネイティブプラグインマニアクス
DeNA Technology Conference 2017
1
Japanリージョンゲーム事業本部 開発基盤部
Haruto Otake
Sae Yamauchi
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
自己紹介
 大竹 悠人(Otake Haruto)
⁃ 開発基盤部 第二グループ所属
⁃ 来歴
• 2009年ドワンゴに新卒入社
⁃ 幾つかのサービスや、家電/ゲーム機向けプロダクトを担当
• 2013年 DeNAに中途入社
⁃ Webソーシャルゲームタイトルの運用ののち、新規ネイティブゲーム開発へ参加
⁃ 基盤整備を得意としていたらいつのまにかそっちが本業に
⁃ 現在はUnityに関連した技術サポートと、様々な内製ライブラリの制作/保守に従事
2
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
自己紹介
 山内 沙瑛 (Yamauchi Sae)
⁃ 開発基盤部 第三グループ所属
⁃ 来歴
• 2012年 新卒入社
⁃ 主に共通基盤の開発に携わる
• UIテスト自動化
• ゲーム用SDKのメンテナンス
• Unityの共通モジュール開発・メンテナンス及び調査
⁃ ゲーム用BaaSのSDK / サーバーサイドの開発・運用を行っている
3
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
アジェンダ
 ネイティブプラグインとは
⁃ なぜ必要なのか
 ネイティブプラグインのつくりかた
⁃ ネイティブプラグインとしての実装
⁃ 必要な実装
⁃ 利用者向けフロントエンド実装
 プラグイン作成時の注意点と対応策
⁃ マルチプラットフォーム対応
⁃ 安定性
⁃ 実機上での実行効率
 まとめ
4
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ネイティブプラグインとは
5
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ネイティブプラグインとは
Unityの機能を拡張するための、ネイティブ実装ライブラリのこと。
ネイティブ実装とインターフェースを用意することで、相互に呼び出しできる。
 参考
⁃ Unity マニュアル ネイティブプラグイン
https://docs.unity3d.com/ja/current/Manual/NativePlugins.html
6
ゲームコード (C#)
ネイティブコード
(例: OSSライブラリ)
インターフェース
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
なぜ必要なのか
大きく分けると以下の理由がある。
 Unityが提供していないプラットフォームAPIを使用するため
 ネイティブ実装された機能をUnityで使用するため
7
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Unityが提供していないプラットフォームAPIを使用するため
iOS Push通知や動画再生などはゲームコードから呼び出せる。
以下の様な機能のAPIを使用したい場合は、Unityが対応していないため、直接呼び
出すことができない。
そのため、ネイティブプラグインを作成する必要がある。
 例
⁃ WebView表示
⁃ Android Push通知設定
⁃ 空きディスク容量取得
8
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
技術資産を流用するため
ネイティブ実装されたミドルウェアや機能をUnityで使用するため。
 例
⁃ 社内モジュール
• ゲーム特化BaaS(Sakasho)
• サウンドエンジン(DeAL)
• リアルタイム通信サーバー(IRIS)
• アセット転送
⁃ OSS
• WebPローダ
• ファイルの暗号化・復号化
9
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ネイティブプラグインのつくりかた
10
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ネイティブプラグインとしての実装 (1)
ネイティブ実装と、それを呼び出すためのインターフェースを用意することで、
相互に呼び出しを行うことができる。
 マネージドコード
⁃ ゲームコード(C#)に当たる
⁃ monoでビルドした場合は、仮想マシン上で実行されるコード
⁃ IL2CPPでビルドした場合は、最終的にはネイティブコードになる
 ネイティブコード(アンマネージドコード)
⁃ C / C++ / Java 等で記述されたコード
11
マネージドコード (C#)
ネイティブコード
(C / C++ / Java等)
インターフェース
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ネイティブプラグインとしての実装 (2) 実装例 (Androidの場合)
12
int add(int x, int y) { return x + y; } // test.c
int add(int x, int y); // test.h
libnative.so
// ゲームコード上での呼び出し(C#)
int result = add(1, 2);
// P/Invoke宣言(C#)
[DllImport("native")]
private static extern int add(int x, int y);
マネージドコード (C#)
ネイティブコード
インターフェース
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
必要な実装
A. 【ネイティブ】拡張機能のコア実装
B. 【ネイティブ】マネージドコードから呼び出すためのインターフェース
C. 【マネージド】ネイティブコードとの連携実装
D. 【マネージド】利用者向け呼び出しフロントエンド実装
13
マネージドコード (C#)
ネイティブコード
(例: OSSライブラリ)
インターフェース
C
D
A
B
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
必要な実装
A. 【ネイティブ】拡張機能のコア実装
B. 【ネイティブ】マネージドコードから呼び出すためのインターフェース
C. 【マネージド】ネイティブコードとの連携実装
D. 【マネージド】利用者向け呼び出しフロントエンド実装
14
マネージドコード (C#)
ネイティブコード
(例: OSSライブラリ)
インターフェース
C
D
A
B
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
拡張機能のコア実装 / マネージドコードから呼び出すためのインターフェース
 ネイティブコード
⁃ 拡張機能のコア実装
⁃ ゲームエンジンを跨いで利用可能な技術資産にできる
 インターフェース
⁃ マネージドコードから呼び出すためのインターフェース
⁃ C Linkageの関数として実装する
• 例 test.cpp
extern "C" int hoge();
int hoge() {
return 1;
}
15
マネージドコード (C#)
ネイティブコード
(例: OSSライブラリ)
インターフェース
C
D
A
B
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
必要な実装
A. 【ネイティブ】拡張機能のコア実装
B. 【ネイティブ】マネージドコードから呼び出すためのインターフェース
C. 【マネージド】ネイティブコードとの連携実装
D. 【マネージド】利用者向け呼び出しフロントエンド実装
16
マネージドコード (C#)
ネイティブコード
(例: OSSライブラリ)
インターフェース
C
D
A
B
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ネイティブコードとの連携実装
以下の機構でネイティブコードとマネージドコードの連携を行うことができる。
 マネージドコード上
⁃ P/Invoke
• ネイティブコードをC#のメソッドのように呼び出すための機構
⁃ AndroidJavaObjectなど(Androidのみ)
• JNIを通じてAndroidのJavaのコードを呼び出す機構
 ネイティブコード上
⁃ UnitySendMessage
• ネイティブからマネージドコードを呼び出すためのメソッド
• 指定したGameObjectに文字列を送ることができる
17
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
P/Invoke (Platform Invoke)
CLI(共通言語基盤)の機能で、ネイティブコードをマネージドコードの様に呼び出
すことができる。
引数や返り値は必要に応じて マーシャリング という変換処理が行われる。
18
ネイティブコード
インターフェース
P/Invoke宣言
マネージドコード(C#)
マーシャラ
引数は
System.String
です
変換した
データを用意しま
す
char*を
受け取りましたネイティブコード
インターフェース
P/Invoke宣言
マネージドコード(C#)引数は
System.String
です
????
[DllImport("ロード対象のプラグイン")]
private static extern int add(int x, int y);
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
AndroidJavaObjectなど
AndroidのAPIやJARに含まれるコードを呼び出すことができるUnityのAPI
マネージドコードからクラス名を指定し呼び出すことができる。
 参考: Unity マニュアル Android 用のプラグインをビルド
⁃ https://docs.unity3d.com/ja/current/Manual/PluginsForAndroid.html
using (AndroidJavaClass cls = new AndroidJavaClass("java.util.Locale")) {
using(AndroidJavaObject locale = cls.CallStatic<AndroidJavaObject>("getDefault")) {
Debug.Log("current lang = " + locale.Call<string>("getDisplayLanguage"));
}
}
上記ドキュメントに記載されている呼び出し例(C#):
19
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
UnitySendMessage
ネイティブコードからマネージドコードに文字列を渡すことができる。
指定したGameObjectの指定したメソッドに対して、stringを引数にして呼び出す。
ネイティブで一定処理を行った後に、結果を返したい場合などに使用する。
 問題点
⁃ 非同期のため、同一フレーム間でメッセージを受け取れるわけではない
// GameObject名, メソッド名, 送信したい文字列
UnitySendMessage("GameObjectName", "MethodName", "Message to send");
20
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
必要な実装
A. 【ネイティブ】拡張機能のコア実装
B. 【ネイティブ】マネージドコードから呼び出すためのインターフェース
C. 【マネージド】ネイティブコードとの連携実装
D. 【マネージド】利用者向け呼び出しフロントエンド実装
21
マネージドコード (C#)
ネイティブコード
(例: OSSライブラリ)
インターフェース
C
D
A
B
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
利用者向けフロントエンド実装
C Linkage関数のインターフェースをC#で扱いやすくするために、ラッパーを実装
する。
 実装例 マネージドコード(C#)
22
public static class HogeBindings {
[DllImport("hoge")]
public static extern IntPtr create(int x);
[DllImport("hoge")]
public static extern void remove(IntPtr context);
[DllImport("hoge")]
public static extern int exec(IntPtr context, int x);
}
public class Hoge : IDisposable {
private IntPtr context;
public Hoge(int x) {
context = HogeBindings.create(x);
}
public Dispose() { HogeBindings.remove(context); }
public int Exec(int x) {
return HogeBindings.exec(context, x);
}
}
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ネイティブプラグイン作成時の注意点と対応策
23
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ネイティブプラグイン作成時の注意点と対応策
 マルチプラットフォーム対応
⁃ 各プラットフォーム用のライブラリ対応
⁃ 各プラットフォームごとのネイティブプラグイン呼び出し実装
⁃ ネイティブプラグインのライフサイクル
⁃ ネイティブコードからマネージドコードを呼び出す実装の注意点
 安定性
⁃ フェイルセーフ性の担保
⁃ アライメント問題の考慮
 実機上での実行効率
⁃ メモリコピーの回避
24
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
各プラットフォーム用のライブラリ対応
各プラットフォーム用(iOS / Android / macOS / Windows)に実装したライブラ
リ を用意する必要がある。
Unity Editor上で動作させるため、macOSやWindows用のネイティブプラグイン
も作成する。
プラットフォーム 形式
iOS Static Library (.a)
Android Shared Library (.so) または JAR (JNI経由)
macOS Loadable Bundle (.bundle)
Windows Dynamic Link Library (.dll)
25
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
各プラットフォームごとのネイティブコードの呼び出し実装 (1)
各プラットフォーム用にP/Invoke宣言の対応も追加する。
ライブラリ毎にDllImport指定が異なるため、プリプロセッサディレクティブで分
岐させる。
加えて、IL2CPPビルドを使う場合は以下の対応も必要になる。
 iOS / Android IL2CPP
⁃ Delegateを使ってネイティブコードからマネージドコードを呼び出す関数に
MonoPInvokeCallback属性指定が必要
• 参考: https://docs.unity3d.com/ja/current/Manual/TroubleShootingIPhone.html
 Android IL2CPP
⁃ ビルドエラーになるため、(iOS用の) DllImport("__Internal")宣言が有効に
ならないようにする
26
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
各プラットフォームごとのネイティブコードの呼び出し実装 (2)
#if UNITY_EDITOR
// iOS, Android設定かつEditor上で実行した場合に対応するため最初の条件にしている
[DllImport("nativeForEditor")]
#elif UNITY_ANDROID
[DllImport("native")]
#elif UNITY_IOS
[DllImport("__Internal")]
#endif
private static extern int add(int x, int y);
プリプロセッサディレクティブ記述例
27
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ネイティブプラグインのライフサイクル (1)
ネイティブプラグインのロードタイミングに注意する。
 Android
⁃ ロード順序が担保されない
• Android OSバージョンによっては、ライブラリの依存関係が解決されない
⁃ JNI_OnLoadが呼び出されない場合がある
• JNI_OnLoad内で処理 (ライブラリをロードする等) を記述していると実行されない
• 参考: https://fogbugz.unity3d.com/default.asp?737959_orv675eqjd2ro91g
ライブラリは関数呼び出し時にロードされるため、ライブラリをロードするための
関数を用意し、依存関係順に呼び出しておく。
28
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ネイティブプラグインのライフサイクル (2)
 Unity Editor (macOS / Windows)
⁃ ネイティブプラグインがロードされるのは初回再生の初回呼び出し時のみ
• ネイティブプラグインを更新した場合はUnityの再起動が必要
⁃ Unity Editorの再生・停止モードには影響されない
• 再生停止してもネイティブプラグインはアンロードされない
⁃ 初期化処理が複数回呼ばれうる処理にする
• ゲームコードがリコンパイルされた後のアセンブリ置き換えで、終了処理が呼ばれな
い場合がある
• 何度初期化されても良いようにする。状態管理はネイティブプラグイン側で行う
29
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ネイティブコードからマネージドコードを呼び出す実装の注意点 (1)
ネイティブプラグインからマネージドコードへ結果を返す場合に注意する。
ネイティブで作成したスレッドからマネージドコードを呼び出すと、
Unityの内部処理もネイティブプラグインからの呼び出しになる場合があり、問題
が起こる。
 iOS / Androidアプリの場合
⁃ Unityのメインスレッド前提の処理の一部で、例外が発生する事がある
 Unity Editorの場合
⁃ デバッガ接続を行うと、Unity Editorが応答不能になる
30
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ネイティブコードからマネージドコードを呼び出す実装の注意点 (2)
ネイティブで作成したスレッドから、マネージドコードのコールバック処理
(Delegate等) は、直接呼び出さない。
Unityのメインスレッドから呼び出す。あくまでマネージド層からの処理として完
結させる。
 対応例
⁃ マネージド層でポーリングし、マネージド層からネイティブ層へ結果を問い合
わせる形にする (Pull型にする)
31
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ネイティブコードからマネージドコードを呼び出す実装の注意点 (3)
32
処理
スレッド作成
呼び出し
結果
処理
スレッド作成
呼び出し
結果
問い合わせ
結果
Unity
メインスレッド
ネイティブ実装
ネイティブで
作成したスレッド
返却
NG OK
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ネイティブプラグイン作成時の注意点
 マルチプラットフォーム対応
⁃ 各プラットフォーム用のライブラリ対応
⁃ 各プラットフォームごとのネイティブプラグイン呼び出し実装
⁃ ネイティブプラグインのライフサイクル
⁃ ネイティブコードからマネージドコードを呼び出す実装
 安定性
⁃ フェイルセーフ性の担保
⁃ プラットフォーム毎のアラインメント問題の考慮
 実機上での実行効率
⁃ メモリコピーの回避
33
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
フェイルセーフ性の担保
プレイヤーのユーザー体験を損ねないように。加えて、開発チームの開発効率を下
げないようにする。
すべてのネイティブコード呼び出しは常に安全に実行、正しく失敗する様にする。
 例
⁃ マネージドからエラーをハンドリングできる仕組み
⁃ ネイティブプラグインで発生したエラーもUnity Editor上から把握できるよう
に
34
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
プラットフォーム毎のアラインメント問題の考慮
構造体を使用する場合、メモリ上の配置にアラインメントが発生する。
マーシャリング対象のため、アラインメントを意識し構造体を定義する。
 8byteのフィールドは8の倍数の位置から配置される
 その間はパディングとして未使用のフィールドになる
struct Sample1 {
int32_t field1;
int16_t field2;
int64_t field3;
};
struct Sample2 {
int32_t field1;
int32_t field2;
int64_t field3;
};
sizeof(Sample1) // => 16
sizeof(Sample2) // => 16
35
field1 field2 field3
16bit 16bit 16bit 16bit 16bit 16bit 16bit 16bit
field1 field2 field3
8byte
int64_t(8byte)の前にint16_t(2byte)を定義した場合
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
実機上での実行効率
実行効率を上げるために、メモリコピーを回避する様にする。
そのためには、ネイティブ層とマネージド層のそれぞれのヒープを意識する必要が
ある。
 マネージドヒープ
⁃ マネージドコードから扱われるヒープ(CLIで管理される)
• GCの処理で消されたり移動したりする可能性がある
 ネイティブヒープ
⁃ ネイティブコードから扱われるヒープ
36
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
メモリコピーの回避 (1)
メモリコピーはマーシャリング時に発生する。
やり取りするデータが大きい・頻度が高い場合は、特にマーシャリングを回避する
ようにする。
37
マーシャラ ネイティブコード
マネージドコード
(C#)
ヒープ間のデータコピー 参照参照
マネージドヒープ ネイティブヒープ
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
メモリコピーの回避 (2)
回避策として、Blittable型を使う方法がある。
Blittable型とはマネージド/ネイティブでメモリレイアウトが同じになる型のこと。
P/Invokeでマネージド/ネイティブへ受け渡す際に、マーシャリングせずに、参照
渡しができる。
(ただし、アドレスが保証されるのは関数呼び出しの間のみ)
38
マーシャラ
ネイティブコード
マネージドコード
(C#)
マネージドヒープを
直接参照する
参照
Blittable型の引数
マネージドヒープ ネイティブヒープ
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
メモリコピーの回避 (3)
 Blittable型の例
⁃ bool, charを除くプリミティブな値型 (int/float/shortなど…)
⁃ Blittable型の一次元配列
⁃ Blittableな型だけを含むStructLayout指定された値型
• ただしBlittable型の可変長配列を含む型は除く
39
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
メモリコピーの回避 (4)
 Blittable型の例
40
// bool, charを除くプリミティブな値型
int f1;
// Blittable型の一次配列
int[] f2;
// Blittable型だけを含むStructLayout指定された値型
[StructLayout(LayoutKind.Sequential)]
unsafe struct S1 {
int f1;
fixed int[64] f2; // Blittable型の固定長配列は可
}
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
メモリコピーの回避 (5)
 非Blittable型の例
41
string f1;
bool f2;
struct S2 { int f1; }
[StructLayout(LayoutKind.Sequential)]
struct S1 { int[] f1; }
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
メモリコピーの回避 (6)
Blittable型にOut方向属性を指定すると、マネージドヒープの内容を直接読み込め
るだけでなく、書き込みを行うことができる。
42
マーシャラ
ネイティブコード
マネージドコード
(C#)
マネージドヒープへ
直接書き込む
参照
Out属性付きBlittable型引数
マネージドヒープ ネイティブヒープ
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
メモリコピーの回避 (7)
P/Invoke及びマーシャリング方向属性を指定する例
extern "C" {
void sample_encode(uint8_t* source, uint8_t * dest, int32_t count);
}
ネイティブコード (libsample.so, libsample.a)
public class SamplePlugin {
#if UNITY_ANDROID
[DllImport("sample")]
#elif UNITY_IOS
[DllImport("__Internal")]
#endif
public static extern void sample_encode([In] byte[] source, [Out] byte[] dest, int count);
}
マネージドコード (C#)
43
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
メモリコピーの回避 (8)
Blittable型を使った参照では、アドレスが保証されるのは、関数呼び出し間のみの
ため、同期呼び出しにしか使用できない。
ネイティブ層で非同期に処理を行いたい場合 (データのパースや復号化処理など)
は、GCHandleを使用する。
 GCHandle
⁃ 指定したインスタンスのガベージコレクタのハンドルを取得する機構
⁃ マネージドヒープに置かれたインスタンスは、GCによってアドレスが移動す
る可能性があるが、GCHandleを使うと固定することができる
GCHandleで固定したインスタンスのポインタをネイティブ層に渡すことで、
ネイティブ層から、非同期で読み込み・書き込みを行うことができるようになる。
44
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
メモリコピーの回避 (9)
 GCHandleを使いマネージドヒープ書き込みを行う例
⁃ (Androidネイティブプラグインとして実装した場合)
45
uint8_t *buffer_ptr;
int32_t buffer_size;
void set_buffer(uint8_t *buffer, int32_t size) {
buffer_ptr = buffer;
buffer_size = size;
}
void write() { // マネージドヒープへの書き込み
memset(buffer_ptr, 0, buffer_size);
int num[] = {0, 1, 2};
memcpy(buffer_ptr, num, sizeof(int) * 3);
}
ネイティブコード (libnative.so)
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
メモリコピーの回避 (10)
46
[DllImport("native")]
private static extern void set_buffer(byte[] buffer, int size);
[DllImport("native")]
private static extern void write();
private byte[] bytes = new byte[100];
private GCHandle handle;
// マネージド層のバッファのポインタをネイティブ層に渡す
public void SetBuffer() {
handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
set_buffer(bytes, bytes.Length);
}
// GCHandleで確保したバッファのため、後の呼び出し時でも書き込める
public void OnLoadFinished() { write(); }
public void Dispose() { handle.Free(); }
マネージドコード (C#)
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
出典
 プラットフォーム呼び出しによるデータのマーシャリング
⁃ https://msdn.microsoft.com/ja-jp/library/fzhhdwae(v=vs.110).aspx
 既定のマーシャリングの動作
⁃ https://msdn.microsoft.com/ja-jp/library/zah6xy75(v=vs.110).aspx
47
Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
まとめ
 ネイティブプラグインを作成することで、ゲーム用の機能や開発効率向上のため
の機能を拡張することができるようになります。
 ネイティブプラグインの実装には、各プラットフォームへの対応や、マネージド
層とアンマネージド層を意識した実装が必要です。
本発表がネイティブプラグイン開発に役立てば幸いです。
ご清聴ありがとうございました。
48

More Related Content

What's hot

【Unite 2018 Tokyo】Unityにおける疎結合設計 ~UIへの適用事例から学ぶ、テクニックとメリット~
【Unite 2018 Tokyo】Unityにおける疎結合設計 ~UIへの適用事例から学ぶ、テクニックとメリット~【Unite 2018 Tokyo】Unityにおける疎結合設計 ~UIへの適用事例から学ぶ、テクニックとメリット~
【Unite 2018 Tokyo】Unityにおける疎結合設計 ~UIへの適用事例から学ぶ、テクニックとメリット~UnityTechnologiesJapan002
 
コールバックと戦う話
コールバックと戦う話コールバックと戦う話
コールバックと戦う話torisoup
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するYoshifumi Kawai
 
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜Unity Technologies Japan K.K.
 
大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化DeNA
 
UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動について
UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動についてUE4プログラマー勉強会 in 大阪 -エンジンの内部挙動について
UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動についてcom044
 
UnityでUI開発を高速化した件
UnityでUI開発を高速化した件UnityでUI開発を高速化した件
UnityでUI開発を高速化した件Grenge, Inc.
 
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説Unity Technologies Japan K.K.
 
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~UnityTechnologiesJapan002
 
MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門torisoup
 
UniRx完全に理解した
UniRx完全に理解したUniRx完全に理解した
UniRx完全に理解したtorisoup
 
PlayStation®4向けARPGのUnity開発事例 最適化と効率化の秘密
PlayStation®4向けARPGのUnity開発事例 最適化と効率化の秘密PlayStation®4向けARPGのUnity開発事例 最適化と効率化の秘密
PlayStation®4向けARPGのUnity開発事例 最適化と効率化の秘密Gemdrops Inc.
 
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術Unity Technologies Japan K.K.
 
【Unity道場 2月】シェーダを書けるプログラマになろう
【Unity道場 2月】シェーダを書けるプログラマになろう【Unity道場 2月】シェーダを書けるプログラマになろう
【Unity道場 2月】シェーダを書けるプログラマになろうUnity Technologies Japan K.K.
 
ガルガンチュア on Oculus Quest - 72FPSへの挑戦 -
ガルガンチュア on Oculus Quest - 72FPSへの挑戦 -ガルガンチュア on Oculus Quest - 72FPSへの挑戦 -
ガルガンチュア on Oculus Quest - 72FPSへの挑戦 -Takehito Gondo
 

What's hot (20)

Riderはいいぞ!
Riderはいいぞ!Riderはいいぞ!
Riderはいいぞ!
 
【Unite 2018 Tokyo】Unityにおける疎結合設計 ~UIへの適用事例から学ぶ、テクニックとメリット~
【Unite 2018 Tokyo】Unityにおける疎結合設計 ~UIへの適用事例から学ぶ、テクニックとメリット~【Unite 2018 Tokyo】Unityにおける疎結合設計 ~UIへの適用事例から学ぶ、テクニックとメリット~
【Unite 2018 Tokyo】Unityにおける疎結合設計 ~UIへの適用事例から学ぶ、テクニックとメリット~
 
Photonのサービス選択の勘どころ
Photonのサービス選択の勘どころPhotonのサービス選択の勘どころ
Photonのサービス選択の勘どころ
 
UE4ローカライズ事例 (UE4 Localization Deep Dive)
UE4ローカライズ事例 (UE4 Localization Deep Dive)UE4ローカライズ事例 (UE4 Localization Deep Dive)
UE4ローカライズ事例 (UE4 Localization Deep Dive)
 
コールバックと戦う話
コールバックと戦う話コールバックと戦う話
コールバックと戦う話
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
 
猫でも分かる UE4のAnimation Blueprintの運用について
猫でも分かる UE4のAnimation Blueprintの運用について猫でも分かる UE4のAnimation Blueprintの運用について
猫でも分かる UE4のAnimation Blueprintの運用について
 
大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化
 
UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動について
UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動についてUE4プログラマー勉強会 in 大阪 -エンジンの内部挙動について
UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動について
 
UnityでUI開発を高速化した件
UnityでUI開発を高速化した件UnityでUI開発を高速化した件
UnityでUI開発を高速化した件
 
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
 
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
 
MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門
 
UniRx完全に理解した
UniRx完全に理解したUniRx完全に理解した
UniRx完全に理解した
 
PlayStation®4向けARPGのUnity開発事例 最適化と効率化の秘密
PlayStation®4向けARPGのUnity開発事例 最適化と効率化の秘密PlayStation®4向けARPGのUnity開発事例 最適化と効率化の秘密
PlayStation®4向けARPGのUnity開発事例 最適化と効率化の秘密
 
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
 
UE4でマルチプレイヤーゲームを作ろう
UE4でマルチプレイヤーゲームを作ろうUE4でマルチプレイヤーゲームを作ろう
UE4でマルチプレイヤーゲームを作ろう
 
【Unity道場 2月】シェーダを書けるプログラマになろう
【Unity道場 2月】シェーダを書けるプログラマになろう【Unity道場 2月】シェーダを書けるプログラマになろう
【Unity道場 2月】シェーダを書けるプログラマになろう
 
ガルガンチュア on Oculus Quest - 72FPSへの挑戦 -
ガルガンチュア on Oculus Quest - 72FPSへの挑戦 -ガルガンチュア on Oculus Quest - 72FPSへの挑戦 -
ガルガンチュア on Oculus Quest - 72FPSへの挑戦 -
 

Viewers also liked

Unityネイティブプラグイン
UnityネイティブプラグインUnityネイティブプラグイン
UnityネイティブプラグインMakotoItoh
 
Unityでスマホアプリが作れるか?
Unityでスマホアプリが作れるか?Unityでスマホアプリが作れるか?
Unityでスマホアプリが作れるか?MakotoItoh
 
DeNA内製ゲームエンジンの現状と目指す未来 #denatechcon
DeNA内製ゲームエンジンの現状と目指す未来 #denatechconDeNA内製ゲームエンジンの現状と目指す未来 #denatechcon
DeNA内製ゲームエンジンの現状と目指す未来 #denatechconDeNA
 
その後のDeNAのネイティブアプリ開発 #denatechcon
その後のDeNAのネイティブアプリ開発 #denatechconその後のDeNAのネイティブアプリ開発 #denatechcon
その後のDeNAのネイティブアプリ開発 #denatechconDeNA
 
IL2CPPに関する軽い話
IL2CPPに関する軽い話IL2CPPに関する軽い話
IL2CPPに関する軽い話Wooram Yang
 
Unity dojo amplifyshadereditor101_jpn-jp
Unity dojo amplifyshadereditor101_jpn-jpUnity dojo amplifyshadereditor101_jpn-jp
Unity dojo amplifyshadereditor101_jpn-jp小林 信行
 
Unity道場aseスペシャル補足資料
Unity道場aseスペシャル補足資料Unity道場aseスペシャル補足資料
Unity道場aseスペシャル補足資料小林 信行
 

Viewers also liked (7)

Unityネイティブプラグイン
UnityネイティブプラグインUnityネイティブプラグイン
Unityネイティブプラグイン
 
Unityでスマホアプリが作れるか?
Unityでスマホアプリが作れるか?Unityでスマホアプリが作れるか?
Unityでスマホアプリが作れるか?
 
DeNA内製ゲームエンジンの現状と目指す未来 #denatechcon
DeNA内製ゲームエンジンの現状と目指す未来 #denatechconDeNA内製ゲームエンジンの現状と目指す未来 #denatechcon
DeNA内製ゲームエンジンの現状と目指す未来 #denatechcon
 
その後のDeNAのネイティブアプリ開発 #denatechcon
その後のDeNAのネイティブアプリ開発 #denatechconその後のDeNAのネイティブアプリ開発 #denatechcon
その後のDeNAのネイティブアプリ開発 #denatechcon
 
IL2CPPに関する軽い話
IL2CPPに関する軽い話IL2CPPに関する軽い話
IL2CPPに関する軽い話
 
Unity dojo amplifyshadereditor101_jpn-jp
Unity dojo amplifyshadereditor101_jpn-jpUnity dojo amplifyshadereditor101_jpn-jp
Unity dojo amplifyshadereditor101_jpn-jp
 
Unity道場aseスペシャル補足資料
Unity道場aseスペシャル補足資料Unity道場aseスペシャル補足資料
Unity道場aseスペシャル補足資料
 

Similar to Unityネイティブプラグインマニアクス #denatechcon

DeNA流cocos2d xとの付き合い方
DeNA流cocos2d xとの付き合い方DeNA流cocos2d xとの付き合い方
DeNA流cocos2d xとの付き合い方dena_study
 
革新的ブラウザゲームを支えるプラットフォーム技術
革新的ブラウザゲームを支えるプラットフォーム技術革新的ブラウザゲームを支えるプラットフォーム技術
革新的ブラウザゲームを支えるプラットフォーム技術Toru Yamaguchi
 
FFRKを支えるWebアプリケーションフレームワークの技術
FFRKを支えるWebアプリケーションフレームワークの技術FFRKを支えるWebアプリケーションフレームワークの技術
FFRKを支えるWebアプリケーションフレームワークの技術dena_study
 
技術選択とアーキテクトの役割
技術選択とアーキテクトの役割技術選択とアーキテクトの役割
技術選択とアーキテクトの役割Toru Yamaguchi
 
Windows 8 Developers カンファレンス
Windows 8 Developers カンファレンスWindows 8 Developers カンファレンス
Windows 8 Developers カンファレンスKaoru NAKAMURA
 
Unity開発で週イチ呑み会を支える技術
Unity開発で週イチ呑み会を支える技術Unity開発で週イチ呑み会を支える技術
Unity開発で週イチ呑み会を支える技術kazuya noshiro
 
マスティフ (for Xcode beta) - バージョンアップ対応を軽減するためのサービス
マスティフ (for Xcode beta) - バージョンアップ対応を軽減するためのサービスマスティフ (for Xcode beta) - バージョンアップ対応を軽減するためのサービス
マスティフ (for Xcode beta) - バージョンアップ対応を軽減するためのサービスToshiyuki Hirata
 
ソニーのディープラーニングツールで簡単エッジコンピューティング
ソニーのディープラーニングツールで簡単エッジコンピューティングソニーのディープラーニングツールで簡単エッジコンピューティング
ソニーのディープラーニングツールで簡単エッジコンピューティングRyohei Kamiya
 
DeNAtechcon_DeNAのセキュリティの取り組みと、スマートフォンセキュリティ(same-origin policy)
DeNAtechcon_DeNAのセキュリティの取り組みと、スマートフォンセキュリティ(same-origin policy)DeNAtechcon_DeNAのセキュリティの取り組みと、スマートフォンセキュリティ(same-origin policy)
DeNAtechcon_DeNAのセキュリティの取り組みと、スマートフォンセキュリティ(same-origin policy)Toshiharu Sugiyama
 
DeNAインフラの今とこれから - 今編 -
DeNAインフラの今とこれから - 今編 -DeNAインフラの今とこれから - 今編 -
DeNAインフラの今とこれから - 今編 -Tomoya Kabe
 
Dangerでpull requestレビューの指摘事項を減らす
Dangerでpull requestレビューの指摘事項を減らすDangerでpull requestレビューの指摘事項を減らす
Dangerでpull requestレビューの指摘事項を減らすShunsuke Maeda
 
iOSアプリにおけるリリースフローとCI環境
iOSアプリにおけるリリースフローとCI環境iOSアプリにおけるリリースフローとCI環境
iOSアプリにおけるリリースフローとCI環境Toshiyuki Hirata
 
エンジニアという職業について
エンジニアという職業についてエンジニアという職業について
エンジニアという職業についてHisatoshi Kikumoto
 
【16-D-4】3分ではじめるスマホアプリのビジュアル開発
【16-D-4】3分ではじめるスマホアプリのビジュアル開発【16-D-4】3分ではじめるスマホアプリのビジュアル開発
【16-D-4】3分ではじめるスマホアプリのビジュアル開発hmimura_embarcadero
 
DeNAが取り組む Software Engineer in Test
DeNAが取り組む Software Engineer in TestDeNAが取り組む Software Engineer in Test
DeNAが取り組む Software Engineer in TestMasaki Nakagawa
 
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)TIS Inc.
 
iOSアプリ開発のCI環境 - Jenkins編 -
iOSアプリ開発のCI環境 - Jenkins編 -iOSアプリ開発のCI環境 - Jenkins編 -
iOSアプリ開発のCI環境 - Jenkins編 -Toshiyuki Hirata
 
Developr Camp 2012 Japan Fall Day2 Special Session - Visual Studio 2012 で始める ...
Developr Camp 2012 Japan Fall Day2 Special Session - Visual Studio 2012 で始める ...Developr Camp 2012 Japan Fall Day2 Special Session - Visual Studio 2012 で始める ...
Developr Camp 2012 Japan Fall Day2 Special Session - Visual Studio 2012 で始める ...Developer Camp 2012 Japan Fall
 
Dev camp2012jpn day2special
Dev camp2012jpn day2specialDev camp2012jpn day2special
Dev camp2012jpn day2specialKatsuhito Katoh
 

Similar to Unityネイティブプラグインマニアクス #denatechcon (20)

DeNA流cocos2d xとの付き合い方
DeNA流cocos2d xとの付き合い方DeNA流cocos2d xとの付き合い方
DeNA流cocos2d xとの付き合い方
 
革新的ブラウザゲームを支えるプラットフォーム技術
革新的ブラウザゲームを支えるプラットフォーム技術革新的ブラウザゲームを支えるプラットフォーム技術
革新的ブラウザゲームを支えるプラットフォーム技術
 
FFRKを支えるWebアプリケーションフレームワークの技術
FFRKを支えるWebアプリケーションフレームワークの技術FFRKを支えるWebアプリケーションフレームワークの技術
FFRKを支えるWebアプリケーションフレームワークの技術
 
技術選択とアーキテクトの役割
技術選択とアーキテクトの役割技術選択とアーキテクトの役割
技術選択とアーキテクトの役割
 
Windows 8 Developers カンファレンス
Windows 8 Developers カンファレンスWindows 8 Developers カンファレンス
Windows 8 Developers カンファレンス
 
Unity開発で週イチ呑み会を支える技術
Unity開発で週イチ呑み会を支える技術Unity開発で週イチ呑み会を支える技術
Unity開発で週イチ呑み会を支える技術
 
マスティフ (for Xcode beta) - バージョンアップ対応を軽減するためのサービス
マスティフ (for Xcode beta) - バージョンアップ対応を軽減するためのサービスマスティフ (for Xcode beta) - バージョンアップ対応を軽減するためのサービス
マスティフ (for Xcode beta) - バージョンアップ対応を軽減するためのサービス
 
ソニーのディープラーニングツールで簡単エッジコンピューティング
ソニーのディープラーニングツールで簡単エッジコンピューティングソニーのディープラーニングツールで簡単エッジコンピューティング
ソニーのディープラーニングツールで簡単エッジコンピューティング
 
DeNAtechcon_DeNAのセキュリティの取り組みと、スマートフォンセキュリティ(same-origin policy)
DeNAtechcon_DeNAのセキュリティの取り組みと、スマートフォンセキュリティ(same-origin policy)DeNAtechcon_DeNAのセキュリティの取り組みと、スマートフォンセキュリティ(same-origin policy)
DeNAtechcon_DeNAのセキュリティの取り組みと、スマートフォンセキュリティ(same-origin policy)
 
DeNAインフラの今とこれから - 今編 -
DeNAインフラの今とこれから - 今編 -DeNAインフラの今とこれから - 今編 -
DeNAインフラの今とこれから - 今編 -
 
Dangerでpull requestレビューの指摘事項を減らす
Dangerでpull requestレビューの指摘事項を減らすDangerでpull requestレビューの指摘事項を減らす
Dangerでpull requestレビューの指摘事項を減らす
 
iOSアプリにおけるリリースフローとCI環境
iOSアプリにおけるリリースフローとCI環境iOSアプリにおけるリリースフローとCI環境
iOSアプリにおけるリリースフローとCI環境
 
エンジニアという職業について
エンジニアという職業についてエンジニアという職業について
エンジニアという職業について
 
【16-D-4】3分ではじめるスマホアプリのビジュアル開発
【16-D-4】3分ではじめるスマホアプリのビジュアル開発【16-D-4】3分ではじめるスマホアプリのビジュアル開発
【16-D-4】3分ではじめるスマホアプリのビジュアル開発
 
DeNAが取り組む Software Engineer in Test
DeNAが取り組む Software Engineer in TestDeNAが取り組む Software Engineer in Test
DeNAが取り組む Software Engineer in Test
 
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
 
iOSアプリ開発のCI環境 - Jenkins編 -
iOSアプリ開発のCI環境 - Jenkins編 -iOSアプリ開発のCI環境 - Jenkins編 -
iOSアプリ開発のCI環境 - Jenkins編 -
 
Parallel Technology
Parallel TechnologyParallel Technology
Parallel Technology
 
Developr Camp 2012 Japan Fall Day2 Special Session - Visual Studio 2012 で始める ...
Developr Camp 2012 Japan Fall Day2 Special Session - Visual Studio 2012 で始める ...Developr Camp 2012 Japan Fall Day2 Special Session - Visual Studio 2012 で始める ...
Developr Camp 2012 Japan Fall Day2 Special Session - Visual Studio 2012 で始める ...
 
Dev camp2012jpn day2special
Dev camp2012jpn day2specialDev camp2012jpn day2special
Dev camp2012jpn day2special
 

More from DeNA

DRIVE CHARTの裏側 〜 AI ☓ IoT ☓ ビッグデータを 支えるアーキテクチャ 〜
DRIVE CHARTの裏側  〜 AI ☓ IoT ☓ ビッグデータを 支えるアーキテクチャ 〜DRIVE CHARTの裏側  〜 AI ☓ IoT ☓ ビッグデータを 支えるアーキテクチャ 〜
DRIVE CHARTの裏側 〜 AI ☓ IoT ☓ ビッグデータを 支えるアーキテクチャ 〜DeNA
 
IoTと業務システムをつなぐgRPC/RESTサービスの開発と運用
IoTと業務システムをつなぐgRPC/RESTサービスの開発と運用IoTと業務システムをつなぐgRPC/RESTサービスの開発と運用
IoTと業務システムをつなぐgRPC/RESTサービスの開発と運用DeNA
 
Can We Make Maps from Videos? ~From AI Algorithm to Engineering for Continuou...
Can We Make Maps from Videos? ~From AI Algorithm to Engineering for Continuou...Can We Make Maps from Videos? ~From AI Algorithm to Engineering for Continuou...
Can We Make Maps from Videos? ~From AI Algorithm to Engineering for Continuou...DeNA
 
SHOWROOMとDeNAで取り組んだライブ配信基盤刷新・超低遅延ライブ配信の裏側【DeNA TechCon 2020 ライブ配信】
SHOWROOMとDeNAで取り組んだライブ配信基盤刷新・超低遅延ライブ配信の裏側【DeNA TechCon 2020 ライブ配信】SHOWROOMとDeNAで取り組んだライブ配信基盤刷新・超低遅延ライブ配信の裏側【DeNA TechCon 2020 ライブ配信】
SHOWROOMとDeNAで取り組んだライブ配信基盤刷新・超低遅延ライブ配信の裏側【DeNA TechCon 2020 ライブ配信】DeNA
 
クラウド環境でのセキュリティ監査自動化【DeNA TechCon 2020 ライブ配信】
クラウド環境でのセキュリティ監査自動化【DeNA TechCon 2020 ライブ配信】クラウド環境でのセキュリティ監査自動化【DeNA TechCon 2020 ライブ配信】
クラウド環境でのセキュリティ監査自動化【DeNA TechCon 2020 ライブ配信】DeNA
 
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】DeNA
 
仕様起因の手戻りを減らして開発効率アップを目指すチャレンジ 【DeNA TechCon 2020 ライブ配信】
仕様起因の手戻りを減らして開発効率アップを目指すチャレンジ 【DeNA TechCon 2020 ライブ配信】仕様起因の手戻りを減らして開発効率アップを目指すチャレンジ 【DeNA TechCon 2020 ライブ配信】
仕様起因の手戻りを減らして開発効率アップを目指すチャレンジ 【DeNA TechCon 2020 ライブ配信】DeNA
 
DeNA データプラットフォームにおける 自由と統制のバランス【DeNA TechCon 2020 ライブ配信】
DeNA データプラットフォームにおける 自由と統制のバランス【DeNA TechCon 2020 ライブ配信】DeNA データプラットフォームにおける 自由と統制のバランス【DeNA TechCon 2020 ライブ配信】
DeNA データプラットフォームにおける 自由と統制のバランス【DeNA TechCon 2020 ライブ配信】DeNA
 
リアルタイムリモートデバッグ環境によるゲーム開発イテレーションの高速化【DeNA TechCon 2020 ライブ配信】
リアルタイムリモートデバッグ環境によるゲーム開発イテレーションの高速化【DeNA TechCon 2020 ライブ配信】リアルタイムリモートデバッグ環境によるゲーム開発イテレーションの高速化【DeNA TechCon 2020 ライブ配信】
リアルタイムリモートデバッグ環境によるゲーム開発イテレーションの高速化【DeNA TechCon 2020 ライブ配信】DeNA
 
MOV の機械学習システムを支える MLOps 実践【DeNA TechCon 2020 ライブ配信】
MOV の機械学習システムを支える MLOps 実践【DeNA TechCon 2020 ライブ配信】MOV の機械学習システムを支える MLOps 実践【DeNA TechCon 2020 ライブ配信】
MOV の機械学習システムを支える MLOps 実践【DeNA TechCon 2020 ライブ配信】DeNA
 
コンピュータビジョン技術の実応用〜DRIVE CHARTにおける脇見・車間距離不足検知〜【DeNA TechCon 2020 ライブ配信】
コンピュータビジョン技術の実応用〜DRIVE CHARTにおける脇見・車間距離不足検知〜【DeNA TechCon 2020 ライブ配信】コンピュータビジョン技術の実応用〜DRIVE CHARTにおける脇見・車間距離不足検知〜【DeNA TechCon 2020 ライブ配信】
コンピュータビジョン技術の実応用〜DRIVE CHARTにおける脇見・車間距離不足検知〜【DeNA TechCon 2020 ライブ配信】DeNA
 
DeNA の Slack 導入と活用の事例紹介
DeNA の Slack 導入と活用の事例紹介DeNA の Slack 導入と活用の事例紹介
DeNA の Slack 導入と活用の事例紹介DeNA
 
タクシーxAIを支えるKubernetesとAIデータパイプラインの信頼性の取り組みについて [SRE NEXT 2020]
タクシーxAIを支えるKubernetesとAIデータパイプラインの信頼性の取り組みについて [SRE NEXT 2020]タクシーxAIを支えるKubernetesとAIデータパイプラインの信頼性の取り組みについて [SRE NEXT 2020]
タクシーxAIを支えるKubernetesとAIデータパイプラインの信頼性の取り組みについて [SRE NEXT 2020]DeNA
 
オートモーティブ領域における 位置情報関連アルゴリズムあれこれ
オートモーティブ領域における 位置情報関連アルゴリズムあれこれオートモーティブ領域における 位置情報関連アルゴリズムあれこれ
オートモーティブ領域における 位置情報関連アルゴリズムあれこれDeNA
 
後部座席タブレットにおけるMaaS時代を見据えた半歩先のUX設計」 [MOBILITY:dev]
後部座席タブレットにおけるMaaS時代を見据えた半歩先のUX設計」 [MOBILITY:dev]後部座席タブレットにおけるMaaS時代を見据えた半歩先のUX設計」 [MOBILITY:dev]
後部座席タブレットにおけるMaaS時代を見据えた半歩先のUX設計」 [MOBILITY:dev]DeNA
 
ドライブレコーダ映像からの3次元空間認識 [MOBILITY:dev]
ドライブレコーダ映像からの3次元空間認識 [MOBILITY:dev]ドライブレコーダ映像からの3次元空間認識 [MOBILITY:dev]
ドライブレコーダ映像からの3次元空間認識 [MOBILITY:dev]DeNA
 
MOVで実践したサーバーAPI実装の超最適化について [MOBILITY:dev]
MOVで実践したサーバーAPI実装の超最適化について [MOBILITY:dev]MOVで実践したサーバーAPI実装の超最適化について [MOBILITY:dev]
MOVで実践したサーバーAPI実装の超最適化について [MOBILITY:dev]DeNA
 
MOV お客さま探索ナビの GCP ML開発フローについて
MOV お客さま探索ナビの GCP ML開発フローについてMOV お客さま探索ナビの GCP ML開発フローについて
MOV お客さま探索ナビの GCP ML開発フローについてDeNA
 
課題ドリブン、フルスタックAI開発術 [MOBILITY:dev]
課題ドリブン、フルスタックAI開発術 [MOBILITY:dev]課題ドリブン、フルスタックAI開発術 [MOBILITY:dev]
課題ドリブン、フルスタックAI開発術 [MOBILITY:dev]DeNA
 
DeNA の AWS アカウント管理とセキュリティ監査自動化
DeNA の AWS アカウント管理とセキュリティ監査自動化DeNA の AWS アカウント管理とセキュリティ監査自動化
DeNA の AWS アカウント管理とセキュリティ監査自動化DeNA
 

More from DeNA (20)

DRIVE CHARTの裏側 〜 AI ☓ IoT ☓ ビッグデータを 支えるアーキテクチャ 〜
DRIVE CHARTの裏側  〜 AI ☓ IoT ☓ ビッグデータを 支えるアーキテクチャ 〜DRIVE CHARTの裏側  〜 AI ☓ IoT ☓ ビッグデータを 支えるアーキテクチャ 〜
DRIVE CHARTの裏側 〜 AI ☓ IoT ☓ ビッグデータを 支えるアーキテクチャ 〜
 
IoTと業務システムをつなぐgRPC/RESTサービスの開発と運用
IoTと業務システムをつなぐgRPC/RESTサービスの開発と運用IoTと業務システムをつなぐgRPC/RESTサービスの開発と運用
IoTと業務システムをつなぐgRPC/RESTサービスの開発と運用
 
Can We Make Maps from Videos? ~From AI Algorithm to Engineering for Continuou...
Can We Make Maps from Videos? ~From AI Algorithm to Engineering for Continuou...Can We Make Maps from Videos? ~From AI Algorithm to Engineering for Continuou...
Can We Make Maps from Videos? ~From AI Algorithm to Engineering for Continuou...
 
SHOWROOMとDeNAで取り組んだライブ配信基盤刷新・超低遅延ライブ配信の裏側【DeNA TechCon 2020 ライブ配信】
SHOWROOMとDeNAで取り組んだライブ配信基盤刷新・超低遅延ライブ配信の裏側【DeNA TechCon 2020 ライブ配信】SHOWROOMとDeNAで取り組んだライブ配信基盤刷新・超低遅延ライブ配信の裏側【DeNA TechCon 2020 ライブ配信】
SHOWROOMとDeNAで取り組んだライブ配信基盤刷新・超低遅延ライブ配信の裏側【DeNA TechCon 2020 ライブ配信】
 
クラウド環境でのセキュリティ監査自動化【DeNA TechCon 2020 ライブ配信】
クラウド環境でのセキュリティ監査自動化【DeNA TechCon 2020 ライブ配信】クラウド環境でのセキュリティ監査自動化【DeNA TechCon 2020 ライブ配信】
クラウド環境でのセキュリティ監査自動化【DeNA TechCon 2020 ライブ配信】
 
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
 
仕様起因の手戻りを減らして開発効率アップを目指すチャレンジ 【DeNA TechCon 2020 ライブ配信】
仕様起因の手戻りを減らして開発効率アップを目指すチャレンジ 【DeNA TechCon 2020 ライブ配信】仕様起因の手戻りを減らして開発効率アップを目指すチャレンジ 【DeNA TechCon 2020 ライブ配信】
仕様起因の手戻りを減らして開発効率アップを目指すチャレンジ 【DeNA TechCon 2020 ライブ配信】
 
DeNA データプラットフォームにおける 自由と統制のバランス【DeNA TechCon 2020 ライブ配信】
DeNA データプラットフォームにおける 自由と統制のバランス【DeNA TechCon 2020 ライブ配信】DeNA データプラットフォームにおける 自由と統制のバランス【DeNA TechCon 2020 ライブ配信】
DeNA データプラットフォームにおける 自由と統制のバランス【DeNA TechCon 2020 ライブ配信】
 
リアルタイムリモートデバッグ環境によるゲーム開発イテレーションの高速化【DeNA TechCon 2020 ライブ配信】
リアルタイムリモートデバッグ環境によるゲーム開発イテレーションの高速化【DeNA TechCon 2020 ライブ配信】リアルタイムリモートデバッグ環境によるゲーム開発イテレーションの高速化【DeNA TechCon 2020 ライブ配信】
リアルタイムリモートデバッグ環境によるゲーム開発イテレーションの高速化【DeNA TechCon 2020 ライブ配信】
 
MOV の機械学習システムを支える MLOps 実践【DeNA TechCon 2020 ライブ配信】
MOV の機械学習システムを支える MLOps 実践【DeNA TechCon 2020 ライブ配信】MOV の機械学習システムを支える MLOps 実践【DeNA TechCon 2020 ライブ配信】
MOV の機械学習システムを支える MLOps 実践【DeNA TechCon 2020 ライブ配信】
 
コンピュータビジョン技術の実応用〜DRIVE CHARTにおける脇見・車間距離不足検知〜【DeNA TechCon 2020 ライブ配信】
コンピュータビジョン技術の実応用〜DRIVE CHARTにおける脇見・車間距離不足検知〜【DeNA TechCon 2020 ライブ配信】コンピュータビジョン技術の実応用〜DRIVE CHARTにおける脇見・車間距離不足検知〜【DeNA TechCon 2020 ライブ配信】
コンピュータビジョン技術の実応用〜DRIVE CHARTにおける脇見・車間距離不足検知〜【DeNA TechCon 2020 ライブ配信】
 
DeNA の Slack 導入と活用の事例紹介
DeNA の Slack 導入と活用の事例紹介DeNA の Slack 導入と活用の事例紹介
DeNA の Slack 導入と活用の事例紹介
 
タクシーxAIを支えるKubernetesとAIデータパイプラインの信頼性の取り組みについて [SRE NEXT 2020]
タクシーxAIを支えるKubernetesとAIデータパイプラインの信頼性の取り組みについて [SRE NEXT 2020]タクシーxAIを支えるKubernetesとAIデータパイプラインの信頼性の取り組みについて [SRE NEXT 2020]
タクシーxAIを支えるKubernetesとAIデータパイプラインの信頼性の取り組みについて [SRE NEXT 2020]
 
オートモーティブ領域における 位置情報関連アルゴリズムあれこれ
オートモーティブ領域における 位置情報関連アルゴリズムあれこれオートモーティブ領域における 位置情報関連アルゴリズムあれこれ
オートモーティブ領域における 位置情報関連アルゴリズムあれこれ
 
後部座席タブレットにおけるMaaS時代を見据えた半歩先のUX設計」 [MOBILITY:dev]
後部座席タブレットにおけるMaaS時代を見据えた半歩先のUX設計」 [MOBILITY:dev]後部座席タブレットにおけるMaaS時代を見据えた半歩先のUX設計」 [MOBILITY:dev]
後部座席タブレットにおけるMaaS時代を見据えた半歩先のUX設計」 [MOBILITY:dev]
 
ドライブレコーダ映像からの3次元空間認識 [MOBILITY:dev]
ドライブレコーダ映像からの3次元空間認識 [MOBILITY:dev]ドライブレコーダ映像からの3次元空間認識 [MOBILITY:dev]
ドライブレコーダ映像からの3次元空間認識 [MOBILITY:dev]
 
MOVで実践したサーバーAPI実装の超最適化について [MOBILITY:dev]
MOVで実践したサーバーAPI実装の超最適化について [MOBILITY:dev]MOVで実践したサーバーAPI実装の超最適化について [MOBILITY:dev]
MOVで実践したサーバーAPI実装の超最適化について [MOBILITY:dev]
 
MOV お客さま探索ナビの GCP ML開発フローについて
MOV お客さま探索ナビの GCP ML開発フローについてMOV お客さま探索ナビの GCP ML開発フローについて
MOV お客さま探索ナビの GCP ML開発フローについて
 
課題ドリブン、フルスタックAI開発術 [MOBILITY:dev]
課題ドリブン、フルスタックAI開発術 [MOBILITY:dev]課題ドリブン、フルスタックAI開発術 [MOBILITY:dev]
課題ドリブン、フルスタックAI開発術 [MOBILITY:dev]
 
DeNA の AWS アカウント管理とセキュリティ監査自動化
DeNA の AWS アカウント管理とセキュリティ監査自動化DeNA の AWS アカウント管理とセキュリティ監査自動化
DeNA の AWS アカウント管理とセキュリティ監査自動化
 

Recently uploaded

【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 

Recently uploaded (8)

【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 

Unityネイティブプラグインマニアクス #denatechcon

  • 1. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Unityネイティブプラグインマニアクス DeNA Technology Conference 2017 1 Japanリージョンゲーム事業本部 開発基盤部 Haruto Otake Sae Yamauchi
  • 2. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 自己紹介  大竹 悠人(Otake Haruto) ⁃ 開発基盤部 第二グループ所属 ⁃ 来歴 • 2009年ドワンゴに新卒入社 ⁃ 幾つかのサービスや、家電/ゲーム機向けプロダクトを担当 • 2013年 DeNAに中途入社 ⁃ Webソーシャルゲームタイトルの運用ののち、新規ネイティブゲーム開発へ参加 ⁃ 基盤整備を得意としていたらいつのまにかそっちが本業に ⁃ 現在はUnityに関連した技術サポートと、様々な内製ライブラリの制作/保守に従事 2
  • 3. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 自己紹介  山内 沙瑛 (Yamauchi Sae) ⁃ 開発基盤部 第三グループ所属 ⁃ 来歴 • 2012年 新卒入社 ⁃ 主に共通基盤の開発に携わる • UIテスト自動化 • ゲーム用SDKのメンテナンス • Unityの共通モジュール開発・メンテナンス及び調査 ⁃ ゲーム用BaaSのSDK / サーバーサイドの開発・運用を行っている 3
  • 4. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. アジェンダ  ネイティブプラグインとは ⁃ なぜ必要なのか  ネイティブプラグインのつくりかた ⁃ ネイティブプラグインとしての実装 ⁃ 必要な実装 ⁃ 利用者向けフロントエンド実装  プラグイン作成時の注意点と対応策 ⁃ マルチプラットフォーム対応 ⁃ 安定性 ⁃ 実機上での実行効率  まとめ 4
  • 5. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ネイティブプラグインとは 5
  • 6. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ネイティブプラグインとは Unityの機能を拡張するための、ネイティブ実装ライブラリのこと。 ネイティブ実装とインターフェースを用意することで、相互に呼び出しできる。  参考 ⁃ Unity マニュアル ネイティブプラグイン https://docs.unity3d.com/ja/current/Manual/NativePlugins.html 6 ゲームコード (C#) ネイティブコード (例: OSSライブラリ) インターフェース
  • 7. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. なぜ必要なのか 大きく分けると以下の理由がある。  Unityが提供していないプラットフォームAPIを使用するため  ネイティブ実装された機能をUnityで使用するため 7
  • 8. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. Unityが提供していないプラットフォームAPIを使用するため iOS Push通知や動画再生などはゲームコードから呼び出せる。 以下の様な機能のAPIを使用したい場合は、Unityが対応していないため、直接呼び 出すことができない。 そのため、ネイティブプラグインを作成する必要がある。  例 ⁃ WebView表示 ⁃ Android Push通知設定 ⁃ 空きディスク容量取得 8
  • 9. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 技術資産を流用するため ネイティブ実装されたミドルウェアや機能をUnityで使用するため。  例 ⁃ 社内モジュール • ゲーム特化BaaS(Sakasho) • サウンドエンジン(DeAL) • リアルタイム通信サーバー(IRIS) • アセット転送 ⁃ OSS • WebPローダ • ファイルの暗号化・復号化 9
  • 10. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ネイティブプラグインのつくりかた 10
  • 11. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ネイティブプラグインとしての実装 (1) ネイティブ実装と、それを呼び出すためのインターフェースを用意することで、 相互に呼び出しを行うことができる。  マネージドコード ⁃ ゲームコード(C#)に当たる ⁃ monoでビルドした場合は、仮想マシン上で実行されるコード ⁃ IL2CPPでビルドした場合は、最終的にはネイティブコードになる  ネイティブコード(アンマネージドコード) ⁃ C / C++ / Java 等で記述されたコード 11 マネージドコード (C#) ネイティブコード (C / C++ / Java等) インターフェース
  • 12. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ネイティブプラグインとしての実装 (2) 実装例 (Androidの場合) 12 int add(int x, int y) { return x + y; } // test.c int add(int x, int y); // test.h libnative.so // ゲームコード上での呼び出し(C#) int result = add(1, 2); // P/Invoke宣言(C#) [DllImport("native")] private static extern int add(int x, int y); マネージドコード (C#) ネイティブコード インターフェース
  • 13. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 必要な実装 A. 【ネイティブ】拡張機能のコア実装 B. 【ネイティブ】マネージドコードから呼び出すためのインターフェース C. 【マネージド】ネイティブコードとの連携実装 D. 【マネージド】利用者向け呼び出しフロントエンド実装 13 マネージドコード (C#) ネイティブコード (例: OSSライブラリ) インターフェース C D A B
  • 14. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 必要な実装 A. 【ネイティブ】拡張機能のコア実装 B. 【ネイティブ】マネージドコードから呼び出すためのインターフェース C. 【マネージド】ネイティブコードとの連携実装 D. 【マネージド】利用者向け呼び出しフロントエンド実装 14 マネージドコード (C#) ネイティブコード (例: OSSライブラリ) インターフェース C D A B
  • 15. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 拡張機能のコア実装 / マネージドコードから呼び出すためのインターフェース  ネイティブコード ⁃ 拡張機能のコア実装 ⁃ ゲームエンジンを跨いで利用可能な技術資産にできる  インターフェース ⁃ マネージドコードから呼び出すためのインターフェース ⁃ C Linkageの関数として実装する • 例 test.cpp extern "C" int hoge(); int hoge() { return 1; } 15 マネージドコード (C#) ネイティブコード (例: OSSライブラリ) インターフェース C D A B
  • 16. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 必要な実装 A. 【ネイティブ】拡張機能のコア実装 B. 【ネイティブ】マネージドコードから呼び出すためのインターフェース C. 【マネージド】ネイティブコードとの連携実装 D. 【マネージド】利用者向け呼び出しフロントエンド実装 16 マネージドコード (C#) ネイティブコード (例: OSSライブラリ) インターフェース C D A B
  • 17. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ネイティブコードとの連携実装 以下の機構でネイティブコードとマネージドコードの連携を行うことができる。  マネージドコード上 ⁃ P/Invoke • ネイティブコードをC#のメソッドのように呼び出すための機構 ⁃ AndroidJavaObjectなど(Androidのみ) • JNIを通じてAndroidのJavaのコードを呼び出す機構  ネイティブコード上 ⁃ UnitySendMessage • ネイティブからマネージドコードを呼び出すためのメソッド • 指定したGameObjectに文字列を送ることができる 17
  • 18. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. P/Invoke (Platform Invoke) CLI(共通言語基盤)の機能で、ネイティブコードをマネージドコードの様に呼び出 すことができる。 引数や返り値は必要に応じて マーシャリング という変換処理が行われる。 18 ネイティブコード インターフェース P/Invoke宣言 マネージドコード(C#) マーシャラ 引数は System.String です 変換した データを用意しま す char*を 受け取りましたネイティブコード インターフェース P/Invoke宣言 マネージドコード(C#)引数は System.String です ???? [DllImport("ロード対象のプラグイン")] private static extern int add(int x, int y);
  • 19. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. AndroidJavaObjectなど AndroidのAPIやJARに含まれるコードを呼び出すことができるUnityのAPI マネージドコードからクラス名を指定し呼び出すことができる。  参考: Unity マニュアル Android 用のプラグインをビルド ⁃ https://docs.unity3d.com/ja/current/Manual/PluginsForAndroid.html using (AndroidJavaClass cls = new AndroidJavaClass("java.util.Locale")) { using(AndroidJavaObject locale = cls.CallStatic<AndroidJavaObject>("getDefault")) { Debug.Log("current lang = " + locale.Call<string>("getDisplayLanguage")); } } 上記ドキュメントに記載されている呼び出し例(C#): 19
  • 20. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. UnitySendMessage ネイティブコードからマネージドコードに文字列を渡すことができる。 指定したGameObjectの指定したメソッドに対して、stringを引数にして呼び出す。 ネイティブで一定処理を行った後に、結果を返したい場合などに使用する。  問題点 ⁃ 非同期のため、同一フレーム間でメッセージを受け取れるわけではない // GameObject名, メソッド名, 送信したい文字列 UnitySendMessage("GameObjectName", "MethodName", "Message to send"); 20
  • 21. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 必要な実装 A. 【ネイティブ】拡張機能のコア実装 B. 【ネイティブ】マネージドコードから呼び出すためのインターフェース C. 【マネージド】ネイティブコードとの連携実装 D. 【マネージド】利用者向け呼び出しフロントエンド実装 21 マネージドコード (C#) ネイティブコード (例: OSSライブラリ) インターフェース C D A B
  • 22. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 利用者向けフロントエンド実装 C Linkage関数のインターフェースをC#で扱いやすくするために、ラッパーを実装 する。  実装例 マネージドコード(C#) 22 public static class HogeBindings { [DllImport("hoge")] public static extern IntPtr create(int x); [DllImport("hoge")] public static extern void remove(IntPtr context); [DllImport("hoge")] public static extern int exec(IntPtr context, int x); } public class Hoge : IDisposable { private IntPtr context; public Hoge(int x) { context = HogeBindings.create(x); } public Dispose() { HogeBindings.remove(context); } public int Exec(int x) { return HogeBindings.exec(context, x); } }
  • 23. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ネイティブプラグイン作成時の注意点と対応策 23
  • 24. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ネイティブプラグイン作成時の注意点と対応策  マルチプラットフォーム対応 ⁃ 各プラットフォーム用のライブラリ対応 ⁃ 各プラットフォームごとのネイティブプラグイン呼び出し実装 ⁃ ネイティブプラグインのライフサイクル ⁃ ネイティブコードからマネージドコードを呼び出す実装の注意点  安定性 ⁃ フェイルセーフ性の担保 ⁃ アライメント問題の考慮  実機上での実行効率 ⁃ メモリコピーの回避 24
  • 25. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 各プラットフォーム用のライブラリ対応 各プラットフォーム用(iOS / Android / macOS / Windows)に実装したライブラ リ を用意する必要がある。 Unity Editor上で動作させるため、macOSやWindows用のネイティブプラグイン も作成する。 プラットフォーム 形式 iOS Static Library (.a) Android Shared Library (.so) または JAR (JNI経由) macOS Loadable Bundle (.bundle) Windows Dynamic Link Library (.dll) 25
  • 26. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 各プラットフォームごとのネイティブコードの呼び出し実装 (1) 各プラットフォーム用にP/Invoke宣言の対応も追加する。 ライブラリ毎にDllImport指定が異なるため、プリプロセッサディレクティブで分 岐させる。 加えて、IL2CPPビルドを使う場合は以下の対応も必要になる。  iOS / Android IL2CPP ⁃ Delegateを使ってネイティブコードからマネージドコードを呼び出す関数に MonoPInvokeCallback属性指定が必要 • 参考: https://docs.unity3d.com/ja/current/Manual/TroubleShootingIPhone.html  Android IL2CPP ⁃ ビルドエラーになるため、(iOS用の) DllImport("__Internal")宣言が有効に ならないようにする 26
  • 27. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 各プラットフォームごとのネイティブコードの呼び出し実装 (2) #if UNITY_EDITOR // iOS, Android設定かつEditor上で実行した場合に対応するため最初の条件にしている [DllImport("nativeForEditor")] #elif UNITY_ANDROID [DllImport("native")] #elif UNITY_IOS [DllImport("__Internal")] #endif private static extern int add(int x, int y); プリプロセッサディレクティブ記述例 27
  • 28. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ネイティブプラグインのライフサイクル (1) ネイティブプラグインのロードタイミングに注意する。  Android ⁃ ロード順序が担保されない • Android OSバージョンによっては、ライブラリの依存関係が解決されない ⁃ JNI_OnLoadが呼び出されない場合がある • JNI_OnLoad内で処理 (ライブラリをロードする等) を記述していると実行されない • 参考: https://fogbugz.unity3d.com/default.asp?737959_orv675eqjd2ro91g ライブラリは関数呼び出し時にロードされるため、ライブラリをロードするための 関数を用意し、依存関係順に呼び出しておく。 28
  • 29. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ネイティブプラグインのライフサイクル (2)  Unity Editor (macOS / Windows) ⁃ ネイティブプラグインがロードされるのは初回再生の初回呼び出し時のみ • ネイティブプラグインを更新した場合はUnityの再起動が必要 ⁃ Unity Editorの再生・停止モードには影響されない • 再生停止してもネイティブプラグインはアンロードされない ⁃ 初期化処理が複数回呼ばれうる処理にする • ゲームコードがリコンパイルされた後のアセンブリ置き換えで、終了処理が呼ばれな い場合がある • 何度初期化されても良いようにする。状態管理はネイティブプラグイン側で行う 29
  • 30. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ネイティブコードからマネージドコードを呼び出す実装の注意点 (1) ネイティブプラグインからマネージドコードへ結果を返す場合に注意する。 ネイティブで作成したスレッドからマネージドコードを呼び出すと、 Unityの内部処理もネイティブプラグインからの呼び出しになる場合があり、問題 が起こる。  iOS / Androidアプリの場合 ⁃ Unityのメインスレッド前提の処理の一部で、例外が発生する事がある  Unity Editorの場合 ⁃ デバッガ接続を行うと、Unity Editorが応答不能になる 30
  • 31. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ネイティブコードからマネージドコードを呼び出す実装の注意点 (2) ネイティブで作成したスレッドから、マネージドコードのコールバック処理 (Delegate等) は、直接呼び出さない。 Unityのメインスレッドから呼び出す。あくまでマネージド層からの処理として完 結させる。  対応例 ⁃ マネージド層でポーリングし、マネージド層からネイティブ層へ結果を問い合 わせる形にする (Pull型にする) 31
  • 32. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ネイティブコードからマネージドコードを呼び出す実装の注意点 (3) 32 処理 スレッド作成 呼び出し 結果 処理 スレッド作成 呼び出し 結果 問い合わせ 結果 Unity メインスレッド ネイティブ実装 ネイティブで 作成したスレッド 返却 NG OK
  • 33. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. ネイティブプラグイン作成時の注意点  マルチプラットフォーム対応 ⁃ 各プラットフォーム用のライブラリ対応 ⁃ 各プラットフォームごとのネイティブプラグイン呼び出し実装 ⁃ ネイティブプラグインのライフサイクル ⁃ ネイティブコードからマネージドコードを呼び出す実装  安定性 ⁃ フェイルセーフ性の担保 ⁃ プラットフォーム毎のアラインメント問題の考慮  実機上での実行効率 ⁃ メモリコピーの回避 33
  • 34. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. フェイルセーフ性の担保 プレイヤーのユーザー体験を損ねないように。加えて、開発チームの開発効率を下 げないようにする。 すべてのネイティブコード呼び出しは常に安全に実行、正しく失敗する様にする。  例 ⁃ マネージドからエラーをハンドリングできる仕組み ⁃ ネイティブプラグインで発生したエラーもUnity Editor上から把握できるよう に 34
  • 35. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. プラットフォーム毎のアラインメント問題の考慮 構造体を使用する場合、メモリ上の配置にアラインメントが発生する。 マーシャリング対象のため、アラインメントを意識し構造体を定義する。  8byteのフィールドは8の倍数の位置から配置される  その間はパディングとして未使用のフィールドになる struct Sample1 { int32_t field1; int16_t field2; int64_t field3; }; struct Sample2 { int32_t field1; int32_t field2; int64_t field3; }; sizeof(Sample1) // => 16 sizeof(Sample2) // => 16 35 field1 field2 field3 16bit 16bit 16bit 16bit 16bit 16bit 16bit 16bit field1 field2 field3 8byte int64_t(8byte)の前にint16_t(2byte)を定義した場合
  • 36. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 実機上での実行効率 実行効率を上げるために、メモリコピーを回避する様にする。 そのためには、ネイティブ層とマネージド層のそれぞれのヒープを意識する必要が ある。  マネージドヒープ ⁃ マネージドコードから扱われるヒープ(CLIで管理される) • GCの処理で消されたり移動したりする可能性がある  ネイティブヒープ ⁃ ネイティブコードから扱われるヒープ 36
  • 37. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. メモリコピーの回避 (1) メモリコピーはマーシャリング時に発生する。 やり取りするデータが大きい・頻度が高い場合は、特にマーシャリングを回避する ようにする。 37 マーシャラ ネイティブコード マネージドコード (C#) ヒープ間のデータコピー 参照参照 マネージドヒープ ネイティブヒープ
  • 38. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. メモリコピーの回避 (2) 回避策として、Blittable型を使う方法がある。 Blittable型とはマネージド/ネイティブでメモリレイアウトが同じになる型のこと。 P/Invokeでマネージド/ネイティブへ受け渡す際に、マーシャリングせずに、参照 渡しができる。 (ただし、アドレスが保証されるのは関数呼び出しの間のみ) 38 マーシャラ ネイティブコード マネージドコード (C#) マネージドヒープを 直接参照する 参照 Blittable型の引数 マネージドヒープ ネイティブヒープ
  • 39. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. メモリコピーの回避 (3)  Blittable型の例 ⁃ bool, charを除くプリミティブな値型 (int/float/shortなど…) ⁃ Blittable型の一次元配列 ⁃ Blittableな型だけを含むStructLayout指定された値型 • ただしBlittable型の可変長配列を含む型は除く 39
  • 40. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. メモリコピーの回避 (4)  Blittable型の例 40 // bool, charを除くプリミティブな値型 int f1; // Blittable型の一次配列 int[] f2; // Blittable型だけを含むStructLayout指定された値型 [StructLayout(LayoutKind.Sequential)] unsafe struct S1 { int f1; fixed int[64] f2; // Blittable型の固定長配列は可 }
  • 41. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. メモリコピーの回避 (5)  非Blittable型の例 41 string f1; bool f2; struct S2 { int f1; } [StructLayout(LayoutKind.Sequential)] struct S1 { int[] f1; }
  • 42. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. メモリコピーの回避 (6) Blittable型にOut方向属性を指定すると、マネージドヒープの内容を直接読み込め るだけでなく、書き込みを行うことができる。 42 マーシャラ ネイティブコード マネージドコード (C#) マネージドヒープへ 直接書き込む 参照 Out属性付きBlittable型引数 マネージドヒープ ネイティブヒープ
  • 43. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. メモリコピーの回避 (7) P/Invoke及びマーシャリング方向属性を指定する例 extern "C" { void sample_encode(uint8_t* source, uint8_t * dest, int32_t count); } ネイティブコード (libsample.so, libsample.a) public class SamplePlugin { #if UNITY_ANDROID [DllImport("sample")] #elif UNITY_IOS [DllImport("__Internal")] #endif public static extern void sample_encode([In] byte[] source, [Out] byte[] dest, int count); } マネージドコード (C#) 43
  • 44. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. メモリコピーの回避 (8) Blittable型を使った参照では、アドレスが保証されるのは、関数呼び出し間のみの ため、同期呼び出しにしか使用できない。 ネイティブ層で非同期に処理を行いたい場合 (データのパースや復号化処理など) は、GCHandleを使用する。  GCHandle ⁃ 指定したインスタンスのガベージコレクタのハンドルを取得する機構 ⁃ マネージドヒープに置かれたインスタンスは、GCによってアドレスが移動す る可能性があるが、GCHandleを使うと固定することができる GCHandleで固定したインスタンスのポインタをネイティブ層に渡すことで、 ネイティブ層から、非同期で読み込み・書き込みを行うことができるようになる。 44
  • 45. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. メモリコピーの回避 (9)  GCHandleを使いマネージドヒープ書き込みを行う例 ⁃ (Androidネイティブプラグインとして実装した場合) 45 uint8_t *buffer_ptr; int32_t buffer_size; void set_buffer(uint8_t *buffer, int32_t size) { buffer_ptr = buffer; buffer_size = size; } void write() { // マネージドヒープへの書き込み memset(buffer_ptr, 0, buffer_size); int num[] = {0, 1, 2}; memcpy(buffer_ptr, num, sizeof(int) * 3); } ネイティブコード (libnative.so)
  • 46. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. メモリコピーの回避 (10) 46 [DllImport("native")] private static extern void set_buffer(byte[] buffer, int size); [DllImport("native")] private static extern void write(); private byte[] bytes = new byte[100]; private GCHandle handle; // マネージド層のバッファのポインタをネイティブ層に渡す public void SetBuffer() { handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); set_buffer(bytes, bytes.Length); } // GCHandleで確保したバッファのため、後の呼び出し時でも書き込める public void OnLoadFinished() { write(); } public void Dispose() { handle.Free(); } マネージドコード (C#)
  • 47. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. 出典  プラットフォーム呼び出しによるデータのマーシャリング ⁃ https://msdn.microsoft.com/ja-jp/library/fzhhdwae(v=vs.110).aspx  既定のマーシャリングの動作 ⁃ https://msdn.microsoft.com/ja-jp/library/zah6xy75(v=vs.110).aspx 47
  • 48. Copyright (C) DeNA Co.,Ltd. All Rights Reserved. まとめ  ネイティブプラグインを作成することで、ゲーム用の機能や開発効率向上のため の機能を拡張することができるようになります。  ネイティブプラグインの実装には、各プラットフォームへの対応や、マネージド 層とアンマネージド層を意識した実装が必要です。 本発表がネイティブプラグイン開発に役立てば幸いです。 ご清聴ありがとうございました。 48

Editor's Notes

  1. 大竹 1/2 17 (17) 00:17
  2. 大竹 2/2 45 (62) 1:02
  3. 山内 1/13 30 (92) 1:32
  4. 山内 2/13 45 (137) 2:17 以下を伝える プラグイン作成時の注意点が一番伝えたい部分であること 資料は後日公開する点
  5. 山内 3/13 5 (142) 2:22
  6. 山内 4/13 30 (172) 2:52 伝えること 本発表では、Unityのネイティブプラグインのことを、”ネイティブプラグイン” と呼ぶこと
  7. 山内 5/13 25 (197) 3:17
  8. 山内 6/13 - Unityから直接呼び出せない。そのため、Unity外から、プラットフォームのAPIを呼び出すためにネイティブプラグインを作成する 45 (242) 4:02
  9. 山内 7/13 - Unityに関係なく作成されたライブラリをUnity上で使うことができるようになる 45 (287) 4:47
  10. 山内 8/13 5 (292) 4:52
  11. 山内 9/13 120 [2:00] (412) 6:52 以下の点を伝える ゲームコード(マネージドコード)はC#による実装前提 以後マネージドと呼ぶ部分は、C#としてイメージして欲しい Monoの仮想マシン上で ネイティブコードとは、プラットフォームネイティブである、という意味で使用します Unity外で提供される機能をつなぐことが目的 つまりC#外のコード、アンマネージドコード その為、ネイティブコードと表現するが、Unity外のコード、そのプラットフォームに対してネイティブなコード、ということでJavaなども含むという前提で説明していきます ---------------- ネイティブコード -> Platform Native的な意であること Javaは違うよねm, Monoの仮想マシン上でと伝える 本セッションにおける、マネージドコード・ネイティブコードについて明示する Javaは今回は、つなぐ対象としてアンマネージドコードなので紹介する CPUネイティブなコードや、プラットフォームネイティブなコードを、ネイティブコードとして呼びますよ
  12. 山内 10/13 90 [1:30] (502) 8:22 伝える ネイティブコードでは、実際の実装を定義する それに対して、P/Invoke宣言という、ネイティブコードの関数を、マネージドコードから呼び出すための宣言を記載する この部分は、ネイティブコードと対応した宣言を行う必要がある これでゲームコードからネイティブコードを呼び出すことができるようになる iOSはstatic libraryのため、__Internalと指定するが、Androidはshared libraryを使うため、ライブラリ名を指定する必要がある、と伝える --------------- 灰色(インターフェース)については明示的に言及しない ネイティブコードの説明の一部とする P/Invoke宣言の箇所で、この部分と対応したシグネチャ宣言を行う、ということだけ伝える
  13. 山内 11/13 60 [1:00] (562) 9:22
  14. 山内 12/13 10 (572) 9:32
  15. 山内 13/13 60 [1:00] (632) 10:32 宣言はC Linkageとして実装する必要がある、ということを示すために C++ のコード例にしている 実装本体はC++でOK
  16. 大竹 1/7 5 (637) 10:37
  17. 大竹 2/7 60 [1:00] (697) 11:37
  18. 大竹 3/7 120 [2:00] (817) 13:37 以下の点を伝える CLIとは
  19. 大竹 4/7 90 [1:30] (907) 15:07
  20. 大竹 5/7 90 [1:30] (997) 16:37
  21. 大竹 6/7 5 (1002) 16:42
  22. 大竹 7/7 180 [3:00] (1182) 19:42
  23. 山内 1/10 5 (1187) 19:47
  24. 山内 2/10 30 (1217) 20:17
  25. 山内 3/10 35 (1252) 20:52 - iOSだけはStatic Libraryで、それ以外のプラットフォームはShared Libraryとなる。このあとちょっとずつ出てくるので、頭の片隅に覚えておいてほしい
  26. 山内 4/10 60 [1:00] (1312) 21:52 以下口頭で伝える iOSの場合はstatic libraryを使うため、DLLImport はアンダースコア*2 Internalになる。 Android IL2CPPでは、__Internal指定があると、静的リンク前提のコードが生成されてしまい、ビルドエラーになってしまう
  27. 山内 5/10 30 (1342) 22:22 - プラットフォームごとに読み込むライブラリ名が異なる - UNITY_EDITOR用にはnativeForEditor.bundle or dll - UNITY_ANDROIDはlinative.s - UNITY_IOSはiOSの場合はstatic libraryを読み込ませるので__Internalと指定する - EditorとAndroidはライブラリ名を揃えられる。iOSはstatic libraryなため、DLLImport指定を揃えることはできないが
  28. 山内 6/10 65 [1:05] (1407) 23:27 - ネイティブプラグインで複数のライブラリを使用しており、依存関係がある場合の話 JNI_OnLoadとは、Javaの仕組みで、共有ライブラリの読み込み時に呼び出される関数 ネイティブプラグインのライブラリの依存関係を マネージド層から 解決するために、ライブラリをロードするための関数を呼び出すようにする
  29. 山内 7/10 80 [1:20] (1487) 24:47 - アプリ (iOS / Android) の場合は、アプリの終了がネイティブプラグインの終了に当たる - Unity Editorの場合は、再生停止してもアンロードされない。このあたりがアプリとは異なる。 - Android/iOSの場合はアプリの終了 == ネイティブプラグインの終了 Unity Editorの場合は再生停止がそれに当たるが、この時のハンドラ自体が呼ばれないことがある メモリからはアンロードされない。 それで、終了処理が呼ばれずに、初期化が呼ばれる事がある (2回初期化されるケースが有る
  30. 山内 8/10 40 (1527) 25:27 iOS / Android UnityはUnityメインスレッドでユーザーコードが動く前提になっているところもある それが崩れてしまうため Unity Editor Unity内部の実装の問題 monoの実装でそうなってしまっている……
  31. 山内 9/10 50 (1577) 26:17
  32. 山内 10/10 50 (1627) 27:07 - Unityに 直接結果を返すとクラッシュなどの問題が発生する
  33. 大竹 1/15 30 (1657) 27:37
  34. 大竹 2/15 90 [1:00] (1747) 29:07
  35. 大竹 3/15 90 [1:30] (1837) 30:37
  36. 大竹 4/15 90 [1:30] (1927) 32:07
  37. 大竹 5/15 60 [1:00] (1987) 33:07
  38. 大竹 6/15 90 [1:30] (2077) 34:37
  39. 大竹 7/15 50 (2127) 35:27
  40. 大竹 8/15 60 [1:00] (2187) 36:27
  41. 大竹 9/15 40 (2227) 37:07
  42. 大竹 10/15 50 (2277) 37:57
  43. 大竹 11/15 60 [1:00] (2337) 38:57
  44. 大竹 12/15 120 [2:00] (2457) 40:57
  45. 大竹 13/15 30 (2487) 41:27
  46. 大竹 14/15 70 [1:10] (2557) 42:37
  47. 大竹 15/15 5 (2562) 42:42
  48. 山内 1/1 30 (2592) 43:12