WWW和WWWForm类

news2025/4/22 8:51:32

WWW类

WWW类是什么

//WWW是Unity提供的简单的访问网页的类
        //我们可以通过该类上传和下载一些资源
        //在使用http是,默认的请求类型是get,如果想要用post上传需要配合WWWFrom类使用
        //它主要支持的协议:
        //1.http://和https:// 超文本传输协议
        //2.ftp://文件传输协议(但仅限于匿名下载)
        //3.file://本地文件传输协议 可以使用该协议异步加载本地文件(PC,IOS和Android都支持)
        //本节课主要使用WWW类来进行数据的下载或加载

        //注意
        //1.该类一般配合协同程序使用
        //2.该类在较新的Unity版本中会提示过时了,但仍可使用,新版本将其功能整合进了UnityWebRequest类中

WWW中的常用方法和变量

 //WWW www = new WWW("http://172.41.2.6/HTTP_Server/测试图片.png");
        //2.GetAudioClip(),从下载数据返回一个音效切片AudioClip对象
        //www.GetAudioClip();
        //3.LoadImageIntoTexture:用下载数据中的图像替换现有的一个Texture2D对象
        //Texture2D tex = new Texture2D(100, 100);
        //www.LoadImageIntoTexture(tex);
        //4.LoadFromCacheOrDownload:从缓存加载ab包对象,如果该包不在缓存则自动下载到缓存,以便以后直接从本地缓存中获取
        //WWW.LoadFromCacheOrDownload("http://172.41.2.6/HTTP_Server/test.assetbundle", 1);

WWW加载Http,Ftp和本地资源

      #endregion
        #region 1.下载http服务器上的内容
        StartCoroutine(DownLoadHttp());
        #endregion
        #region 2.下载ftp服务器上的内容(ftp服务器一定要支持匿名账户)
        StartCoroutine(DownLoadFtp());
        #endregion
        #region 3.本地内容加载(一般移动平台加载内容都会使用这种格式)
        StartCoroutine(DownLoadLocalFile());
        #endregion 

    }
    IEnumerator DownLoadHttp()
    {
        //1.创建www对象
        WWW www = new WWW("https://img-blog.csdnimg.cn/0880c070ead14668b585e0036c29f7a4.jpg");
        //2.等待加载结束
        while (!www .isDone)
        {
            print(www.bytesDownloaded);
            print(www.progress);
            yield return null;
        }
        print(www.bytesDownloaded);
        print(www.progress);
        //3.使用加载结束后的资源
        if (www.error ==null)
        {
            image.texture = www.texture;
        }
    }
    IEnumerator DownLoadFtp()
    {
        //1.创建www对象
        WWW www = new WWW("ftp://DamnF@127.0.0.1/文本格式.jpg");
        //2.等待加载结束
        while (!www.isDone)
        {
            print(www.bytesDownloaded);
            print(www.progress);
            yield return null;
        }
        print(www.bytesDownloaded);
        print(www.progress);
        //3.使用加载结束后的资源
        if (www.error == null)
        {
            image.texture = www.texture;
        }
    }
    IEnumerator DownLoadLocalFile()
    {
        //1.创建www对象
        WWW www = new WWW("file://"+Application .streamingAssetsPath +"/test.png");
        //2.等待加载结束
        while (!www.isDone)
        {
            print(www.bytesDownloaded);
            print(www.progress);
            yield return null;
        }
        print(www.bytesDownloaded);
        print(www.progress);
        //3.使用加载结束后的资源
        if (www.error == null)
        {
            image.texture = www.texture;
        }
    }

WWWForm类

WWWForm类是什么

在 Unity 中,WWWForm 类主要用于与 WWW 类配合,构建并发送包含表单数据的 HTTP POST 请求,例如向服务器提交用户输入、上传文件等。尽管 WWW 类在 Unity 2017.1 及后续版本中已被标记为过时(推荐使用 UnityWebRequest),但了解 WWWForm 的用法仍有助于理解旧项目或历史代码。

WWWForm类中的常用方法和变量

1. 构造函数
WWWForm form = new WWWForm(); // 创建空表单

2. 常用方法
方法名作用
AddField(string key, string value)添加文本类型的表单字段(键值对),用于提交普通字符串数据。
AddBinaryData(string key, byte[] data, string fileName, string mimeType)添加二进制数据(如文件),fileName 为文件名(影响服务器解析),mimeType 为文件的 MIME 类型(如 image/jpeg)。
headers获取或设置请求头(Dictionary<string, string>),可添加自定义请求头(如 User-Agent)。

WWW结合WWWForm对象异步上传数据

      #region 知识点三 WWW结合WWWForm对象来异步上传数据
        StartCoroutine(UpLoadData());
        #endregion 
    }
    IEnumerator UpLoadData()
    {
        WWWForm data = new WWWForm();
        //上传的数据 对应的后端程序 必须要有处理的规则 才能生效
        data.AddField("Name", "DamnF", Encoding.UTF8);
        data.AddField("Age", 99);
        data.AddBinaryData("file", File.ReadAllBytes(Application.streamingAssetsPath + "/test.png"));
        WWW www = new WWW("http://172.41.2.6/HTTP_Server/", data);
        yield return www;
        if(www.error ==null)
        {
            print("上传成功");  
            //www.bytes
        }
        else
        {
            print("上传失败"+www.error);
        }
    }

将WWW类和WWWForm类用单例模式封装到WWWMgr模块中

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

public class WWWMgr : MonoBehaviour
{
    private static WWWMgr instance = new WWWMgr();
    public static WWWMgr Instance => instance;

    private string HTTP_SERVER_PATH = "http://172.41.2.6/HTTP_Server/";
    private void Awake()
    {
        instance = this;
        DontDestroyOnLoad(this.gameObject);
    }
    public void LoadRes<T>(string path, UnityAction<T> action) where T : class
    {
        StartCoroutine(LoadResAsync<T>(path, action));
    }
    private IEnumerator LoadResAsync<T>(string path, UnityAction<T> action) where T : class
    {
        WWW www = new WWW(path);
        yield return www;
        if (www.error == null)
        {
            //根据T泛型的类型 决定使用哪种类型的资源 传递给外部
            if (typeof(T) == typeof(AssetBundle))
            {
                action?.Invoke(www.assetBundle as T);
            }
            else if (typeof(T) == typeof(Texture))
            {
                action?.Invoke(www.texture as T);
            }
            else if (typeof(T) == typeof(AudioClip))
            {
                action?.Invoke(www.GetAudioClip() as T);
            }
            else if (typeof(T) == typeof(string))
            {
                action?.Invoke(www.text as T);
            }
            else if (typeof(T) == typeof(byte[]))
            {
                action?.Invoke(www.bytes as T);
            }
        }
        else
        {
            Debug.LogError("加载资源出错了" + www.error);
        }

    }

    public void SendMsg<T>(BaseMsg msg,UnityAction<T>action)where T:BaseMsg 
    {
        StartCoroutine(SendMsgAsync<T>(msg, action));
    }
    private IEnumerator SendMsgAsync<T>(BaseMsg msg,UnityAction <T>action)where T:BaseMsg 
    {
        //消息发送
        WWWForm data = new WWWForm();
        //准备要发送的消息数据
        data.AddBinaryData("Msg", msg.Writing());
        WWW www = new WWW(HTTP_SERVER_PATH, data);
        //我们也可以直接传递 2进制字节数组 只要和后端制定好规则 怎么传都是可以的
        //WWW www = new WWW(HTTP_SERVER_PATH, msg.Writing());
        //异步等待 发送结束 才会继续执行后面的代码
        yield return www;
        //发送完毕后 收到响应
        //认为后端发回来的内容也是一个继承自BaseMsg类的字节数组对象
        if(www.error ==null)
        {
            //先解析 ID和消息长度
            int index = 0;
            int msgID = BitConverter.ToInt32(www.bytes, index);
            index += 4;
            int msgLength = BitConverter.ToInt32(www.bytes, index);
            index += 4;
            //反序列化 BaseMsg
            BaseMsg baseMsg = null;
            switch (msgID)
            {
                case 1001:
                    baseMsg = new PlayerMsg();
                    baseMsg.Reading(www.bytes, index);
                    break;
            }
            if (baseMsg != null)
                action?.Invoke(baseMsg as T);
            else
                Debug.LogError("发消息出现问题" + www.error);
        }
    }
}

测试

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

public class Lesson29_Test : MonoBehaviour
{
    public RawImage image;
    // Start is called before the first frame update
    void Start()
    {
        //只要保证一运行时 进行该判断 进行动态创建
        if(WWWMgr.Instance ==null)
        {
            GameObject obj = new GameObject("WW");
            obj.AddComponent<WWWMgr>();
        }
        //在任何地方使用WWWMgr都没问题

        WWWMgr.Instance.LoadRes<Texture>("https://img-blog.csdnimg.cn/0880c070ead14668b585e0036c29f7a4.jpg", (obj) =>
       {
           //使用加载结束的资源
           image.texture = obj;
       });
        WWWMgr.Instance.LoadRes<byte[]>("https://img-blog.csdnimg.cn/0880c070ead14668b585e0036c29f7a4.jpg", (obj) =>
        {
            //把得到的字节数组存储到本地
            print(Application.persistentDataPath);
            File.WriteAllBytes(Application.persistentDataPath + "/www图片.png", obj);
        });
    }
 
    // Update is called once per frame
    void Update()
    {
        
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2339986.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【java实现+4种变体完整例子】排序算法中【希尔排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格

以下是希尔排序的详细解析&#xff0c;包含基础实现、常见变体的完整代码示例&#xff0c;以及各变体的对比表格&#xff1a; 一、希尔排序基础实现 原理 希尔排序是插入排序的改进版本&#xff0c;通过分步缩小增量间隔&#xff0c;将数组分成多个子序列进行插入排序&#…

matlab 处理海洋数据并画图的工具包--ocean_data_tools

matlab 处理海洋数据并画图的工具包–ocean_data_tools matlab 处理海洋数据并画图的工具包–ocean_data_tools ocean_data_tools 简化了提取、格式化和可视化免费可用的海洋学数据的过程。虽然可以在线访问大量海洋学数据&#xff0c;但由于获取这些数据并将其格式化为可用数据…

MCP:AI时代的“万能插座”,开启大模型无限可能

摘要&#xff1a;Model Context Protocol&#xff08;MCP&#xff09;由Anthropic在2024年底开源&#xff0c;旨在统一大模型与外部工具、数据源的通信标准。采用客户端-服务器架构&#xff0c;基于JSON-RPC 2.0协议&#xff0c;支持stdio、SSE、Streamable HTTP等多种通信方式…

静态网页的开发

文章目录 基于 idea 开发静态网页添加web框架前端配置服务器并启动服务资源名字不是 index 静态网页 流转 基于 idea 开发静态网页 添加web框架 方法1 方法2 前端 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&quo…

【CPU】结合RISC-V CPU架构回答中断系统的7个问题(个人草稿)

结合RISC-V CPU架构对中断系统七个关键问题的详细解析&#xff0c;按照由浅入深的结构进行说明&#xff1a; 一、中断请求机制&#xff08;问题①&#xff09; 硬件基础&#xff1a; RISC-V通过CLINT&#xff08;Core Local Interrupter&#xff09;和PLIC&#xff08;Platfor…

uCOS3实时操作系统(任务切换和任务API函数)

文章目录 任务切换任务API函数 任务切换 C/OS-III 将 PendSV 的中断优先级配置为最低的中断优先级&#xff0c;这么一来&#xff0c; PendSV 异常的中断服务函数就会在其他所有中断处理完成后才被执行。C/OS-III 就是将任务切换的过程放到 PendSV 异常的中断服务函数中处理的。…

科学养生指南:解锁健康生活新方式

在快节奏的现代生活中&#xff0c;健康养生已成为人们关注的焦点。科学合理的养生方式&#xff0c;能帮助我们增强体质、预防疾病&#xff0c;享受更优质的生活。​ 饮食是健康养生的基石。遵循 “均衡饮食” 原则&#xff0c;每日饮食需包含谷类、蔬菜水果、优质蛋白质和健康…

第十四届蓝桥杯 2023 C/C++组 有奖问答

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 核心思路&#xff1a; 思路详解&#xff1a; 代码&#xff1a; 代码详解&#xff1a; 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 蓝桥云课 有奖问答 思路&…

transformer注意力机制

单头注意力机制 import torch import torch.nn.functional as Fdef scaled_dot_product_attention(Q, K, V):# Q: (batch_size, seq_len, d_k)# K: (batch_size, seq_len, d_k)# V: (batch_size, seq_len, d_v)batch_size: 一次输入的句子数。 seq_len: 每个句子的词数。 d_mo…

QT 5.15 程序打包

说明&#xff1a; windeployqt 是 Qt 提供的一个工具&#xff0c;用于自动收集并复制运行 Qt 应用程序所需的动态链接库&#xff08;.dll 文件&#xff09;及其他资源&#xff08;如插件、QML 模块等&#xff09;到可执行文件所在的目录。这样你就可以将应用程序和这些依赖项一…

【路由交换方向IE认证】BGP选路原则之AS-Path属性

文章目录 一、路由器BGP路由的处理过程控制平面和转发平面选路工具 二、BGP的选路顺序选路的前提选路顺序 三、AS-Path属性选路原则AS-Path属性特性AS-Path管进还是管出呢&#xff1f;使用AS-Path对进本AS的路由进行选路验证AS-Path不接收带本AS号的路由 四、BGP邻居建立配置 一…

Linux系统下docker 安装 redis

docker安装最新版的redis 一、docker拉取最新版redis镜像 拉取镜像若没有指定版本&#xff0c;代表拉取最新版本 二、查询redis镜像 三、挂载配置文件 在docker容器内修改redis配置文件不方便&#xff0c;所以挂载配置文件&#xff0c;这样可以在外边修改redis配置 3.1 创建…

深度学习框架PyTorch——从入门到精通(3.3)YouTube系列——自动求导基础

这部分是 PyTorch介绍——YouTube系列的内容&#xff0c;每一节都对应一个youtube视频。&#xff08;可能跟之前的有一定的重复&#xff09; 我们需要Autograd做什么&#xff1f;一个简单示例训练中的自动求导开启和关闭自动求导自动求导与原地操作 自动求导分析器高级主题&…

【基础算法】二分算法详解

🎯 前言:二分不是找某个数,而是找一个满足条件的位置/值 所以最关键的是:找到单调性,写好 check() 函数,剩下交给模板! 什么是二分算法 二分算法是一种在有序区间中查找答案的方法,时间复杂度:O(log n)。核心思想是: 每次把搜索区间分成两半,只保留可能存在答案的…

mysql——基础知识

关键字大小写不敏感 查看表结构中的 desc describe 描述 降序中的 desc descend 1. 数据库的操作 1. 创建数据库 create database 数据库名;为防止创建的数据库重复 CREATE DATABASE IF NOT EXISTS 数据库名;手动设置数据库采用的字符集 character set 字符集名;chars…

OOA-CNN-LSTM-Attention、CNN-LSTM-Attention、OOA-CNN-LSTM、CNN-LSTM四模型多变量时序预测一键对比

OOA-CNN-LSTM-Attention、CNN-LSTM-Attention、OOA-CNN-LSTM、CNN-LSTM四模型多变量时序预测一键对比 目录 OOA-CNN-LSTM-Attention、CNN-LSTM-Attention、OOA-CNN-LSTM、CNN-LSTM四模型多变量时序预测一键对比预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于OOA-CN…

PCIE Spec ---Base Address Registers

7.5.1.2.1 Base Address Registers (Offset 10h - 24h) 在 boot 到操作系统之前&#xff0c;系统软件需要生产一个内存映射的 address map &#xff0c;用于告诉系统有多少内存资源&#xff0c;以及相应功能需要的内存空间&#xff0c;所以在设备的 PCI 内存空间中就有了这个 …

Spring如何通过XML注册Bean

在上一篇当中我们完成了对三种资源文件的读写 上篇内容&#xff1a;Spring是如何实现资源文件的加载 Test public void testClassPathResource() throws IOException { DefaultResourceLoader defaultResourceLoader new DefaultResourceLoader(); Resource resource …

基于Java的不固定长度字符集在指定宽度和自适应模型下图片绘制生成实战

目录 前言 一、需求介绍 1、指定宽度生成 2、指定列自适应生成 二、Java生成实现 1、公共方法 2、指定宽度生成 3、指定列自适应生成 三、总结 前言 在当今数字化与信息化飞速发展的时代&#xff0c;图像的生成与处理技术正日益成为众多领域关注的焦点。从创意设计到数…

【版本控制】idea中使用git

大家好&#xff0c;我是jstart千语。接下来继续对git的内容进行讲解。也是在开发中最常使用&#xff0c;最重要的部分&#xff0c;在idea中操作git。目录在右侧哦。 如果需要git命令的详解&#xff1a; 【版本控制】git命令使用大全-CSDN博客 一、配置git 要先关闭项目&#xf…