強火で進め

このブログではプログラム関連の記事を中心に書いてます。

【Unity Proのみ対応】 Mac 環境のプラグインを作成

プラグインの作成についてはこちらのページで解説されています。

Unity - Plugins (Pro/Mobile-Only Feature)
http://docs.unity3d.com/Documentation/Manual/Plugins.html

デスクトップのプラグインを作成する場合には合わせて以下のページを参考にします。

Unity - Building Plugins for Desktop Platforms
http://docs.unity3d.com/Documentation/Manual/PluginsForDesktop.html

こちらのページの「Simplest Plugin」とういう項目にはサンプルへのリンクが有ります。

サンプルの解説

サンプルを解凍するとこの様なフォルダ構成に成っています。

【フォルダの内容】

XCodePlugin: Mac のプラグインを作成する為のコード
VS2008Plugin: Windos のプラグインを作成する為のコード
Unity Project Plugin:上記2つのプラグインを使った Unity のサンプル

Mac の場合は Loadable Bundle という形式のものを作成します。今回のサンプルでは ASimplePlugin.bundle というファイル名で作成されます。

Unity のサンプルでは Plugins のフォルダに格納されています。

プラグインを使う為にはプラグインのファイル以外にもプラグインのメソッドなどを Unity で使える様にインターフェイスを繋ぐ様なプログラムを Unity 側に準備する必要が有ります。

サンプルではこのプログラムは Plugins フォルダの ASimplePlugin.cs がそのプログラムとなります。

内容は以下の様に成っています。
【ASimplePlugin.cs】

using UnityEngine;
using System.Collections;
using System;
using System.Runtime.InteropServices;

public class PluginImport : MonoBehaviour {
	//Lets make our calls from the Plugin
	[DllImport ("ASimplePlugin")]
	private static extern int PrintANumber();
	
	[DllImport ("ASimplePlugin")]
	private static extern string PrintHello();
	
	[DllImport ("ASimplePlugin")]
	private static extern int AddTwoIntegers(int i1,int i2);

	[DllImport ("ASimplePlugin")]
	private static extern float AddTwoFloats(float f1,float f2);	
	
	void Start () {
		Debug.Log(PrintANumber());
		Debug.Log(PrintHello());
		Debug.Log(AddTwoIntegers(2,2));
		Debug.Log(AddTwoFloats(2.5F,4F));
	}
}

ここでは int PrintANumber() の処理について解説します。

まずは以下の記述でプラグインのファイルから int PrintANumber() の定義を引き出しています。

	[DllImport ("ASimplePlugin")]
	private static extern int PrintANumber();

DllImport () の部分ではにはプラグインの拡張子部分を除いたファイル名を記述します。今回のプラグインのファイルは ASimplePlugin.bundle ですので ASimplePlugin と記述して有ります。次の行の記述により、実際に関数を利用する事が可能になります。

他の関数についても同様の記述を行う事により Unity で利用可能に成ります。

サンプルではこの記述と実際に利用する記述が同一のクラスに書かれていますが実際に使う場合には他のクラスから呼び出したい場合が多いかと思います。

他のクラスから呼び出したい場合には PluginImport に以下の様なメソッドを追加します。

	public static int PrintANumber_() {
		return PrintANumber();
	}

この様に記述すると他のクラスからこの様に利用出来ます。

Debug.Log("PluginImport.PrintANumber_() : " + PluginImport.PrintANumber_());

1から作る時

次に自分で1から作る時の手順を解説します。

まずは Xcode で Loadable Bundle 用のテンプレートを選択してプロジェクトを作成します。現在の Xcode では Frameworks & Library の中の Bundle が該当のテンプレートです。

後は C/C++/Objective-C/Objective-C++ の中からお好みのファイルを追加して関数なり、クラスなりを作成すればOKです。

ここで C++Objective-C++ を使う時には以下の様に

extern "C" {
  float FooPluginFunction ();
} 

ネーム・マングリング(name mangling)やリンケージ指定などと呼ばれる記述が必要です。

Build Settings

その他の注意点として Build Settings を一部変更する必要が有ります。まずはUnityで使用するプラグインは32bitのみに対応しているので Architectures を32bitに変更します。

続いて Objective-CObjective-C++ を使っている場合にはARC(Automatic Reference Counting)を切る必要が有ります。ARC対応は64bitアプリでないと使えない為、有効に成っていると「-fobjc-arc is not supported with fragile abi」というビルドエラーが発生します。

関連リンク

iPhone/iPadプラグインを作成する方法(改訂版) - 強火で進め
http://d.hatena.ne.jp/nakamura001/20120504/1336095282