大家在玩手游的时候经常会看到游戏里有一些提醒状态,图示如下,右上角有当前手机端的时间,wifi网络状态展示,以及电量的展示效果
对于时间的展示,实际就是拿到手机上的时间以字符串的形式显示出来即可。
对于中间的Wifi网络的贴图展示,也是拿到了当前的网络数据类型,移动端还是wifi网络,对不同的图片进行展示。
而最后的电量的格子,实现的原理则是拿到当前手机端的电量,根据不同的电量设置内部格子贴图的FillAmount即可,当FillAmount为1的时候格子填充满。也可以根据不同的电量区间比设置格子成不同的颜色。比如百分之60以上内部的格子贴图为绿色,30-60的区间格子为黄色,1-30的区间格子为红色,这样就很像我们手机端的真是电量展示了。
所以以上的关键点就在于如何拿到手机上的时间,电量,以及网络状态类型。
接下来正题开始
想要拿到ios和安卓两个平台的手机时间,是一个很容易的事。
这里我直接把代码贴出来,方便大家使用,下面的代码双平台均可使用获取时间。
///获取手机时间
IEnumerator UpdataTime()
{
DateTime now = DateTime.Now;
if(now.Hour < 10 && now.Minute>= 10)
{
m_time = string.Format("0{0}:{1}", now.Hour, now.Minute);
}
else if(now.Hour < 10 && now.Minute < 10)
{
m_time = string.Format("0{0}:0{1}", now.Hour, now.Minute);
}
else if(now.Hour >= 10 && now.Minute < 10)
{
m_time = string.Format("{0}:0{1}", now.Hour, now.Minute);
}
else
{
m_time = string.Format("{0}:{1}", now.Hour, now.Minute);
}
//设置组件文本的显示内容为当前的手机时间
m_phoneTimeText.text = m_time;
yield return new WaitForSeconds(60f - now.Second);
while (true)
{
now = DateTime.Now;
if(now.Hour < 10 && now.Minute>= 10)
{
m_time = string.Format("0{0}:{1}", now.Hour, now.Minute);
}
else if(now.Hour < 10 && now.Minute < 10)
{
m_time = string.Format("0{0}:0{1}", now.Hour, now.Minute);
}
else if(now.Hour >= 10 && now.Minute < 10)
{
m_time = string.Format("{0}:0{1}", now.Hour, now.Minute);
}
else
{
m_time = string.Format("{0}:{1}", now.Hour, now.Minute);
}
//设置组件文本的显示内容为当前的手机时间
m_phoneTimeText.text = m_time;
yield return new WaitForSeconds(60f);
}
}
上面的接口通过下面的方式调用即可。
void Start ()
{
//更新手机时间
StartCoroutine("UpdataTime");
}
以上是获取移动端手机时间的方法,接下来介绍下获取网络类型
如果下面类型为真,则代表当前网络类型为Wifi
Application.internetReachability == NetworkReachability.ReachableViaLocalAreaNetwork
如果下面类型为真,代表当前网络类型为移动数据
Application.internetReachability == NetworkReachability.ReachableViaCarrierDataNetwork
如果下面类型为真,代表当前无网络
Application.internetReachability == NetworkReachability.NotReachable
上面就是获取手机端网络类型的方法,可以根据不同的网络类型显示不同的资源图。移动端ios和android平台都可以使用这个方式。
接下来就是最后一个知识点,也就是获取移动端手机电量的方法,对于不同的平台,安卓和ios获取手机电量的方式就不太相同了,需要各自封装自己的方法才可以实现。
对于安卓来说,可以通过下面的方式进行获取。
///获取安卓手机电池电量
private int GetAndroidBatteryNum()
{
if (Application.platform == RuntimePlatform.Android)
{
try
{
using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
if (null != unityPlayer)
{
using (AndroidJavaObject currActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"))
{
if (null != currActivity)
{
using (AndroidJavaObject intentFilter = new AndroidJavaObject("android.content.IntentFilter", new object[]{ "android.intent.action.BATTERY_CHANGED" }))
{
using (AndroidJavaObject batteryIntent = currActivity.Call<AndroidJavaObject>("registerReceiver", new object[]{null,intentFilter}))
{
int level = batteryIntent.Call<int>("getIntExtra", new object[]{"level",-1});
int scale = batteryIntent.Call<int>("getIntExtra", new object[]{"scale",-1});
if (level == -1 || scale == -1)
{
return 50;
}
return (int)(((float)level / (float)scale) * 100.0f);
}
}
}
}
}
}
}
catch (System.Exception ex)
{
}
}
return 100;
}
获取安卓上的手机电量大家只需要调用该接口即可。
网上还有其他的教程,通过路径的形式获取电量,我也试过下面的方式,但是并不推荐
此方式只能取出部分安卓手机端电量
try
{
string CapacityString = System.IO.File.ReadAllText("/sys/class/power_supply/battery/capacity");
return int.Parse(CapacityString);
}
catch (Exception e)
{
LogManager.Log("Failed to read battery power; " + e.Message);
}
return -1;
但是此方法只能取出部分安卓手机端电量,因为通过路径文件的方式获取电量并不是所有的安卓系统都是一样的路径,所以有的可以取出有的则不行,所以不推荐上面的方法。
对于ios平台来说,和我们之前分享过的一篇手机端关闭程序的思维是一样的,既然需要依赖于ios底层代码去获取电量,就一定需要外部函数extern来实现这个功能,然后在C#调用ios的原生逻辑。
我先把C#内的代码写出来,如下
///获取ios端手机电量
[ DllImport( "__Internal" )]
private static extern float GetiOSBatteryLevel();
然后在项目的Plugins\iOS文件夹中,增加一个新的文件,名为GetiPhoneBattery.mm
然后下面是.mm文件的内部代码逻辑,用来获取移动端ios平台手机电量
extern "C"
{
float GetiOSBatteryLevel()
{
[[UIDevice currentDevice] setBatteryMonitoringEnabled:YES];
return [[UIDevice currentDevice] batteryLevel];
}
}
好了,是不是很简单呢?
以上就是在移动端获取手机上电量、时间、网络状态的方法,已经都分享给大家了。
马上就要十月一了,希望大家愉快的度过假期,提前祝大家十一快乐哈。
(*^‧^*)
下期分享见咯
本文分享自 韩东吉的Unity杂货铺 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!