こんにちは。京都事業部の大西です。
今回はUnityとiOS SDKの連携方法についてご紹介します。
連携の方法としてスタンダードなものは、
Objective-C、またはC++などで書かれたコードをプラグインとしてUnityに読み込むというものなんですが、
実は結構手間がかかるので、もっと簡単にサクッとできる実装方法を今回はご紹介しようと思います。
※ プラグインの作成方法は下記の記事がわかりやすいです。
iPhone/iPadのプラグインを作成する方法 – 強火で進め
UnityからiOSのプログラムを呼び出したい場合
今回実装に使用するのが、PlayerPrefsというUnityのクラスです。
これは、FlashでいうSharedObjectのようなもので、簡単なデータをローカルに保存することができるクラスとなっています。
PlayerPrefsの保存先は、書き出し先のプラットフォームにより異なるのですが、
iOSの場合では、iOS SDKに用意されているNSUserDefaultsと同じ場所に保存されるようになっています。
このNSUserDefaultsも同様にローカルにデータを保存するためのクラスなので、
UnityからはPlayerPrefsクラスを使って、iOSからはNSUserDefaultsを使って同一データに書き込むことができるようになっています。
NSUserDefaultsはObserverを指定することにより、書き込み状態を監視することができるので、
これを用いることで、UnityからiOSのプログラムを呼び出すことが可能になります。
下記はUnity側からUIAlertViewを呼び出す際のコードの例です。

<Unity側のコード>
PlayerPrefs.SetString("test","value");
<iOS側のコード>
-(void)適当なメソッド{
NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
[defaults addObserver:self forKeyPath:@"test" options:0 context:nil];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"test"]) {
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"test"
message:@"テスト"
delegate:nil
cancelButtonTitle:nil
otherButtonTitles:@"OK", nil];
[alert show];
}
}
この方法の注意点としては、大きなデータの受け渡しが難しいことと、
NSUserDefaultsに書き込むまでのラグが若干あるので、
シビアなタイミング要求される実装にはあまり向かないということが挙げられます。
iOSからUnityのプログラムを呼び出したい場合
iOSからUnityのプログラムを呼び出したい場合は非常にシンプルです。
UnityからiOS用にビルドすると、UnitySendMessageというメソッドが用意されているので、
それを用いることでUnityのプログラムを呼び出すことが可能です。
UnitySendMessage("GameObjectName1", "MethodName1", "Message to send");
第1引数に対象となるGameObjectの名前、第2引数に対象となるメソッドの名前、
第3引数にメソッドに渡したい引数を指定することが可能です。
・参考
Unity – Plugins – Pro/Mobile-Only Feature