facebook twitter hatena line email

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

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(kotlinバージョン)
 
(同じ利用者による、間の9版が非表示)
行1: 行1:
=Android-Unity連携=
+
[[Unity/Native連携/Android連携]]
==android側でaarライブラリを作成==
+
以下の"aarライブラリ作成項目を確認してaarファイルを作成する
+
  
[[Android/開発環境/AndroidStudio/aarライブラリ作成読込方法]] [ショートカット]
+
[[Unity/Native連携/Kotlin連携]]
  
===javaバージョン===
+
[[Unity/Native連携/Swift連携]]
UnityRenkei.java
+
<pre>
+
package com.example.mylibrary;
+
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>
+
  
===kotlinバージョン===
+
[[Unity/Native連携/Kotlinバックグランドアラーム]]
UnityRenkei.kt
+
<pre>
+
package com.example.mylibrary
+
import android.util.Log
+
class UnityRenkei {
+
    companion object {
+
        @JvmStatic
+
        fun teststatic(flag: Boolean): Boolean {
+
            return flag
+
        }
+
    }
+
    fun test(flag: Boolean): Boolean {
+
        return flag
+
    }
+
  
    fun testexec() {
+
[[Unity/Native連携/Kotlinバックグランド通知]]
        Log.i("test", "testexec")
+
    }
+
}
+
</pre>
+
  
==Android-unity連携する==
+
[[Unity/Native連携/Swiftバックグランド通知]]
#aarをAssets/Plugins/Android/の下に配置する
+
#以下コードを実行する
+
 
+
<pre>
+
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エラーが起こったとき==
+
コピーミスなどにより、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>
+
#if UNITY_IPHONE
+
using System.Runtime.InteropServices;
+
#endif
+
using UnityEngine;
+
 
+
public class ExampleClass : MonoBehaviour
+
{
+
#if UNITY_IPHONE
+
    [DllImport("__Internal")]
+
    private static extern bool _testStaticMethod(bool flag);
+
 
+
    [DllImport("__Internal")]
+
    private static extern bool _testMethod(bool flag);
+
 
+
    [DllImport("__Internal")]
+
    private static extern void _testExecMethod();
+
#endif
+
    void Start()
+
    {
+
#if UNITY_IOS && !UNITY_EDITOR
+
        bool flag = _testMethod(true);
+
        bool flagstatic = _testStaticMethod(true);
+
        bool flagfalse = _testMethod(false);
+
        bool flagstaticfalse = _testStaticMethod(false);
+
        Debug.Log("flag=" + flag);
+
        Debug.Log("flagstatic=" + flagstatic);
+
        Debug.Log("flagfalse=" + flagfalse);
+
        Debug.Log("flagstaticfalse=" + flagstaticfalse);
+
        _testExecMethod();
+
#endif
+
    }
+
}
+
</pre>
+
 
+
Assets/Plugins/iOS/UnityRenkei.swiftを作成し、以下を貼り付ける。(xcode側では、Libraries/Plugins/iOS/にある。)
+
<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>
+
 
+
Assets/Plugins/iOS/UnityBridge.mmを作成し、以下を貼り付ける。(xcode側では、Libraries/Plugins/iOS/にある。)
+
<pre>
+
#import <UnityFramework/UnityFramework-Swift.h>
+
 
+
extern "C" {
+
    // Unityから呼び出せるSwiftメソッドのラッパー
+
    bool _testStaticMethod(bool flag) {
+
        bool result = [UnityRenkei teststatic:flag];  // Swiftのstaticメソッドを呼び出す
+
        NSLog(@"result: %d", result);
+
        return result;
+
    }
+
    bool _testMethod(bool flag) {
+
        UnityRenkei *renkei = [[UnityRenkei alloc] init];
+
        bool result = [renkei test:flag];  // Swiftのインスタンスメソッドを呼び出す
+
        NSLog(@"result: %d", result);
+
        return result;
+
    }
+
    void _testExecMethod() {
+
        UnityRenkei *renkei = [[UnityRenkei alloc] init];
+
        [renkei testexec];  // Swiftのインスタンスメソッドを呼び出す
+
    }
+
}
+
</pre>
+
 
+
==出力==
+
<pre>
+
flag=True
+
flagstatic=True
+
flagfalse=False
+
flagstaticfalse=False
+
testexec
+
</pre>
+
 
+
==参考==
+
https://qiita.com/ohbashunsuke/items/8f3b7c733fc70a180941
+

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

Unity/Native連携/Android連携

Unity/Native連携/Kotlin連携

Unity/Native連携/Swift連携

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

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

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