하나. 개발 환경 설명
개발 플랫폼 : 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에서.
동시에 PackageManager에서 동일한 버전의 ARFoundation 관련 플러그인을 추가해야합니다.
세. 관련 플러그인의 역할에 대한 설명
ARFoundation AR로드 및 코어 표시
AR 기능 종속성을 사용하기 위해 Android 플랫폼에 출시 된 ARCoreXRPlugin은 코어 버전과 일치해야합니다.
ARKitXRPlugin preview.4-3.1.0을 iOS 플랫폼에 출시하여 AR 기능을 사용하려면 종속성이 코어 버전과 일치해야합니다.
ARKitFaceTracking preview.4-3.1.0 iOS 플랫폼 얼굴 추적 종속성, 코어 버전과 일치해야 함
ARFoundation은 AR 기능을 구현하기 위해 Android의 arcore 및 ios의 arckit에 의존하기 때문에 개발 과정에서 웹캠을 직접 개발 및 디버깅에 사용할 수 없습니다. 효과는 모바일 단말기에 게시 한 후에 만 확인할 수 있으므로 원하는만큼 개발할 수 있습니다. 버그가 나타날 수있는 위치를 찾기위한 가능한 디버그 출력
네. 메서드 호출 및 미리 컴파일 된 매크로 명령어
Android와 iOS는 Unity에서 C # 퍼블릭 클래스의 퍼블릭 메서드를 직접 호출 할 수 있지만 void 형 함수 만 호출 할 수 있고 리턴 형 함수를 호출 할 수 있지만 플랫폼마다 값을 가져올 때 다른 문제가 발생합니다. 콜백 메소드를 사용하는 것이 좋습니다. 값을 전달하려면
1. 안드로이드
Unity의 Assert 디렉토리에 Plugins 폴더를 생성하고 그 안에 Android 폴더를 생성하여 자바 클래스 파일을 저장해야합니다. Unity는 AndroidJavaClass 메소드를 통해 해당 자바 클래스를 가져올 수 있습니다.
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;
}
}
자바 클래스 생성 후, 안드로이드 프로젝트 파일 생성시 자바 클래스에서 접근 할 수 있도록 패널에서 Plugin에 해당하는 플랫폼을 확인해야한다.
코드에서 매크로를 사용하여 현재 플랫폼을 결정하고 해당 콜백 이벤트를 트리거합니다. 왜냐하면 콜백은 추상 함수로 선언되어 있기 때문이며, 해당 함수가 자바 측에서 덮어 쓰여지면 콜백을 직접 수행 할 수 있습니다.
#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 폴더를 생성하고 그 안에 IOS 폴더를 생성하여 objectc 클래스 파일을 저장해야합니다 .Unity는 NativeAPI 클래스를 사용자 정의하여 해당 콜백 메서드를 얻을 수 있습니다.
objectc 클래스 생성 후, ios 프로젝트 파일 생성시 objectc 클래스에서 접근 할 수 있도록 패널에서 Plugin에 해당하는 플랫폼을 확인해야합니다 .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 class In에서 문자열 이름은 String으로 바꿔야하며 해당 .h 및 .mm 클래스에서는 문자열 이름을 (char *)로 바꿔야합니다.
파이브. 모바일 플랫폼 릴리스 구성
1. 안드로이드
Android 터미널이 Android 패키징 또는 애플리케이션 임베딩을위한 프로젝트로 출시 된 경우 BuildSettings에서 프로젝트 내보내기를 확인해야합니다.
PlayerSettings 인터페이스
RealiboxShader는 Gamma 공간에서 처리되므로 ColorSpace를 Gamma로 설정해야하며 GraphicsAPI는 OpenGLES3 만 선택하고 Auto를 취소합니다. MinumApiLevel은 ARCore를 지원하는 Android7.0'Nougat (API 레벨 24)를 선택해야하며, Target API Level은 자동 (가장 높은 설치)을 선택하고 XRSettings는 ARCore 지원을 확인할 필요가 없습니다.
2. ios 끝
Unity는 iOS의 XCode 프로젝트 파일 만 게시 한 다음 XCode로 패키징 및 컴파일 할 수 있습니다.
PlayerSettings 인터페이스
iOS를 게시 할 때주의해야 할 몇 가지 사항이 있습니다. ColorSpace는 Gamma로 설정해야합니다 (내 셰이더는 감마 공간에서 계산되기 때문). Graphics API는 기본적으로 Metal 만 선택하고 AutoGraphicsAPI를 선택 취소합니다. 권한을 획득하면 ios가 표시되며 팝업 텍스트는 여기에서 수동으로 설정해야합니다. Target minimun IOS 버전에서는 ARKit 지원을 11.0 이상으로 설정해야합니다. 그리고 ARKit 지원 필요를 선택하십시오. 프로젝트 패키지를 다른 iOS 응용 프로그램에 포함해야하는 경우 Strip Engine Code의 선택을 취소해야합니다.