使用環境
・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プロジェクトでも取り入れてみてください!