Unity C# 网络学习(十)——UnityWebRequest(一)

Unity C# 网络学习(十)——UnityWebRequest(一)

UnityWebRequest与WWW的区别

  • UnityWebRequest将各种资源进行了拆分
  • UnityWebRequest比WWW的效率更高,有很低的GC产生
  • 更方便的上传数据

一.UnityWebRequest类获取数据

1.下载文本和二进制数据

    private IEnumerator LoadText()
    {
        UnityWebRequest unityWebRequest = UnityWebRequest.Get("http://192.168.1.103:8080/Http_Server/zzs.txt");
        yield return unityWebRequest.SendWebRequest();
        if (unityWebRequest.result == UnityWebRequest.Result.Success)
        {
            string text = unityWebRequest.downloadHandler.text;
            byte[] bytes = unityWebRequest.downloadHandler.data;
            Debug.Log(text);
            Debug.Log(bytes.Length);
            Debug.Log("文本下载完成!");
        }
        else
        {
            Debug.Log("下载失败:" + unityWebRequest.result);
        }
    }

2.下载图片数据

    private IEnumerator LoadTexture()
    {
        UnityWebRequest unityWebRequest =
            UnityWebRequestTexture.GetTexture("http://192.168.1.103:8080/Http_Server/xxx.jpg");
        yield return unityWebRequest.SendWebRequest();
        if (unityWebRequest.result == UnityWebRequest.Result.Success)
        {
            //方式一
            Texture2D tex2D1 = (unityWebRequest.downloadHandler as DownloadHandlerTexture)?.texture;
            //方式二
            Texture2D tex2D2 = DownloadHandlerTexture.GetContent(unityWebRequest);
            image.texture = tex2D2;
            Debug.Log("图片下载完成!");
        }
        else
        {
            Debug.Log("下载失败:" + unityWebRequest.result);
        }
    }

3.下载AssetBundle数据

    private IEnumerator LoadAb()
    {
        UnityWebRequest unityWebRequest =
            UnityWebRequestAssetBundle.GetAssetBundle("http://192.168.1.103:8080/Http_Server/photo.ywj");
        unityWebRequest.SendWebRequest();
        while (!unityWebRequest.isDone)
        {
            Debug.Log(unityWebRequest.downloadProgress);
            Debug.Log(unityWebRequest.downloadedBytes);
            yield return null;
        }

        if (unityWebRequest.result == UnityWebRequest.Result.Success)
        {
            //方式一
            AssetBundle assetBundle1 = (unityWebRequest.downloadHandler as DownloadHandlerAssetBundle)?.assetBundle;
            //方式二
            AssetBundle assetBundle2 = DownloadHandlerAssetBundle.GetContent(unityWebRequest);

            if (assetBundle1 != null) Debug.Log(assetBundle1.name);
            if (assetBundle2 != null) Debug.Log(assetBundle2.name);
            Debug.Log("图片下载完成!");
        }
        else
        {
            Debug.Log("下载失败:" + unityWebRequest.result);
        }
    }

4.下载音频数据

    private IEnumerator LoadAudioClip()
    {
        UnityWebRequest unityWebRequest =
            UnityWebRequestMultimedia.GetAudioClip("http://192.168.1.103:8080/Http_Server/music.mp3", AudioType.MPEG);
        yield return unityWebRequest.SendWebRequest();
        if (unityWebRequest.result == UnityWebRequest.Result.Success)
        {
            AudioClip clip = DownloadHandlerAudioClip.GetContent(unityWebRequest);
            audioSource.clip = clip;
            audioSource.Play();
            Debug.Log("音频下载成功!");
        }
        else
        {
            Debug.Log("下载失败:"+unityWebRequest.result);
        }
    }

二.UnityWebRequest类上传数据

1.上传数据类MultipartFormDataSection

		//======MultipartFormDataSection======
        //1.二进制字节数组
        dataList.Add(new MultipartFormDataSection(Encoding.UTF8.GetBytes("zzs666")));
        //2.字符串
        dataList.Add(new MultipartFormDataSection("zzs666"));
        //3.参数名,参数值
        dataList.Add(new MultipartFormDataSection("Name","zzs"));
        dataList.Add(new MultipartFormDataSection("Msg",new byte[1024]));

2.上传数据类MultipartFormFileSection

        //======MultipartFormFileSection======
        //1.二进制字节数组
        dataList.Add(new MultipartFormFileSection(Encoding.UTF8.GetBytes("zzs666")));
        //2.文件名,字节数组(常用)
        dataList.Add(new MultipartFormFileSection("上传的文件.jpg",File.ReadAllBytes(Application.streamingAssetsPath +"/test.jpg")));
        //3.字符串数据,编码格式,文件名(常用)
        dataList.Add(new MultipartFormFileSection("zzs!zzs!zzs!",Encoding.UTF8, "zzsTest.txt"));

3.Post发送数据相关

    private IEnumerator UpLoad()
    {
        List<IMultipartFormSection> data = new List<IMultipartFormSection>
        {
            new MultipartFormDataSection("Name", "MrTang"),
            new MultipartFormFileSection("Unity上传的文件.jpg",
                File.ReadAllBytes(Application.streamingAssetsPath + "/test.jpg")),
            new MultipartFormFileSection("zzs!zzs!zzs!", Encoding.UTF8, "zzsTest.txt")
        };
        UnityWebRequest unityWebRequest = UnityWebRequest.Post("http://192.168.1.103:8080/Http_Server/", data);
        yield return unityWebRequest.SendWebRequest();

        if (unityWebRequest.result == UnityWebRequest.Result.Success)
        {
            Debug.Log("上传完成!");
        }
        else
        {
            Debug.Log("上传失败!" + unityWebRequest.result + unityWebRequest.error);
        }
    }
### 集成YOLOv8到Unity进行物体检测 为了在Unity环境中实现YOLOv8的物体检测功能,可以采用几种不同的方法来完成这目标。种常见的方式是通过中间服务器作为桥梁,在该服务器上运行YOLOv8模型并处理来自Unity客户端发送过来的图像数据;另种方式则是尝试直接在Unity项目内嵌入YOLOv8推理引擎。 #### 方法:基于Web API的服务端部署方案 创建个RESTful Web服务接口用于接收图片请求,并返回标注后的结果给Unity应用。此过程涉及以下几个方面: - **训练好的YOLOv8模型**:确保已经拥有经过适当训练能够满足特定需求的YOLOv8权重文件[^4]。 - **Flask/Django等框架搭建API**:利用Python web框架快速构建起能调用YOLOv8预测函数的服务端口[^5]。 ```python from flask import Flask, request, jsonify import torch from PIL import Image app = Flask(__name__) model = torch.hub.load('ultralytics/yolov8', 'custom', path='path/to/best.pt') @app.route('/predict', methods=['POST']) def predict(): file = request.files['image'] img_bytes = file.read() results = model(Image.open(io.BytesIO(img_bytes)), size=640) return jsonify(results.pandas().xyxy[0].to_dict(orient="records")) if __name__ == '__main__': app.run(host='0.0.0.0') ``` - **Unity侧HTTP通信模块编写**:使用C#脚本发起网络请求并将接收到的数据解析出来展示于游戏视窗之中[^6]。 ```csharp using UnityEngine; using System.Collections; using UnityEngine.Networking; public class ObjectDetection : MonoBehaviour { private IEnumerator Start() { WWWForm form = new WWWForm(); Texture2D texture = ...; // 获取当前帧纹理 byte[] bytes = texture.EncodeToPNG(); form.AddBinaryData("image", bytes); UnityWebRequest www = UnityWebRequest.Post("http://localhost:5000/predict", form); yield return www.SendWebRequest(); if (www.result != UnityWebRequest.Result.Success) { Debug.LogError(www.error); } else { string jsonResponse = www.downloadHandler.text; // 解析JSON响应... } } } ``` #### 方法二:本地化解决方案——借助ML-Agents或其他插件支持 对于希望减少延迟或者离线工作的开发者来说,可能更倾向于探索如何让YOLOv8直接跑在Unity内部的可能性。这通常意味着要寻找合适的机器学习代理工具包(如ML-Agents),或是其他形式的支持库帮助移植深度神经网络Unity平台之上。不过需要注意的是,这种方法可能会遇到性能瓶颈以及兼容性挑战等问题[^7]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值