转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持!



开篇废话:

这个项目准备分四部分介绍:

一:创建可旋转的“3D球”:3D语音天气球(源码分享)——创建可旋转的3D球

二:通过天气服务,从网络获取时实天气信息并动态生成“3D球”:3D语音天气球(源码分享)——通过天气服务动态创建3D球

三:Android语音服务和Unity的消息传递:3D语音天气球(源码分享)——在Unity中使用Android语音服务

四:Unity3D端和Android端的结合3D语音天气球(源码分享)——完结篇

关于项目的详细介绍和3D球的创建请看上面第一篇文章(重要)

今天主要讲解如何通过获取实时的天气信息去动态的创建3D球。效果图如下:

左边是Unity做出后在电脑上运行效果图(本节需要实现的效果)

右边是Unity结合Android和语音控制之后在手机运行的效果图(所有都介绍完后的最终效果):

    



天气服务:

我们需要通过网站提供的天气服务来获取实时的城市天气信息。
网上可以搜到很多这类的天气服务,基本都是通过传入固定的城市ID返回天气信息,这些天气信息的格式一般都是json或xml,解析之后就可以使用了。

我对比网上好多的天气服务,下面两个是比较好用的,免费不用注册不用申请,直接浏览器打上就可以用:
简略天气:http://www.weather.com.cn/data/cityinfo/101010100.html
详细天气:http://weather.51wnl.com/weatherinfo/GetMoreWeather?cityCode=101010100&weatherType=0
最后面的101010100就是北京的编号,城市的天气编号大家可以上网查(demo里也有),返回的结果分别如下:
  1. {"weatherinfo":{"city":"天津","cityid":"101030100","temp1":"-6℃","temp2":"4℃","weather":"晴","img1":"n0.gif","img2":"d0.gif","ptime":"18:00"}}
  1. {"weatherinfo":{"city":"北京","city_en":"beijing","date_y":"2014年12月16日","date":"十月廿五","week":"星期二","fchh":"18","cityid":"101010100","temp1":"-6℃~5℃","temp2":"-7℃~4℃","temp3":"-5℃~3℃","temp4":"-5℃~1℃","temp5":"-7℃~3℃","temp6":"-6℃~5℃","tempF1":"21.2℉~41℉","tempF2":"19.4℉~39.2℉","tempF3":"23℉~37.4℉","tempF4":"23℉~33.8℉","tempF5":"19.4℉~37.4℉","tempF6":"21.2℉~41℉","weather1":"晴","weather2":"晴转多云","weather3":"多云","weather4":"晴","weather5":"晴","weather6":"晴","img1":"0","img2":"99","img3":"0","img4":"1","img5":"1","img6":"99","img7":"0","img8":"99","img9":"0","img10":"99","img11":"0","img12":"99","img_single":"0","img_title1":"晴","img_title2":"晴","img_title3":"晴","img_title4":"多云","img_title5":"多云","img_title6":"多云","img_title7":"晴","img_title8":"晴","img_title9":"晴","img_title10":"晴","img_title11":"晴","img_title12":"晴","img_title_single":"晴","wind1":"北风3-4级转微风","wind2":"微风","wind3":"微风转北风4-5级","wind4":"北风3-4级","wind5":"微风","wind6":"微风","fx1":"北风","fx2":"微风","fl1":"3-4级转小于3级","fl2":"小于3级","fl3":"小于3级转4-5级","fl4":"3-4级","fl5":"小于3级","fl6":"小于3级","index":"较冷","index_d":"建议着厚外套加毛衣等服装。年老体弱者宜着大衣、呢外套加羊毛衫。","index48":"","index48_d":"","index_uv":"中等","index48_uv":"","index_xc":"较适宜","index_tr":"适宜","index_co":"较舒适","st1":"4","st2":"-6","st3":"4","st4":"-5","st5":"3","st6":"-4","index_cl":"适宜","index_ls":"基本适宜","index_ag":"极不易发"}}

大家可以看到返回的数据是Json格式的,现在的任务就是解析这些返回的数据来给我们的城市对象赋值。





解析数据:

相信解析Json大家都不陌生,本例中的Json解析使用的是LitJson插件,下载LitJson插件放入Unity中并在使用时导包即可。
下面只简单贴出本例的解析方法,详细使用方法网上教程很多这里就不细说了。

简略天气:http://www.weather.com.cn/data/cityinfo/101010100.html
  1. public void parseJson(string result)
  2. {
  3. JsonData jd = JsonMapper.ToObject(result);
  4. JsonData jdResult = jd["weatherinfo"];
  5.  
  6. this.name = (string)jdResult["city"];
  7. this.temperature = (string)jdResult["temp1"];
  8. this.temperature2 = (string)jdResult["temp2"];
  9. setTempture (temperature, temperature2);
  10. this.weather = (string)jdResult ["weather"];
  11. this.img1 = (string)jdResult ["img1"];
  12. this.img2 = (string)jdResult ["img2"];
  13. }

img1,img2表示当前天气的图片,图片需要提前从中国天气网下载。



详细天气:http://weather.51wnl.com/weatherinfo/GetMoreWeather?cityCode=101010100&weatherType=0
  1. public void parseJson(string result)
  2. {
  3. JsonData jd = JsonMapper.ToObject(result);
  4. JsonData jdResult = jd["weatherinfo"];
  5.  
  6. this.name = (string)jdResult["city"];
  7. this.date_y = (string)jdResult["date_y"];
  8. this.date = (string)jdResult["date"];
  9. this.week = (string)jdResult["week"];
  10. this.temperature = (string)jdResult["temp1"];
  11. this.weather = (string)jdResult ["weather1"];
  12. this.wind = (string)jdResult ["wind1"];
  13. this.fl = (string)jdResult ["fl1"];
  14. this.index = (string)jdResult ["index"];
  15. this.index_uv = (string)jdResult ["index_uv"];
  16. this.index_xc = (string)jdResult ["index_xc"];
  17. this.index_tr = (string)jdResult ["index_tr"];
  18. this.index_co = (string)jdResult ["index_co"];
  19. this.index_cl = (string)jdResult ["index_cl"];
  20. this.index_ls = (string)jdResult ["index_ls"];
  21. this.index_ag = (string)jdResult ["index_ag"];
  22. }




动态生成天气球:


目前已经知道如何从网上获取实时天气服务并解析。现在可以根据它来动态生成我们的3D球了。

Unity.StartCoroutine:
由于涉及到网络,所以首先想到的就是使用线程来生成每个小球。在Unity中可以使用StartCoroutine(协程)来实现:

在Unity3D中,使用StartCoroutine(string methodName)和StartCoroutine(IEnumerator routine)都可以开启一个线程。区别在于使用字符串作为参数可以开启线程并在线程结束前终止线程,相反使用IEnumerator 作为参数只能等待线程的结束而不能随时终止(除非使用StopAllCoroutines()方法);另外使用字符串作为参数时,开启线程时最多只能传递一个参数,并且性能消耗会更大一点,而使用IEnumerator
作为参数则没有这个限制。

主要代码:
下面的代码是以上篇文章为基础。上篇文章已经详细介绍了如何在大球中生成平均分布的小球。接下来的任务就是为生成的小球gameobject设置各种属性:
  1. // 获取天气信息
  2. public void getWeather(City city, GameObject text)
  3. {
  4. // 根据城市id得到获取天气服务的url
  5. string url = "http://www.weather.com.cn/data/cityinfo/" + city.getCityID() +".html";
  6. // 通过url来给小球赋值
  7. StartCoroutine(GET(url,city,text));
  8. }

返回类型为IEnumerator的协同方法,来解析天气结果并为小球赋值:

  1. IEnumerator GET(string url, City city, GameObject text)
  2. {
  3. WWW www = new WWW (url);
  4. yield return www;
  5.  
  6. //GET请求失败
  7. if (www.error != null)
  8. {
  9. Debug.Log ("error is :" + www.error);
  10. }
  11. //GET请求成功
  12. else
  13. {
  14. //Debug.Log(www.text);
  15. // 解析天气信息,给对象赋值
  16. city.parseJson (www.text);
  17. // 根据当前city对象中的属性给小球复制
  18. TextMesh tm = (TextMesh)text.GetComponent<TextMesh> ();
  19. ChangeColor changeColor = text.GetComponent<ChangeColor>();
  20.  
  21. // 判断当前对象是城市还是省份来分别赋值
  22. if (isCity) {
  23. tm.text = city.getName ();
  24. changeColor.name = city.getName();
  25. changeColor.id = city.getCityID();
  26. changeColor.tempture = city.getTempture();
  27. }
  28. else
  29. {
  30. tm.text = city.getProName();
  31. changeColor.name = city.getProName();
  32. changeColor.tempture = city.getTempture();
  33. }
  34.  
  35. // 设置当前颜色
  36. tm.color = city.getWeatherColor();
  37.  
  38. // 根据城市和省份的不同来判断是否设置图片
  39. foreach (Transform child in text.transform) {
  40.  
  41. if (isCity) {
  42. if (child.tag == "pic1") {
  43. //Debug.Log(getPicPath(city.getImg1()));
  44. Texture2D pic = (Texture2D)Resources.Load(Util.getPicPath(city.getImg1()));
  45. child.renderer.material.shader = Shader.Find ("Unlit/Transparent");
  46. child.renderer.material.mainTexture = (Texture)pic;
  47.  
  48. }
  49. else if (child.tag == "pic2")
  50. {
  51. //Debug.Log(getPicPath(city.getImg2()));
  52. Texture2D pic = (Texture2D)Resources.Load(Util.getPicPath(city.getImg2()));
  53. child.renderer.material.shader = Shader.Find ("Unlit/Transparent");
  54. child.renderer.material.mainTexture = (Texture)pic;
  55. }
  56. else
  57. {
  58. TextMesh tm2 = (TextMesh)child.GetComponent<TextMesh> ();
  59. tm2.text = city.getDetailsName ();
  60. tm2.color = city.getWeatherColor();
  61. }
  62. }
  63. else
  64. {
  65. child.active = false;
  66. }
  67. }
  68. // 设置小球大小
  69. text.transform.localScale = city.getSize();
  70. text.GetComponent<ChangeColor>().oldScale = text.transform.localScale;
  71. }
  72. }

显示单个城市详细天气信息的方法和上面大同小异,这里我就不过多介绍了。



最后:

本节介绍的内容不多,但更新的代码不少,已经可以单独作为一个Unity项目使用了。
没有详细介绍的原因主要是写的比较搓,因为为了快速完成功能所以逻辑比较混乱,使用方法和代码风格也不知道对不对所以就没贴出来。
大家如果有兴趣的话可以下载下来看看:

剩余的内容只剩下Android语音搜索,和Android、Unity相互结合。我会尽快更新,敬请期待。。。

3D语音天气球(源码分享)——通过天气服务动态创建3D球的更多相关文章

  1. 3D语音天气球(源代码分享)——通过天气服务动态创建3D球

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 这个项目准备分四部分介绍: 一:创建可旋转的"3D球":3 ...

  2. 3D语音天气球(源码分享)——完结篇

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 由于这篇文章是本系列最后一篇,有必要进行简单的回顾和思路整理. 这个程序是由两 ...

  3. 3D语音天气球(源码分享)——在Unity中使用Android语音服务

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 这个项目准备分四部分介绍: 一:创建可旋转的"3D球":3 ...

  4. 3D语音天气球(源码分享)——创建可旋转的3D球

    开篇废话: 在9月份时参加了一个网站的比赛,比赛的题目是需要使用第三方平台提供的服务做出创意的作品. 于是我选择使用语音服务,天气服务,Unity3D,Android来制作一个3D语音天气预报,我给它 ...

  5. 超给力的HTML5 3D动画欣赏及源码下载

    HTML5有着非常巨大的魅力,尤其是CSS3和Cavnas,可以帮助页面渲染得非常炫酷.值得一提的是,利用HTML5的3D特性可以帮助你更加方便地在网页上实现3D动画特效.本文分享的这些HTML5 3 ...

  6. 微信小程序——智能小秘“遥知之”源码分享(语义理解基于olami)

    微信小程序智能生活小秘书开发详解 >>>>>>>>>>>>>>>>>>>>> ...

  7. 支持语音识别、自然语言理解的微信小程序(“遥知之”智能小秘)完整源码分享

    记录自己搭建https的silk录音文件语音识别服务的调用过程,所有代码可在文中找链接打包下载 >>>>>>>>>>>>> ...

  8. 推荐!Html5精品效果源码分享

    一直在看别人的汇总,看到了一些不错的关于 HTML5内容的源码,我也汇总下分享出来,好东西需要共享!希望可以帮到需要的朋友. 1.劲爆分享:HTML5动感的火焰燃烧动画特效 这又是一款基于HTML5的 ...

  9. [DeviceOne开发]-土地销售项目源码分享

    一.简介 这个是一个真实项目开源,虽然不是很花哨,但是中规中矩,小细节处理的也很好,非常值得参考和借鉴.里面的数据都缓存到本地,可以离线运行,但是调整一下代码,马上就可以和服务端完全对接.后续会有详细 ...

随机推荐

  1. php源码安装

    要用swoole,首先需要有PHP环境.由于swoole的某些特性,最好是能够从源码编译安装PHP,这样在使用过程中可以避免很多不必要的错误.PHP下载地址:http://php.net/在这里挑选你 ...

  2. php--纯静态和伪静态的区别与关系

    先前说了什么是纯静态和伪静态,现在介绍一下他们的区别? 首先肯定的是纯静态和伪静态都是SEO的产物,但纯静态和伪静态还是有很大区别的.纯静态是生成真实的HTML页面保存到服务器端,用户访问时直接访问这 ...

  3. Caused by: java.lang.OutOfMemoryError: PermGen space.

    现在eclipse需要加载4个项目同时运行了,所以当服务启动的时候,出现Caused by: java.lang.OutOfMemoryError: PermGen space.空间不足错误,我说一下 ...

  4. Android笔记:真机调试无法输出Log 信息的问题

    机器在出厂时将log的级别做了限制,方法是:拨号盘输入*20121220# -> 选择日志输出级别 -> 选择Java log level -> 选择LOGD即可. 方法是:拨号盘输 ...

  5. recordcount

    rs.recordcount 有时不能取到数,这时 要更改游标为客户端游标 .

  6. css3背景色渐变

    <style> .test { width: 200px; height: 200px; background: -moz-linear-gradient(top, #8fa1ff, #3 ...

  7. JavaScript:单选钮的事件处理

    单选按钮事件: 单选钮属于多选一的处理流程,但是单选钮由于也是HTML元素,所以对于JavaScript而言也表示对象. 注意:单选钮的特点是一定要需要名相同才可以实现,所以此处如果名字相同,那么就是 ...

  8. 腾讯企鹅智酷100多张PPT:移动时代创业黄金法则

    移动时代创业黄金法则 http://tech.qq.com/a/20141223/008325.htm#p=8

  9. memory leak at strcore.cpp

    最近使用CString出现了内存泄露,后来发现是CString.GetBuffer之后没有ReleaseBuffer.

  10. mysql怎么终止当前正在执行的sql语句

    mysql怎么终止当前正在执行的sql语句 show processlist; kill 要杀的ID kill 7