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

2023-11-09

转载请注明本文出自大苞米的博客(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里也有),返回的结果分别例如以下:
{"weatherinfo":{"city":"天津","cityid":"101030100","temp1":"-6℃","temp2":"4℃","weather":"晴","img1":"n0.gif","img2":"d0.gif","ptime":"18:00"}}
{"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
	public void parseJson(string result)
	{
		JsonData jd = JsonMapper.ToObject(result);
		JsonData jdResult = jd["weatherinfo"]; 

		this.name = (string)jdResult["city"];
		this.temperature = (string)jdResult["temp1"];
		this.temperature2 = (string)jdResult["temp2"];
		setTempture (temperature, temperature2);
		this.weather = (string)jdResult ["weather"];
		this.img1 = (string)jdResult ["img1"];
		this.img2 = (string)jdResult ["img2"];
	}
img1,img2表示当前天气的图片。图片须要提前从中国天气网下载。
具体天气:http://weather.51wnl.com/weatherinfo/GetMoreWeather?cityCode= 101010100 &weatherType=0
	public void parseJson(string result)
	{
		JsonData jd = JsonMapper.ToObject(result);
		JsonData jdResult = jd["weatherinfo"]; 
		
		this.name = (string)jdResult["city"];
		this.date_y = (string)jdResult["date_y"];
		this.date = (string)jdResult["date"];
		this.week = (string)jdResult["week"];
		this.temperature = (string)jdResult["temp1"];
		this.weather = (string)jdResult ["weather1"];
		this.wind = (string)jdResult ["wind1"];
		this.fl = (string)jdResult ["fl1"];
		this.index = (string)jdResult ["index"];
		this.index_uv = (string)jdResult ["index_uv"];
		this.index_xc = (string)jdResult ["index_xc"];
		this.index_tr = (string)jdResult ["index_tr"];
		this.index_co = (string)jdResult ["index_co"];
		this.index_cl = (string)jdResult ["index_cl"];
		this.index_ls = (string)jdResult ["index_ls"];
		this.index_ag = (string)jdResult ["index_ag"];
	}


动态生成天气球:
眼下已经知道怎样从网上获取实时天气服务并解析。

如今能够依据它来动态生成我们的3D球了。


Unity.StartCoroutine:
因为涉及到网络。所以首先想到的就是使用线程来生成每一个小球。在Unity中能够使用StartCoroutine(协程)来实现:
在Unity3D中。使用StartCoroutine(string methodName)和StartCoroutine(IEnumerator routine)都能够开启一个线程。差别在于使用字符串作为參数能够开启线程并在线程结束前终止线程。相反使用IEnumerator 作为參数仅仅能等待线程的结束而不能随时终止(除非使用StopAllCoroutines()方法);另外使用字符串作为參数时。开启线程时最多仅仅能传递一个參数。而且性能消耗会更大一点,而使用IEnumerator 作为參数则没有这个限制。
主要代码:
以下的代码是以上篇文章为基础。

上篇文章已经具体介绍了怎样在大球中生成平均分布的小球。接下来的任务就是为生成的小球gameobject设置各种属性:

	// 获取天气信息
	public void getWeather(City city, GameObject text)
	{
		// 依据城市id得到获取天气服务的url
		string url = "http://www.weather.com.cn/data/cityinfo/" + city.getCityID() +".html";
		// 通过url来给小球赋值
		StartCoroutine(GET(url,city,text));
	}
返回类型为IEnumerator的协同方法,来解析天气结果并为小球赋值:
	IEnumerator GET(string url, City city, GameObject text)
	{
			WWW www = new WWW (url);
			yield return www;

			//GET请求失败
			if (www.error != null)
			{
				Debug.Log ("error is :" + www.error);
			}
			//GET请求成功
			else 
			{
				//Debug.Log(www.text);
				// 解析天气信息,给对象赋值
				city.parseJson (www.text);
				// 依据当前city对象中的属性给小球复制
				TextMesh tm = (TextMesh)text.GetComponent<TextMesh> ();
				ChangeColor changeColor = text.GetComponent<ChangeColor>();

				// 推断当前对象是城市还是省份来分别赋值
				if (isCity) {
					tm.text = city.getName ();
					changeColor.name = city.getName();
					changeColor.id = city.getCityID();
					changeColor.tempture = city.getTempture();
				}
				else 
				{
					tm.text = city.getProName();
					changeColor.name = city.getProName();
					changeColor.tempture = city.getTempture();
				}
				
				// 设置当前颜色
				tm.color = city.getWeatherColor();
				
				// 依据城市和省份的不同来推断是否设置图片
				foreach (Transform child in text.transform) {
					
					if (isCity) {
						if (child.tag == "pic1") {
							//Debug.Log(getPicPath(city.getImg1()));
							Texture2D pic = (Texture2D)Resources.Load(Util.getPicPath(city.getImg1()));
							child.renderer.material.shader = Shader.Find ("Unlit/Transparent");
							child.renderer.material.mainTexture = (Texture)pic;

						}
						else if (child.tag == "pic2") 
						{
							//Debug.Log(getPicPath(city.getImg2()));
							Texture2D pic = (Texture2D)Resources.Load(Util.getPicPath(city.getImg2()));
							child.renderer.material.shader = Shader.Find ("Unlit/Transparent");
							child.renderer.material.mainTexture = (Texture)pic;
						}
						else
						{
							TextMesh tm2 = (TextMesh)child.GetComponent<TextMesh> ();
							tm2.text = city.getDetailsName ();
							tm2.color = city.getWeatherColor();
						}
					}
					else 
					{
						child.active = false;
					}
				}
				// 设置小球大小
				text.transform.localScale = city.getSize();
				text.GetComponent<ChangeColor>().oldScale = text.transform.localScale;
			}
	}
显示单个城市具体天气信息的方法和上面大同小异,这里我就只是多介绍了。
最后:
本节介绍的内容不多。但更新的代码不少,已经能够单独作为一个Unity项目使用了。
没有具体介绍的原因主要是写的比較搓,由于为了高速完毕功能所以逻辑比較混乱,用法和代码风格也不知道对不正确所以就没贴出来。

大家假设有兴趣的话能够下载下来看看:
剩余的内容仅仅剩下Android语音搜索,和Android、Unity相互结合。我会尽快更新,敬请期待。

。。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • chrome中直接使用import

    现在我们在开发项目时都是基于构建工具 像webpack 上进行开发 所以在使用import时得心应手 但今天在chrome中直接使用import时 发现不知道如何使用 chrome中直接使用import 三个条件 浏览器版本需要支持 浏览器
  • c++常用输出函数详解

    1 printf printf的基本运用 printf是c 标准输出函数 目的是向标准输出设备按规定格式输出信息 格式如下 printf d a 上面的a是一个int形变量 但如果想输出一个字符型的变量 字符串等该怎么办呢 那我们就要把 后
  • 【mmdetection】小trick试验结果

    基准 faster rcnn r50 fpn 1x coco简称frrf config mAP 最好 模型大小 publish model cal train time s iter 1 frrf 0 9346 315 32MB
  • axios实现同步请求

    如何实现ajax请求的同步 通过jquery发送 将async属性设置为false 这样就会发送同步请求 在axios中 所有的请求都是异步发送的 所以单独用axios是实现不了同步的 需要结合async与await关键字使用 var da
  • ab压力测试 和 nginx 配置优化 及 用户打开的最大进程数

    原文 https blog csdn net wudinaniya article details 86064797 一 ab压力测试 和 nginx 配置优化 压力测试工具 ApacheBench 简称ab 是Apache 中自带的基准性
  • 毕业设计-基于 Python 的天气预测系统

    目录 前言 课题背景和意义 实现技术思路 一 Python 二 网络爬虫 三 基于 Python 的天气预测系统 四 系统测试 五 总结 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学
  • MATLAB 创建矩阵

    创建简单数值矩阵 输入矩阵是要以 为标识 矩阵的元素应在 内部 此时MATLAB才识别为矩阵 矩阵的同行元素之间可由空格或 分隔 行与行之间要用 或回车符分隔 A 1 2 3 4 5 6 7 8 9 运算结果 使用 zeros 函数和 on
  • luci流程简介

    LuCI作为 FFLuCI 诞生于2008年3月份 目的是为OpenWrt固件从Whiterussian 到 Kamikaze实现快速配置接口 LuCI是OpenWrt上的Web管理界面 LuCI采用了MVC三层架构 使用lua脚本开发 所
  • mysql不能使用别名做判断条件的解决方案

    错误例子 select name as n from user where n 张三 报错 n 字段在表user中不存在 解决办法 select name as n from user where name 张三 具体原因 请自行百度
  • SpringMVC框架从入门到精通

    文章目录 SpringMVC 框架介绍 概述 MVC模型 性能超群 工作原理 案例 展示汽车数据 需求 创建Maven module 创建RunApp java Car java CarController java 测试 处理请求参数 概
  • element-ui表格组件el-table实现行编辑与新增功能

    element前端ui组件挺美观的 我们也使用了他们的table组件 但是默认没有提供行编辑功能 我们可以通过将table的每个单元格换成input框来巧妙实现 默认每个单元格就是一个template数据填充 不可编辑 我们可以在templ
  • Qt-Web混合开发-QtWebChannel实现Qt与Web通信交互(4)

    Qt Web混合开发 QtWebChannel实现Qt与Web通信交互 文章目录 Qt Web混合开发 QtWebChannel实现Qt与Web通信交互 1 概述 2 实现效果 3 实现功能 4 关键代码 5 源代码 更多精彩内容 个人内容
  • 不仅仅好看!30个优秀logo的设计思想分析

    拥有一个抢眼的Logo对企业来乃一大幸事 毕竟Logo千千万 但真正让人过目不忘的作品可是屈指可数 好的Logo必须量体裁衣 迅速传递出企业的价值和理念 本文里精选了30个经典的标志设计 并附上设计思想分析 相信会对你受益匪浅 Castle
  • 从零开始的iOS开发: 20

    目录 一 开发环境 二 基础知识 1 往期知识点 2 简易自动布局 Stack View 三 实验步骤 1 先在Xcode建立一个APP项目 2 界面搭建 3 连接控件与代码 4 补充代码 完善功能 一 开发环境 开发工具 Xcode 12
  • 【Vue】Element-Plus 源码学习笔记——实现一个基本的 ElMessage 组件

    先贴下 Element Plus ElMessage 源码的网址 我们需要实现的效果类似 ElMessage 即能够显示多个消息 上一个消息消失下面的消息会自动往上移动 进入移出动画 自定义消息和持续时间 其他选项这里不考虑 大体思路 我们
  • C++ 风格指南

    0 扉页 0 1 译者前言 Google 经常会发布一些开源项目 意味着会接受来自其他代码贡献者的代码 但是如果代码贡献者的编程风格与 Google 的不一致 会给代码阅读者和其他代码提交者造成不小的困扰 Google 因此发布了这份自己的
  • Windows+Git+TortoiseGit+COPSSH安装图文教程

    跟师弟一起搭了个git本地服务器 他整理了一下相关内容 我转过来 准备工作 1 Git 1 8 1 2 preview20130201 exe 下载地址 https code google com p msysgit downloads l
  • 【RocksDB】Ubuntu20.04下编译rocksdb

    前言 我在刚学rocksdb的时候是在2022年 但是网上的资源很少 查了好久才把rocksdb安装成功 在这里向大家分享一下我的经历 安装过程中也报了很多错误 希望大家不要迷路 首先 在虚拟机里面安装依赖的包以及组件 总共七个依赖包和组件
  • Java 抽象类和普通类、接口的区别——看完你就顿悟了

    Java 抽象类和普通类 接口的区别 看完你就顿悟了 标签 java抽象类概念理解抽象类与接口区别抽象类与普通类区别 2017 05 04 16 26 1029人阅读 评论 0 收藏 举报 分类 Java 17 版权声明 本文为博主csdn
  • 3D语音天气球(源代码分享)——通过天气服务动态创建3D球

    转载请注明本文出自大苞米的博客 http blog csdn net a396901990 谢谢支持 开篇废话 这个项目准备分四部分介绍 一 创建可旋转的 3D球 3D语音天气球 源代码分享 创建可旋转的3D球 二 通过天气服务 从网络获取