facebook twitter hatena line email

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

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
 
(同じ利用者による、間の5版が非表示)
行3: 行3:
 
[[Unity/Native連携/Kotlin連携]]
 
[[Unity/Native連携/Kotlin連携]]
  
[[Unity/Native連携/iOS連携]]
+
[[Unity/Native連携/Swift連携]]
  
==javaをkotlinにする場合==
+
[[Unity/Native連携/Kotlinバックグランドアラーム]]
  
UnityRenkei.javaを削除し、UnityRenkei.ktを追加する
+
[[Unity/Native連携/Kotlinバックグランド通知]]
  
UnityRenkei.kt
+
[[Unity/Native連携/Swiftバックグランド通知]]
<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() {
+
        Log.i("test", "testexec")
+
    }
+
}
+
</pre>
+
プロジェクト直下のbuild.gradleにbuildscriptを追加
+
 
+
<pre>
+
buildscript {
+
    ext.kotlin_version = "1.8.10"
+
    repositories {
+
        google()
+
        mavenCentral()
+
    }
+
    dependencies {
+
        classpath "com.android.tools.build:gradle:8.1.0"
+
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+
    }
+
}
+
 
+
plugins {
+
    id 'com.android.application' version '8.1.0' apply false
+
    id 'com.android.library' version '8.1.0' apply false
+
    id 'org.jetbrains.kotlin.android' version '1.8.10' apply false
+
}
+
</pre>
+
 
+
mylibrary/build.gradleを以下の通り修正
+
<pre>
+
plugins {
+
    id 'com.android.library'
+
    id 'org.jetbrains.kotlin.android'
+
}
+
 
+
android {
+
    namespace 'com.example.mylibrary'
+
    compileSdk 34
+
 
+
    defaultConfig {
+
        minSdk 24
+
 
+
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+
        consumerProguardFiles "consumer-rules.pro"
+
    }
+
 
+
    buildTypes {
+
        release {
+
            minifyEnabled false
+
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+
        }
+
    }
+
    compileOptions {
+
        sourceCompatibility JavaVersion.VERSION_1_8
+
        targetCompatibility JavaVersion.VERSION_1_8
+
    }
+
    kotlinOptions {
+
        jvmTarget = "1.8"
+
    }
+
}
+
dependencies {
+
    implementation 'androidx.appcompat:appcompat:1.6.1'
+
    implementation 'com.google.android.material:material:1.8.0'
+
    testImplementation 'junit:junit:4.13.2'
+
    androidTestImplementation 'androidx.test.ext:junit:1.1.5'
+
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
+
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
+
}
+
 
+
==="NoClassDefFoundError"エラーが出る場合===
+
エラー詳細
+
<pre>
+
Error Unity AndroidJavaException: java.lang.NoClassDefFoundError: Failed resolution of: Lkotlin/jvm/internal/Intrinsics;
+
Error Unity java.lang.NoClassDefFoundError: Failed resolution of: Lkotlin/jvm/internal/Intrinsics;
+
</pre>
+
 
+
対策方法
+
 
+
ProjectSettingsのAndroidのCustomMainGradleTemplateをチェック
+
 
+
Assets/Plugins/Android/mainTemplate.gradle に以下を追加
+
<pre>
+
buildscript {
+
    ext.kotlin_version = '1.8.0'
+
    repositories {
+
        google()
+
        mavenCentral()
+
    }
+
    dependencies {
+
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+
    }
+
}
+
 
+
apply plugin: 'com.android.library'
+
apply plugin: 'kotlin-android'
+
dependencies {
+
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" // Kotlinランタイムを追加
+
}
+
 
+
</pre>
+
 
+
=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バックグランド通知