3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[Unity] iOS NativePluginの実装の仕方

Last updated at Posted at 2021-10-07

はじめに

Androidに引き続き、iOS側でもNativePluginの作成方法をまとめました。
ここでは、UnityでiOSのNativeアラートを表示させるまでの忘却録です。

Unity向けのiOS Pluginは作り方は人によって違うと思いますが、
今回は『UnityのiOSビルド結果であるXcodeプロジェクト上からコードを編集しました。』
もっと効率の良いやり方があればご教授下さい><;

Android版↓

環境

macOS Catalina: 10.15.7
Unity 2018.4.19f
Xcode12.4
Swift4.0

UnityとiOS Pluginの構成

Unityから書き出されるiOS関連のファイルはObjective-CベースなのでSwiftを呼び出す設定が必要です。
SwiftからObjective-Cのクラスに呼ぶには、宣言されてるヘッダーファイルを特定のヘッダーファイルでimportして使用します。
今回はObjective-C++のコードを経由させます。
呼び出しの簡易図は下記。

UnityのC#がインターフェース(.csファイル)
↑↓
↓↑
iOSネイティブ Objective-C++ Cインターフェース(.mmファイル)
↓↑
↓↑
iOSネイティブ Swiftコード(.swiftファイル)

Unity側の対応(呼び出し方法)サンプル

ボタンを押下してアラート表示は、Androidの時の対応と同様な構成にしています。
 2021-11-29 19.11.59.png

ここでのポイントは下記です。
①、[DllImport("__Internal")]属性を付けること。
ネイティブプラグイン参照

ButtonView.cs
using System.Runtime.InteropServices;
using UnityEngine;

public class ButtonView : MonoBehaviour
{
    #if UNITY_IOS && !UNITY_EDITOR
	[DllImport("__Internal")]
	private static extern void _showAlert();
    #endif

    public void ShowNativeDialog() {
        #if UNITY_IOS && !UNITY_EDITOR
		_showAlert();
		#endif
    }
}

Unity上でSwiftファイル、Objective-C++のファイルを準備

AssetsPluginiOSディレクトリが無ければ作成します。
ここにNativePluginのファイルを置きます。
 2021-09-13 19.03.20.png

AlertPlugin.swiftAlertPlugin.mmファイルを作成。中身は空です。
 2021-09-13 19.40.26.png

ビルド周りのEditor拡張が必要

やることは下記です。
①、Swiftのバージョン指定する(今回はSwift4.0)
②、Objective-C Bridging Headerの設定
③、Objective-C Generated Interface Header Nameの設定
上記を設定していきますが、便利なPluginが既に用意されてるのでこちらを参考にさせて頂きました。

AssetsEditerPostProcessor.csこちらにファイルを作ります。
 2021-11-29 19.17.31.png

PostProcessor.cs
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
using System.IO;

namespace UnitySwift {
    public static class PostProcessor {
        [PostProcessBuild]
        public static void OnPostProcessBuild(BuildTarget buildTarget, string buildPath) {
            if(buildTarget == BuildTarget.iOS) {
                var projPath = buildPath + "/Unity-iPhone.xcodeproj/project.pbxproj";
                var proj = new PBXProject();
                proj.ReadFromFile(projPath);

                string xcodeTarget = proj.TargetGuidByName("Unity-iPhone");

                proj.AddBuildProperty(xcodeTarget, "SWIFT_VERSION", "4.0");
                proj.SetBuildProperty(xcodeTarget, "ENABLE_BITCODE", "NO");
                proj.SetBuildProperty(xcodeTarget, "SWIFT_OBJC_BRIDGING_HEADER", "Libraries/Plugins/iOS/UnitySwift-Bridging-Header.h");
                proj.SetBuildProperty(xcodeTarget, "SWIFT_OBJC_INTERFACE_HEADER_NAME", "Unity-iPhone-Swift.h");
                proj.AddBuildProperty(xcodeTarget, "LD_RUNPATH_SEARCH_PATHS", "@executable_path/Frameworks");

                proj.WriteToFile(projPath);
            }
        }
    }
}

UnitySwift-Bridging-Header.h

Swiftから呼び出すObjファイルをimportします。

UnitySwift-Bridging-Header.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "UnityInterface.h"

ビルドしてiOSプロジェクトを書き出す

FileBuild SettingsBuildで書き出されるディレクトリ名を決めて作成。
 2021-09-28 16.20.36.png

Unity-iPhone.xcodeprojをXcodeで展開します。
 2021-09-28 16.25.22.png

Xcode上での作業

Xcodeを開くと下記のようなディレクトリ構造になっています。
AlertのコードはUnity-iPhoneLibrariesPluginsiOSに内包されてます。
Unityで追加したファイルはLibrariesに入るみたいです。
 2021-10-05 15.40.13.png

先程、ビルド周りのEditer拡張で指定した下記はこちらに設定されていますので、確認します。
①、Swiftのバージョン指定する(今回はSwift4.0)
②、Objective-C Bridging Headerの設定
③、Objective-C Generated Interface Header Nameの設定
 2021-11-29 20.52.19.png

Swiftコードは下記です。ここで必要なことは下記です。
①、クラスは NSObject を継承する
②、クラスのスコープを public にする
public にするのは、Objective-C++から直接呼び出したいクラスおよびメソッドだけでも良い。
③、メソッドに@objcを付ける

AlertPlugin.swift
public class AlertPlugin : NSObject {
    
    @objc static func showAlert() {
        let alertView = UIAlertController(title: "Title", message: "AlertMessage", preferredStyle: UIAlertController.Style.alert)

        let okAction = UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler:nil)
        let cancelButton = UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel, handler:nil)

        alertView.addAction(okAction)
        alertView.addAction(cancelButton)

        UIApplication.shared.keyWindow?.rootViewController?.present(alertView, animated: true, completion: nil)
    }
}

Objective-C++コードです。ここでのポイントは、下記です。
①、extern "C"宣言でCインターフェイスを作成。
②、Objective-C Generated Interface Header Nameで設定しているUnity-iPhone-Swift.hをimportすること。
これをimportするとObjective-C++のクラスのように呼び出すことができる。

AlertPlugin.mm
#import "Unity-iPhone-Swift.h"

extern "C"
{
    void _showAlert()
    {
        [AlertPlugin showAlert];
    }
}

実機確認

IMG_1747.PNG

成果物

参考

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?