Похоже, вы пытаетесь линеаризовать сопрограмму. «StartCoroutine» не работает как ожидание.
Давайте сначала go о том, как работает ваша сопрограмма GetRequest.
IEnumerator GetRequest(string uri)
{
using (UnityWebRequest webRequest = UnityWebRequest.Get(Host + uri))
{
yield return webRequest.SendWebRequest();
response = webRequest.downloadHandler.text;
}
}
Приведенный выше код создает новый веб-запрос и возвращает элемент управления Unity каждый кадр до тех пор, пока веб-запрос завершен.
Думайте о yield return webRequest.SendWebRequest();
так:
while(!webRequest.isDone)
{
//suspend the coroutine until next frame
yield return null;
}
Это просто приостанавливает сопрограмму каждый кадр, пока не будет получен ответ.
Теперь давайте пройдемся по вашему коду и посмотрим, что происходит:
var roomID =client.GetID("Rooms/", roomName.text, "IDRoom");
, который вызывает:
public int GetID(string entity, string identify, string ID)
{
StartCoroutine(GetRequest(entity + identify));
var json = ParseJson(response);
return int.Parse(json[ID]);
}
Начиная с webRequest.SendWebRequest () в вашем GetRequest метод не мгновенный, ответ не будет содержать анализируемые JSON данные, по крайней мере, до следующего кадра.
С GetID вызывается во фрейме (и не является сопрограммой), он выполняет все свои логики c в фрейме, который он вызывает. Он пытается Разобрать Json (ответ) на неустановленном ответе , поэтому ваша сопрограмма не успевает написать.
Как сделать мы это исправим?
К сожалению, универсального решения не существует. Вам нужно будет разграничить логику c, чтобы она могла происходить в нескольких кадрах. Умное использование Queues могло бы хорошо послужить здесь, или размещение большего количества логик c внутри CoRoutine также могло бы решить эту проблему.
Вот пример использования CoRoutines, так как Queues вероятно требуется больше кода для их мониторинга / обработки:
Переместите логи конфигурации комнаты c сопрограмму (и вместо того, чтобы вкладывать сопрограммы, просто вызовите веб-запрос из этого):
public IEnumerator ConfigureRoom(string roomNameText, RoomOptions roomOptions, TypedLobby sqlLobby)
{
client.PostRoom(roomNameText)
using (UnityWebRequest webRequest = UnityWebRequest.Get("Rooms/" + roomNameText))
{
yield return webRequest.SendWebRequest();
response = webRequest.downloadHandler.text;
}
var json = ParseJson(response);
var roomId = int.Parse(json["IDRoom"]);
client.PostPlayer(PhotonNetwork.NickName, roomID);
PhotonNetwork.CreateRoom(roomNameText, roomOptions, sqlLobby);
}
//Inside of your CreateRoom() method
if (roomName.text.Length != 0)
{
StartCoroutine(ConfigureRoom(roomName.text, roomOptions, sqlLobby));
}
Это позволяет создавать вашу комнату и обновлять данные в течение нескольких кадров.
Отказ от ответственности: Я набрал все это в браузере. Могут быть незначительные синтаксические ошибки. Пожалуйста, дайте мне знать, чтобы я мог их исправить.