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

2015년 4월 20일 월요일

Unity3d 네트워크 상태 판단

유니티 함수로 네트워크 상태를 판단하려면 Application.internetReachability을 사용하여 알 수 있다.


Application.internetReachability

public static NetworkReachability internetReachability;

Description

Returns the type of Internet reachability currently possible on the device.
This property is mostly useful on handhelds to distinguish fast and cheap WiFi connection from carrier networking.

Note: Do not use this property to determine the actual connectivity. E.g. the device can be connected to a hot spot, but not have the actual route to the network. Non-handhelds are considered to always be capable of NetworkReachability.ReachableViaLocalAreaNetwork.
실제 연결을 확인하려면이 속성을 사용하지 마세요. 예를들면 device는 hot spot에 접속하지만, 실제의 네트워크 경로를 가질 수 없습니다.. Non-handhelds는 항상 NetworkReachability.Reachable 통해 LocalAreaNetwork를 할 수 있다고 간주합니다.
(http://docs.unity3d.com/ScriptReference/Application-internetReachability.html)

실제 서비스한 프로젝트에서 위 유틸을 사용했지만 많은 시행 착오 및 신뢰성이 떨어졌었다.

하여 가능하면 단말기 자체의 네트워크 상태정보를 가져오는것이 더 신뢰성이 높으므로
Navite코드를 통하여 Device의 상태정보를 가져올 수 있어야한다.

* AOS Native 관련 포스트
http://developer.android.com/training/basics/network-ops/managing.html
http://mainia.tistory.com/549

* IOS Native 관련 포스트
http://reysion.tistory.com/48

2015년 4월 15일 수요일

Unity3D에서 Native 함수 호출

AOS
private AndroidJavaClass unityPlayerClass;
private AndroidJavaObject unityPlayerActivity;

void Awake()
{
    unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    unityPlayerActivity = unityPlayerClass.GetStatic<AndroidJavaObject>("currentActivity");
}
  • "currentActivity"로 접근해서 얻는 이유.
    Call 함수의 엔진 내부 동작은 달빅VM 쓰레드에 연결된 jnienv의 포인터를 받은 후 GetMethodID 함수를 통해 스트링으로 제공하는 함수 이름에 맞는 함수의 ID를 찾아 실행시켜 줍니다.
    매번 GetMethodID를 호출하여 ID를 찾으면 시간이 걸리니 엔진 내부에서는 캐싱 테이블로 빠르게 ID를 찾을 수 있게 제공합니다.
    따라서 Call 함수를 부모 클래스의 레퍼런스상에서 호출하더라도 C#의 Reflection 처럼 동작하여 문제 없이 EclipseBasicActivity의 함수를 호출할 수 있게 됩니다.
    http://unitystudy.net/bbs/board.php?bo_table=qanda&wr_id=174
  • Destroy할때 Dispose 해주자.
    void OnDestroy()
    {
        if (unityPlayerActivity != null)
        {
           unityPlayerActivity.Dispose();
           unityPlayerActivity = null;
        }
    
        if (unityPlayerClass != null)
        {
            unityPlayerClass.Dispose();
            unityPlayerClass = null;
        }
    }
    
  • Native 메소드 호출 방법
    // (void func0())
    unityPlayerActivity.Call("func0");
    // (void func1(string msg))
    unityPlayerActivity.Call("func1", "message");
    // (void func2(int val))
    unityPlayerActivity.Call("func2", value);
    // (bool func3())
    boo bRet = unityPlayerActivity.Call<bool>("func3");
    

IOS
using System.Runtime.InteropServices; // 선언

[DllImport("__Internal")]
private static extern void func1();

[DllImport("__Internal")]
private static extern int func2();
  • 다른 플러그인 시스템과 마찬가지로 C#과 네이티브 코드는 다른 영역이며, C#에서 네이티브를 호출할 때에는 .NET의 PInvoke 기능을 사용하고, 네이티브에서는 유니티 라이브러리에서 제공하는 UnitySendMessage를 사용하여 C#의 함수를 호출합니다.
    PInvoke를 사용하기 위해서는 System.Runtime.InteropServices 네임스페이스를 사용해야하며, [DllImport(“__Internal”)] 프로퍼티를 C#의 static 멤버 함수에 설정하면 Objective C 코드에서 선언된 함수와 일치하게 됩니다.
    이 때 Objective C 코드의 함수는 C 스타일로 정의되어야 하며, 이를 위해 함수에 extern “C”키워드를 명시적으로 주어 name mangling 문제가 일어나지 않도록 합니다.
    http://www.unitystudy.net/bbs/board.php?bo_table=dustin&wr_id=402 // [모바일] iOS 플러그인 제작