使用 Unity 实现与 API 的交互及处理中文编码——6.18山大软院项目实训

Unity中的UnityWebRequest

UnityWebRequest是Unity提供的一个强大的网络库,用于发送和接收与网络相关的数据。我们使用它来发送POST请求到一个REST API,并接收响应。

示例脚本概览

我们的脚本GetUrl包含以下几个关键部分:

  • APIRequestData类:用于序列化发送到服务器的数据。
  • ServerResponse类:用于反序列化从服务器接收的响应。
  • 发送请求:使用UnityWebRequest发送JSON格式的POST请求。
  • 处理中文编码:特别处理从API接收的包含中文的JSON字符串。
发送和接收JSON数据

SendRequest方法演示了如何构造一个JSON对象,并将其作为POST请求的一部分发送到服务器。该方法使用了Unity的JsonUtility来序列化请求数据。接收到的响应同样是JSON格式,我们使用了Newtonsoft.Json来进行反序列化,这是因为它提供了比JsonUtility更强大的功能,特别是在处理复杂对象时。

处理Unicode编码

从API接收的响应可能包含Unicode编码的中文字符,直接在Unity中显示这些字符可能会遇到问题。为了解决这一问题,我们实现了ConvertUnicodeJsonToChinese方法,它使用Regex.Unescape来将Unicode编码转换为可读的中文字符。这保证了无论API如何返回中文数据,用户都能在游戏中看到正确的中文文本。

调用示例

GetUrl脚本提供了一个talk公共方法,允许外部触发请求。在实际游戏中,这可以连接到UI元素,如按钮的点击事件。

完整脚本功能

此脚本不仅处理了网络请求和响应,还包括了错误处理逻辑,确保在发生连接错误或数据处理异常时,能够给予适当的反馈。

using UnityEngine;
using UnityEngine.Networking;
using System.Text;
using System.Collections;
using UnityEngine.UI;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
using System;

public class GetUrl : MonoBehaviour
{
public Text targetText;
private string apiUrl = "http://"; // 替换为实际的API端点URL
void Start()
{
   
}
public void talk(string word)
{
    StartCoroutine(SendRequest("你是导游机器人。"
        ,
        word));
}

IEnumerator SendRequest(string system, string user)
{
    // 创建一个新的JSON对象
    string jsonPayload = JsonUtility.ToJson(new APIRequestData
    {
        system = system,
        user = user
    });

    // 创建一个新的UnityWebRequest,并设置方法和上传的JSON数据
    using (UnityWebRequest webRequest = new UnityWebRequest(apiUrl, "POST"))
    {
        byte[] jsonToSend = new UTF8Encoding().GetBytes(jsonPayload);
        webRequest.uploadHandler = new UploadHandlerRaw(jsonToSend);
        webRequest.downloadHandler = new DownloadHandlerBuffer();
        webRequest.SetRequestHeader("Content-Type", "application/json");

        // 等待请求发送并接收响应
        yield return webRequest.SendWebRequest();

        if (webRequest.result == UnityWebRequest.Result.ConnectionError || webRequest.result == UnityWebRequest.Result.ProtocolError)
        {
            Debug.LogError("Error: " + webRequest.error);
        }
        else
        {
            targetText.text = ConvertUnicodeJsonToChinese(webRequest.downloadHandler.text);
            Debug.Log(ConvertUnicodeJsonToChinese(webRequest.downloadHandler.text));
        }
    }
}

string ConvertUnicodeJsonToChinese(string jsonString)
{
    string decodedString = Regex.Unescape(jsonString);
    //Debug.Log(decodedString);
    return ProcessResponse(decodedString);
}
string ProcessResponse(string json)
{
    try
    {
        ServerResponse response = JsonConvert.DeserializeObject<ServerResponse>(json);
        return response.response;  // 输出 response 字段
    }
    catch (JsonException e)
    {
        Debug.LogError("JSON Parse Error: " + e.Message);
        return "error";
    }
}

// 用于序列化JSON的类
[System.Serializable]
public class APIRequestData
{
    public string system;
    public string user;
}

[Serializable]
public class ServerResponse
{
    public string response;
    public int status_code;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值