클라이언트 프로그래머의 일기/신입 클라이언트 프로그래머의 일기

모바일 게임 Wifi 기능 연동 시 사용 할 함수들.

ckhyeok 2020. 10. 26. 11:55

만약 게임에 기능을 추가하게 된다면 사용 하려고 만든 함수들 입니다.

 

1. 와이파이 세기 측정.(API Level에 따라 2개로 나뉨.)

    // Android API 30 미만에서 사용 할 함수 ( 20/10/26 기준 최신 API는 29 입니다.)
    private static int GetSignalLevel(int numberOfLevels)
    {
        using (var activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer")
           .GetStatic<AndroidJavaObject>("currentActivity"))
        {
            var wifiManager = activity.Call<AndroidJavaObject>("getSystemService", "wifi");
            var wifiInfo = wifiManager.Call<AndroidJavaObject>("getConnectionInfo");
            int rssi = wifiInfo.Call<int>("getRssi");
            return wifiManager.CallStatic<int>("calculateSignalLevel", rssi, numberOfLevels);
        }
    }
    
    
    /// <summary>
    /// RSSI 평균값 계산
    /// </summary>
    /// <param name = "rssi"> AndroidDev에선 평균 -55~-90 사이라고 지정함 </param>
    private static int GetRssiLevel(int rssi)
    {   // Android API 30 이상에서 사용 하는 함수로 rssi 값의 범위에 따라 직접 Level을 나누어서 적용해야 합니다.
        // 알아 본 결과 -60까진 최고세기, 그다음 -70, -80, -90 순으로 적용하면 될 것 같습니다.
        using (var activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer")
           .GetStatic<AndroidJavaObject>("currentActivity"))
        {
            var wifiManager = activity.Call<AndroidJavaObject>("getSystemService", "wifi");
            var wifiInfo = wifiManager.Call<AndroidJavaObject>("getConnectionInfo");
            rssi = wifiInfo.Call<int>("getRssi");
            return wifiManager.CallStatic<int>("calculateSignalLevel", rssi);
        }
    }
    

 

2. 현재 디바이스의 API Level 확인 함수

    private static int currentAPILevel; // api 레벨 체크 변수
    public static int APILevel
    {
        get
        {
#if UNITY_ANDROID
            if (Application.isEditor)
            {
#endif
                return 0;
#if UNITY_ANDROID
            }
            else if (currentAPILevel == 0)
            {
                using (var androidVersion = new AndroidJavaClass("android.os.Build$VERSION"))
                {
                    currentAPILevel = androidVersion.GetStatic<int>("SDK_INT");
                }
            }

            return currentAPILevel;
#endif
        }
    }

 

3. 현재 인터넷 상태가 와이파이인지, 데이터인지 확인하는 함수

(만약 구현한다면 해당 오브젝트의 Active를 True or False 해줄 것 같아서 GameObject로 함수를 만들었습니다.)

    private GameObject CheckConnected()
    {
        if (Application.internetReachability == NetworkReachability.ReachableViaCarrierDataNetwork)
        {
            return CellularIcon;
        }
        if (Application.internetReachability == NetworkReachability.ReachableViaLocalAreaNetwork)
        {
            return WifiIIcon;
        }
        else
            return null;
    }