【Unity5】【iOS】UnityのView上にUIViewを出したり消したり
諸事情から、Unityの画面上にUIView(UIImageView)を出してみる実験をしてみました。
ちなみにタイトルにわざわざUnity5と付けているのは、無料ユーザーでもiOSのプラグインが使えるからですw 確認はしていませんが、おそらく4系でも動くと思います。
やったこと
- Unity上のOpenボタンを押すと、画面上部に画像を表示する。
- Closeボタンを押すと画像を非表示にする。
- 表示する画像はiOS用のプラグインを作成して、UIImageViewを画面に追加することで実現する
Unityプロジェクトの作成
とりあえず画像を表示するためのGUIボタンを作成し、ついでにScene上にCubeを追加しておきます。
なお、今回Cubeは特に使用しないため、追加しなくても良いです。
CtrlUnityView.cs
using UnityEngine;
using System.Collections;
public class CtrlUnityView : MonoBehaviour
{
void Start()
{
// プラグインを初期化.
CtrlPlugins.Init();
}
void OnGUI()
{
if(GUI.Button(new Rect(50f, 400f, 100f, 100f), "Open 0"))
{
CtrlPlugins.Open(0);
}
if(GUI.Button(new Rect(200f, 400f, 100f, 100f), "Open 1"))
{
CtrlPlugins.Open(1);
}
if(GUI.Button(new Rect(50f, 600f, 100f, 100f), "Close"))
{
CtrlPlugins.Close();
}
}
}
- 「CtrlPlugins.〜」の部分からプラグインを呼び出します。
プラグインを呼び出す
プラグインにアクセスするコードを、Unity側、iOS側でそれぞれ作成して連携する、という流れになります。
Unity側
Assets > Pluginsに、以下のようなコードを追加します。
CtrlPlugins.cs
using UnityEngine;
using System.Runtime.InteropServices;
public class CtrlPlugins : MonoBehaviour
{
[DllImport("__Internal")]
private static extern void init_();
[DllImport("__Internal")]
private static extern void open_(int intImageNum);
[DllImport("__Internal")]
private static extern void close_();
public static void Init()
{
init_();
}
public static void Open(int intImageNum)
{
open_(intImageNum);
}
public static void Close()
{
close_();
}
}
で、Unity側からは「public static void Init()」にアクセスしてプラグインのメソッドを実行する感じです。
iOS側
Assets > Plugins > iOSに、以下のようなコードを追加します。
PluginConnector.mm
#import "ViewController.h"
extern "C"{
ViewController *vwcView;
void init_()
{
vwcView = [[ViewController alloc] init];
[vwcView initImageView];
}
void open_(int intImageNum)
{
[vwcView addImageView: intImageNum];
}
void close_()
{
[vwcView removeImageView];
}
}
- Cのコードと、Objective-Cのコードを使用するため、ファイルの拡張子は.mmにしておく必要があります。
- このコードはUnityでビルドしてXcodeで開くと、Libraries > Plugins > iOSの中に配置されます。
なおXcodeで内容を変更しても問題ありませんが、Unityでビルドするたびに元に戻るため、保存しておきたい内容はUnity側で変更したほうが良いです。
以上でUnityEditorを使って行う作業は終了です。
BuildSettingsからPlatformをiOSに変更してビルドします。
Xcode上でコードを追加
ビルドが終わったら、実際にView上に画像を追加・削除するViewController.h / ViewController.mを作成します。
ViewController.h
@interface ViewController: NSObject - (void) initImageView; - (void) addImageView: (NSInteger)intImageNum; - (void) removeImageView; @end
ViewController.m
#import "ViewController.h"
@interface ViewController()
@property (strong, nonatomic)UIViewController *vwcUnityView;
@property (strong, nonatomic)NSArray *aryImage;
@property (strong, nonatomic)UIImageView *imvImageView;
@end
@implementation ViewController
- (void) initImageView
{
// 画像を配列に追加する.
UIImage *imgBeer = [UIImage imageNamed:@"beer.png"];
UIImage *imgTrain = [UIImage imageNamed:@"train.png"];
_aryImage = [NSArray arrayWithObjects:imgBeer, imgTrain, nil];
}
- (void) addImageView: (NSInteger)intImageNum
{
// 前に追加したViewを削除する.
[self removeImageView];
// 追加するImageViewの設定.
_imvImageView = [[UIImageView alloc] initWithImage:(UIImage *)[_aryImage objectAtIndex:intImageNum]];
_imvImageView.frame = CGRectMake(50, 10, 150, 150);
// UnityのViewを取得して、SubViewとして追加する.
_vwcUnityView = UnityGetGLViewController();
[_vwcUnityView.view addSubview:_imvImageView];
}
- (void) removeImageView
{
// UnityのViewから
[_imvImageView removeFromSuperview];
}
@end
コメントの通りなのですが、注目すべきところは「UnityGetGLViewController()」で、これがUnityアプリで表示されるViewなのですね。
これに対してSubViewを追加・削除することで項目の表示・非表示ができると。
今回はUnityのView上にXcodeでViewを追加しましたが、逆にUIView上にUnityのViewを表示するのも試してみたいところです。