nirasan's tech blog

趣味や仕事の覚え書きです。Linux, Perl, PHP, Ruby, Javascript, Android, Cocos2d-x, Unity などに興味があります。

Unity でネイティブプラグインを使って ActivityIndicator の画像変更と画面中央での表示(iOS編)

iOS 側のコード

  • 以下のスクリプトを Unity の Assets/Plugins/iOS に MyActivityIndicator.mm として保存する
  • http://tsubakit1.hateblo.jp/entry/2014/08/19/010141 からの変更点は
    • 親ビューの取得がなんかうまくいかなかったので GetAppController から UnityGetGLViewController に
    • 背景色を半透明の黒に
    • 画像の表示位置を画面中央に
#import "UnityAppController.h"
 
UIImageView *imageView;
UIView *backgroundView;
NSMutableArray *imageList;

const int kImageCount = 4;
NSString* const kImageNameFormat = @"anim%02d.png";

extern "C" {
    void InitMyActivityIndicator();
    void StartMyActivityIndicator();
    void EndMyActivityIndicator();
}
 
void InitMyActivityIndicator()
{
    imageList = [NSMutableArray array];
    for (NSInteger i = 0; i < kImageCount; i++) {
        NSString *imagePath = [NSString stringWithFormat:kImageNameFormat, i];
        UIImage *img = [UIImage imageNamed:imagePath];
        [imageList addObject:img];
    }
    UIImage *img = [imageList objectAtIndex:0];
    CGSize cs = img.size;
    CGRect pr = [[UIScreen mainScreen] bounds];
    CGRect rect = CGRectMake(
        (pr.size.width / 2 - cs.width / 2),
        (pr.size.height / 2 - cs.height / 2),
        cs.width,
        cs.height
    );
    imageView = [[UIImageView alloc]initWithFrame:rect];
    imageView.image = imageView.image = [imageList objectAtIndex:0];
    imageView.animationImages = imageList;
    imageView.animationDuration = 0.5;
    imageView.animationRepeatCount = 0;
}

void CreateBackgroundView () {
    CGRect pr = [[UIScreen mainScreen] bounds];
    backgroundView = [[UIView alloc] init];
    backgroundView.frame = CGRectMake(0, 0, pr.size.width, pr.size.height);
    backgroundView.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    [UnityGetGLViewController().view addSubview:backgroundView];
} 
 
void StartMyActivityIndicator() {
    InitMyActivityIndicator();
    CreateBackgroundView();
    [UnityGetGLViewController().view addSubview:imageView];
    [imageView startAnimating];
}

void EndMyActivityIndicator()
{
    [imageView removeFromSuperview];
    [backgroundView removeFromSuperview];
}
画像の取り込み手順
  • iOS 側で表示する画像は XCode のプロジェクト内に取り込む必要がある
  • 上記のコードでは前回の Plugins/Android/res/drawable/*.png を使いまわす想定
  • 以下手順
    • Unity で Platform を iOS にしてビルド
    • XCode でプロジェクトを開く
    • Images.xcassets を選択し
    • 中央ペインで右クリック
    • Import を選んで前記の画像を選択して Open で取り込む

Unity 側のコード

  • 以下のスクリプトを任意の GameObject にアタッチする
  • StartActivityIndicator で表示、StopActivityIndicator で非表示
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;

public class ActivityIndicator : SingletonMonoBehaviour<ActivityIndicator>{

    #if UNITY_IOS
    [DllImport("__Internal")]
    static extern void InitMyActivityIndicator();

    [DllImport("__Internal")]
    static extern void StartMyActivityIndicator();

    [DllImport("__Internal")]
    static extern void EndMyActivityIndicator();
    #endif

    public void Start()
    {
        #if UNITY_IOS
        InitMyActivityIndicator ();
        DontDestroyOnLoad(gameObject);
        #endif
    }

    public void StartActivityIndicator(){
        #if UNITY_IOS
        StartMyActivityIndicator();
        #endif
    }

    public void StopActivityIndicator()
    {
        #if UNITY_IOS
        EndMyActivityIndicator();
        #endif
    }
}