unity www请求同时发出多少www请求

如何在Unity3d中实现和网页数据的交互_百度知道
如何在Unity3d中实现和网页数据的交互
我有更好的答案
使用WWW对网页地址进行请求
其他类似问题
为您推荐:
unity3d的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁3014人阅读
Unity3D(156)
Unity3D下,网络通信的HTTP协议如何获取网络图片以及内容内容?下面就让我们一起来探讨一下其中的规律,看其脚本如何发挥作用的。
& & 首先我们要说明的是此脚本主要实现了以下方面的内容:
· 分别用pose和get方式获取天气预报信息(XML格式)。
· 解析XML
· 获取网络图片
· 获取网络图片(base64格式)
· base64与byte[]互转
· byte[]与Texture2D(图片)互转
& &更多常用WEBService:
using UnityE
using System.C
using System.Collections.G
using System.X
using System.IO;
& & public class HTTPDemo : MonoBehaviour
& & public string HostName = &.cn&;
& & //城市天气预报服务&&
& & public string URLPath = &/WebServices/WeatherWebService.asmx/getWeatherbyCityName&;
& & //获得验证码服务(直接获得图片)
& & private string PictureName = &/WebServices/ValidateCodeWebService.asmx/cnValidateImage?byString='Picture'&;
& & //获得验证码服务(获得图片字节流)
& & private string PictureByteName = &/WebServices/ValidateCodeWebService.asmx/cnValidateByte?byString='picByte'&;
& & private Texture2D mP
& & private Texture2D mPictureB
& & private Texture2D mConvertPNG;
& & public string[] Parameters = new string[] { &theCityName& };
& & private string XMLContent = &null&;
& & public string testC = &null&;
& & void OnGUI()
& && &&&//显示测试信息&&
& && &&&GUI.Label(new Rect(100, 10, 1000, 38), testC);
& && & //表单传值
& && &&&if (GUI.Button(new Rect(10, 50, 100, 60), &post&))
& && && && &postWeatherbyCityName(&北京&);
& && &&&GUI.Button(new Rect(120, 80, 100 + getJindu() * 100, 20), (getJindu() * 100) + &%&);
& && &&&//get传值(android平台不支持中文参数)
& && &&&if (GUI.Button(new Rect(10, 130, 100, 60), &get&))
& && && && &getWeatherbyCityName(&58367&);//上海
& && &&&GUI.Button(new Rect(120, 150, 100 + getJindu() * 100, 20), (getJindu() * 100) + &%&);
& && &&&//显示读取到的天气预报原始信息(xml格式)
& && &&&GUI.Label(new Rect(10, 220, 380, 500), mContent);
& && &&&//解析xml&&
& && &&&if (GUI.Button(new Rect(500, 200, 120, 60), &AnalysisXML&))
& && && &&&XMLContent = AnalysisXML();
& && &&&GUI.Label(new Rect(410, 220, 380, 500), XMLContent);
& && &&&//下载网络图片&&
& && &&&if (GUI.Button(new Rect(10, 750, 80, 60), &downPic&))
& && && && &downloadPicture(PictureName);
& && & GUI.Label(new Rect(100, 760, 200, 200), mPicture);
& && &&&//下载网络图片 (base64格式)
& && &&&if (GUI.Button(new Rect(350, 750, 80, 60), &downPicByte&))
& && && && &downloadPictureByte(PictureByteName);
& && &&&GUI.Label(new Rect(450, 760, 200, 200), mPictureByte);
& & public void postWeatherbyCityName(string str)
& && &&&//将参数集合封装到Dictionary集合方便传值
& && &&&Dictionary&string, string& dic = new Dictionary&string, string&();
& && &&&//参数
& && &&&dic.Add(Parameters[0], str);
& && &&&StartCoroutine(POST(HostName + URLPath , dic));
& & public void getWeatherbyCityName(string str)
& && &&&//将参数集合封装到Dictionary集合方便传值
& && &&&Dictionary&string, string& dic = new Dictionary&string, string&();
& && &&&//参数
& && &&&dic.Add(Parameters[0], str);
& && &&&StartCoroutine(GET(HostName + URLPath , dic));
& & //下载图片&&
& & public void downloadPicture(string picName)
& && &&&testC =&picurl = & + picN
& && &&&StartCoroutine(GETTexture(HostName + picName));
& & //下载图片(字节流)
& & public void downloadPictureByte(string picName)
& && &&&StartCoroutine(GETTextureByte(HostName + picName));
& &/*----------------------------------------------------Helper----------------------------------------------------------------------------*/
& &private float mJindu = 0;
& &private string mC
& &public float getJindu()
& && & return mJ
& & //POST请求(Form表单传值、效率低、安全 ,)
& &IEnumerator POST(string url, Dictionary&string, string& post)
& && &&&//表单&&
& && &&&WWWForm form = new WWWForm();
& && &&&//从集合中取出所有参数,设置表单参数(AddField()).
& && &&&foreach (KeyValuePair&string, string& post_arg in post)
& && && && &form.AddField(post_arg.Key, post_arg.Value);
& && &&&//表单传值,就是post&&
& && &&&WWW www = new WWW(url, form);
& && & mJindu = www.progress;
& && & if (www.progress;
& && &&&if (www.error != null)
& && && & //GET请求失败
& && && && &mContent = &error :& + www.error;
& && & else
& && && && &//GET请求成功
& && && && &mContent = www.error != null)
& && && && &//GET请求失败
& && && &&&Debug.Log(&error :& + www.error);
& && &&&else
& && && &&&//GET请求成功
& && && && &Debug.Log(&PicBytes text = & + www.text);
& && && && &XmlDocument xmlDoc = new XmlDocument();
& && && && &xmlDoc.Load(new StringReader(www.text));
& && && && &//通过索引查找子节点&&
& && && && &PicByte = xmlDoc.GetElementsByTagName(&base64Binary&).Item(0).InnerT
& && && && &testC = PicB
& && && && &mPictureByte = BttetoPic(PicByte);
& & //解析XML&&
& & string AnalysisXML()
& && &&&string str = &&;
& && &&&XmlDocument xmlDoc = new XmlDocument();
& && &&&xmlDoc.Load(new StringReader(mContent));
& && & //得到文档根节点的所有子节点集合&&
& && & //XmlNodeList nodes = xmlDoc.DocumentElement.ChildN
& && & //通过节点名得到节点集合
& && &XmlNodeList nodes = xmlDoc.GetElementsByTagName(&string&);
& && &&&//通过索引查找子节点&&
& && &&&str += &item[1] = & + xmlDoc.GetElementsByTagName(&string&).Item(1).InnerText + &\n\n&;
& && &&&//遍历所有子节点
& && & foreach (XmlElement element in nodes)
& && && && &if (element.Name == &string&)
& && && &&&{
& && && && && &str += element.InnerText + &\n&;
& && && &&&}
& &//图片与byte[]互转
& &public void convertPNG(Texture2D pic)
& && & byte[] data = pic.EncodeToPNG();
& && & Debug.Log(&data = & + data.Length + &|& + data[0]);
& && & mConvertPNG = new Texture2D(200, 200);
& && &&&mConvertPNG.LoadImage(data);
& &//byte[]与base64互转&&
& & Texture2D BttetoPic(string base64)
& && & Texture2D pic = new Texture2D(200,200);
& && &&&//将base64转码为byte[]&&
& && &&&byte[] data = System.Convert.FromBase64String(base64);
& && &&&//加载byte[]图片
& && &&&pic.LoadImage(data);
& && &&&string base64str = System.Convert.ToBase64String(data);
& && &&&Debug.Log(&base64str = & + base64str);
& &&&完整的脚本就这样完成了,大家可以用实际操作原来演练一下,熟悉其中所用的原理。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:824002次
积分:9243
积分:9243
排名:第1243名
原创:78篇
转载:350篇
评论:69条
(2)(3)(2)(1)(3)(1)(4)(2)(2)(6)(25)(2)(5)(3)(65)(20)(2)(4)(4)(58)(12)(10)(82)(75)(25)(1)(1)(1)(3)(2)(8)(1)> 游戏统计分析 > 游戏统计分析Unity插件 > 集成文档
Unity3D游戏统计分析插件使用指南
在项目中集成SDK
下载最新版SDK的 导入 UmengGameAnalytics.unitypackage
先在友盟的管理后台中创建App,获得AppKey
*特别提醒:我们建议开发者在注册账号时使用企业邮箱,避免使用个人邮箱注册,防止由于个人离职带来的问题,建议使用的账号形式 :umeng@企业域名、apps@企业域名、dev@企业域名。
编写统计代码
using UnityE
public class Example : MonoBehaviour {
void Start () {
//请到 /analytics 获取app key
GA.StartWithAppKeyAndChannelId("your app key", "App Store");
//触发统计事件 开始关卡
GA.StartLevel("your level ID");
Android开发者请注意:
友盟游戏统计分析 Unity3D v1.3 不在提供对Android 2.2的支持
Android平台用到的permission,service和activity
Asset/Plugins/Android/AndroidManifest.xml 已经默认添加如下permission,service和activity
用户无需再手动添加 这些permission,service和activity在Unity Build过程中会被自动加入到应用程序中
统计组件使用的permission
检测联网方式,区分用户设备使用的是2G、3G或是WiFi
&uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/&
访问互联网
&uses-permission android:name="android.permission.INTERNET"/&
获取用户手机的IMEI,用来唯一的标识用户
&uses-permission android:name="android.permission.READ_PHONE_STATE"/&
如果您的应用会运行在无法读取IMEI的平板上,我们会将mac地址作为用户的唯一标识
&uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/&
iOS开发者请注意:
iOS9中ATS配置:
由于iOS9引入了App Transport Security (ATS)特性,要求App访问的网络使用HTTPS协议,如果不做特殊设置,http请求会失败,所以需要开发者在工程中增加设置以便可以发送http请求,如下:
在info plist中增加字段:
& key&NSAppTransportSecurity& /key&
    & key&NSAllowsArbitraryLoads& /key&
配置完后如图所示:
使用Unity 5.3的开发者请注意:
需要添加依赖框架(Framework)和编译器选项
TARGETS--&Build Phases--&Link Binary With Libraries--& + --&libz.dylib(libz.tbd)
游戏统计介绍
玩家支付货币兑换虚拟币,用于统计游戏的收入情况
public enum PaySource
AppStore = 1,
支付宝 = 2,
财付通 = 4,
Paypal = 8,
Source9,// 目前1-20的来源已经被友盟预定义,如果使用自定义来源请使用21-99之间的id。
void Pay(double cash, PaySource source, double coin);
// 充值并购买道具.
void Pay(double cash, PaySource source, string item, int amount, double price);
真实币数量
&=0的数,最多只保存小数点后2位
枚举类型, 目前1-20的来源已经被预定义,如果使用自定义来源请使用21-99之间的id。
虚拟币数量
大于0的整数, 最多只保存小数点后2位
非空字符串
大于0的整数
在游戏中充值或者购买虚拟币的时候调用此方法,比如通过支付宝用 10元钱 购买了 1000 个金币,可以这样调用:
GA.Pay(10, GA.PaySource.AppStore, 1000);
有些时候在游戏中会直接购买某个道具,比如10元购买 2个魔法药水,每个药水50个金币,可以调用下面的方法在付费的同时购买道具。
GA.Pay(10, GA.PaySource.AppStore, "magic_bottle", 2, 50);
测试方法及报表对应关系请见。
玩家用虚拟币兑换一定数量、价值的道具
// 购买道具.
void Buy(string item, int amount, double price);
非空字符串
大于0的整数
购买道具需要传递道具ID、数量(amount)、道具单价(price)。
在游戏中使用金币购买了1个头盔,一个头盔价值 1000 金币,可以这样统计:
GA.Buy("helmet", 1, 1000);
测试方法及报表对应关系请见。
玩家使用道具的情况
// 使用道具.
void Use(string item, int amount, double price);
非空字符串
大于0的整数
消耗道具需要传递道具ID、数量(amount)、道具单价(price)。
游戏中的物品损耗,比如使用了2瓶魔法药水,每个需要50个虚拟币,可以这样统计:
GA.Use("magic_bottle", 2, 50);
测试方法及报表对应关系请见。
记录玩家在游戏中的进度
// 进入关卡.
void StartLevel(string level);
// 通过关卡.
void FinishLevel(string level);
// 未通过关卡.
void FailLevel(string level);
非空字符串(eg:level-01)
开发者需要在关卡状态变动时调用startLevel方法重新设置当前关卡。
多次调用startLevel,以最后设置的为准
在游戏开启新的关卡的时候调用 startLevel 方法,在关卡失败的时候调用 failLevel 方法,在成功过关的时候调用 finishLevel 方法。
调用 failLevel 或 finishLevel 的时候会计算从 startLevel 开始的时长,作为这一关卡的耗时。level 字段最好为非空可排序的字符串。
SDK 默认减去程序切入后台的时间。
测试方法及报表对应关系请见。
玩家信息统计
增加玩家账号统计维度,同时可以追踪玩家的等级情况。以便结合关卡和付费数据整理出更有价值的用户。开发者应该在程序开始的地方尽早调用。
注意:SetUserInfo已弃用,使用老版SDK中账号统计的开发者,请尽早跟新SDK并使用新接口:
void ProfileSignIn(string userId)
void ProfileSignIn(string userId,string provider)
ID:玩家账号ID,长度小于64字节
provider : 不能以下划线"_"开头,使用大写字母和数字标识; 如果是上市公司,建议使用股票代码。
使用sign-In函数后,如果结束该userId的统计,需要调用ProfileSignOfff函数
void ProfileSignOff()
示例:当玩家使用游戏自有账号登录时,可以这样统计
GA.ProfileSignIn("playerID")
当玩家使用第三方账号(如新浪微博)登录时,可以这样统计:
GA.ProfileSignIn("playerID","WB")
玩家等级统计
当玩家建立角色或者升级时,需调用此接口
void SetUserLevel(int level);
level:大于1的整数,最多统计1000个等级
当玩家从1级升至2级时,可以这样统计:
GA.SetUserLevel(2);
游戏中发生的金币、道具赠送行为
public enum BonusSource
系统奖励 = 1,
Source2,// 如果使用其他的来源 请使用Source2 到Source 10
并在友盟后台网站设置 对应的定义
// 赠送金币.
void Bonus(double coin, BonusSource source);
// 赠送道具.
void Bonus(string item, int amount, double price, BonusSource source);
虚拟币数量
大于0的整数, 最多只保存小数点后2位
枚举类型, 其中Source1预定义为“系统奖励”,Source2~Source10的定义需要在友盟后台设置
非空字符串
大于0的整数
消耗道具需要传递道具ID、数量(amount)、道具单价(price)。
连续5天登陆游戏奖励1000金币,可以这样统计:
GA.Bonus(1000,GA.BonusSource.系统奖励);
如果在五一假期中举行登陆有奖活动,开发者想统计活动期间所赠送的金币数量,可以这样统计:
GA.Bonus(10000,BonusSource.Source2);
然后在后台“设置”——“虚拟币来源管理”中将“2”这个事件设为节日奖励。即可看到相应的数据了。
高级功能集成指南
使用自定义事件
使用自定义事件功能请先在网站应用管理后台(设置-&编辑自定义事件)中添加相应的自定义事件后,服务器才会对相应的自定义事件请求进行处理。这里我们将提供几个简单而通用的接口:
事件数量统计
在您希望跟踪的代码部分,调用如下方法:
void Event(string eventId)
void Event(string eventId, string label)
eventId为当前统计的事件ID。
label为当前事件的属性和取值(键值对)。
示例:统计微博应用中"转发"事件发生的次数,那么在转发的函数里调用
GA.Event("Forward");
示例: 统计游戏中“死亡”事件发生的关卡数,那么可以在死亡的函数里调用
GA.Event("player_dead", "level1");
考虑事件附带属性,可以调用如下方法:
void Event(string eventId, Dictionary&string, string& attributes)
attributes为当前事件的属性 , 属性中的Key-Vaule Pair不能超过10个。
示例:统计电商应用中“购买”事件发生的次数,以及购买的商品类型及数量,那么在购买的函数里调用:
var dict = new Dictionary&string,string&();
dict["book"]="3";
GA.Event("purchase", dict);
事件时长统计
有的事件是持续发生的,需要记录其持续的时间,这里提供了两种解决方法。
在事件开始和结束时调用EventBegin(string eventId)和EventEnd(string eventId)两个函数
示例: 跟踪播放音乐事件发生的总时间,那么在音乐播放开始时调用:
GA.EventBegin("music_play");
在音乐播放结束时调用:
GA.EventEnd("music_play");
跟踪时长的事件包含多个属性
void EventBeginWithPrimarykeyAndAttributes(string eventId, string primaryKey, Dictionary&string, string& attributes)
void EventEndWithPrimarykey(string eventId, string primaryKey)
primarykey这个参数用于和eventId一起标示一个唯一事件,并不会被统计;
对于同一个事件在EventBeginWithPrimarykeyAndAttributes和EventEndWithPrimarykey 中要传递相同的eventId和primaryKey
示例: 跟踪每种类型的音乐播放了多久,那么在音乐播放开始时调用
var dict = new Dictionary&string,string&();
dict["type"] = "popular";
dict["artist"] = "JJLin";
EventBeginWithPrimarykeyAndAttributes("music", "song1", dict);
var dict2 = new Dictionary&string,string&();
dict2["type"] = "popular";
dict2["artist"] = "Jobs";
EventBeginWithPrimarykeyAndAttributes("music", "song2", dict2);
在音乐播放结束时调用
EventEndWithPrimarykey("music", "song1");
EventEndWithPrimarykey("music", "song2");
时长是友盟统计的一个新功能,使用过程中可能会出现一些常见的错误,开发者应该尽量的避免。
1. eventId 和 tag 不能使用特殊字符,且长度不能超过128个字节;attributes中的key和value 都不能使用特殊字符,key 不能超过128个字节,value 不能超过256个字节
2. id, ts, du是保留字段,不能作为eventId及key的名称。
3. 每个应用至多添加500个自定义事件,每个event 的 key不能超过10个,每个key的取值不能超过1000个(不允许通过key-value结构来统计类似搜索关键词,网页链接等随机生成的字符串信息)。
程序中的某些事件,如登录、分享、下载等,是定性变量(categorical variable),对应的统计项是字符串类型。开发者只需了解它们发生的次数及独立用户数,使用计数事件即可满足。
还有一些事件,如上面提到的支付金额、内容浏览数量等是连续变量,对应的统计项是数值类型。开发者需要查看这些事件的数值分布特征,这就需要使用计算事件。
详见 /analytics/reference/functions/numekv
void Event(string eventId, Dictionary&string, string& attributes, int value)
eventId为当前统计的事件ID。
attributes为当前事件的属性和取值(键值对)。
value为定性变量(categorical variable)。
有时需要统计应用程序的分发渠道,例如有多少用户来从应用汇 下载了您的应用,又有多少用户通过GooglePlay下载到您的应用程序。你调用StartWithAppKeyAndChannelId时传入的channelId可以完成这个功能
每台设备仅记录首次安装激活的渠道,在其他渠道再次安装不会重复计量。 所以在测试不同的渠道的时候,请使用不同的设备来分别测试。channelId注意不能是纯数字。
使用在线配置功能
这个功能目前可以帮您在网站上动态配置两种类型的参数:
自定义key-value型的键值对
数据发送策略(发送策略在网站动态配置)
您需要在StartWithAppKeyAndChannelId后调用
GA.UpdateOnlineConfig();
它将从服务器获取在线参数,并缓存本地。
然后可使用
string GetConfigParamForKey(string key);
获得key对应的vaule值
key为友盟后台上预设的key值。
使用页面访问统计
您可以统计每个UI视图的停留时长及路径 为UI设计提供参考
需要配对使用,如
GA.PageBegin("UIPanel1");
GA.PageEnd("UIPanel1");
* 我们针对页面访问进行的是抽样统计,所以只有数据量达到一定规模之后才可以看到。
* 由于这组方法的调用,需要保证线性不交叉,每个 PageBegin 都有一个 PageEnd 配对,如下:
PageBegin -&PageEnd-& PageBegin -& PageEnd -& PageBegin -&PageEnd
这样才能保证每个页面统计的正确
//集成测试请使用此函数获得 设备的识别信息
public static string GetDeviceInfo()
集成测试服务详细说明请参见。
联系客服:
Email:请发邮件至,我们会尽快回复您。
为了能够尽快响应您的反馈,请提供您的appkey及log中的详细出错日志,您所提供的内容越详细越有助于我们帮您解决问题。
SetCrashReportEnabled(bool value) 开启CrashReport收集, 默认是开启状态。此方法只有iOS平台有效。Android平台无此函数 Android平台CrashReport收集始终保持开启状态,无法关闭。
注意:请在StartWithAppkey之前调用,之后调用无效!
SetLogEnabled(bool value) 设置为true,umeng SDK 会输出log信息,记得release产品时要设置回false。
SetLogEncryptEnabled(bool value)设置是否对日志信息进行加密, 默认false(不加密)。value 设置为true, SDK会将日志信息做加密处理
对于需要在unity 4.6 中使用 il2cpp 编译 ios 程序的开发者,请在Build前删除 Assets/Pluggins/Android/UMGameAnalyticsLibForAndroid.dll有个写了个库
为了方便,我还是直接用WWW类来做。
using UnityE
using System.C
/// &summary&
/// Filename: WWWHelper.cs
/// Description: Manage http request
/// Author: Star
/// Date: [12/12/10]
/// &/summary&
public class WWWHelper : MonoBehaviour
private static WWWHelper instance = null;
private WWW m_
private GameObject m_CallBackTarget = null;
private bool m_bIsBeginRequest = false;
private bool m_bIsDone = true;
public bool IsBeginRequest
get { return m_bIsBeginR }
set { m_bIsBeginRequest = }
public bool IsDone
get { return m_bIsD }
set { m_bIsDone = }
public static WWWHelper Instance
get { return }
void Awake()
if (instance != null && instance != this)
Destroy(this.gameObject);
instance = this;
DontDestroyOnLoad(this.gameObject);
public void GET(string url, GameObject callBackTarget)
if (m_bIsDone)
m_CallBackTarget = callBackT
this.m_www = new WWW(url);
m_bIsBeginRequest = true;
m_bIsDone = false;
// Update is called once per frame
void Update ()
if (m_bIsBeginRequest)
if (this.m_www.isDone)
if (null != m_CallBackTarget)
m_CallBackTarget.SendMessage("RequestDone",this.m_www.text);
m_bIsDone = true;
m_bIsBeginRequest = false;
阅读(...) 评论()Unity中文培训脚本手册|unity3D官网学习教程大全
unity培训unity3d游戏开发培训专业教程,unity学习教程大全,unity官方学习网站

我要回帖

更多关于 unity3d 终止www请求 的文章

 

随机推荐