在开发游戏过程中,我们有可能会遇到这样的需求:当玩家切到后台,再切回前台时,需要计算出当前的离线收益。
我原本是打算用update中刷新计算的方式,来判断这中间的时间间隔。后来发现作用不大,而且Unity有对应的API。
基于Unity3D的 OnApplicationPause函数,我们可以判断游戏是否进入后台:
private void OnApplicationPause(bool focus)
{
//进入程序状态更改为前台
if (focus)
{
}
else
{
}
}
然后通过每次切入切出的时间,实现离线时间的判断,来给予玩家相应的离线奖励。
我们可以写个简单的脚本测试下效果:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class NewBehaviourScript : MonoBehaviour
{
public Text txt;
private string str;
// Start is called before the first frame update
void Start()
{
ChangeStr("开始测试");
}
void Update()
{
}
private void OnApplicationPause(bool _focus)
{
ChangeStr("时间" + Time.realtimeSinceStartup + " " + _focus);
}
/// <summary>
/// 改变文字
/// </summary>
void ChangeStr(string _str)
{
str += _str+"\n";
txt.text = str;
}
}
最终真机运行截图如下:
完整测试代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class NewBehaviourScript : MonoBehaviour
{
public Text txt;
private string str;
// Start is called before the first frame update
void Start()
{
ChangeStr("开始测试");
}
void Update()
{
}
#region 计算离线收益
private bool isFocus = false;
private float focusTime = 0;
private void OnApplicationPause(bool _focus)
{
ChangeStr("时间" + Time.realtimeSinceStartup + " " + _focus);
if (!_focus && isFocus)
{
//超过半分钟重启游戏
if (Time.realtimeSinceStartup - focusTime > 30)
{
ChangeStr("离线收益"+(Time.realtimeSinceStartup - focusTime));
}
}
focusTime = Time.realtimeSinceStartup;
isFocus = _focus;
}
#endregion
/// <summary>
/// 改变文字
/// </summary>
void ChangeStr(string _str)
{
str += _str+"\n";
txt.text = str;
}
}