そこで、静的メソッドをたくさん持つオブジェクトを作成したいと思います。メソッドは、リモート サーバーへの API です。私は読んでいて、ユニティメソッドを使用できると思ってStartCoroutine
いましたが、この状況では使用できないため、どこに行けばよいかわかりません。
一般的な考え方は、オブジェクトのメソッドの 1 つを呼び出し、デリゲートを渡し、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";
}
}