Version: 2020.1
물리 성능 최적화
인앱 구매(IAP)를 위한 애플리케이션 준비

iOS용 플러그인 빌드

이 페이지는 iOS 플랫폼용 네이티브 코드 플러그인을 빌드하는 방법에 대해 설명합니다.

iOS용 네이티브 플러그인으로 애플리케이션 빌드

iOS용 네이티브 플러그인으로 애플리케이션을 빌드하려면 다음 단계를 따르십시오

  1. 호출하려는 각 네이티브 함수에 대해 다음과 같이 C# 파일에 extern 메서드를 정의합니다.

    [DllImport ("__Internal")] 
    
    private static extern float FooPluginFunction();
    
  2. Unity 프로젝트에 네이티브 코드 소스 파일을 추가합니다.

  3. 플러그인 인스펙터 창에서 플러그인 설정을 커스터마이즈합니다. 예를 들어 네이티브 코드가 iOS 전용이면 플러그인이 iOS용으로만 활성화되었는지 확인합니다.

참고: C++(.cpp) 또는 Objective-C++(.mm)를 사용하여 플러그인을 구현하는 경우 네임 맹글링 문제를 방지하려면 C 링크를 사용하여 함수를 선언해야 합니다.

extern "C" {
  float FooPluginFunction();
}

C 또는 Objective-C로 작성된 플러그인은 네임 맹글링을 사용하지 않기 때문에 필요하지 않습니다.

C#에서 플러그인 사용

앱은 실제 기기에 배포된 경우에만 iOS 네이티브 플러그인을 호출할 수 있으므로, 모든 네이티브 코드 메서드를 추가 C# 코드 레이어로 래핑해야 합니다. 이 코드는 UNITY_IOS && !UNITY_EDITOR 조건부 컴파일을 사용하거나, 또는 Application.platform을 확인하고 앱이 기기에서 실행 중일 때에만 네이티브 메서드를 호출해야 합니다. 이를 구현하는 간단한 방법은 다음과 같습니다.

void MyMethod()
{
# if UNITY_IOS && !UNITY_EDITOR
    CallNativeMethodImplementation();
# else
    CallEditorMethodImplementation();
# endif
}

더욱 상세한 구현을 확인하려면 아래의 Bonjour 브라우저 샘플을 다운로드하십시오.

네이티브 코드에서 C# 콜백

Unity iOS는 제한된 네이티브-매니지드(native-to-managed) 콜백 기능을 지원합니다. 다음 두 가지 방법 중 하나로 이 작업을 수행할 수 있습니다. * UnitySendMessage 사용 * 델리게이트 사용

UnitySendMessage 사용

이 옵션은 간단하지만, 일부 제한 사항이 있습니다. 다음과 같이 표시됩니다.

UnitySendMessage("GameObjectName1", "MethodName1", "Message to send");

다음의 세 가지 파라미터가 있습니다. * 타겟 GameObject의 이름 * 해당 오브젝트에 대해 호출하는 스크립트 메서드 * 호출된 메서드에 전달할 메시지 문자열

UnitySendMessage를 사용할 경우 다음과 같은 제한 사항이 있습니다.

  1. 네이티브 코드에서는 void MethodName(string message); 서명에 해당하는 스크립트 메서드만 호출할 수 있습니다.
  2. UnitySendMessage로의 호출은 비동기적이고 1 프레임 지연됩니다.
  3. 두 개 이상의 게임 오브젝트가 이름이 같으면 UnitySendMessage를 사용할 때 충돌이 발생할 수 있습니다.

델리게이트 사용

이 옵션은 좀 더 복잡합니다. 델리게이트를 사용하는 경우 C# 측의 메서드는 정적이어야 하고 MonoPInvokeCallback 속성으로 표시되어야 합니다. 메서드를 델리게이트로 extern 메서드에 전달해야 합니다. 이 메서드는 네이티브 코드를 통해 해당 서명이 포함된 함수에 대한 포인터를 가져오는 함수로 구현되었습니다. 그러면 네이티브 코드의 함수 포인터는 C# 정적 메서드로 돌아갑니다.

이 메서드에 대한 C# 코드는 다음과 같은 모습입니다.

delegate void MyFuncType();

[AOT.MonoPInvokeCallback(typeof(MyFuncType))]

static void MyFunction() { }

static extern void RegisterCallback(MyFuncType func);

그런 다음 콜백을 수락하는 C 코드는 다음과 같은 모습입니다.

typedef void (*MyFuncType)();

void RegisterCallback(MyFuncType func) {}

자동화된 플러그인 통합

Unity는 자동화된 플러그인 통합을 지원하며, 플러그인 인스펙터 창에서 iOS용으로 활성화하면 생성된 Xcode 프로젝트에 .a, .m, .mm, .c, .cpp, .h 확장자를 가진 모든 파일을 복사합니다. 이러한 확장자를 가진 파일이 Assets/Plugins/iOS 폴더에 있는 경우 Unity는 해당 파일을 iOS 플랫폼용으로만 활성화합니다.

참고: 생성된 Xcode 프로젝트에 파일을 복사한 후에는 Unity 프로젝트의 해당 파일에 더 이상 연결되지 않습니다. Xcode에서 이러한 파일을 변경하는 경우 Unity 프로젝트에 다시 복사해야 합니다. 그렇지 않으면 Unity는 다음에 프로젝트를 빌드할 때 이 파일들을 덮어씁니다.

이 인스펙터 창은 플러그인이 iOS용으로 활성화되었음을 보여줍니다.
이 인스펙터 창은 플러그인이 iOS용으로 활성화되었음을 보여줍니다.

iOS 팁:

  1. 관리 코드에서 비관리 코드 호출은 iOS에서 부하가 높습니다. 프레임당 여러 개의 네이티브 메서드를 호출하는 것을 지양하는 것이 좋습니다.

  2. 기기에서 네이티브 코드를 호출하여 에디터에서 더미 값을 반환하는 네이티브 메서드를 추가 C# 레이어와 래핑해야 합니다.

  3. 네이티브 메서드로부터 반환된 문자열 값은 UTF–8로 인코딩되고 힙에 할당돼야 합니다. 이런 문자열의 경우 모노 마셜링(Mono marshalling)을 자유롭게 사용할 수 있습니다.

Bonjour 브라우저 샘플

Bonjour 브라우저 샘플에서 네이티브 코드 플러그인을 사용하는 방법에 대한 간단한 예제를 다운로드할 수 있습니다

이 예제는 Unity iOS 애플리케이션에서 bjective-C 코드를 호출하는 방법을 보여줍니다. 이 애플리케이션은 간단한 Bonjour 클라이언트를 구현하며 다음으로 구성됩니다.

  • Plugins\Bonjour.cs가 네이티브 코드에 대한 C# 인터페이스이고, BonjourTest.cs가 애플리케이션 로직을 구현하는 스크립트인 Unity iOS 프로젝트
  • 위의 자동화된 플러그인 통합 섹션에 설명된 대로 빌드된 Xcode 프로젝트에 추가해야 하는 네이티브 코드(Assets/Plugins/iOS에 있음)
물리 성능 최적화
인앱 구매(IAP)를 위한 애플리케이션 준비