Unity常用网络请求方式

这篇具有很好参考价值的文章主要介绍了Unity常用网络请求方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引子

小编这两天在测试API接口,主要是用Postman和Unity上写的程序来做测试,刚刚好给大家分享一下Unity中常用的网络请求方式吧

Unity网络请求程序演练

UnityWebRequest

UnityWebRequest 是 Unity 5.2 引入的一个新的 API,可以用来进行 HTTP、HTTPS、FTP 等协议的网络请求。它支持异步请求,支持 GET、POST等请求方式。UnityWebRequest 能够处理大部分常见的 HTTP 状态响应码,如 404(未找到)、302(重定向)、500(服务器内部错误)等。UnityWebRequest 也支持上传和下载文件,以及在后台运行请求

GET请求

以下是一个使用UnityWebRequest发送GET请求的示例:

IEnumerator GetRequest(string url)
{
    UnityWebRequest request = UnityWebRequest.Get(url);

    yield return request.SendWebRequest();

    if (request.result != UnityWebRequest.Result.Success)
    {
        Debug.Log(request.error);
    }
    else
    {
        Debug.Log(request.downloadHandler.text);
    }
}
 

你可以将该函数添加到MonoBehaviour脚本中,并在需要的时候调用它。例如:

void Start()
{
    string url = "https://jsonplaceholder.typicode.com/todos/1";
    StartCoroutine(GetRequest(url));
}

POST请求

以下是使用UnityWebRequest发送POST请求的示例代码:

string url = "http://example.com/api/user/login";
string data = "{\"username\":\"test\",\"password\":\"123456\"}";

UnityWebRequest request = new UnityWebRequest(url, "POST");
byte[] bodyRaw = Encoding.UTF8.GetBytes(data);
request.uploadHandler = new UploadHandlerRaw(bodyRaw);
request.downloadHandler = new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", "application/json");

yield return request.SendWebRequest();

if (request.result == UnityWebRequest.Result.Success)
{
    string responseText = request.downloadHandler.text;
    // 处理服务器返回的数据
}
else
{
    Debug.LogError(request.error);
}

在上述示例中,我们使用了 UnityWebRequest 对象来发起一个 POST 请求。我们首先定义了请求目标的 URL 和请求体的数据。接下来创建了一个 UnityWebRequest 类型的对象,指定了请求的方法为 POST,设置了请求体,并指定了请求头。然后通过 SendWebRequest 方法来发送请求。请求发送成功后,我们可以从 downloadHandler 属性中获取服务器的响应数据,并进行相应的处理。如果请求发送失败,则可以从 error 属性获取错误信息。

WWW

WWW 是 Unity 3D 早期版本使用的网络请求类。它很容易使用,可以用来加载图片、音频、视频等资源,也可以用来进行 HTTP 请求。不过,WWW 类没有 UnityWebRequest 强大,它不能很好地处理 HTTP 状态响应码,也不支持上传和下载文件

GET请求

以下是一个简单的Unity WWW Get请求示例:

using UnityEngine;
using System.Collections;

public class Example : MonoBehaviour {

    void Start () {
        StartCoroutine(GetText());
    }

    IEnumerator GetText() {
        // 向http://www.example.com发送GET请求
        using (WWW www = new WWW("http://www.example.com")) {
            yield return www; // 等待请求完成

            // 检查是否有错误
            if (string.IsNullOrEmpty(www.error)) {
                Debug.Log("Response: " + www.text);
            } else {
                Debug.Log("Error: " + www.error);
            }
        }
    }
}

在这个例子中,我们向http://www.example.com发送一个GET请求,并等待它完成。一旦请求完成,我们检查是否有错误,并输出服务器返回的文本。请注意,我们使用了协程,因为WWW请求在Unity中是异步的,因此我们需要等待它完成

POST请求

以下是使用Unity发送POST请求的示例代码:

IEnumerator Post(string url, string data)
{
    // 将数据转换为字节数组
    byte[] postData = Encoding.UTF8.GetBytes(data);

    // 创建一个Web请求
    UnityWebRequest request = UnityWebRequest.Post(url, "POST");

    // 设置请求体中的数据
    request.uploadHandler = new UploadHandlerRaw(postData);

    // 设置请求头中的内容类型
    request.SetRequestHeader("Content-Type", "application/json");

    // 发送请求
    yield return request.SendWebRequest();

    // 检查请求是否发生错误
    if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError)
    {
        Debug.Log("POST请求错误:" + request.error);
    }
    else
    {
        // 获取响应数据
        string response = request.downloadHandler.text;

        // 处理响应数据
        Debug.Log("POST请求响应:" + response);
    }
}

使用示例:

StartCoroutine(Post("https://httpbin.org/post", "{\"name\": \"test\"}"));

该示例将发送一个POST请求到https://httpbin.org/post网址,并携带一个名为test的JSON数据。您可以根据需要修改url和data参数来发送不同的请求。

HttpClient

HttpClient 是一个.NET 的 Http 编程库,可以用来在 Unity 中进行网络请求。它支持异步请求,支持 GET、POST 等请求方式。不过,HttpClient 是一个独立的 .NET 库,需要手动将其导入项目中

GET请求

下面是一个使用C#中HttpClient类发起GET请求的示例代码:

using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        using var client = new HttpClient();
        // 设置请求头信息,可选
        client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");
        try
        {
            // 发起GET请求
            var response = await client.GetAsync("https://www.example.com/");
            response.EnsureSuccessStatusCode(); // 确保响应成功
            var responseBody = await response.Content.ReadAsStringAsync(); // 获取响应主体内容
            Console.WriteLine(responseBody);
        }
        catch (HttpRequestException e)
        {
            Console.WriteLine($"请求失败:{e.Message}");
        }
    }
}

这个示例使用了HttpClient类中的GetAsync方法发起GET请求,并使用EnsureSuccessStatusCode方法确保响应成功。响应的主体内容可以使用ReadAsStringAsync方法获取。在请求之前,可以使用DefaultRequestHeaders属性设置请求头信息,也可以在发送请求时传递HttpHeaders对象作为参数实现。

POST请求

以下是使用Unity中的HttpClient进行POST请求的示例:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json;

public class HttpClientExample : MonoBehaviour {
    async void Start() {
        var values = new Dictionary<string, string> {
            { "username", "example_user" },
            { "password", "example_password" }
        };

        var content = new FormUrlEncodedContent(values);

        using (var client = new HttpClient()) {
            var response = await client.PostAsync("http://example.com/api/login", content);

            var responseString = await response.Content.ReadAsStringAsync();

            var responseData = JsonConvert.DeserializeObject<LoginResponse>(responseString);
            
            Debug.Log("Login Status: " + responseData.success);
            Debug.Log("User ID: " + responseData.user_id);
        }
    }
}

public class LoginResponse {
    public bool success { get; set; }
    public string user_id { get; set; }
}

在这个示例中,我们创建了一个Dictionary对象来存储POST请求的参数,然后使用FormUrlEncodedContent将其转换为可以发送到服务器的内容。我们将POST请求发送到“http://example.com/api/login”地址,并使用HttpClient来处理响应。最后,我们使用JsonConvert将响应数据反序列化为LoginResponse对象,并将其输出到Unity的控制台中。

请注意,由于HttpClient是异步的,我们在使用它时必须使用async和await关键字。这将确保我们的应用程序在等待响应时不会被挂起。

RESTful API

是一种基于 HTTP 协议的 API 接口,它使用 HTTP 的 POST、GET、DELETE、PUT 等方法来进行资源的操作。在 Unity 中,可以使用 UnityWebRequest、HttpClient 等类库来调用 RESTful API 接口

GET请求

下面是一个基本的Unity中使用RESTful API进行GET请求的示例代码:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;

public class RESTfulAPIExample : MonoBehaviour {
    IEnumerator Start() {
        // 设置请求的url
        string url = "http://www.example.com/api/data";

        // 创建GET请求对象
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.Method = "GET";
        request.ContentType = "application/json";

        // 发送请求并获取响应信息
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Stream stream = response.GetResponseStream();
        StreamReader reader = new StreamReader(stream, Encoding.UTF8);
        string result = reader.ReadToEnd();
        reader.Close();
        response.Close();

        // 处理响应数据
        Debug.Log(result);

        yield return null;
    }
}

以上代码片段通过使用Unity的协程功能,向指定的url(即http://www.example.com/api/data)发送GET请求,并从响应中获取数据并打印到控制台中。该请求使用了application/json的Content-Type头部,如果需要使用其他类型的Content-Type,需要进行相应的修改。

需要注意,以上代码中的请求均为同步请求,如果需要使用异步请求或其他更高级的功能,需要进行相应的扩展和修改。

POST请求

下面是一个使用Unity的C#代码示例,用于向RESTful API发送POST请求:

IEnumerator PostRequest(string url, string jsonData)
{
    UnityWebRequest request = UnityWebRequest.Post(url, "POST");
    byte[] bodyRaw = Encoding.UTF8.GetBytes(jsonData);
    request.uploadHandler = new UploadHandlerRaw(bodyRaw);
    request.downloadHandler = new DownloadHandlerBuffer();

    yield return request.SendWebRequest();

    if (request.result == UnityWebRequest.Result.ConnectionError || 
        request.result == UnityWebRequest.Result.ProtocolError)
    {
        Debug.LogError(request.error);
    }
    else
    {
        Debug.Log(request.downloadHandler.text);
    }
}

示例中的 url 参数是POST请求的目标URL, jsonData 参数是要发送的JSON数据。

该代码使用Unity的 UnityWebRequest 类来发送POST请求。 UnityWebRequest 允许您指定请求的类型(在本例中为“POST”),上传请求主体,并从响应中下载响应主体。

使用 yield 关键字使此函数成为协程,以确保请求在后台线程上执行而不会阻塞主线程。在协程完成后,检查UnityWebRequest对象的结果以确定是否存在错误,并输出响应的文本内容或错误消息。

Socket

适用于自定义的网络协议,可实现定制化的网络通信

GET请求

这里是一个简单的 Unity C# Socket GET请求示例:

using System;
using System.Net.Sockets;
using System.Text;

public class SocketGETRequest {
    public static void Main() {
        // 创建一个Socket对象
        Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        // 连接到目标网站
        clientSocket.Connect("www.example.com", 80);

        // 构建HTTP GET请求
        string getRequest = "GET / HTTP/1.1\r\n";
        getRequest += "Host: www.example.com\r\n";
        getRequest += "Connection: Close\r\n\r\n";

        // 发送请求
        byte[] requestBytes = Encoding.ASCII.GetBytes(getRequest);
        clientSocket.Send(requestBytes);

        // 接收响应
        byte[] buffer = new byte[1024];
        int bytesRead = clientSocket.Receive(buffer);
        string response = Encoding.ASCII.GetString(buffer, 0, bytesRead);

        // 输出响应
        Console.WriteLine(response);

        // 关闭Socket连接
        clientSocket.Shutdown(SocketShutdown.Both);
        clientSocket.Close();
    }
}

这个示例中,我们创建了一个Socket对象,连接到了一个名为www.example.com的网站,然后构建了一个HTTP GET请求,将请求发送给服务器,并等待响应。最后,我们输出了响应,并关闭了Socket连接。

POST请求

以下是使用Unity的C#代码示例来进行Socket POST请求的示例:

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class SocketClient
{
    private Socket socket;

    public SocketClient()
    {
        try
        {
            // 创建Socket
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        }
        catch (SocketException ex)
        {
            Debug.Log($"创建Socket失败: {ex}");
        }
    }

    public void Request(string url, string data)
    {
        try
        {
            // 解析URL
            Uri uri = new Uri(url);
            IPAddress ipAddress = Dns.GetHostAddresses(uri.Host)[0];
            IPEndPoint remoteEndPoint = new IPEndPoint(ipAddress, uri.Port);

            // 连接服务器
            socket.Connect(remoteEndPoint);

            // 构造HTTP POST请求
            string request = $"POST {uri.PathAndQuery} HTTP/1.1\r\n" +
                             $"Host: {uri.Host}\r\n" +
                             "Content-Type: application/x-www-form-urlencoded\r\n" +
                             $"Content-Length: {data.Length}\r\n" +
                             "Connection: close\r\n" +
                             "\r\n" +
                             $"{data}";

            // 发送请求
            byte[] requestBytes = Encoding.ASCII.GetBytes(request);
            socket.Send(requestBytes);

            // 接收服务器响应
            byte[] receiveBuffer = new byte[1024];
            int receiveSize = socket.Receive(receiveBuffer);

            // 处理服务器响应
            string response = Encoding.ASCII.GetString(receiveBuffer, 0, receiveSize);
            Debug.Log($"服务器响应:{response}");
        }
        catch (Exception ex)
        {
            Debug.Log($"请求异常:{ex}");
        }
        finally
        {
            // 关闭连接
            socket.Close();
        }
    }
}

使用示例:

SocketClient socketClient = new SocketClient();
socketClient.Request("http://localhost:8080/your_api_path", "param=value");

注:以上示例仅用于演示Socket POST请求的基本流程,实际应用中需要考虑更多的异常处理、数据加密等安全问题。

总结

在使用网络请求的过程中,需要注意请求方式的选择、请求参数的设置、请求结果的处理等方面。同时,也需要注意网络请求过程中可能出现的错误情况,如网络连接失败、请求超时、服务器返回错误等,需要进行合理的异常处理

要是有疑问大家可以加我微信详聊 yf1553653788文章来源地址https://www.toymoban.com/news/detail-709138.html

到了这里,关于Unity常用网络请求方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity vs Godot :哪个游戏引擎更适合你?

    游戏引擎的选择对开发过程和最终产品质量有着重大影响。近年来,Godot和Unity这两款引擎受到广泛关注。本文将从多个维度对两者进行比较,以期为开发者提供正确的选择建议。 Godot和Unity都有各自的优势,没有绝对的好坏之分。Godot开源免费,上手简单,更适合2D和小型游戏

    2024年01月23日
    浏览(98)
  • 30分钟了解所有引擎组件,132个Unity 游戏引擎组件速通!【收藏 == 学会】

    🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN 🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 🌲Unity实战100例专栏推荐:Unity 实战100例 教程 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长

    2024年02月11日
    浏览(74)
  • Unity游戏开发之游戏存档方式

    目录 1.Unity自带存储方式PlayerPrefs 2.XML存储方式 3.Json类型存储方式 1.Unity的序列化问题 2.Unity中支持序列化的类 3.Unity中Json的使用方法  4.SQLite 1.SQLite的一些基础(简单介绍,不会深入讲解) 2.在Unity中使用SQLite 3.SQLite的优劣 结语         属于unity自带的数据存储方法,其形式

    2024年02月06日
    浏览(49)
  • Unity Physics2D 2d物理引擎游戏 笔记

    2d 材质 里面可以设置 摩擦力 和 弹力 Simulated:是否在当前的物理环境中模拟,取消勾选该框类似于Disable Rigidbody,但使用这个参数更加高效,因为Disable会销毁内部产生的GameObject,而取消勾选Simulated只是禁用。 Kinematic 动力学刚体 动力学刚体不受重力和力的影响,而受用户的

    2023年04月24日
    浏览(124)
  • Unity和UE4两大游戏引擎,你该如何选择?

    目录 游戏引擎 2 —— 难易区别 编程语言 3 —— 游戏产品 UE4制作的游戏产品  Unity制作的游戏产品  产品类型 5 —— 资源商店 6 —— 人才需求 平均薪资 总结      Unity和UE4都是游戏引擎,所谓游戏引擎就是集成了复杂功能的游戏开发软件,他们帮我们实现了复杂的底层逻

    2023年04月08日
    浏览(73)
  • GODOT游戏引擎简介,包含与unity性能对比测试,以及选型建议

    GODOT,是一个免费开源的3D引擎。本文以unity作对比,简述两者区别和选型建议。由于是很久以前写的ppt,技术原因视频和部分章节丢失了。建议当做业务参考。 GODOT目前为止遇到3个比较重大的机遇,第一个是oprea的合作奖,第二个是用支持c#换来的微软的投资,第三个是虚幻

    2024年02月14日
    浏览(88)
  • Unity 引擎做残影效果——3、顶点偏移方式

    Unity实现残影效果   大家好,我是阿赵。   继续讲Unity引擎的残影做法。这次的残影效果和之前两种不太一样,是通过顶点偏移来实现的。   具体的效果是这样:   与其说是残影,这种效果更像是移动速度很快时造成的速度线,所以在移动过程中的效果还是非常好

    2024年02月14日
    浏览(34)
  • Unity 引擎做残影效果——2、屏幕后处理方式

    Unity实现残影效果   大家好,我是阿赵。   这里继续介绍Unity里面做残影的方法。之前介绍了BakeMesh的方法做残影,这一期介绍的是用屏幕后处理的方法做残影。   之前的BakeMesh方法,是真的生成了很多个网格模型在场景里面。如果用后处理做,就没有这个过程。   

    2024年01月17日
    浏览(44)
  • Unity 开发人员转CGE(castle Game engine)城堡游戏引擎指导手册

    一、简介 2. Unity相当于什么GameObject? 3. 如何设计一个由多种资产、生物等组成的关卡? 4. 在哪里放置特定角色的代码(例如生物、物品)?Unity 中“向 GameObject 添加 MonoBehaviour”相当于什么? 5.Unity子目录相当于什么Assets? 6. 支持哪些模型格式? 7. 支持FBX模型格式吗? 8.

    2024年02月07日
    浏览(79)
  • SuperMap Hi-Fi 3D SDK for Unity制作游戏引擎材质

    kele     在交通,电力,规划等行业中,有的对象常常具有很强的质感,比如金属质感的 钢轨,电力塔;陶瓷材质的绝缘子;玻璃材质的建筑幕墙等,但常规方式的表现效果 往往差强人意。     游戏引擎(Unity3D)中已有丰富的材质资源库,比如玻璃,金属等材质,这

    2024年02月09日
    浏览(87)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包