모바일 앱에서 디바이스의 배터리 잔량 표시하기


PC나 콘솔 같은 디바이스에서 동작하는 앱이라면 상관없는 문제이지만 모바일 같은 휴대기기에서 동작하는 앱이라면 현재 앱이 동작하고 있는 디바이스의 배터리 잔량에 대해서 알아야 하거나 확인해야 할 수도 있다. 사용자가 일일이 화면 상단을 드래그나 터치해서 상태바(Status bar)를 꺼내지 않고도 배터리 잔량을 할 수 있게 하는 방식으로 말이다.


유니티는 모바일을 타깃으로 하는 게임이나 앱들을 굉장히 폭넓게 지원하기 때문에 이와 관련된 기능 역시 제공하고 있다.


SystemInfo.batteryLevel;

SystemInfo.batteryStatus;


유니티에서 배터리의 상태와 관련된 정보는 SystemInfo 클래스의 정적 프로퍼티를 통해서 가져올 수 있다.


첫 번째로 batteryLevel은 현재 디바이스의 배터리 충전량으로 float 변수이며, 0-1사이의 값을 가지며, 이 프로퍼티를 호출한 디바이스가 배터리를 사용하지 않거나 batteryLevel을 지원하지 않는 디바이스라면 -1을 반환한다.


두 번째 프로퍼티는 batteryStatus로 현재 배터리의 상태를 가져올 수 있다. 이 프로퍼티는 BatteryStatus 타입의 열거형이며 열거형의 종류와 내용은 다음과 같다.


BatteryStatus.Unknown;       // 충전 상태를 알 수 없음. 배터리 상태를 지원하지 않는 플랫폼일 때 반환되는 값.
BatteryStatus.Discharging;   // 충전 케이블이 연결되지 않았고, 충전도 되지 않는 상태.
BatteryStatus.NotCharging;   // 충전 케이블은 연결되어 있지만, 충전은 되지 않는 상태.
BatteryStatus.Charging;      // 충전 케이블이 연결되어 있고, 충전되고 있는 상태.
BatteryStatus.Full;          // 충전 케이블이 연결되어 있고, 배터리가 가득 찬 상태.






간단한 사용 예시


using UnityEngine;
using UnityEngine.UI;

public class BatteryUI : MonoBehaviour
{
    Sprite chargeStateSprite;   // 배터리 충전중 표시 스프라이트
    Sprite fewStateSprite;      // 배터리가 부족하다는 표시 스프라이트

    Image batteryStateImg;      // 배터리 상태 표시 이미지
    Image batteryFrameImg;      // 배터리 모양 프레임 이미지
    Image batteryLevelImg;      // 배터리 잔량 표시 이미지

    public void UpdateBatteryUI()
    {
        float batteryLevel = SystemInfo.batteryLevel;
        switch (SystemInfo.batteryStatus)
        {
            case BatteryStatus.Full:
            case BatteryStatus.Charging:

                batteryLevelImg.color = batteryFrameImg.color = Color.white;
                batteryStateImg.sprite = chargeStateSprite;
                batteryStateImg.gameObject.SetActive(true);
                batteryLevelImg.fillAmount = 1f;
                break;

            case BatteryStatus.Discharging:
                if(batteryLevel < 0.1f) // 배터리가 부족하면 이미지를 빨갛게
                {
                    batteryLevelImg.color = batteryFrameImg.color = Color.red;
                    batteryStateImg.sprite = fewStateSprite;
                    batteryStateImg.gameObject.SetActive(true);
                }
                else
                {
                    batteryLevelImg.color = batteryFrameImg.color = Color.white;
                    batteryStateImg.gameObject.SetActive(false);
                }

                batteryLevelImg.fillAmount = batteryLevel;
                break;
        }
    }
}



반응형

안드로이드 버전의 빌드에서 디바이스의 로컬 저장소에 파일을 저장하는 법


유니티에서 게임을 만들 때, 네트워크로 받아온 파일을 로컬에 저장해야 하는 일이 많다. 특히 게임의 패치 시스템(Patch System)을 만들어야 하는 경우라면 100% 필요한 일이다. 윈도우 버전의 빌드에서는 적당히 원하는 경로에 파일을 저장할 수 있지만, 안드로이드 버전의 빌드에서는 경로마다 읽기/쓰기의 권한이 다르고 제한이 있다.


안드로이드의 데이터 경로와 읽기/쓰기 권한은 다음과 같다.


[안드로이드 External]
Application.persistentDataPath : /mnt/sdcard/Android/data/com.YourProductName.YourCompanyName/files [파일 읽기/쓰기 가능]
Application.dataPath : /data/app/번들이름-번호.apk
Application.streamingAssetsPath : jar:file:///data/app/번들이름.apk!/assets [파일이 아닌 WWW로 읽기 가능]

[안드로이드 Internal]
Application.persistentDataPath : /Android/data/com.YourProductName.YourCompanyName/files [파일 읽기/ 쓰기 가능]
Application.dataPath : /data/app/번들이름-번호.apk
Application.streamingAssetsPath : jar:file:///data/app/번들이름.apk!/assets [파일이 아닌 WWW로 읽기 가능]


위에 적힌 것처럼 네트워크에서 받아온 파일을 로컬에 저장하기 위해서는 읽기/쓰기가 모두 가능한 Application.persistentDataPath의 경로를 사용해야 한다.


위의 경로에 원하는 폴더를 만들고자 할 때는 다음의 코드를 참조하면 된다.


if (!Directory.Exists(Application.persistentDataPath + "/생성할 폴더 이름"))
{
    Directory.CreateDirectory(Application.persistentDataPath + "/생성할 폴더 이름");
}


위의 경로에 원하는 파일을 쓰고자 할 때는 다음의 코드를 참조하면 된다.


FileStream fs = new FileStream(Application.persistentDataPath + "/" + "TestFileName.txt", FileMode.Create, FileAccess.Write);
byte[] data = new byte[writeDataSize];
fs.Write(data, 0, (int)writeDataSize);
fs.Close();


이 섹션에서 소개한 내용은 제일 처음에 설명했듯이 주로 게임 패치 시스템에 많이 사용되는데, 유니티에서는 게임 패치에 에셋 번들을 많이 사용하는 편이다. 빌드된 에셋 번들은 manifest 파일을 제외하면 공통적으로 나오는 AssetBundles 파일을 비롯해서 주로 확장자 없이 지정한 번들 이름만 적힌 파일이 나오는데, 이렇게 확장자가 없는 에셋 번들 파일을 그대로 사용할 때는, 각 에셋 번들의 이름과 같은 폴더를 생성하려고 하면 폴더 생성에 실패하게 된다. 그렇기 때문에, 에셋 번들의 이름과 같은 이름의 폴더의 생성은 피하거나 에셋 번들 파일의 끝에 ".unity3d"같은 확장자를 붙여주는 것이 좋다.



참고 사이트 :: http://egloos.zum.com/pgrblues/v/4257068

반응형

+ Recent posts