Unity×iOS

【Unity×iOS】バッテリー残量と充電状態を取得する方法|UIDevice+プラグイン連携で実装【コピペOK】

使用環境

・Unity Editor:2021.3.18f1

この記事で分かること

  • Unity単体ではバッテリー状態を取得できない理由
  • iOSネイティブ(UIDevice)を使ってバッテリー情報を取得する方法
  • 【コピペOK】Objective-C++プラグイン+Unity C#連携コード
  • バッテリー状態に応じた演出・UX改善アイデア

iOSのバッテリー取得方法とは?

ピッグダディ

今日は「UnityでiPhoneやiPadのバッテリー残量や充電状態を取得する方法」について解説します。

ピッグボーイ

えっ?Unityってバッテリー情報は取れないと思ってました!

ピッグガール

どうやって取るんですか?
iOSの機能を使う感じ?

ピッグダディ

その通り!
Unityだけでは不可能ですが、iOSネイティブ(UIDevice)をObjective-C++で呼び出すプラグインを作成することで、Unity側でも簡単にバッテリー状態を取得できるようになります!

Unity標準APIではバッテリー状態を取得できない

Unityには「バッテリー残量」「充電中かどうか」を直接取得する標準APIは存在しません。
(※一部プラットフォームではSystemInfo.batteryLevelなどがありますが、iOSでは正確ではありません)

iOSでは、UIDeviceクラスを使えば簡単に取得できます。

  • UIDevice.currentDevice.batteryState(充電中/接続なし/満充電)
  • UIDevice.currentDevice.batteryLevel(バッテリー残量 0.0〜1.0)

これらをネイティブプラグイン経由でUnityに渡すのがベストな方法です!

【コピペOK】バッテリー状態取得プラグイン作成手順

.mmファイルを作成する

プロジェクトに
Assets/Plugins/iOS/BatteryStatusPlugin.mm
というファイルを作成し、以下のコードを記述します。

#import <UIKit/UIKit.h>

extern "C" {

// バッテリー残量を取得 (0.0~1.0)
float GetBatteryLevel()
{
    [UIDevice currentDevice].batteryMonitoringEnabled = YES;
    return [UIDevice currentDevice].batteryLevel;
}

// バッテリー充電状態を取得
// 0: Unknown, 1: Unplugged, 2: Charging, 3: Full
int GetBatteryState()
{
    [UIDevice currentDevice].batteryMonitoringEnabled = YES;
    return (int)[UIDevice currentDevice].batteryState;
}
}

ポイント

  • batteryMonitoringEnabled = YESを忘れずに設定しないと、情報が取得できません!
  • 戻り値は簡単なfloatとintでUnity側に渡します。

Unity側のC#スクリプトを書く

これで

  • BatteryStatusPlugin.BatteryLevel → バッテリー残量(例:0.75 → 75%)
  • BatteryStatusPlugin.BatteryState → 現在の充電状態(文字列で取得)

がUnity側からいつでも読めるようになります!

using System.Runtime.InteropServices;
using UnityEngine;

public static class BatteryStatusPlugin
{
#if UNITY_IOS && !UNITY_EDITOR
    [DllImport("__Internal")] private static extern float GetBatteryLevel();
    [DllImport("__Internal")] private static extern int GetBatteryState();
#else
    private static float GetBatteryLevel() => 1.0f; // Editor仮値
    private static int GetBatteryState() => 2;      // Editor仮値 (Charging)
#endif

    public static float BatteryLevel => GetBatteryLevel();

    public static string BatteryState
    {
        get
        {
            switch (GetBatteryState())
            {
                case 0: return "Unknown";
                case 1: return "Unplugged";
                case 2: return "Charging";
                case 3: return "Full";
                default: return "Unknown";
            }
        }
    }
}

使用例(ゲーム内でバッテリーを取得する)

例えば、ゲーム画面の右上にバッテリーアイコンを出したいなら:

using UnityEngine;
using UnityEngine.UI;

public class BatteryUI : MonoBehaviour
{
    public Text batteryText;

    void Update()
    {
        float level = BatteryStatusPlugin.BatteryLevel;
        string state = BatteryStatusPlugin.BatteryState;
        batteryText.text = $"Battery: {Mathf.RoundToInt(level * 100)}% ({state})";
    }
}

これだけでリアルタイムにバッテリー状況を表示できます!

バッテリー状態を活かしたUX改善アイデア

  • 充電中の場合のみ「高画質モード」を自動オン
  • バッテリー低下時に「節電モード」をオススメ表示
  • 充電完了(Full)でシークレット演出を開放する隠し要素
  • 残量10%以下でゲーム内通知を出してプレイ継続を配慮

単純に数値を表示するだけでなく、
バッテリーを軸に新しい体験を作ることができます!

まとめ

項目内容
Unity単体ではバッテリー取得できないiOSネイティブプラグインが必要
UIDeviceを使ってバッテリー残量・状態を取得
コピペできる.mmファイルとC#コードを紹介
UX向上や節電サポートにも活用可能

バッテリー連携は、ユーザーに優しい設計をする上でとても大切な要素です。
ぜひこの記事を参考に、あなたのUnity×iOSプロジェクトでも取り入れてみてください!