嘿,我有一个关于几天来我正在处理的事情的问题。
我正在制作一个空闲的烹饪游戏,按下按钮将启动一个协程,并在它结束时玩家获得奖励(游戏的长篇故事)。
现在我希望烹饪过程需要很长时间才能获得更先进和更有价值的食物..让我们说1小时完成或类似的东西 所以玩家不会留在游戏中看着计时器倒计时,
我如何在玩家暂停游戏时更新协程计时器? 我找不到那么多的东西。
启动计时器“WaitForSeconds”后,您甚至可以更新协程吗? 我有一个脚本可以保存离线时间(退出/暂停到游戏继续之间的时间)
这是我如何在不暂停的情况下实施烹饪的代码。 如果我暂停游戏,那么计时器会冻结,直到我回来,如果我注销,那么它会在没有奖励或任何东西的情况下重置
请指导我应该如何处理这个问题?
真的很想得到你的帮助,谢谢
private FoodData foodData;
public void CookFood(int foodIndex) // Active cooking by clicking
{
foodData = foodManager.GetFoodData(foodIndex);
if (foodManager.IsFoodOnCooldown(foodIndex))
{
return;
}
float cookingTime = foodData.CookingTime;
int profit = foodData.Profit;
foodManager.SetFoodOnCooldown(foodIndex, true);
HOGManager.Instance.SaveManager.Save(foodManager.foods);
InvokeEvent(HOGEventNames.OnCookFood, foodIndex); // starts the loading bar and timer of cooking
StartCoroutine(StartCooking(cookingTime, profit, foodIndex));
}
private IEnumerator StartCooking(float cookingTime, int profit, int foodIndex)
{
yield return new WaitForSeconds(cookingTime);
playerMoney.UpdateCurrency(profit);
foodManager.SetFoodOnCooldown(foodIndex, false);
InvokeEvent(HOGEventNames.MoneyToastOnCook, foodIndex);
}
我试过像这样离线后做饭:
public void CookFoodAfterOffline(int foodIndex)
{
foodData = foodManager.GetFoodData(foodIndex);
int offlineTime = Manager.TimerManager.GetLastOfflineTimeSeconds();
float cookingTime = foodData.CookingTime;
if(foodData.IsOnCooldown == true)
{
if (offlineTime >= cookingTime)
{
return;
}
timeLeftToCook[foodIndex] = cookingTime - offlineTime;
int profit = foodData.Profit * foodData.CookFoodTimes;
foodManager.SetFoodOnCooldown(foodIndex, true);
InvokeEvent(HOGEventNames.CookFoodAfterOffline, foodIndex); // starts the loading bar and timer of cooking with the time left
StartCoroutine(StartCooking(timeLeftToCook[foodIndex], profit, foodIndex));
}
}
但这效果不佳,如果玩家只是暂停游戏,那么它也不会正常工作..
我在加载 UIManager 时激活它 但没有成功.. 也许问题出在 WaitForSeconds ...
我真的需要一个指南,说明当玩家回来并且计时器正确更新并在结束后分配奖励时通常采用何种方式处理离线时间 我用过它是用协程完成的,但也许这里不一样
您可以使用 WaitForSecondsRealtime 它不会阻止您的协程在游戏暂停时工作。
您需要使用
WaitForSecondsRealtime
,但请确保Application.runInBackground = true
并设置Application.targetFrameRate = 60
。