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

모바일 게임에 보이는 Wifi 아이콘 어떻게 구현하는걸까?

ckhyeok 2020. 10. 21. 17:55

 

 

몇몇 모바일 게임을 보면 화면에 현재 와이파이의 연결세기가 나타나는 것을 볼 수 있습니다.

이 부분을 유니티 쪽에 물어보니까 따로 기능이 없고 스스로 구현해야 한다고 해서 조사를 했습니다.

우선 AndroidStudio에 와이파이 세기를 가져올 수 있다는 것을 확인할 수 있었습니다.

단 문제는 이제 AndroidStudio에서 코드를 친 후 그것을 Unity로 가져와서 게임에 구현시키는 부분입니다.

우선 간단한 Toast 문구 띄우기는 성공했습니다.

이제 Android Studio에 있는 WifiManager에서의 calculateSignalLevel(int rssi) 함수를 사용해서 신호 품질 등급을 반환받고

그것을 유니티에서 wifi 아이콘으로 변환해서 상단 구석에 wifi가 실시간으로 몇칸으로 바뀌는지 체크하는 것을 구현해야 합니다.

 

 

우리 프로젝트는 API 16부터 호환하고 있는데

 

Wifimanager의 calculateSignalLevel에 Rssi값만 사용하는 함수는 API level이 30이 돼야 한다고 한다.

(현재 최신 폰의 API = 29)

 

그래서 우리는 calculateSignalLevel에 Rssi와 PowerLevel 두 변수를 받아오는 함수를 사용할 것입니다.

 

 

 

 

우선 Plugins -> Android 폴더 안에 있는 AndroidManifest 파일에 WIFi에 대한 permission을

추가해야 합니다.

 

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE">

 

그 후 스크립트를 하나 생성 한 다음. AndroidJavaclass와 AndroidJavaObject를 활용해서

Android API에 있는 함수들을 불러 온 뒤 적용시켜야 합니다.

 

    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);
        }
    }

 

해당 위 함수는 실제로 와이파이 세기 정보를 총 4단계의 Level 로 나누어서 현재 상태를 int형 변수로 가져오는 함수입니다.

 

구현 방법은 매우 간단하지만 실제로 위 과정을 이해하고 적용하는데 적지 않은 시간을 소요했습니다.

 

이로써 요즘 유행하는 모바일 MMORPG 게임에서의 화면에 Wifi 세기 띄워주는 방법을 포스팅 해보았습니다.