레이블이 plugin인 게시물을 표시합니다. 모든 게시물 표시
레이블이 plugin인 게시물을 표시합니다. 모든 게시물 표시

2014년 5월 5일 월요일

유니티 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]);

}