facebook twitter hatena line email

「Unity/Native連携」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(iOS-Unity連携)
 
(同じ利用者による、間の19版が非表示)
行1: 行1:
=Android-Unity連携=
+
[[Unity/Native連携/Android連携]]
==android側でaarライブラリを作成==
+
以下の"aarライブラリ作成項目を確認してaarファイルを作成する
+
  
[[Android/開発環境/AndroidStudio/aarライブラリ作成読込方法]] [ショートカット]
+
[[Unity/Native連携/Kotlin連携]]
  
<pre>
+
[[Unity/Native連携/Swift連携]]
package com.example.mylibrary.renkeilib;
+
import android.util.Log;
+
public class UnityRenkei {
+
    public static boolean teststatic(boolean flag) {
+
        return flag;
+
    }
+
    public boolean test(boolean flag) {
+
        return flag;
+
    }
+
    public void testexec() {
+
        Log.i("test", "testexec");
+
    }
+
}
+
</pre>
+
  
==Android-unity連携する==
+
[[Unity/Native連携/Kotlinバックグランドアラーム]]
#aarをAssets/Plugins/Android/の下に配置する
+
#以下コードを実行する
+
  
<pre>
+
[[Unity/Native連携/Kotlinバックグランド通知]]
using UnityEngine;
+
using System.Collections;
+
public class ExampleClass : MonoBehaviour
+
{
+
    [SerializeField] Button button;
+
    void Start()
+
    {
+
        button.onClick.AddListener(CallMethod);
+
    }
+
    void CallMethod()
+
    {
+
#if UNITY_ANDROID && !UNITY_EDITOR
+
        try
+
        {
+
            AndroidJavaObject jo = new AndroidJavaObject("com.example.mylibrary.UnityRenkei");
+
            bool flag = jo.Call<bool>("test", true);
+
            bool flagstatic = jo.CallStatic<bool>("teststatic", true);
+
            bool flagfalse = jo.Call<bool>("test", false);
+
            bool flagstaticfalse = jo.CallStatic<bool>("teststatic", false);
+
            jo.Call("testexec");
+
            Debug.Log("flag=" + flag);
+
            Debug.Log("flagstatic=" + flagstatic);
+
            Debug.Log("flagfalse=" + flagfalse);
+
            Debug.Log("flagstaticfalse=" + flagstaticfalse);
+
        }
+
        catch (System.Exception e)
+
        {
+
            Debug.LogError("Failed to call Android method: " + e.Message);
+
        }
+
#endif
+
    }
+
}
+
</pre>
+
このように表示されればとりあえず成功。Android実機のみで、UnityEditorだと動作しないので注意。
+
<pre>
+
I Unity   : flag=True
+
I Unity  : (Filename: ./Runtime/Export/Debug.bindings.h Line: 43)
+
I Unity  : flagstatic=True
+
I Unity  : (Filename: ./Runtime/Export/Debug.bindings.h Line: 43)
+
I Unity  : flagfalse=False
+
I Unity  : (Filename: ./Runtime/Export/Debug.bindings.h Line: 43)
+
I Unity  : flagstaticfalse=False
+
I Unity  : (Filename: ./Runtime/Export/Debug.bindings.h Line: 43)
+
</pre>
+
  
==com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicateエラーが起こったとき==
+
[[Unity/Native連携/Swiftバックグランド通知]]
コピーミスなどにより、Assetrs/Plugins/Android/classes.jarがあるとクラスが2重となっている可能性がある。
+
一旦classes.jarを消してみる。
+
 
+
==参考==
+
AndroidJavaObject公式:https://docs.unity3d.com/ja/current/ScriptReference/AndroidJavaObject.html
+
Unity-Android-Plugin:https://qiita.com/keidroid/items/455c61de9355eff2a907
+
 
+
=iOS-Unity連携=
+
Unityに記述
+
<pre>
+
using System.Runtime.InteropServices;
+
using UnityEngine;
+
 
+
public class ExampleClass : MonoBehaviour
+
{
+
    // DllImportでObjective-Cのラッパーメソッドを指定
+
    [DllImport("__Internal")]
+
    private static extern void _testStaticMethod();
+
 
+
    [DllImport("__Internal")]
+
    private static extern void _testMethod();
+
 
+
    [DllImport("__Internal")]
+
    private static extern void _testExecMethod();
+
 
+
    void Start()
+
    {
+
#if UNITY_IOS && !UNITY_EDITOR
+
        _testStaticMethod();  // Swiftのstaticメソッド呼び出し
+
        _testMethod();        // Swiftのインスタンスメソッド呼び出し
+
        _testExecMethod();    // Swiftの別のインスタンスメソッド呼び出し
+
#endif
+
    }
+
}
+
</pre>
+
 
+
xcode側で、UnityRenkei.swiftを作成し、以下を貼り付ける
+
<pre>
+
import Foundation
+
 
+
@objc public class UnityRenkei: NSObject {
+
    @objc public static func teststatic(_ flag: Bool) -> Bool {
+
        return flag
+
    }
+
 
+
    @objc public func test(_ flag: Bool) -> Bool {
+
        return flag
+
    }
+
 
+
    @objc public func testexec() {
+
        print("testexec")
+
    }
+
}
+
</pre>
+
 
+
 
+
ブリッジングヘッダーの Swift クラスを追加。UnityRenkeiBridge.hをFile > New > File> Header Fileで、作成し、以下を貼り付ける。
+
<pre>
+
#import "Unity-iPhone-Swift.h"
+
</pre>
+
 
+
 
+
Objective-C ラッパーのUnityBridge.mをFile > New > File> Objective-C Fileで、作成し、以下を貼り付ける。
+
<pre>
+
#import <Foundation/Foundation.h>
+
#import "Unity-iPhone-Swift.h" // Bridging HeaderでSwiftクラスをインポート
+
 
+
@interface UnityBridge : NSObject
+
@end
+
 
+
@implementation UnityBridge
+
 
+
// Unityから呼び出せるSwiftメソッドのラッパー
+
void _testStaticMethod() {
+
    bool flag = [UnityRenkei teststatic:true];  // Swiftのstaticメソッドを呼び出す
+
    NSLog(@"Flag: %d", flag);
+
}
+
 
+
void _testMethod() {
+
    UnityRenkei *renkei = [[UnityRenkei alloc] init];
+
    bool flag = [renkei test:true];  // Swiftのインスタンスメソッドを呼び出す
+
    NSLog(@"Flag: %d", flag);
+
}
+
 
+
void _testExecMethod() {
+
    UnityRenkei *renkei = [[UnityRenkei alloc] init];
+
    [renkei testexec];  // Swiftのインスタンスメソッドを呼び出す
+
}
+
 
+
@end
+
</pre>
+
 
+
UnityBridge.hをFile > New > File> Header Fileで、作成し、以下を貼り付ける。
+
<pre>
+
#ifndef UnityBridge_h
+
#define UnityBridge_h
+
 
+
#ifdef __cplusplus
+
extern "C" {
+
#endif
+
 
+
void _testStaticMethod();
+
void _testMethod();
+
void _testExecMethod();
+
 
+
#ifdef __cplusplus
+
}
+
#endif
+
 
+
#endif /* UnityBridge_h */
+
</pre>
+
 
+
*xcodeのBuildSettingのDefines Module を YES に設定。
+
*xcodeのBuildPhasesのCompileSourcesに、UnityBridge.mを追加
+
*xcodeのBuildSettingsで、OtherLinkerFlagsで、"-ObjC"を追加
+
 
+
Unity-iPhone-Swift.hは、ビルドが成功すると、自動生成されるが、以下のようなコードとなる。
+
<pre>
+
#import <Foundation/Foundation.h>
+
 
+
// Swift クラス UnityRenkei のインターフェース
+
@interface UnityRenkei : NSObject
+
 
+
// Swift の static メソッドの宣言
+
+ (BOOL)teststatic:(BOOL)flag;
+
 
+
// Swift のインスタンスメソッドの宣言
+
- (BOOL)test:(BOOL)flag;
+
 
+
// Swift のインスタンスメソッドの宣言
+
- (void)testexec;
+
 
+
@end
+
</pre>
+

2024年9月11日 (水) 17:16時点における最新版

Unity/Native連携/Android連携

Unity/Native連携/Kotlin連携

Unity/Native連携/Swift連携

Unity/Native連携/Kotlinバックグランドアラーム

Unity/Native連携/Kotlinバックグランド通知

Unity/Native連携/Swiftバックグランド通知