【问题标题】:How to update data from remote server in unity?如何统一更新来自远程服务器的数据?
【发布时间】:2019-03-12 15:25:09
【问题描述】:

我是 Unity 新手,现在处于学习阶段。

我正在尝试将硬币和钻石从 Unity 游戏更新到 apache 服务器。

我从后端开发者那里得到了一个 URL

这是网址

http://192.168.10.89:8080/GameManage/coindiamond/

邮递员中的POST请求

在邮递员中测试此网址时。金币和钻石更新正常。

但是当我在 Unity 中进行测试时,它不会。 (后端开发人员对统一一无所知)。

这是我的 C# 代码。

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;

public class PostJsonDataScript : MonoBehaviour
{ 
    string url = "http://192.168.10.89:8080/GameManage/coindiamond/";
    public int id, coin, diamond;

    private void Start()
    {

    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            id = 1;
            coin = 3;
            diamond = 4;
            UpdateUser(id, coin, diamond);
            Debug.Log("updated");
        }
    }


    public void UpdateUser(int id, int coin, int diamond)
    {
        WWWForm form = new WWWForm();
        form.AddField("id", id);
        form.AddField("coin", coin);
        form.AddField("diamond", diamond);
    }
}

我已经被困在这里 2 周了。有人请帮帮我

我的代码变成了这样

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
using System.Collections;

public class PostJsonDataScript : MonoBehaviour
{
    public int id, coin, diamond;
    string url = "http://192.168.10.89:8080/GameManage/coindiamond/";

    private IEnumerator UpdateUser(int userId, int userCoin, int userDiamond)
    {
        userId = 1;
        userCoin = 2;
        userDiamond = 3;

        var json = "{\"id\":\"" + userId + "\",\"coin\":\"" + userCoin + "\",\"diamond\":\"" + userDiamond + "\"}";

        Debug.Log(json);

        UnityWebRequest www = UnityWebRequest.Post(url, json);

        {

            www.SetRequestHeader("Content-Type", "application/json");
            www.SetRequestHeader("Accept", "text/json");



            yield return www.SendWebRequest();


            if (www.isNetworkError || www.isHttpError)
            {
                Debug.LogErrorFormat(this, "Upload failed with: {0} - {1}", www.responseCode, www.error);
            }
            else
            {
                Debug.Log("Form upload complete!");
            }
        }
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            id = 1;
            coin = 2;
            diamond = 3;
            StartCoroutine(UpdateUser(id, coin, diamond));
        }
    }
}

我的语法正确吗?

我上传失败:400 - Generic/Unknown Http error

【问题讨论】:

  • 错误是什么?
  • 在我给出的代码中 id = 1;硬币 = 2;钻石 = 3;当我运行程序时,它应该将这些值更新到服务器但它不会@Johnny
  • 如果您正在发布帖子,那么服务器需要处理该请求。这不再与 Unity 相关,但更可能是 php、nodeJS 或其他服务器端开发。
  • 您创建了一个WWWForm,但我没有看到任何创建请求的尝试,例如使用UnityWebRequest.Post 以实际将请求发送到服务器...??
  • 顺便说一句 WWW 也已过时。也许更好地使用UnityWebRequest.Post...

标签: c# unity3d


【解决方案1】:

您创建了表单,但从未真正将其发送到服务器!

使用UnityWebRequest.Post

private IEnumerator UpdateUser(int userId, int userCoin, int userDiamond)
{
    WWWForm form = new WWWForm();
    form.AddField("id", userId);
    form.AddField("coin", userCoin);
    form.AddField("diamond", userDiamond);

    using (UnityWebRequest www = UnityWebRequest.Post(url, form))
    {
        yield return www.SendWebRequest();

        if (www.isNetworkError || www.isHttpError)
        {
            Debug.LogErrorFormat(this, "Upload failed with: {0} - {1}", www.responseCode, www.error);
        }
        else
        {
            Debug.Log("Form upload complete!", this);
        }
    }
}

然后像这样开始

private void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        id = 1;
        coin = 3;
        diamond = 4;
        StartCoroutine (UpdateUser(id, coin, diamond));
    }
}

请注意,WWWForm 的使用也是传统方式,仅仍受支持以允许从已过时的 WWW 迁移。

您可能想要使用MultipartFormDataSection 代替,如图所示here


但是,在postman 中,您实际上是在发布 JSON 字符串而不是表单数据,并且还使用字符串作为值而不是数字值。所以也许你应该尝试这样做

var json = "{\"id\":\"" + userId + "\",\"coin\":\"" + userCoin + "\",\"diamond\":\"" + userDiamond + "\"}";

UnityWebRequest www = UnityWebRequest.Post(url, json)
{
    ...
}

旁注:192.168.10.89:8080 是本地网络地址,不在 Internet 中路由。因此,仅当您运行 Unity 的设备与您的服务器位于同一本地网络中或至少路由正确时,它才有效。

【讨论】:

  • 我复制了你的代码并测试了很多次。还是不更新。现在我的大脑着火了。无论如何感谢您的回复。您认为服务器端代码需要更改吗? @derHugo
  • @KhantMinSiThu 我不知道你的服务器端代码......你从请求中得到任何错误还是你得到输出Form upload complete!?如果 Unity 端正常工作,则服务器或表单本身可能有问题.. 请注意,您在 postman 中发送的内容似乎是 JSON 字符串而不是表单...
  • 是的,它是一个 Json 字符串。我试着按照你的教导改变。但数据不会进入服务器。我收到一条错误消息 { Generic/Unknown Http error } 我也没有收到任何 debug.log 上传失败或表单上传完成。
  • 如果你没有得到任何调试日志,那么你从哪里得到error message { Generic/Unknown Http error }
  • 对不起上传失败。现在我尝试添加这两条线 www.SetRequestHeader("Content-Type", "application/json"); www.SetRequestHeader("接受", "text/json");因为我收到了错误代码 405。但在那之后我收到错误代码 400 + Generic/unknown Http 错误仍然不会上传@derHugo
猜你喜欢
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多