Version: 2023.1
언어: 한국어
물리 성능 최적화
Unity를 네이티브 iOS 애플리케이션에 통합

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 애플리케이션에서 Objective-C 코드를 호출하는 방법을 보여줍니다. 이 애플리케이션은 간단한 Bonjour 클라이언트를 구현하며 다음으로 구성됩니다.

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