Unity引擎的设计目标是让开发者可以使用相同的代码在不同的平台上创建游戏和应用,而不需要关心平台特定的实现细节。

如何让屏幕保持常亮?如何获取手机当前电量?如何…?

接下来列举一些实用特性和方法:


1.防止屏幕休眠,从而让屏幕保持常亮

Screen.sleepTimeout = SleepTimeout.NeverSleep;

SleepTimeout.NeverSleep是一个特殊的值,它会禁止屏幕进入休眠状态,因此屏幕会保持常亮。

注意,这个设置可能会导致用户的电池电量消耗增加,因此在不需要保持屏幕常亮的情况下,你可能需要重新将Screen.sleepTimeout设置为其默认值(通常是SleepTimeout.SystemSetting),以便让屏幕可以在一段时间内无操作后自动休眠。

这个代码在安卓和iOS平台上都是可以使用的。当你使用Screen.sleepTimeout = SleepTimeout.NeverSleep;这行代码时,Unity引擎会自动处理底层的平台特定的调用,以防止屏幕进入休眠状态。

然而,要注意的是,即使这段代码可以在多个平台上运行,但设备的实际行为可能还会受到用户的系统设置或者其他应用的影响。例如,如果用户设置了一个很短的屏幕超时时间,或者正在运行一些能够控制屏幕休眠状态的应用,那么屏幕可能还是会在一段时间后自动关闭。因此,尽管这段代码在大多数情况下都能工作,但并不能保证在所有情况下都能防止屏幕休眠。


2.获取设备方向:可以使用 Input.deviceOrientation 来获取设备的当前方向,例如:

DeviceOrientation deviceOrientation = Input.deviceOrientation;

3.调整屏幕方向:可以使用Screen.orientation来设置屏幕的方向

Screen.orientation = ScreenOrientation.LandscapeLeft;

这将会把屏幕方向设置为横屏(设备的左边在上方)。


4.控制屏幕亮度:可以使用Screen.brightness来调整屏幕亮度(值在0到1之间):

Screen.brightness = 0.5f;

5.检查网络连接:可以使用Application.internetReachability来检查设备的网络连接状态,例如:

if (Application.internetReachability == NetworkReachability.NotReachable) {
    Debug.Log("没有网络连接");
} else if (Application.internetReachability == NetworkReachability.ReachableViaCarrierDataNetwork) {
    Debug.Log("通过运营商数据网络连接互联网");
} else if (Application.internetReachability == NetworkReachability.ReachableViaLocalAreaNetwork) {
    Debug.Log("通过局域网连接互联网");
}

6.获取操作系统版本信息:可以使用 SystemInfo.operatingSystem 来获取操作系统的版本信息:

string osVersion = SystemInfo.operatingSystem;

7.获取设备唯一标识符:可以使用 SystemInfo.deviceUniqueIdentifier 来获取设备的唯一标识符:

string deviceID = SystemInfo.deviceUniqueIdentifier;

注意,这个API一般都是可用的,但是有些系统厂商做了重新封装,有可能获取为空

8.获取设备型号:SystemInfo.deviceModel 可以获取设备的型号信息,例如:

string deviceModel = SystemInfo.deviceModel;

关于Unity的SystemInfo类提供了很多属性,可以用于获取关于当前设备硬件和软件的信息,之后我会出一篇文章,专门针对SystemInfo类来列举每一个属性的用法


9.判断是否正在充电:可以使用 SystemInfo.batteryStatus 来获取设备的充电状态:

if (SystemInfo.batteryStatus == BatteryStatus.Charging)
{
    Debug.Log("设备正在充电");
}

10.获取电池电量:可以使用 SystemInfo.batteryLevel 来获取设备的当前电池电量(0到1之间):

float batteryLevel = SystemInfo.batteryLevel;

11.退出应用:

Application.Quit();

注意,这个函数在编辑器中无效


12.控制游戏帧率:可以通过 Application.targetFrameRate 属性来设置游戏的目标帧率:

Application.targetFrameRate = 60; // 设置游戏目标帧率为 60fps

在Unity中,也可以取消帧数上限,以便应用程序以最高可能的帧率运行。为此,需要将目标帧率设置为Application.targetFrameRate = -1
在移动设备上取消帧数限制可能会导致过热和电池消耗加快。因此,在实际发布移动应用时,建议将帧率上限设置为一个合理的值,如30或60,或者让用户自己选择。如果您希望在不同平台上使用不同的帧率限制,可以使用平台相关的预处理指令

void Start()
    {
        #if UNITY_EDITOR
        Application.targetFrameRate = -1;
        #elif UNITY_IOS || UNITY_ANDROID
        Application.targetFrameRate = 60;
        #else
        Application.targetFrameRate = 30;
        #endif
    }
}

13.检查设备是否支持某项特性:可以使用 SystemInfo.SupportsRenderTextureFormat、SystemInfo.supportsImageEffects、SystemInfo.supports3DTextures 等方法和属性来检查设备是否支持某项特性:

if (SystemInfo.supportsImageEffects)
{
    // 设备支持图像特效
}

14.获取和设置剪贴板的内容:可以使用 GUIUtility.systemCopyBuffer 属性来获取和设置剪贴板的内容:

GUIUtility.systemCopyBuffer = "Hello, World!"; // 设置剪贴板的内容
string clipboardContent = GUIUtility.systemCopyBuffer; // 获取剪贴板的内容

15.获取触摸输入:可以使用 Input.touches 来获取当前帧的所有触摸事件:

foreach (Touch touch in Input.touches)
{
    Vector2 touchPosition = touch.position;
    // 处理触摸事件
}

16.全屏和非全屏切换:可以通过 Screen.fullScreen 属性来设置应用是否全屏显示:

Screen.fullScreen = true; // 设置为全屏
Screen.fullScreen = false; // 设置为非全屏

17.重力感应输入:Unity能够通过 Input 类来接收并处理设备的重力感应输入,例如:

Vector3 deviceAcceleration = Input.acceleration;

在这个示例中,Input.acceleration 返回一个 Vector3 类型的对象,表示设备在三个轴向(x,y,z)上的加速度。


18.振动:使用 Handheld.Vibrate() 让设备振动:

Handheld.Vibrate();

注意,这个API在安卓和iOS设备上有效。
这个函数的行为在不同的平台上可能是不同的,并且在某些平台上可能无法控制振动的持续时间和强度。尽管大多数iOS设备都支持振动,但仍有一些特定型号或设置可能会影响其功能

如果针对IOS设备的震动,可以使用下方的API

19.设备振动反馈:

iOS设备上,Unity支持复杂的振动反馈。你可以使用iOS设备的Taptic引擎来提供物理反馈。这需要使用 iOS.Device.SetTapticEngineFeedbackPreparation 和 iOS.Device.TriggerTapticEngineFeedbackPeek, iOS.Device.TriggerTapticEngineFeedbackPop, iOS.Device.TriggerTapticEngineFeedbackNope 等API。

请注意,不同的设备和操作系统可能对这些API的支持程度不同。在使用这些API时,你应该首先检查设备是否支持这些功能,或者在不支持的设备上提供合适的回调策略。


以上所说的API,在使用时需要考虑到用户的隐私和设备的电量消耗。

在使用可能会对用户隐私造成影响的API(如设备唯一标识符)时,需要在应用的隐私政策中明确说明,确保符合所有相关的隐私法规。
在使用可能会增加设备电量消耗的API(如振动或设置屏幕常亮)时,需要尽量优化你的应用,以减少对电池寿命的影响。