본문 바로가기

Development

Unity iOS 플러그인 제작

유니티에서 iOS의 네이티브 함수를 호출하기 위해서 다음과 같은 방법으로 통신할 수 있다.



public class iOSManager : MonoBehaviour

{

    static iOSManager _instance = null;


    [DllImport("__Internal")]

    private static extern void iOsFunction(string strMessage);


//iOS의 네이티브 함수를 호출한다. 인자로 strMsg라는 문자열을 넘긴다.

public void CallIosFunction(string strMsg)

{

iOsFunction(strMsg);

}



//이후에 iOS의 네이티브 단에서 이 메소드를 호출한다.

//유니티에서는 단지 iOS에서 넘어온 문자열을 유니티 콘솔에 출력해준다.

public void MsgFromiOs(string strMsg)

{

MonoBehaviour.print("msg from ios : " + strMsg);

}


유니티 단에서는 위와 같이  [DllImport("__Internal")] 선언을 하고 아래에 함수를 외부로 부터 가져온다고 알린다.

이후에는 일반 적인 c#의 메소드를 호출하듯이 호출해주면된다.

iOS네이티브 단에서는 위에서 선언한 함수를 실제 구현해줘야한다.



iosplugin.m 이라는 소스 파일을 하나 만들고

내부에 위의 c#스크립트에서 선언했던 형태로 함수를 구현해준다.

c#의 스트링은 iOS에 인자로 넘어올때 UTF-8의 바이트 배열 형태로 변환되어 넘어오기 때문에

인자를 const char* 형태로 바꿔준다.


//utf-8의 char형 배열은 아래 함수를 통해서 NSString으로 변환가능하다.


static NSString* CreateNSString(const char* string)

{

    if (string != NULL)

        return [NSString stringWithUTF8String:string];

    else

        return [NSString stringWithUTF8String:""];

}


void void iOsFunction(const char* strMessage)

{

//단순히 유니티로 부터 전달받은 메시지를 오브젝트c의 NSString으로 변환하고 그것을 다시 utf-8의 char형 배열로 변환한다음에

//다시 유니티로 전달하는 것을 보여준다.

   NSString* strResult = CreateNSString(strMessage);


//안드로이드에서와 비슷하게 UnitySendMessage함수를 통해서 유니티의 특정 오브젝트에 연결된 스크립트를 호출할 수 있다.

//c#의 스크립트에서 스트링으로 넘어온 문자열이 오브젝트 c에서 UTF-8의 char형배열로 변환된것처럼

//오브젝트c에서 NSString 문자열을 유니티로 넘길때에도 UTF-8의 char 형배열로 변환해서 넘기면된다.

//이호출을 통해서 위의 c#스크립트에서 구현해놓은 MsgFromiOs메소드가 호출되게 된다.

    UnitySendMessage("iOSManager", "MsgFromiOs", [strResult UTF8String]);


}