ARFoundationに基づいてiOSとAndroidのデュアルプラットフォーム互換の構成手順を開発する

1。開発環境の説明

開発プラットフォーム:Windows 10 X64

Unityバージョン:Unity2019.3.0f6

ARFoundation関連のパッケージパッケージバージョン:

ARFoundationプレビュー.4-3.1.0

ARCoreXRPluginプレビュー.4-3.1.0

ARKitXRPluginプレビュー.4-3.1.0

ARKitFaceTrackingプレビュー.4-3.1.0

ARFoundation関連のパッケージのバージョンは一貫している必要があります。そうしないと、リリース後に異なるプラットフォーム表示効果やバグが発生する可能性があります。

 

2.開発前のUnity環境の構成

プロジェクトでユニバーサルレンダーパイプラインを使用する必要がある場合は、新しいシーンを作成するときにユニバーサルレンダーパイプラインをチェックせず、デフォルトで空のプロジェクトを選択することをお勧めします。プロジェクトを作成した後、ユニバーサルレンダーパイプラインを追加して構成します。 PackageManagerで。

 

 

同時に、同じバージョンのARFoundation関連のプラグインをPackageManagerに追加する必要もあります。

三。関連するプラグインの役割の説明

ARFoundationARのコアのロードと表示

AR関数の依存関係を使用するためにAndroidプラットフォームにリリースされたARCoreXRPluginは、コアバージョンと一致している必要があります

AR関数の依存関係を使用するためにiOSプラットフォームにリリースされたARKitXRPluginpreview.4-3.1.0は、コアバージョンと一致している必要があります

ARKitFaceTracking Preview.4-3.1.0 iOSプラットフォームの顔追跡の依存関係、コアバージョンとの整合性が必要

 

ARFoundationはAndroidのarcoreとiosのarckitに依存してAR機能を実現しているため、開発プロセス中の開発やデバッグにWebカメラを直接使用することはできません。効果はモバイル端末に公開した後にのみ確認できるため、バグが発生する可能性のある場所を特定するための可能なデバッグ出力

 

四。メソッド呼び出しとプリコンパイルされたマクロ命令

AndroidとiOSはUnityのC#パブリッククラスのパブリックメソッドを直接呼び出すことができますが、呼び出すことができるのはvoid型関数と戻り値型関数のみであることに注意してください。ただし、プラットフォームが異なれば、値を取得する際の問題も異なります。コールバックメソッドを使用することをお勧めします。値を渡すため。

1.Android

   UnityのAssertディレクトリにPluginsフォルダを作成し、その中にJavaクラスファイルを保存するAndroidフォルダを作成する必要があります。UnityはAndroidJavaClassメソッドを介して対応するJavaクラスを取得できます。

package com.xx.ar;
import android.os.Bundle;
import android.widget.FrameLayout;

import com.unity3d.player.UnityPlayerActivity;

public abstract class xxUnityActivity extends UnityPlayerActivity
{
    //
    abstract protected void function1(String var);
   //
    abstract protected void function2();
     //
    abstract protected void function3();
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        instance = this;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        instance = null;
    }
}

 

 

   Javaクラスを作成したら、パネルのプラグインに対応するプラットフォームを確認して、Androidプロジェクトファイルの生成時にJavaクラスからアクセスできるようにする必要があります。

 

コードでは、マクロを使用して現在のプラットフォームを判別し、対応するコールバックイベントをトリガーします。これは、コールバックが抽象関数で宣言されており、対応する関数がJava側で上書きされる限り、コールバックを直接実行できるためです。

#if UNITY_ANDROID

                AndroidJavaClass jc = new AndroidJavaClass("com.realibox.ar.RealiboxUnityActivity");

                AndroidJavaObject activity = jc.GetStatic<AndroidJavaObject>("instance");

                activity.Call("function", value.ToString());

#endif

2. ios端

    UnityのAssertディレクトリにPluginsフォルダーを作成し、その中にObjectcクラスファイルを格納するIOSフォルダーを作成する必要があります。Unityは、NativeAPIクラスをカスタマイズすることで、対応するコールバックメソッドを取得できます。

objectcクラスを作成した後、パネル上のプラグインに対応するプラットフォームを確認して、iosプロジェクトファイルの生成時にobjectcクラスからアクセスできるようにする必要があります。iosは対応する.hヘッダーファイルを作成する必要があることに注意してください。同じ名前の.mmカテゴリ。

xx.h

// [!] important set UnityFramework in Target Membership for this file
// [!]           and set Public header visibility

#import <Foundation/Foundation.h>

// NativeCallsProtocol defines protocol with methods you want to be called from managed
@protocol NativeCallsProtocol
@required

-(void)function1:(char*)var;
//
-(void)function2:(char*)var2;
//
-(void)functoin;
// other methods
@end

__attribute__ ((visibility("default")))
@interface FrameworkLibAPI : NSObject
// call it any time after UnityFrameworkLoad to set object implementing NativeCallsProtocol methods
+(void) registerAPIforNativeCalls:(id<NativeCallsProtocol>) aApi;

@end


xx.mm

#import <Foundation/Foundation.h>
#import "NativeCallProxy.h"


@implementation FrameworkLibAPI

id<NativeCallsProtocol> api = NULL;
+(void) registerAPIforNativeCalls:(id<NativeCallsProtocol>) aApi
{
    api = aApi;
}

@end

extern "C" {

        void function1(char* var1) {
        return [api function1:var1];
    }

        void function2(char* var2) {
        return [api function2:var2];
    }

        void function3() {
        return [api function3];
    }
}

Unityでは、NativeAPIクラスを事前に定義する必要があります。このクラスは、以前に.hで認識されていたすべてのメソッドを定義します。NativeAPIは、プリコンパイルされたマクロで作成できます。

#if UNITY_IOS || UNITY_TVOS

public class NativeAPI {

    [DllImport("__Internal")]

    public static extern void function2(string status);

    [DllImport("__Internal")]

    public static extern void function1(string msg);

}

#endif

このようにして、コールバックメソッドはプリコンパイルされたマクロで直接トリガーできます

#elif UNITY_IOS || UNITY_TVOS

            NativeAPI.function1();

#endif

UnityはC#コードで記述されており、コールバックの名前はC#形式で定義されているため、iosまたはAndroidプラットフォームのどちらであっても、コールバックメソッドで渡されるパラメーターは文字列タイプの関数のみをサポートすることに注意してください。 javaクラスでは、文字列名をStringに置き換える必要があります。対応する.hクラスと.mmクラスでは、文字列名を(char *)に置き換える必要があります。

 

ファイブ。モバイルプラットフォームのリリース構成

1.Android

   Android端末がAndroidパッケージまたはアプリケーション埋め込み用のプロジェクトとしてリリースされている場合は、BuildSettingsで[プロジェクトのエクスポート]をオンにする必要があります。

   PlayerSettingsインターフェイス

   

   RealiboxShaderはガンマ空間で処理されるため、ColorSpaceをガンマに設定する必要があるため、注意すべき点がいくつかあります。GraphicsAPIはOpenGLES3のみを選択し、自動をキャンセルします。MinumApiLevelはARCoreをサポートするAndroid7.0「Nougat」(APIレベル24)を選択する必要があり、Target API Levelは自動(インストールされている最高)を選択し、XRSettingsはARCoreサポートをチェックする必要はありません

   

   

2. ios端

   Unityは、iOSのXCodeプロジェクトファイルのみを公開し、XCodeでパッケージ化してコンパイルすることができます

PlayerSettingsインターフェイス

iOSを公開する際に注意すべき点がいくつかあります。ColorSpaceをガンマに設定する必要があります(シェーダーはガンマ空間で計算されるため)。グラフィックAPIはデフォルトでメタルのみを選択し、AutoGraphicsAPIのチェックを外します。権限を取得するとiOSがポップアップします。ポップアップのテキストは、ここで手動で設定する必要があります。Target minimun IOSバージョンでは、ARKitサポートを11.0以上に設定する必要があります。そして、[ARKitサポートが必要]をオンにします。プロジェクトパッケージを他のiOSアプリケーションに埋め込む必要がある場合は、ストリップエンジンコードのチェックを外す必要があります

 

おすすめ

転載: blog.csdn.net/ssssssilver/article/details/106012118