Итак, у меня есть проект Unity, в котором я хотел бы регистрировать время, когда мой игрок завершил уровень, на котором он находится.
Изначально я хотел использовать Firebase, но обнаружил, что не могу, поскольку сборки Windows Unity не поддерживают его, поэтому в итоге я просто создал API, который отправляет данные в MongoDB и снова делает некоторые другие вещи. не важно.
Итак, приступаем к сути проблемы:
У меня есть IEnumerator для отправки запроса:
Код: Выделить всё
IEnumerator logPlayerTime()
{
string url = "http://some-vercel-cloud-function/api/new";
var requestBody = new PlayerRequestBody();
requestBody.firstName = "John";
requestBody.lastName = "Doe";
requestBody.email = "email@email.com";
requestBody.marketing = false;
requestBody.time = 200000; // this actually come from somewhere else but for now this is fine
string json = JsonUtility.ToJson(requestBody);
UnityWebRequest request = UnityWebRequest.Put(url, json);
request.SetRequestHeader("Content-Type", "application/json");
request.SetRequestHeader("Accept", "*/*");
request.SetRequestHeader("Accept-Encoding", "gzip, deflate, br");
request.SetRequestHeader("Connection", "keep-alive");
request.useHttpContinue = false;
yield return request.SendWebRequest();
if (request.result != UnityWebRequest.Result.Success)
{
Debug.Log(request.error);
}
else
{
Debug.Log("Time Logged! " + json);
}
}
Что касается JSON, который мне нужен для отправки я сделал эту структуру
Код: Выделить всё
[Serializable]
private struct PlayerRequestBody
{
public string firstName;
public string lastName;
public string email;
public bool marketing;
public float time;
}
Все это говорит о том, что независимо от того, что я меняю в запросе, даже ввод строки JSON вручную экранируется. Он просто отправляет тело запроса пустого объекта JSON следующим образом:
Код: Выделить всё
{}
Код: Выделить всё
[PUT] /api/new 01:44:25:13 {}
Код: Выделить всё
// ...
private void Awake()
{
GameManager.OnGameStateChanged += GameManager_OnGameStateChanged;
}
// ...
private void GameManager_OnGameStateChanged(GameState state)
{
if (state == GameState.Victory)
{
handleVictory();
}
}
Подробнее здесь: https://stackoverflow.com/questions/723 ... son-string
Мобильная версия