Unity3D与Web服务器交互之图片数据的传输

2015年10月22日 12:49 0 点赞 2 评论 更新于 2017-05-09 21:03

本篇文章详细讲解在Unity3D与Apache服务器交互时,如何进行图片数据的传输。服务端语言采用PHP。关于Apache和PHP的配置,请参考Unity3D与Web服务器交互之Apache,PHP和Mysql配置。在图片传输过程中,我们使用的是Post请求方式,有关Post请求和Get请求的详细内容,请参考:Unity3D与Web服务器交互之Get请求和Post请求示例。图片传输需要先将图片数据转换成byte[](字节数组),下面将结合具体代码展开详细说明。

实现效果

我们期望实现这样的效果:当点击测试按钮时,将指定的一张图片上传到服务器,同时再从服务器上下载该图片并应用到另一个图片显示区域。具体效果如下图所示(此处应插入对应图片)。

实现步骤

客户端工作

  1. 准备图片与设置属性
    • 新建一个Unity工程,将熊猫图片导入到工程中。
    • 设置图片的属性:将Texture Type选择为Advanced,并启用Read/Write Enable。(此处应插入对应设置图片)
  2. 制作界面
    • 使用UGUI制作界面,添加一个按钮和两个Image组件。
    • 将熊猫图片赋予上面的Image组件。(此处应插入对应界面图片)
  3. 创建脚本并挂载
    • 创建一个空物体,命名为TransmitPic
    • 创建一个脚本TransmitPic,并将该脚本挂载到空物体上。脚本代码如下:
      using UnityEngine;
      using System.Collections;
      using UnityEngine.UI;
      

public class TransmitPic : MonoBehaviour { public Image upImage; public Image downImage;

IEnumerator TransmitPicture() { // 将该texture转成jpg格式图片,返回byte[]数据 byte[] bs = upImage.sprite.texture.EncodeToJPG();

// WWWForm是一个辅助类,用于生成表单数据,然后WWW类可以将该表单数据post到web服务器上 WWWForm form = new WWWForm();

// 添加二进制文件到表单,使用该函数可以上传文件或者图片到Web服务器 // 第一个参数相当于一个"key",类似于html中表单的fieldname,服务器端根据这个"key"得到文件流 // 所以在php文件中用$_FILES["picture"]可以得到该文件 // 上传的内容就是字节数组bs的内容 // 第三个参数filename用于告诉服务器当保存上传文件时使用什么文件名 // 最后一个参数是档案格式,此处上传的是jpg格式,所以用image/jpg // 如果bs使用的是png格式图片,就使用image/png form.AddBinaryData("picture", bs, "filename", "image/jpg");

// 该构造函数创建并发送一个post请求 // form包含着要被post到web服务器的表单数据(form data) // 此时数据流也开始自动的下载web服务器的数据,可通过www访问下载到的数据 WWW www = new WWW("http://127.0.0.1/unitypic.php", form);

// 等待www完成 yield return www;

if (www.error != null) { Debug.Log(www.error); yield return null; } else { // WWW.texture返回用下载下来的数据生成的texture2D Texture2D tex = www.texture; Sprite spr = Sprite.Create(tex, upImage.sprite.rect, upImage.sprite.pivot, upImage.sprite.pixelsPerUnit); downImage.sprite = spr; yield return null; } }

public void OnTestButton() { StartCoroutine(TransmitPicture()); } }

4. **关联组件与设置响应函数**
- 将场景中上下两个`Image`分别赋值给脚本中的`public Image upImage`和`public Image downImage`。
- 将按钮的点击响应函数设置为`public void OnTestButton()`。

至此,客户端工作完成。

### 服务端工作
1. **创建PHP文件**
打开Apache和PHP配置一节中新建的`www`文件夹,创建一个新的PHP文件`unitypic.php`,代码如下:

<?php // isset()用于检测括号内的变量值是否设置了值 // 如果变量存在且设置了非null值返回true,否则false // $_FILES[]表示经由 HTTP POST 文件上传而提交至脚本的变量 // php中变量前面要加$ // echo表示输出 if(isset($_FILES["picture"])) // 如果接收到了上传的数据 { // file_get_contents() 函数把整个文件读入一个字符串中 // tmp_name表示文件上传后在服务端存储的临时文件名 // 一般是系统默认。可以在php.ini的upload_tmp_dir 指定 echo file_get_contents($_FILES["picture"]["tmp_name"]); } else { echo "error!"; } ?>


至此,服务端工作完成。

### 测试
1. 打开Apache服务器(打开方式参看Apache配置一节)。
2. 在Unity客户端进行测试,点击中间的测试按钮。若出现预期效果(此处应插入对应测试成功图片),则测试成功。

恭喜,测试成功!通过以上步骤,我们就实现了Unity3D与Apache服务器之间的图片数据传输。

作者信息

洞悉

洞悉

共发布了 515 篇文章