이 페이지는 iOS 플랫폼용 네이티브 코드 플러그인을 빌드하는 방법에 대해 설명합니다.
iOS용 네이티브 플러그인으로 애플리케이션을 빌드하려면 다음 단계를 따르십시오
호출하려는 각 네이티브 함수에 대해 다음과 같이 C# 파일에 extern 메서드를 정의합니다.
[DllImport ("__Internal")]
private static extern float FooPluginFunction();
Unity 프로젝트에 네이티브 코드 소스 파일을 추가합니다.
플러그인 인스펙터 창에서 플러그인 설정을 커스터마이즈합니다. 예를 들어 네이티브 코드가 iOS 전용이면 플러그인이 iOS용으로만 활성화되었는지 확인합니다.
참고: C++(.cpp) 또는 Objective-C++(.mm)를 사용하여 플러그인을 구현하는 경우 네임 맹글링 문제를 방지하려면 C 링크를 사용하여 함수를 선언해야 합니다.
extern "C" {
float FooPluginFunction();
}
C 또는 Objective-C로 작성된 플러그인은 네임 맹글링을 사용하지 않기 때문에 필요하지 않습니다.
앱은 실제 기기에 배포된 경우에만 iOS 네이티브 플러그인을 호출할 수 있으므로, 모든 네이티브 코드 메서드를 추가 C# 코드 레이어로 래핑해야 합니다. 이 코드는 UNITY_IOS && !UNITY_EDITOR
조건부 컴파일을 사용하거나, 또는 Application.platform
을 확인하고 앱이 기기에서 실행 중일 때에만 네이티브 메서드를 호출해야 합니다. 이를 구현하는 간단한 방법은 다음과 같습니다.
void MyMethod()
{
# if UNITY_IOS && !UNITY_EDITOR
CallNativeMethodImplementation();
# else
CallEditorMethodImplementation();
# endif
}
더욱 상세한 구현을 확인하려면 아래의 Bonjour 브라우저 샘플을 다운로드하십시오.
Unity iOS는 제한된 네이티브-매니지드(native-to-managed) 콜백 기능을 지원합니다. 다음 두 가지 방법 중 하나로 이 작업을 수행할 수 있습니다.
* UnitySendMessage
사용
* 델리게이트 사용
UnitySendMessage
사용이 옵션은 간단하지만, 일부 제한 사항이 있습니다. 다음과 같이 표시됩니다.
UnitySendMessage("GameObjectName1", "MethodName1", "Message to send");
다음의 세 가지 파라미터가 있습니다.
* 타겟 GameObject
의 이름
* 해당 오브젝트에 대해 호출하는 스크립트 메서드
* 호출된 메서드에 전달할 메시지 문자열
UnitySendMessage
를 사용할 경우 다음과 같은 제한 사항이 있습니다.
void MethodName(string message);
서명에 해당하는 스크립트 메서드만 호출할 수 있습니다.UnitySendMessage
로의 호출은 비동기적이고 1 프레임 지연됩니다.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에서 부하가 높습니다. 프레임당 여러 개의 네이티브 메서드를 호출하는 것을 지양하는 것이 좋습니다.
기기에서 네이티브 코드를 호출하여 에디터에서 더미 값을 반환하는 네이티브 메서드를 추가 C# 레이어와 래핑해야 합니다.
네이티브 메서드로부터 반환된 문자열 값은 UTF–8로 인코딩되고 힙에 할당돼야 합니다. 이런 문자열의 경우 모노 마셜링(Mono marshalling)을 자유롭게 사용할 수 있습니다.
You can download a simple example of how to use a native code plug-in here: Bonjour Browser Sample.
이 예제는 Unity iOS 애플리케이션에서 bjective-C 코드를 호출하는 방법을 보여줍니다. 이 애플리케이션은 간단한 Bonjour 클라이언트를 구현하며 다음으로 구성됩니다.
Plugins\Bonjour.cs
가 네이티브 코드에 대한 C# 인터페이스이고, BonjourTest.cs
가 애플리케이션 로직을 구현하는 스크립트인 Unity iOS 프로젝트Assets/Plugins/iOS
에 있음)