所以我想做一个有一堆静态方法的对象。这些方法是远程服务器的 API。我正在阅读并认为我可以使用统一StartCoroutine
方法,但在这种情况下不可用,所以现在我不知道该去哪里。
一般的想法是我希望能够调用我的对象的一个方法,将它传递给一个委托并让 id 离开并完成它的工作。完成后,使用结果调用委托。我不能使用线程,因为 Unity3D 不是线程安全的。
我知道 c# 有这个yield
东西,我已经在几个地方读过它,但它仍然让我感到困惑。如何重构下面的代码,以便完成我正在尝试做的事情?
public class Server
{
private static string baseURL = "http://localhost/game.php";
private static Hashtable session_ident = new Hashtable();
//--- Public API
public delegate void DeviceSeenCallback(bool seen);
public static void DeviceSeen(DeviceSeenCallback callBack) {
StartCoroutine(DoDeviceSeen(callBack));
}
public delegate void AuthenticateCallback(bool authenticated, string errorMessage);
public static void Authenticate(string username, string passwordHash, AuthenticateCallback callBack) {
StartCoroutine(DoAuthenticate(username, passwordHash, callBack));
}
//--- Private API
private static IEnumerator DoDeviceSeen(DeviceSeenCallback callBack)
{
WWWForm form = new WWWForm();
form.AddField("deviceID", SystemInfo.deviceUniqueIdentifier);
WWW www = new WWW(baseURL + "?cms=seen", form.data, session_ident);
yield return www;
// Check for errors
callBack(ResultIsOk(www.text));
}
private static IEnumerator DoAuthenticate(string username, string passwordHash, AuthenticateCallback callBack)
{
WWWForm form = new WWWForm();
form.AddField("deviceID", SystemInfo.deviceUniqueIdentifier);
form.AddField("deviceType", SystemInfo.deviceType.ToString() + "||" + SystemInfo.deviceModel);
form.AddField("user", username);
form.AddField("pass", passwordHash);
WWW www = new WWW(baseURL + "?cms=auth", form.data, session_ident);
yield return www;
if (ResultIsOk(www.text)) {
callBack(true, "");
} else {
int code;
string message;
ResultGetError(www.text, code, message);
callBack(false, message);
}
}
private static bool ResultIsOk(string resultText) {
return false;
}
private static void ResultGetError(string resultText, out int code, out string message) {
code = -1;
message = "Some Error Message";
}
}