(я не знаю, как именно работает ваш метод, поэтому немного угадайте)
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
, который запускаетсопрограммная.