Unity用UnityWebRequest和 BestHttp的GET和POST表单提交,与php交互

本文详细介绍了Unity 2021中使用UnityWebRequest进行GET和POST请求,以及通过BestHttp插件与PHP交互下载图片的示例,展示了向服务器获取GM配置和数据处理的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

在unity2021中,WWW的资源加载方式过时了,新的方法为UnityWebRequest

 BestHttp的Get方式和Post方式

 部分API


在unity2021中,WWW的资源加载方式过时了,新的方法为UnityWebRequest

实际开发过程中,游戏APP通常在连接游戏服务器之前先从web服务器获取GM配置的相关信息,这里模拟服务器和前端的简单交互,用Unity的UnityWebRequest的GET和POST两种方式提交表单,向后端请求数据,后端返回JSON数据,前端根据返回数据执行相关逻辑。

Demo的内容:

  1. 用UnityWebRequest的GET和POST表单提交,与php(返回JSON)交互
  2. 从web服务器下载图片替换本地显示的图片
  3. 用BestHttp插件的GET和POST表单提交,与php(返回JSON)交互

 演示图片:

 

 演示视频:

UnityWebRequest下载图片demo

 直接上代码,都是老司机,demo仅供参考玩

PHP脚本:GetInfo.php

<?php

// 如果是GET请求
if ($_SERVER['REQUEST_METHOD'] == 'GET') {
    // Get访问。。。。
    if ($_GET["action"]=="login")
    {
        if ($_GET['user'] == 'admin' && $_GET['pwd'] == 'admin' && $_GET['time']>202205312146151616)
        {
            exit(json_encode([
                'code' => '200',
                'msg' => 'GET_success',
                'num' => 71, 
                'data' => [
                    'aa' => true, 
                    'bb' => false, 
                    'cc' => 15, 
                    'dd' => 3.1415, 
                    'ee' => [1,2,3], 
                ]
            ]));
            // var_dump("登录成功");
        }  else {
            exit(json_encode([
                'code' => '200',
                'msg' => 'user does not exist',
                'data' => []
            ]));
        }
    } 
    else if ($_GET["action"]=="get_picture_num")
    {
        exit(json_encode([
                'code' => '200',
                'msg' => 'GET_success',
                'num' => 71, 
            ]));
    }
    else
    {
       exit(json_encode([
            'code' => '200',
            'msg' => 'GET 请求',
            'data' => []
        ])); 
    }
    
}


// 如果是POST请求
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    // POST访问。。。。
    if ($_POST["action"]=="login")
    {
        if ($_POST['user'] == 'admin' && $_POST['pwd'] == 'admin' && $_POST['time']>202205312146151616)
        {
            exit(json_encode([
                'code' => '200',
                'msg' => 'POST_success',
                'num' => 71, 
                'data' => [
                    'aa' => true, 
                    'bb' => false, 
                    'cc' => 15, 
                    'dd' => 3.1415, 
                    'ee' => [1,2,3], 
                ]
            ]));
            // var_dump("登录成功");
        } 
         else {
            exit(json_encode([
                'code' => '200',
                'msg' => 'user does not exist',
                'data' => []
            ]));
        }
        
    }  else {
       exit(json_encode([
            'code' => '200',
            'msg' => 'POST 请求',
            'data' => []
        ])); 
    }
        
}

C#代码:DownloadUI.cs

using MiniJSON;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;

public class DownloadUI : MonoBehaviour
{
    //图片占位图
    public Texture placeholder;
    //要替换背景的RawImage
    public RawImage testholder;
    //点击左边这个按钮,显示默认占位图
    public Button setDefaultImage;
    //点击这个按钮,从Web服务器加载图片显示在上面的RawImage
    public Button setWebImage;
    //索引,默认从第一张图片开始下载
    private int index;
    // 要下载的图片的总数量
    private int num;
    void Start()
    {
        //测试,用POST向服务器提交信息
        StartCoroutine(HttpPostRequest());

        //测试,用GET向服务器提交信息
        StartCoroutine(HttpGetRequest());

        //从服务器获取要下载的图片的数量
        StartCoroutine(HttpGetPictureNumRequest());

        //两个按钮的点击事件(注:此处省略了用代码获取UI主件,直接在UI上拖拽设置了)
        setDefaultImage.onClick.AddListener(DefaultCallBack);
        setWebImage.onClick.AddListener(WebCallBack);
        //初始化索引,默认从第一张图片开始下载
        index = 1;
    }
    /// <summary>
    /// 从服务器获取要下载的图片的数量
    /// </summary>
    /// <returns></returns>
    private IEnumerator HttpGetPictureNumRequest()
    {
        string url = "http://wy.bestshe.top/game/GetInfo.php?action=get_picture_num";
        UnityWebRequest web = UnityWebRequest.Get(url);
        yield return web.SendWebRequest();
        if (web.isDone)
        {
            string str = Encoding.UTF8.GetString(web.downloadHandler.data);
            Dictionary<string, object> data = (Dictionary<string, object>)Json.Deserialize(str);
            if (data.ContainsKey("num"))
            {
                num = Convert.ToInt32(data["num"]);
            }
        }
    }

    private void WebCallBack()
    {
        string url = "http://wy.bestshe.top/game/";
        if (index > num) index = 1;
        url = url + index + ".jpeg";
        AsyncImageDownload.Instance.SetAsyncImage(url, testholder);
        index++;
    }

    private void DefaultCallBack()
    {
        //开始下载图片前,如果没有图片,则将UITexture的主图片设置为占位图
        if (testholder.texture == null)
        {
            testholder.texture = placeholder;
        }
        else
        {
            //再次点击default替换掉下载的图
            testholder.texture = placeholder;
        }
    }
  
    private IEnumerator HttpPostRequest()
    {
        string url = "http://wy.bestshe.top/game/GetInfo.php";
        WWWForm form = new WWWForm();
        form.AddField("action", "login");
        form.AddField("user", "admin");
        form.AddField("pwd", "admin");
        form.AddField("time", string.Format("{0:yyyyMMddHHmmssffff}", DateTime.Now));
        UnityWebRequest web = UnityWebRequest.Post(url, form);
        yield return web.SendWebRequest();
        if (web.result != UnityWebRequest.Result.Success)
            Debug.Log(" error:" + web.error);
        else if (web.isDone)
        {
            string str = Encoding.UTF8.GetString(web.downloadHandler.data);
            Debug.Log("Post发送成功----" + str);
        }
    }
    private IEnumerator HttpGetRequest()
    {
        string url = "http://wy.bestshe.top/game/GetInfo.php?action=login&user=admin&pwd=admin";
        url = SetUrlTime(url);
        UnityWebRequest web = UnityWebRequest.Get(url);
        yield return web.SendWebRequest();
        if (web.result != UnityWebRequest.Result.Success)
            Debug.Log(" error:" + web.error);
        else if (web.isDone)
        {
            string str = Encoding.UTF8.GetString(web.downloadHandler.data);
            Debug.Log("Get发送成功----" + str);
        }
    }
    public string SetUrlTime(string url)
    {
        string symbol = url.IndexOf("?") > -1 ? "&" : "?";
        url = string.Format("{0}{1}time={2}", url, symbol, string.Format("{0:yyyyMMddHHmmssffff}", DateTime.Now));
        return url;
    }
}

 AsyncImageDownload.cs

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

public class AsyncImageDownload : MonoBehaviour
{

    public static AsyncImageDownload Instance = null;
    private static string path;
    public Dictionary<string, Texture2D> textureCache = new Dictionary<string, Texture2D>();
   
    void Awake()
    {
        Instance = this;
        path = Application.persistentDataPath + "/ImageCache/";
        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }
    }
    public void SetAsyncImage(string url, RawImage texture)
    {
        //判断是否是第一次加载这张图片
        if (!File.Exists(path + url.GetHashCode()))
        {
            //如果之前不存在缓存文件
            StartCoroutine(DownloadImage(url, texture));
        }
        else
        {
            StartCoroutine(LoadLocalImage(url, texture));
        }
    }

   
    IEnumerator DownloadImage(string url, RawImage texture)
    {
        using UnityWebRequest uwr = UnityWebRequestTexture.GetTexture(url);
        yield return uwr.SendWebRequest();
        if (uwr.result != UnityWebRequest.Result.Success)
            Debug.Log("DownloadImage error:" + uwr.error);
        else if (uwr.isDone)
        {
            //将下载到的图片赋值到RawImage上
            Texture2D mTexture2D = DownloadHandlerTexture.GetContent(uwr);
            texture.texture = mTexture2D;
            //将下载到的图片赋值到RawImage上(二选一都行)
            //texture.texture = ((DownloadHandlerTexture)uwr.downloadHandler).texture;
            //将图片保存至缓存路径
            byte[] jpgData = mTexture2D.EncodeToJPG();
            File.WriteAllBytes(path + url.GetHashCode(), jpgData);
            textureCache[url] = mTexture2D;
        }
    }

    IEnumerator LoadLocalImage(string url, RawImage texture)
    {
        string filePath = "file:///" + path + url.GetHashCode();
        if (textureCache.TryGetValue(url, out Texture2D tex))
        {
            texture.texture = tex;
        }
        else
        {
            using UnityWebRequest uwr = UnityWebRequestTexture.GetTexture(filePath);
            yield return uwr.SendWebRequest();
            if (uwr.result != UnityWebRequest.Result.Success)
                Debug.Log("DownloadImage error:" + uwr.error);
            else if (uwr.isDone)
            {
                Texture2D mTexture2D = DownloadHandlerTexture.GetContent(uwr);
                textureCache[url] = mTexture2D;
                texture.texture = mTexture2D;
            }
        }
    }
}

 BestHttp的Get方式和Post方式

/*----------------------------------------------------------------

 Created by 王银
 文件名: BestHttpTest.cs
 创建时间: 2022.6.26
 文件功能描述: 
 Copyright © 2022年 王银 All rights reserved.
----------------------------------------------------------------*/

using System;
using System.IO;
using BestHTTP;
using UnityEngine;
using UnityEngine.UI;

namespace BestHttpDemo
{
    public class BestHttpTest : MonoBehaviour
    {

        private Button button;
        private RawImage image;

        void Start()
        {
            button = transform.Find("Button (Legacy)").GetComponent<Button>();
            image = transform.Find("RawImage").GetComponent<RawImage>();
            button.onClick.AddListener(ButtonCallBack);
            OnGetRequest();
            OnPostRequest();
        }

        private void ButtonCallBack()
        {
            OnLoadImage();
        }
        //Get请求
        public void OnGetRequest()
        {
            string url = "https://wy3.bestshe.top/game/GetInfo.php?action=login&user=admin&pwd=admin";
            url = SetUrlTime(url);
            HTTPRequest request = new HTTPRequest(new
                Uri(url), HTTPMethods.Get, OnRequestFinished);
            request.Send();
        }
        public string SetUrlTime(string url)
        {
            string symbol = url.IndexOf("?") > -1 ? "&" : "?";
            url = string.Format("{0}{1}time={2}", url, symbol, string.Format("{0:yyyyMMddHHmmssffff}", DateTime.Now));
            return url;
        }
        //Post请求
        private void OnPostRequest()
        {
            string url = "https://wy3.bestshe.top/game/GetInfo.php";
            HTTPRequest request = new HTTPRequest(new
                Uri(url), HTTPMethods.Post, OnRequestFinished);
            request.AddField("action", "login");
            request.AddField("user", "admin");
            request.AddField("pwd", "admin");
            request.AddField("time", string.Format("{0:yyyyMMddHHmmssffff}", DateTime.Now));
            request.Send();
        }
        //请求回调
        void OnRequestFinished(HTTPRequest request, HTTPResponse response)
        {
            Debug.Log(response.DataAsText);
        }
        //下载图片 
        public void OnLoadImage()
        {

            new HTTPRequest(new Uri("https://wy3.bestshe.top/game/13.jpeg"), (request, response) =>
            {
                image.texture = response.DataAsTexture2D;
                //保存图片
                try
                {
                    if (Application.platform == RuntimePlatform.Android)
                    {
                        File.WriteAllBytes("jar:file://" + Application.persistentDataPath + "/13.jpeg", response.Data);
                    }
                    else
                    {
                        File.WriteAllBytes(Application.dataPath + "/13.jpeg", response.Data);
                    }
                }
                catch (IOException e)
                {
                    Debug.LogError(e);
                }

            }).Send();
        }
    }
}

 部分API

public void BestHttpAPI()
    {
        GeneralStatistics stats = HTTPManager.GetGeneralStatistics(StatisticsQueryFlags.All); //获取统计信息,统计类型全部
        BestHTTP.Caching.HTTPCacheService.IsSupported        //是否支持缓存(只读)
        stats.CacheEntityCount.ToString();                   //缓存对象个数
        stats.CacheSize.ToString("N0");                      //缓存总大小
        BestHTTP.Caching.HTTPCacheService.BeginClear();      //清空缓存
       
        BestHTTP.Cookies.CookieJar.IsSavingSupported        //是否支持保存Cookie(只读)
        stats.CookieCount.ToString();                       //Cookie个数
        stats.CookieJarSize.ToString("N0");                 //Cookie总大小
        BestHTTP.Cookies.CookieJar.Clear();                 //清空Cookie
     
        HTTPManager.GetRootCacheFolder()                    //获取缓存和Cookies目录路径
        stats.Connections.ToString();                       //Http连接数
        stats.ActiveConnections.ToString();                 //激活的Http连接数
        stats.FreeConnections.ToString();                   //空闲的Http连接数
        stats.RecycledConnections.ToString();               //回收的Http连接数
        stats.RequestsInQueue.ToString();                   //Request请求在队列的数量
        BestHTTP.HTTPManager.OnQuit();                      //退出统计
     
     
        //缓存维护  缓存最大1mb,   删除2天前的缓存
        BestHTTP.Caching.HTTPCacheService.BeginMaintainence(new BestHTTP.Caching.HTTPCacheMaintananceParams( TimeSpan.FromDays(2),1 *1024*1024 ));
        
        //Cookie维护  删除7天前的Cookie并保持在最大允许大小内。
        BestHTTP.Cookies.CookieJar.Maintain();
     
        //获取Cookie集合
        List<Cookie> cookie = CookieJar.Get(new Uri("https://www.baidu.com/"));
        //Cookie的API很多
        cookie[0].Name
        cookie[0].Domain 
        cookie[0].Value
    }
    */

原文链接:https://blog.youkuaiyun.com/u012322710/article/details/52860747

<think>好的,我现在需要帮助用户了解在Unity中使用GETPOST请求服务器交互的方法。首先,我要确定用户的需求是什么。他们可能是一个刚开始学习Unity开发的开发者,想要了解如何实现网络通信,特别是GETPOST请求。我需要确保回答结构清晰,步骤详细,并且符合系统级指令中的格式要求。 首先,我应该介绍Unity中常用的网络请求方法。UnityWebRequestUnity推荐的类,取代了旧的WWW类,所以需要重点讲解这个。然后,分步骤说明GETPOST的实现方式,每个步骤都要具体,给出代码示例,并解释每个参数步骤的作用。 对于GET请求,我需要说明如何创建请求,设置URL,发送请求,并处理响应。同时,要提到URL参数的拼接,比如使用Unity的WWW类来编码参数,或者手动拼接。还要处理可能发生的错误,比如网络问题或服务器错误。 然后是POST请求,这部分需要解释如何上传数据,比如表单数据或JSON。要展示如何设置请求头,特别是Content-Type,以及如何将数据写入请求体。同样,处理响应错误也是必须的。 接下来,用户可能需要了解如何处理服务器响应,比如解析JSON数据。这里可以举一个简单的例子,使用JsonUtility来处理返回的数据,假设服务器返回的是JSON格式。 此外,注意事项部分也很重要。要提到协程的使用,因为UnityWebRequest需要配合StartCoroutine来使用。主线程的问题也需要说明,比如不能在主线程中阻塞,所以协程是必要的。安全性方面,尤其是HTTPS敏感数据的处理,需要提醒用户。性能方面,避免频繁请求内存泄漏。 还需要考虑用户可能遇到的问题,比如编码格式、跨域问题(CORS),或者数据解析错误。不过可能不需要深入这些细节,除非用户进一步询问。 最后,确保所有代码示例中的数学公式或变量使用$...$格式,比如变量名或方法名不需要,但如果有数学表达式的话要正确使用。不过在这个主题中可能数学公式较少,但如果有参数示例,比如URL中的参数,可能需要用$符号包裹,比如$page=1$,不过根据系统指令,变量方程等需要这样处理,所以要注意。 检查LaTeX语法是否正确,所有独立公式是否用$$...$$,但在这个回答中可能没有太多数学公式,所以可能不需要。但需要确保行内表达式正确,比如如果有变量或代码参数中的数学符号,可能需要使用$...$,但可能在这个上下文中不太适用。不过用户的问题是关于GETPOST的,所以可能不需要数学表达式,但代码中的变量名可能需要用$...$吗?比如在解释URL参数时,如果有类似$x=1$的参数,可能需要写成$x=1$,但根据系统指令,变量需要使用$...$,所以可能需要处理。 例如,在解释URL参数时,如果有参数名为page,值为1,应该写成$page=1$,但可能用户的问题中并没有涉及数学表达式,所以可能需要确认。不过根据系统指令,所有行内数学表达式包括变量需要使用$...$,所以可能像变量名如url、form等是否需要?可能不需要,因为这些是代码变量,不是数学变量。但如果有数学表达式,比如方程,就需要。因此,在回答中可能不需要太多数学公式,但需要确保如果有的话正确使用。 现在,开始组织回答的结构: 1. 介绍Unity中的网络请求方法,推荐使用UnityWebRequest。 2. 分步骤讲解GET请求的实现:创建请求、处理参数、发送、处理响应错误。 3. 分步骤讲解POST请求的实现:创建请求、设置表单或JSON数据、发送、处理响应。 4. 示例处理JSON响应。 5. 注意事项:协程、主线程、安全性、性能。 6. 总结。 需要确保每个代码示例正确,使用正确的语法,比如在C#中使用UnityWebRequest,正确处理协程。同时,代码中的注释解释要清晰,用中文说明每一步的作用。 可能需要注意,在代码示例中,变量名如www或request不需要用$...$包裹,因为它们是代码变量,不是数学表达式。但如果有参数拼接,比如"name=user&age=20",可能需要用$...$吗?根据系统指令,变量、方程等需要,但这里的参数是字符串,可能不需要,除非是数学变量。可能在这里不需要,但需要再仔细检查系统指令。 系统级指令第一条说所有行内数学表达式,包括变量、不等式、方程等必须使用$...$格式。这里的变量可能指数学变量,比如x, y等,而不是代码中的变量名。因此,在正常文本中提到的变量如URL参数中的page=1,可能不需要,除非是数学意义上的变量。例如,如果提到参数为x=5,则应该写成$x=5$,但如果只是代码中的字符串参数,可能不需要。需要明确区分。 例如,在解释URL参数时,如果有示例URL为http://example.com/api?page=1&size=10,这里的pagesize是参数名,可能不需要用$...$,但根据指令,所有变量都需要。所以可能需要写成$http://example.com/api?page=1&size=10$,但这样可能不太合适,因为整个URL是一个字符串。或者,可能只需要将变量部分如page=1用$...$包裹,但这样可能会影响可读性。 可能更好的做法是,如果变量在文本中作为示例出现,比如参数名值,使用$...$。例如:“例如:$page=1$ $size=10$”。但如果在代码中,作为字符串的一部分,则不需要,因为代码块会单独处理,不需要LaTeX格式。 因此,在文本中提到的变量或参数,如page=1,应该用$...$包裹,而在代码示例中则保持原样。例如: 在文本中:“例如URL参数为$page=1$$size=10$” 在代码中:string url = "http://example.com/api?page=1&size=10"; 这样符合系统指令的要求。 现在,整合所有内容,确保每个部分符合格式要求,LaTeX正确,结构清晰,使用中文,分步骤说明,代码示例正确,注意事项全面。 最后,检查是否有遗漏的部分,比如错误处理、异步操作、示例代码的完整性,以及是否提到了使用协程IEnumerator。 确认无误后,整理成最终的答案。</think>在Unity开发中,使用GETPOST请求服务器交互是常见需求。以下是分步说明关键代码示例: --- ### 一、Unity网络请求基础 Unity通过`UnityWebRequest`类处理HTTP请求,需配合**协程**实现异步操作。 --- ### 二、GET请求实现 **步骤:** 1. **创建请求对象** 使用`UnityWebRequest.Get`初始化,并拼接URL参数: ```csharp string baseUrl = "http://example.com/api"; string params = $name={userName}$&$age=20$; // 行内变量示例 UnityWebRequest request = UnityWebRequest.Get($baseUrl?{params}$); ``` 2. **发送请求并等待响应** 通过协程处理: ```csharp IEnumerator SendGetRequest() { yield return request.SendWebRequest(); if (request.result == UnityWebRequest.Result.Success) { Debug.Log("响应数据:" + request.downloadHandler.text); } else { Debug.LogError($"请求失败:{request.error}$"); } } ``` --- ### 三、POST请求实现 **步骤:** 1. **创建请求对象并设置数据** - **表单数据**: ```csharp WWWForm form = new WWWForm(); form.AddField($name$, "user"); form.AddField($age$, "20"); UnityWebRequest request = UnityWebRequest.Post(url, form); ``` - **JSON数据**: ```csharp string jsonData = "{\"name\":\"user\", \"age\":20}"; byte[] bodyRaw = Encoding.UTF8.GetBytes(jsonData); UnityWebRequest request = new UnityWebRequest(url, "POST"); request.uploadHandler = new UploadHandlerRaw(bodyRaw); request.downloadHandler = new DownloadHandlerBuffer(); request.SetRequestHeader("Content-Type", "application/json"); ``` 2. **发送请求** 同样通过协程处理,代码逻辑GET类似。 --- ### 四、处理服务器响应 **示例解析JSON响应:** ```csharp [System.Serializable] public class ResponseData { public int code; public string message; } // 解析代码 ResponseData data = JsonUtility.FromJson<ResponseData>(request.downloadHandler.text); Debug.Log($"状态码:{data.code}$,消息:{data.message}$"); ``` --- ### 五、注意事项 1. **协程主线程** 网络请求需在协程中执行,避免阻塞主线程: ```csharp void Start() { StartCoroutine(SendGetRequest()); } ``` 2. **安全性** - 使用HTTPS加密通信。 - 避免在URL中明文传输敏感数据(如密码)。 3. **性能优化** - 及时释放请求对象:`request.Dispose()` - 避免频繁请求,合理设置超时时间。 --- ### 六、总结 | 请求类型 | 适用场景 | 数据位置 | 示例方法 | |----------|--------------------|-------------------|-----------------------| | GET | 获取数据 | URL参数 | `UnityWebRequest.Get` | | POST | 提交表单或JSON数据 | 请求体(Body) | `UnityWebRequest.Post`| 通过灵活使用`UnityWebRequest`,开发者可实现高效可靠的服务器交互
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王 银

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值