unity3d 如何让协程在游戏暂停后继续工作?

brccelvz  于 2023-04-07  发布在  其他
关注(0)|答案(2)|浏览(349)

对了我有个问题要问几天了。
我正在做一个空闲的烹饪游戏,按下按钮将启动一个协程,在它结束时,玩家得到奖励(游戏的简短故事)。
现在我希望烹饪过程需要很长的时间来获得更高级和更有价值的食物..让我们说1小时完成或类似的东西,这样玩家就不会留在游戏中看着计时器下降,
当玩家暂停游戏时,我怎么更新协程计时器?我找不到任何关于这个的东西。
你甚至可以更新一个协程一旦你启动计时器“等待秒”?我有一个脚本,节省离线时间(退出/暂停之间的时间,当游戏继续)
这里的代码,我如何implemented烹饪没有暂停。。如果我暂停游戏,使计时器冻结,直到我回来,如果我注销,使它重置没有奖励或任何东西
请告诉我该如何处理这个问题?
我真的很想得到你的帮助,谢谢

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的加载中激活了这个,但是没有成功。。也许问题出在等待秒数上。。
我只是真的需要一个指导方针,以什么方式通常是接近处理离线时间,当一个球员回来和计时器更新正确和disribute奖励后,它结束了,以及我用它正在做的协程,但也许在这里是不同的

e5nszbig

e5nszbig1#

你可以使用WaitForSecondsRealtime,它不会阻止你的协程在游戏暂停时工作。

cbeh67ev

cbeh67ev2#

您需要使用WaitForSecondsRealtime,但确保Application.runInBackground = true并设置Application.targetFrameRate = 60

相关问题