파파비의 블로그

Unity ) 유니티에서 C#으로 Android Native Code 실행하기 - (1) C# 코드 원리편 본문

기타

Unity ) 유니티에서 C#으로 Android Native Code 실행하기 - (1) C# 코드 원리편

N. Dave 2020. 10. 9. 20:23
반응형

유니티에서 안드로이드 java code를 실행할 수 있습니다. C#을 활용해서 말이죠!

(물론 안드로이드 API를 좀 아셔야 합니다)

 

안드로이드 java code를 활용하게 되면.

 

1. 토스트, 카메라 등의 네이티브 기능들을 유니티에서 활용할 수 있습니다.

papabee.tistory.com/339

 

Unity ) 유니티에서 C#으로 Android Native Code 실행하기 - (2) C#으로 안드로이드 네이티브 기능 실행해��

플러그인을 따로 만들지 않고, 기존에 존재하는 안드로이드 API를 유니티 내의 C# 스크립트를 통해 다뤄보도록 하겠습니다. 간단하게 유니티 내에서 Toast 메시지를 띄우는 코드에 대해서 살펴봅��

papabee.tistory.com

 

2. 우리가 직접 플러그인을 만들어서 활용하게 되면, 우리가 기존에 설정한 네이티브 기능들을 활용 할 수 있습니다.

papabee.tistory.com/341

 

Unity ) 유니티에서 C#으로 Android Native Code 실행하기 - (3) 안드로이드 플러그인 만들기

안드로이드 플러그인 만들기 자체는 하나도 어렵지 않습니다! 플러그인을 만드는 방법은 2가지가 있습니다. arr 파일로 만드는 것과 jar 파일로 맏느는 것입니다. 제가 둘 다 해봤지만 arr이 훨씬 �

papabee.tistory.com

 

 

 

 

 

 

 

 

이 글에서는 먼저 위의 것들을 하기 전에 기본 코드 개념을 다루는 글입니다.

 

유니티에서는

1) C#으로 자바 코드를 어떻게 가져오고,

2) 어떻게 사용하는지에 대한 개념을 다뤄보도록 하겠습니다.

 

핵심1) 모든 java class에 대한 정보는 유니티에서 AndroidJavaClass 객체로 받아서 사용합니다. 

c#에서는 static 메소드를 사용하려면 Class 명에 .을 붙여서 접근하지요? 

자바도 마찬가지입니다. 그래서 유니티에서는 static 메소드를 활용하기 위해서는

Class에 대한 정보를 AndroidJavaClass라는 객체에 받아서 사용합니다.

AndroidJavaClass toastClass = new AndroidJavaClass("android.widget.Toast");

이 코드를 보시면 C# 코드인데, 안드로이드의 Toast class에 대한 정보를 받은 것입니다.

new라는 keyword를 통해 객체를 만들고 인자로 원하는 class에 대한 이름을 패키지를 포함하여 풀네임으로 넣어줍니다.

 

(참고로)

기본 안드로이드 API라면 유니티에서 알아서 찾아내겠지만,

그렇지 않거나, 플러그인이라면 Assets/Plugins/Android 폴더 내에 arr이나 jar파일을 넣어두시면 되는데,

자세한 부분은 플러그인 파트 부분에서 다뤄보도록 하겠습니다.

 

이제 toastClass라는 객체를 통해서 안드로이드의 Toast class의 static 메소드를 호출 할 수 있습니다.

 

핵심2) static 메소드는 AndroidJavaClass 객체의 CallStatic<T> 메소드를 활용한다. 

T는 호출하는 메소드의 return되는 값의 타입입니다.

만약 호출하는 메소드가 return이 없는 void 라면, <>를 생략하면 되고, 만약 return값이 존재하는데

<>를 생략하면 제대로 메소드를 찾지 못해 에러가 납니다.

 

CallStatic 메소드의 첫번째 인자에는 메소드 이름이 string값으로 들어갑니다.

인자가 있는 경우에는 순서에 맞게, 그 뒤로 넣어주면 됩니다.

 AndroidJavaObject toastObject = 
 toastClass.CallStatic<AndroidJavaObject>("makeText", unityActivity, message, 0);

이 코드를 보면 AndroidJavaObject라는 객체를 return 하는, makeText라는 Toast class의 static 메소드를 실행했으며

인자로는 3개의 값이 넣어진 것을 볼 수 있습니다.

 

AndroidJavaObject가 무엇인가에 대해서는 곧장 바로 보겠습니다.

 

핵심3) java의 모든 객체는 유니티에서 AndroidJavaObject 객체로 받아서 사용합니다.

위 코드를 보면 실제로, makeText라는 메소드는 Toast라는 객체를 return하지만, 구체적인 객체의 type은 유니티에선 의미가 없습니다. 그냥 객체인지, class인지 구분만 하면 됩니다. 메소드야 어차피 string 값으로 호출하기 때문입니다.

 

핵심4) java 객체의 메소드는 AndroidJavaObject 객체의 Call<T> 메소드를 활용한다. 

위에 핵심 2번을 이해했다면 여기도 쉽게 이해 될 것입니다.

toastObject.Call("show");

이 코드를 보면, toastObject는 AndroidJavaObject 객체입니다. 그리고 call 메소드를 통해 해당 객체의 "show"라는 메소드를 실행하고 있습니다. Call 뒤에 <>로 return 타입이 명시가 안되어 있는 것을 보니 void 를 return 하는 메소드인 것을 알 수 있으며, "show"뒤에 어떠한 추가적인 인자도 없는 것으로 보아, 인자를 받지 않는 메소드임을 알 수 있습니다.

 

만약 인자를 받는 메소드이거나, return type이 void가 아닌 메소드라면 show라는 메소드를 찾지 못해 에러가 나게됩니다.

 

 

다음 글에서는 실제로 유니티 c# 스크립트를 통해, 유니티 앱에서 안드로이드 네이티브 기능인 toast를 쏴주는 코드에 대해서 다뤄보도록 하겠습니다.

 

반응형
Comments