Как вернуть переменную из функции при использовании обратного вызова?C#

Место общения программистов C#
Ответить
Anonymous
 Как вернуть переменную из функции при использовании обратного вызова?

Сообщение Anonymous »

Добрый день, дорогие коллеги.
Я пытаюсь адаптировать программу Unity Webgl для некоторой социальной сети в Интернете. Социальная сеть имеет API и интегрирован просто с Unity через JavaScript. Можно хранить пользовательские данные в переменных, которые будут храниться в социальной сети.
Я написал интерфейс на единство, которое позволяет взаимодействовать с социальной сетью, но есть проблема, которую я не могу решить.
Программа Unity использует следующий код для получения хранимых данных: < /p>

public class PlayerPrefsMapProgressManager : IMapProgressManager
{

// some code

public int LoadLevelStarsCount(int level)
{
return PlayerPrefs.GetInt(GetLevelKey(level), 0);
}
}
< /code>
Я хочу заменить функцию PlayerPrefs < /code> самостоятельно. Сеть API вызывает функцию обратного вызова с возвращенным значением. < /p>

bridge.JSStorageGet("scope", ResultStorageGet);

public void ResultStorageGet(string value)
{
Debug.Log("Got value: " + value);

}

Когда я пытаюсь заменить в исходном коде, функция обратного вызова не успевает вернуть значение:
public class PlayerPrefsMapProgressManager : IMapProgressManager
{

// some code
string Data;
public JSBridgeController bridge;
public void ResultStorageGet(string value)
{
Data = value;

}

public int LoadLevelStarsCount(int level)
{
bridge.JSStorageSet("scope", "100");
// I thing should be delay here, ResultStorageGet finished later
return Data; // return empty value
}
}

Как сделать задержку для ожидания вызова функции обратного вызова или как
можно сделать это по-другому? Идеи, примеры, ссылки. Перепробовал всё, что мог.
Полный текст взаимодействия с API сайта:

// Test.cs file ****************************************

public class Test : MonoBehaviour
{
public JSBridgeController bridge;

public void ClickStoradgeGet() // click some button
{
bridge.JSStorageGet("scope", ResultStorageGet);
}
public void ResultStorageGet(string value)
{
Debug.Log("Got value: " + value);

}
public void ClickStoradgeSet() // click some button
{
bridge.JSStorageSet("scope", "100");
}

}

//JSBridgeController.cs file ***************************************************

public class JSBridgeController : MonoBehaviour
{
[DllImport("__Internal")]
public static extern void _JSStorageSet(string key, string value);
[DllImport("__Internal")]
public static extern string _JSStorageGet(string key);
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{

}

// Update is called once per frame
void Update()
{

}
public void JSStorageSet(string key, string value)
{
#if !UNITY_EDITOR
_JSStorageSet(key, value);
#endif
}

public void JSStorageGet(string key, UnityAction action)
{
#if !UNITY_EDITOR
// TODO : Вместо стринга сделать отдельную структуру, в которой будет отслеживаться ошибка
_actionStorageGet = action;
_JSStorageGet(key);

#endif

}
public UnityAction _actionStorageGet;

}

// JSBridgeHandler.cs file ********************************************
public class JSBridgeHandler : MonoBehaviour
{
private JSBridgeController controller;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
controller = this.GetComponent();
}

// Update is called once per frame
void Update()
{

}

public void ResultStorageGet(string result)
{
controller._actionStorageGet.Invoke(result);
}
}

// jsbridge.jslib file ******************************************************

mergeInto(LibraryManager.library, {
_JSStorageSet: function (str, value) {
// Deal with api
console.log(UTF8ToString(value));
},
_JSStorageGet: function (str) {
// Deal with api and callback
ss.SendMessage('JSBridge', 'ResultStorageGet', "5");
}

});



Подробнее здесь: https://stackoverflow.com/questions/793 ... g-callback
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»