johnnyGameStudio’s blog

無能なゲームプログラマのぼやき ぎーくになりたい Twitter: https://twitter.com/JGS_Developer

【UE4】スマートフォン(iOS,Android)のスリープ機能を無効にする

はじめに

スマートフォン向けに開発していると少し重めのDLCをDLさせる必要があったり、長めのムービーを見せたいことがよくあと思います
その場合、スリープされてしまうとDLが中断したりムービーが途中で終わってしまったりして意図しない結果になってしまいますよね
なのでスリープ機能をOFFにしてしまえば解決するのですがUE4だとどうやればいいのかまとまっている記事が見当たらなかったので備忘録として残りしておきます

環境

Windows10
UE4.21.2

実装

  1. 〇〇.Build.csのPublicDependencyModuleNamesに「ApplicationCore」モジュールを追加
  2. 任意のcppファイルで「HAL/PlatformApplicationMisc.h」をinclude
  3. ifdefでiOSAndroidで処理を分ける
  4. プラットフォーム別のControlScreensaver関数でONとOFFを切り替える

// Fill out your copyright notice in the Description page of Project Settings.

#include "MyActor.h"
#if PLATFORM_ANDROID || PLATFORM_IOS
#include "HAL/PlatformApplicationMisc.h"
#endif


void AMyActor::SetEnableScreensaver(bool enabled)
{
#if PLATFORM_ANDROID
    FAndroidApplicationMisc::ControlScreensaver(
        enabled ? FAndroidApplicationMisc::EScreenSaverAction::Enable : FAndroidApplicationMisc::EScreenSaverAction::Disable);
#elif PLATFORM_IOS
    FIOSPlatformApplicationMisc::ControlScreensaver(
        enabled ? FIOSPlatformApplicationMisc::EScreenSaverAction::Enable : FIOSPlatformApplicationMisc::EScreenSaverAction::Disable);
#endif
}

備考っぽいもの

今回Includeしている「HAL/PlatformApplicationMisc.h」では単純に必要なヘッダーファイルをプラットフォーム別に読み込めるようにifdefで区切っている
なので、どのプラットフォームだろうがこのヘッダーを読み込んでおけばOK
また、ControlScreensaver関数も共通のクラスから呼び出せば大丈夫になっているかと思いきやVerの問題なのかコンパイルではじかれたので素直にプラットフォーム別に処理をわけたほうが間違いないかなと思いました

あとiOSだけっぽいのですが、無効にする処理をBeginPlayで行っても正常動作しなかったのでTickなどで1秒以上delayさせてから実行するようにすると正常動作しました