Нужно подождать, пока единица получит время сервера, чтобы начать крафт - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь настроить систему ремесла, которая использует время сервера playfab для вычисления времени завершения ремесла.

Вот так я получаю время сервера:

 public void GetServerTime()
{
    PlayFabClientAPI.GetTime(new GetTimeRequest(), (GetTimeResult result) =>
    {          
        DateTime now = result.Time.AddHours(1); // GMT+1
        serverTime = Utilities.ConvertToUnixTimestamp(now);  // in seconds          
    }, null);
}

Вкл.нажмите кнопку «Start Craft». У меня есть этот код:

public void StartCraft(double craftTime)
{
    playFab.GetServerTime(); //server time variable updates
    double endTime = serverTime + craftTime;   
    StartCrafting(craftTime); // coroutine
}

После завершения сопрограммы я хочу проверить, действительно ли серверное время> = до времени окончания (таким образом также следует избегать мошенничества).

Проблема в том, что когда я получаю серверное время, требуется некоторое время для обновления переменной serverTime, и код продолжает выполняться, поэтому endTime неверен.Я хочу что-то вроде этого:

 double endTime = GetServerTime() + craftTime;

Но я не знаю, как сделать функцию для непосредственного возврата значения.Он говорит, что я не могу вернуть значение, потому что эта функция пуста.Как я могу решить это?Спасибо.

1 Ответ

0 голосов
/ 05 февраля 2019

(я не знаю, как именно работает ваш метод, поэтому немного угадайте)

GetServerTime кажется асинхронным, то есть вам придется подождать, пока вы не вернете значение.Таким образом, вы не можете напрямую вернуть значение.

Но вместо этого вы можете добавить обратный вызов, который будет выполнен, как только будет доступно значение.Вы можете затем удалить переменную serverTime.

public void GetServerTime(Action<double> callback)
{
    PlayFabClientAPI.GetTime(new GetTimeRequest(), (GetTimeResult result) =>
    {          
        DateTime now = result.Time.AddHours(1); // GMT+1

        // Execute whatever was set as callback passing it the serverTime
        callback?.Invoke(Utilities.ConvertToUnixTimestamp(now));         
    }, null);
}

И теперь вызывать ее, передавая сопрограмму как обратный вызов, например, как лямбда-выражение (так что вам не нужно передавать значение craftTime междуметоды)

public void StartCraft(double craftTime)
{
    playFab.GetServerTime(
        serverTime =>
        {
            double endTime = serverTime + craftTime;   
            StartCrafting(craftTime);
        }
    );
}

В качестве альтернативы, если вы предпочитаете иметь метод вместо лямбда-выражения, вам придется также передать значение craftTime между методами и обратно в обратный вызов

public void GetServerTime(double craftTime, Action<double, double> callback)
{
    PlayFabClientAPI.GetTime(new GetTimeRequest(), (GetTimeResult result) =>
    {          
        DateTime now = result.Time.AddHours(1); // GMT+1

        // Execute whatever was set as callback passing it the craftTime and serverTime
        callback?.Invoke(craftTime, Utilities.ConvertToUnixTimestamp(now));         
    }, null);
}

А теперь вызывайте его, передавая сопрограмму в качестве обратного вызова, используя метод, передающий также craftTime, чтобы он также был в обратном вызове

public void StartCraft(double craftTime)
{
    playFab.GetServerTime(craftTime, OnServerTimeReceived);
}

private void OnServerTimeReceived(double craftTime, double serverTime)
{
    double endTime = serverTime + craftTime;   
    StartCrafting(craftTime);
}

Или потому, что выможет иметь смесь между ними и использовать лямбда-выражение для вызова метода

public void GetServerTime(Action<double> callback)
{
    PlayFabClientAPI.GetTime(new GetTimeRequest(), (GetTimeResult result) =>
    {          
        DateTime now = result.Time.AddHours(1); // GMT+1

        // Execute whatever was set as callback passing it the serverTime
        callback?.Invoke(Utilities.ConvertToUnixTimestamp(now));         
    }, null);
}

и

public void StartCraft(double craftTime)
{
    playFab.GetServerTime(
        serverTime =>
        {
            OnServerTimeReceived(craftTime, serverTime);
        }
    );
}

private void OnServerTimeReceived(double craftTime, double serverTime)
{
    double endTime = serverTime + craftTime;   
    StartCrafting(craftTime);
}

Обратите внимание, что если StartCrafting действительно является сопрограммой, вы можетене вызывайте его как метод

StartCrafting(craftTime);

его нужно запустить вместо этого как

StartCoroutine(StartCrafting(craftTime));

Я предположил, что вы используете его правильно, и StartCrafting был void, который запускаетсопрограммная.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...