Добрый день, дорогие коллеги.
Я пытаюсь адаптировать программу 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
Как вернуть переменную из функции при использовании обратного вызова? ⇐ C#
Место общения программистов C#
1737734347
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");
}
});
Подробнее здесь: [url]https://stackoverflow.com/questions/79384573/how-to-return-variable-from-function-when-using-callback[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия