あーるPG - 社会人のデジタル生活

日曜プログラマになろうかなーと思った30代理系社会人の、キャリアアップや趣味(特にデジタル情報)の記録。らーめんとビールが好き。

Unityの自作プラグインを作る(前編)

プラグインの概要

Unityでは動的にリンクするライブラリを作っておけば、スクリプトC#など)から呼び出せます。
WindowsであればDLLにあたります。

大まかな手順です。

  1. VisualStudioなどで普通にDLLを作ります。
  2. その作ったDLLを、x86向けであればプロジェクトのAssets/Plugins/x86/に配置します。
  3. C#上でDLL名と関数宣言を記載すると、DLL内の関数が使えるようになります。PluginNameはUnity側でチェックされるので、作成時VisualStudioで指定する”ライブラリの名前”、ファイル名と合わせなければダメです。
	[DllImport ("PluginName")]
	private static extern float FooPluginFunction (); 

iOS等、ダイナミックリンクの形式にできない場合は別の表記法になります。
参考:http://docs-jp.unity3d.com/Documentation/Manual/PluginsForDesktop.html

ネイティブに組み込まなければいけないので、UnityEditor上で動作するPluginをWebから持って来てもダメです。
例えばiOSで動作させたいなら、iOSネイティブで動作するプラグインが必要となります。

ビルドターゲットの指定

Editorの [File] - [Build Settings] でPlatformを指定し、Build & Runを実行。
その後はCTRL+Bを押せばビルドから実行までやってくれます。

プラットフォーム依存コード

プラグインはネイティブ実装なので、Unityのエディタ上では動作しません。WebPlayerでも動作しません。
しかしゲームの開発にはエディタを使用したいので、プラグインを使用するかを環境によって分岐させます。

分岐にはdefine的な定義とAPIがあります。DLLの呼び出しは関数内で分岐させるのではないので、定義で分岐させます。

	#if UNITY_STANDALONE_WIN && !UNITY_EDITOR &&
		//Pluginを使用.
	#endif

ちなみにAPIを使用する場合は以下の通り。

	if (Application.platform == RuntimePlatform.WindowsPlayer){
		//Windows依存コード
	}

指定できる環境は https://docs.unity3d.com/Documentation/ScriptReference/RuntimePlatform.html を参照。
WiiPS3も指定できます。

プラグイン作成のTIPS

  • まずはPlugin側をネイティブ環境でじっくり作り込みましょう。
    バグが出たときにUnity、呼び出し、プラグインのどこが悪いのかわからなくなります。
    ネイティブで作りこむということで、Unity使わなくていいじゃん!と私も思いますが、ゲームとライブラリは別に作るのも仕方ないです。
  • ログ出力を大いに利用しましょう。
    スクリプト側のDebug.Log()はネイティブ側のprinft()など標準出力に変換されているようです。
    プラグイン内でもprintf()が使えるので、出来るだけ情報を出しましょう。
  • ネイティブプレイヤーのビルドは非常に時間がかかるので、時間を有効に使うよう心がけましょう。
    再ビルド不要であればCTRL+BではなくExplorerなどから直接呼び出したほうが速いです。
  • API呼び出しは単純化しましょう。
    C/C++で作成したAPIC#から呼び出すということは、UnmanagedコードをManagedコードから呼び出すということです。
    これが非常に難解で、お互い歩み寄らないとドツボにはまります。
    プラグインを自分で作ったのであれば、単純に呼び出せるようにAPIを調整したほうが良いです。(後編につづく)
  • 折れない心
    これが一番必要です。それぐらいしんどい作業です。
    できればプラグインを使わないに越したことはありません。


API呼び出し関連は次回に。