UnityのネイティブプラグインをGoで書く #golang #unity
May 11, 2016
この記事はQiitaの記事をエクスポートしたものです。内容が古くなっている可能性があります。
ネイティブプラグイン用のGoのコードを書く
以下のようなコードを用意し、hoge.go
としておきます。
どうやらmain
パッケージでないとダメなようです。
cgo
経由で関数をエクスポートするので、import "C"
を書きます。
Hoge
関数をエクスポートするために//export Hoge
というコメントを書きます。
package main
import "C"
//export Hoge
func Hoge() int {
return 100
}
func main() {
}
Androidのネイティブプラグインを作る
Android用に.so
ファイルを作ります。
$ CGO_ENABLED=1 \
CC=arm-linux-androideabi-gcc \
GOOS=android \
GOARCH=arm \
GOARM=7 \
go build -buildmode=c-shared -o libhoge.so hoge.go
作成した.so
ファイルをUnityに取り込みます。
Assets
以下にPlugins/Android
以下にできたlibhoge.so
ファイルを置きます。
iOSのネイティブプラグインを作る
クロスコンパイラを再ビルドしないといけないらしいので、$GOROOT/misc/iosにある通りに、make.bash
を走らせます。なお、通常のGo(1.5以上)をソースからビルドする際と同じように$GOROOT_BOOTSTRAP
も設定する必要があります。
※追記 以下の記事にGo Mobileのツールチェインを使う方法について書きました。 この方法であれば、ツールチェインをビルドし直す必要がありません。 http://qiita.com/tenntenn/items/11b2d08af6186b436422 —追記 終わり—-
$ cd $GOROOT/src
$ GOROOT_BOOTSTRAP=/path/to/go1.4/ \
GOARM=7 \
CGO_ENABLED=1 \
GOARCH=arm \
CC_FOR_TARGET=`pwd`/../misc/ios/clangwrap.sh \
CXX_FOR_TARGET=`pwd`/../misc/ios/clangwrap.sh ./make.bash
続いて、.a
ファイルを以下のように作ります。
CGO_ENABLED=1 \
GOARCH=arm \
go build -buildmode=c-archive -tags=ios hoge.go
hoge.a
ファイルができるので、それをUnityに取り込みます。
Assets
以下にPlugins/iOS
以下にできたhoge.a
ファイルを置きます。
hoge.h
はなくてもビルドできるようです。
XCodeプロジェクトを出力した後に以下の設定を行います。
- BuildSettings > Build Options > Enable BitcodeをNoにする
- BuildSettings > Architectures > ArchitecturesをArm7だけにする。
試していませんが、Arm64用もビルドすれば、おそらく動くとは思います。
Unity側に呼び出すコードを書く
以下のようなコードを書くと呼び出せます。
うまく呼び出せていたら、n = 100
とコンソールに表示されます。
using UnityEngine;
using System.Runtime.InteropServices;
public class Sample : MonoBehaviour
{
#if UNITY_IPHONE
[DllImport("__Internal")]
#else
[DllImport("hoge")]
#endif
private static extern int Hoge();
void Start()
{
var n = Hoge();
Debug.LogFormat("n = {0}", n); // n = 100
}
}
まとめ
UnityからGoで書いたネイティブプラグインを呼び出す方法について紹介しました。
net/http
などの標準ライブラリは問題なく使えると思うので、通信部分をGoで書くということもアリなのではないかなと思います。
気になるのは、.so
ファイルや.a
ファイルの容量ですが、今回作った.so
ファイルについては1.1MBで.a
ファイルについては883KBでした。
go build
する際に-ldflags "-s"
を指定して、シンボルテーブルを削ると、.so
ファイルは793KBまで減りました。
おそらく、.a
ファイルについても同様に軽くなると思います。
Go MobileのJavaバインドみたいにC#バインドを書けばもっと便利になりそうです。
また、UnityのネイティブプラグインはJavaやObj-Cでも書けるので、頑張ればgomobile bind
で作ったGoのSDKも使えるとは思います。