Unity 脚本 关于网络请求的方法有如下:
public WWW (string url, byte[] postData, Dictionary<string, string> headers)
public WWW (string url, byte[] postData, Hashtable headers)
-----> deprecated
public WWW (string url, byte[] postData)
public WWW (string url, WWWForm form)
public WWW (string url)
很多方法呢,从文档中可以看到。
但是正在我看书的过程中发现有个方法已经被弃置了,所以特意写下笔记,增强记忆。
参考《Unity 3D/2D 手机游戏开发》一书自学的。
但遗憾在Unity5 的时候有方法被弃置,本人的思路将会根据该书来记录。
1.创建一个脚本,选C#,名为WebManager。
2.将脚本WebManager.cs 添加到一个对象上,即可触发脚本的事件。
3.开始编写代码。
3.1先编写一个界面。
using UnityEngine; using System.Collections; public class WebManager : MonoBehaviour { //全局变量,用来接收信息提示,初始化为“Nothing”。 string m_info = "Nothing"; void OnGUI() { GUI.BeginGroup (new Rect (Screen.width * 0.5f - 100, Screen.height * 0.5f - 100, 500, 200), ""); //创建一个标签,设置位置、大小,将接收信息提示的全局变量作为标签的文本内容。 GUI.Label (new Rect (10, 10, 400, 30), m_info); //创建一个按钮,设置位置、大小,按钮上的标题为“Get Data”。 if (GUI.Button (new Rect (10, 50, 150, 30), "Get Data")) { //这里写点击按钮所触发的行为、事件。 } //创建一个按钮,设置位置、大小,按钮上的标题为“Post Data”。 if (GUI.Button (new Rect (10, 100, 150, 30), "Post Data")) { //这里写点击按钮所触发的行为、事件。 } GUI.EndGroup(); } // Use this for initialization void Start () { } // Update is called once per frame void Update () { } }
首先就来个简单的方法吧。
Get请求是最简单的,所以一般简单的方法都是Get方法的。
3.2Get方法
先写下这个IGetData() 函数。需要注意的是该函数返回类型是迭代器 IEnumerator,通过这个可以进行协同调用。
IEnumerator IGetData() { //使用Get方式访问HTTP地址 WWW www = new WWW ("http://yococoxc.vicp.cc:9999/test/userprint.php?username=yococo&password=123456789"); //等待服务器的响应 yield return www; //如果出现错误 if (www.error != null) { //获取服务器的错误信息 m_info = www.error; yield return null; } //获取服务器的响应文本 m_info = www.text; }
然后需要将上面的函数在Get对应的按钮上设置好,以便触发。
if (GUI.Button (new Rect (10, 50, 150, 30), "Get Data")) { StartCoroutine(IGetData()); }
说明:
StartCoroutine()方法的作用是启动协同程序,执行指定的方法,当然执行的方法的返回类型必须是IEnumerator。
关于程序所使用的PHP代码将会在最后列出。
效果为:
3.3Post方法
Get方法就是如上那么简单,接下来就是Post方法,有些类似,但是比较麻烦,当然Post方法有很多优点的,默认你是知道的。
IEnumerator IPostData() { Dictionary<string,string> headers = new Dictionary<string, string> (); headers ["Content-Type"] = "application/x-www-form-urlencoded"; //将要发送的Post文本内容 string data = "username=yococo&password=123456789"; //将文本转为byte数组 byte[] bs = System.Text.UTF8Encoding.UTF8.GetBytes (data); //向HTTP服务器提交Post数据 WWW www = new WWW ("http://yococoxc.vicp.cc:9999/test/userprint.php", bs, headers); //等待服务器的响应 yield return www; //如果出现错误 if (www.error != null) { //获取服务器的错误信息 m_info = www.error; yield return null; } //获取服务器的响应文本 m_info = www.text; }
特别提示:
用了 Dictionary 这个类,请引入 using System.Collections.Generic;
否则会出错。
然后按钮对应上执行的方法。
if (GUI.Button (new Rect (10, 100, 150, 30), "Post Data")) { StartCoroutine(IPostData()); }
结果:
3.4弃置的方法。
public WWW (string url, byte[] postData, Hashtable headers)
被弃置了,这个编程中不罕见,有弃置就会有相对代替的方法,文档是关键。
3.5另外的Post写法,实现另外的方法。
IEnumerator IPostData() { //将要发送的Post文本内容 string data = "username=yococo&password=123456789"; //将文本转为byte数组 byte[] bs = System.Text.UTF8Encoding.UTF8.GetBytes (data); //向HTTP服务器提交Post数据 WWW www = new WWW ("http://yococoxc.vicp.cc:9999/test/userprint.php", bs); //等待服务器的响应 yield return www; //如果出现错误 if (www.error != null) { //获取服务器的错误信息 m_info = www.error; yield return null; } //获取服务器的响应文本 m_info = www.text; }
此处少了添加头信息。
IEnumerator IPostData() { WWWForm form = new WWWForm (); //添加字段(键,值) form.AddField ("username", "yococo"); form.AddField ("password", "123456789"); //向HTTP服务器提交Post数据,提交表单 WWW www = new WWW ("http://yococoxc.vicp.cc:9999/test/userprint.php", form); //等待服务器的响应 yield return www; //如果出现错误 if (www.error != null) { //获取服务器的错误信息 m_info = www.error; yield return null; } //获取服务器的响应文本 m_info = www.text; }
接下来就是PHP代码:
<?php if (isset($_GET['username']) && isset($_GET['password'])) { echo "GET -> username is " . $_GET['username'] . " and password is" . $_GET['password']; } else if (isset($_POST['username']) && isset($_POST['password'])) { echo "POST -> username is " . $_POST['username'] . " and password is" . $_POST['password']; } else { echo "error"; } ?>
作者:木子才
iOS开发者俱乐部 232099237 有空可以加入这里一起探讨问题,由于群小,请输入验证信息。