Page 1 of 1

Wie kann ich Variable aus der Funktion zurückgeben, wenn ich Callback verwendete?

Posted: 25 Jan 2025, 12:24
by Guest
Guten Tag, liebe Kollegen. Das soziale Netzwerk verfügt über eine API und ist einfach in die Einheit über JavaScript integriert. Es ist möglich, Benutzerdaten in Variablen zu speichern, die im sozialen Netzwerk gespeichert werden. > Das Einheitsprogramm verwendet den folgenden Code, um gespeicherte Daten zu erhalten: < /p>

Code: Select all

public class PlayerPrefsMapProgressManager : IMapProgressManager
{

// some code

public int LoadLevelStarsCount(int level)
{
return PlayerPrefs.GetInt(GetLevelKey(level), 0);
}
}
< /code>
Ich möchte die Funktion von PlayerPrefs < /code> selbst ersetzen. Die Netzwerk -API ruft die Rückruffunktion mit dem zurückgegebenen Wert auf. < /p>

bridge.JSStorageGet("scope", ResultStorageGet);

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

}
Wenn ich versuche, im Quellcode zu ersetzen, hat die Rückruffunktion keine Zeit, den Wert zurückzugeben:

Code: Select all

    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
}
}
< /code>
Wie kann ich eine Verzögerung vornehmen, um auf die Aufruffunktion zu warten, oder wie kann ich es anders machen? Ideen, Beispiele, Links. Ich habe alles ausprobiert, was ich kann.
// 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");
}

});