一、前言
使用Unity制作天气预报最难的一点就是没有合适的天气接口,在网上找了好多才找到一个合适的接口。
http://www.tianqiapi.com/index/doc
这个网站注册成功后可以免费查找2000次很适合小伙伴练习使用。
效果图:
二、思路
制作天气预报思路我将其分为3步:
①获取当前位置地区信息
②通过地区id获取天气信息
③UI布局显示
三、正文
3.1获取当前位置信息
百度地图API
http://api.map.baidu.com/location/ip?ak=bretF4dm6W5gqjQAXuvP0NXW6FeesRXb&coor=bd09ll
Json信息
{“address”:“CN|\u6d59\u6c5f|\u676d\u5dde|None|CHINANET|0|0”,“content”:{“address”:”\u6d59\u6c5f\u7701\u676d\u5dde\u5e02″,“address_detail”:{“city”:”\u676d\u5dde\u5e02″,“city_code”:179,“district”:””,“province”:”\u6d59\u6c5f\u7701″,“street”:””,“street_number”:””},“point”:{“x”:“120.21937542”,“y”:“30.25924446”}},“status”:0}
Json在线解析工具
http://c.runoob.com/front-end/53
解析后信息
然后写一个类接收解析后的信息
#region 返回的城市名字等数据类
public class CityData
{
public string address;
public Content content;
public int status;
}
public class Content
{
public string address;
public Address_Detail address_detail;
public Point point;
}
public class Address_Detail
{
public string city;
public int city_code;
public string district;
public string province;
public string street;
public string street_number;
}
public class Point
{
public string x;
public string y;
}
#endregion
ps:这里要注意字段命名要相同,否则会接收不到数据
通过百度地图API获取的信息位置不是标准Json,所以我们要对这些数据进行解析一下
解析Json所需文件
下载地址:
https://download.csdn.net/download/q764424567/12403068
代码:
using System.Collections;
using UnityEngine.UI;
using UnityEngine;
using System.IO;
#region 返回的城市名字等数据类
public class CityData
{
public string address;
public Content content;
public int status;
}
public class Content
{
public string address;
public Address_Detail address_detail;
}
public class Address_Detail
{
public string city;
public int city_code;
public string district;
public string province;
public string street;
public string street_number;
}
public class Point
{
public string x;
public string y;
}
#endregion
#region 城市的city_code编号代码
public class CityCode
{
public int id;
public int pid;
public string city_code;
public string city_name;
public string post_code;
public string area_code;
public string ctime;
}
#endregion
public class Test : MonoBehaviour {
//获取位置信息
string Posurl = "http://api.map.baidu.com/location/ip?ak=bretF4dm6W5gqjQAXuvP0NXW6FeesRXb&coor=bd09ll";
void Start () {
StartCoroutine(RequestCityName());
}
IEnumerator RequestCityName()
{
WWW www = new WWW(Posurl);
yield return www;
if (string.IsNullOrEmpty(www.error))
{
CityData cityData = LitJson.JsonMapper.ToObject<CityData>(www.text);
Debug.Log(cityData.content.address_detail.city);
}
}
}
3.2获取天气信息
天气接口
http://www.tianqiapi.com/index/doc
进入这个网站注册登录
//获取天气信息格式
string Weatherurl = "https://v0.yiketianqi.com/api?version=v61&appid=注册后的id号&appsecret=密钥&cityid=";
用户id和密钥设置完成后 通过地区id访问获取本地天气信息
{“cityid”:“101210101”,“date”:“2021-02-23”,“week”:”\u661f\u671f\u4e8c”,“update_time”:“10:30”,“city”:”\u676d\u5dde”,“cityEn”:“hangzhou”,“country”:”\u4e2d\u56fd”,“countryEn”:“China”,“wea”:”\u6674″,“wea_img”:“qing”,“tem”:“10”,“tem1”:“14”,“tem2”:“7”,“win”:”\u4e1c\u98ce”,“win_speed”:“3\u7ea7”,“win_meter”:”\u5c0f\u4e8e12km/h”,“humidity”:“64%”,“visibility”:“13.6km”,“pressure”:“1021”,“air”:“48”,“air_pm25”:“48”,“air_level”:”\u4f18″,“air_tips”:”\u7a7a\u6c14\u5f88\u597d\uff0c\u53ef\u4ee5\u5916\u51fa\u6d3b\u52a8\uff0c\u547c\u5438\u65b0\u9c9c\u7a7a\u6c14\uff0c\u62e5\u62b1\u5927\u81ea\u7136\uff01″,“alarm”:{“alarm_type”:”\u5927\u98ce”,“alarm_level”:”\u9ec4\u8272″,“alarm_content”:”\u676d\u5dde\u5e02\u6c14\u8c61\u53f02021\u5e7402\u670822\u65e517\u65f635\u5206\u53d1\u5e03\u5927\u98ce\u9ec4\u8272\u9884\u8b66\u4fe1\u53f7\uff1a\u53d7\u51b7\u7a7a\u6c14\u5f71\u54cd\uff0c\u4eca\u5929\uff0822\u65e5\uff09\u508d\u665a\u5230\u660e\u5929\uff0823\u65e5\uff09\u4e0b\u5348\u4e3b\u57ce\u533a\u548c\u94b1\u5858\u65b0\u533a\u6700\u5927\u504f\u5317\u98ce\u529b\u53ef\u8fbe57\u7ea7\uff0c\u5c71\u533a\u548c\u90e8\u5206\u6c5f\u6e56\u6c34\u976268\u7ea7\uff0c\u8bf7\u6709\u5173\u65b9\u9762\u6ce8\u610f\u3002\uff08\u9884\u8b66\u4fe1\u606f\u6765\u6e90\uff1a\u56fd\u5bb6\u9884\u8b66\u4fe1\u606f\u53d1\u5e03\u4e2d\u5fc3\uff09″},“aqi”:{“update_time”:“09:23”,“cityid”:“101210101”,“city”:”\u676d\u5dde”,“cityEn”:“hangzhou”,“country”:”\u4e2d\u56fd”,“countryEn”:“China”,“air”:“52”,“air_level”:”\u826f”,“air_tips”:”\u7a7a\u6c14\u597d\uff0c\u53ef\u4ee5\u5916\u51fa\u6d3b\u52a8\uff0c\u9664\u6781\u5c11\u6570\u5bf9\u6c61\u67d3\u7269\u7279\u522b\u654f\u611f\u7684\u4eba\u7fa4\u4ee5\u5916\uff0c\u5bf9\u516c\u4f17\u6ca1\u6709\u5371\u5bb3\uff01″,“pm25”:“20”,“pm25_desc”:”\u4f18″,“pm10”:“53”,“pm10_desc”:”\u826f”,“o3”:“42”,“o3_desc”:”\u4f18″,“no2”:“30”,“no2_desc”:”\u4f18″,“so2”:“5”,“so2_desc”:”\u4f18″,“co”:“1”,“co_desc”:”\u4f18″,“kouzhao”:”\u4e0d\u7528\u4f69\u6234\u53e3\u7f69″,“yundong”:”\u9002\u5b9c\u8fd0\u52a8″,“waichu”:”\u9002\u5b9c\u5916\u51fa”,“kaichuang”:”\u9002\u5b9c\u5f00\u7a97″,“jinghuaqi”:”\u5173\u95ed\u51c0\u5316\u5668″}}
解析Json
这里和上面一样,书写一个类接收解析后的信息
#region 天气数据类
public class WeatherData
{
public string cityid;
public string date;
public string week;
public string update_time;
public string city;
public string cityEn;
public string country;
public string countryEn;
public string wea;
public string wea_img;
public string tem;
public string tem1;
public string tem2;
public string win;
public string win_speed;
public string win_meter;
public string humidity;
public string visibility;
public string pressure;
public string air;
public string air_pm25;
public string air_level;
public string air_tips;
}
public class Alarm
{
public string alarm_type;
public string alarm_level;
public string alarm_content;
}
public class Aqi
{
public string update_time;
public string cityid;
public string city;
public string cityEn;
public string country;
public string countryEn;
public string air;
public string air_level;
public string air_tips;
public string pm25;
public string pm25_desc;
public string pm10;
public string pm10_desc;
public string o3;
public string o3_desc;
public string no2;
public string no2_desc;
public string so2;
public string so2_desc;
public string co;
public string co_desc;
public string kouzhao;
public string yundong;
public string waichu;
public string kaichuang;
public string jinghuaqi;
}
#endregion
ps:一定一定注意字段名不要写错
将我们的代码整合起来,是这样婶的:
using System.Collections;
using UnityEngine.UI;
using UnityEngine;
using System.IO;
#region 返回的城市名字等数据类
public class CityData
{
public string address;
public Content content;
public int status;
}
public class Content
{
public string address;
public Address_Detail address_detail;
}
public class Address_Detail
{
public string city;
public int city_code;
public string district;
public string province;
public string street;
public string street_number;
}
public class Point
{
public string x;
public string y;
}
#endregion
#region 城市的city_code编号代码
public class CityCode
{
public int id;
public int pid;
public string city_code;
public string city_name;
public string post_code;
public string area_code;
public string ctime;
}
#endregion
#region 天气数据类
public class WeatherData
{
public string cityid;
public string date;
public string week;
public string update_time;
public string city;
public string cityEn;
public string country;
public string countryEn;
public string wea;
public string wea_img;
public string tem;
public string tem1;
public string tem2;
public string win;
public string win_speed;
public string win_meter;
public string humidity;
public string visibility;
public string pressure;
public string air;
public string air_pm25;
public string air_level;
public string air_tips;
}
public class Alarm
{
public string alarm_type;
public string alarm_level;
public string alarm_content;
}
public class Aqi
{
public string update_time;
public string cityid;
public string city;
public string cityEn;
public string country;
public string countryEn;
public string air;
public string air_level;
public string air_tips;
public string pm25;
public string pm25_desc;
public string pm10;
public string pm10_desc;
public string o3;
public string o3_desc;
public string no2;
public string no2_desc;
public string so2;
public string so2_desc;
public string co;
public string co_desc;
public string kouzhao;
public string yundong;
public string waichu;
public string kaichuang;
public string jinghuaqi;
}
#endregion
public class Test : MonoBehaviour {
//获取位置信息
string Posurl = "http://api.map.baidu.com/location/ip?ak=bretF4dm6W5gqjQAXuvP0NXW6FeesRXb&coor=bd09ll";
//获取天气信息
string Weatherurl = "https://v0.yiketianqi.com/api?version=v61&appid=注册后的id号&appsecret=密钥&cityid=";
void Start () {
StartCoroutine(RequestCityName());
}
IEnumerator RequestCityName()
{
WWW www = new WWW(Posurl);
yield return www;
if (string.IsNullOrEmpty(www.error))
{
CityData cityData = LitJson.JsonMapper.ToObject<CityData>(www.text);
Debug.Log(cityData.content.address_detail.city);
StartCoroutine(RequestCityWeather(cityData.content.address_detail.city));
}
//这里我加的一条每隔30分钟更新一次数据
//yield return new WaitForSeconds(1800);
//StartCoroutine(RequestCityName());
}
IEnumerator RequestCityWeather(string city)
{
WWW www = new WWW(Weatherurl + city);
yield return null;
yield return new WaitForSeconds(0.1f);//等待www完成下载
if (string.IsNullOrEmpty(www.error))
{
WeatherData t = LitJson.JsonMapper.ToObject<WeatherData>(www.text);
Debug.Log(t.cityid);
Debug.Log("城市:" + t.city);
Debug.Log("空气质量:" + t.air_level);
Debug.Log("日期星期::" + t.week);
Debug.Log("天气:" + t.wea);
Debug.Log("温度:" + t.tem2 + "℃~" + t.tem1 + "℃");
Debug.Log("风向:" + t.win + " " + t.win_speed);
Debug.Log("天气寄语:" + t.air_tips);
}
}
}
3.3显示UI
public Image iconWeather;
public Text city;
public Text week;
public Text weather;
public Text temperature;
public Text wind;
public Text tips;
代码plus版:
using System.Collections;
using UnityEngine.UI;
using UnityEngine;
using System.IO;
#region 返回的城市名字等数据类
public class CityData
{
public string address;
public Content content;
public int status;
}
public class Content
{
public string address;
public Address_Detail address_detail;
}
public class Address_Detail
{
public string city;
public int city_code;
public string district;
public string province;
public string street;
public string street_number;
}
public class Point
{
public string x;
public string y;
}
#endregion
#region 城市的city_code编号代码
public class CityCode
{
public int id;
public int pid;
public string city_code;
public string city_name;
public string post_code;
public string area_code;
public string ctime;
}
#endregion
#region 天气数据类
public class WeatherData
{
public string cityid;
public string date;
public string week;
public string update_time;
public string city;
public string cityEn;
public string country;
public string countryEn;
public string wea;
public string wea_img;
public string tem;
public string tem1;
public string tem2;
public string win;
public string win_speed;
public string win_meter;
public string humidity;
public string visibility;
public string pressure;
public string air;
public string air_pm25;
public string air_level;
public string air_tips;
}
public class Alarm
{
public string alarm_type;
public string alarm_level;
public string alarm_content;
}
public class Aqi
{
public string update_time;
public string cityid;
public string city;
public string cityEn;
public string country;
public string countryEn;
public string air;
public string air_level;
public string air_tips;
public string pm25;
public string pm25_desc;
public string pm10;
public string pm10_desc;
public string o3;
public string o3_desc;
public string no2;
public string no2_desc;
public string so2;
public string so2_desc;
public string co;
public string co_desc;
public string kouzhao;
public string yundong;
public string waichu;
public string kaichuang;
public string jinghuaqi;
}
#endregion
public class Test : MonoBehaviour {
//获取位置信息
string Posurl = "http://api.map.baidu.com/location/ip?ak=bretF4dm6W5gqjQAXuvP0NXW6FeesRXb&coor=bd09ll";
//获取天气信息
string Weatherurl = "https://v0.yiketianqi.com/api?version=v61&appid=注册后的id号&appsecret=密钥&cityid=";
public Image iconWeather;
public Text city;
public Text week;
public Text weather;
public Text temperature;
public Text wind;
public Text tips;
void Start () {
testTxt = File.ReadAllText(Application.streamingAssetsPath + "/txt.txt");//获取静态天气信息
StartCoroutine(RequestCityName());
}
IEnumerator RequestCityName()
{
WWW www = new WWW(Posurl);
yield return www;
if (string.IsNullOrEmpty(www.error))
{
CityData cityData = LitJson.JsonMapper.ToObject<CityData>(www.text);
Debug.Log(cityData.content.address_detail.city);
StartCoroutine(RequestCityWeather(cityData.content.address_detail.city));
}
//30分钟更新数据
//yield return new WaitForSeconds(1800);
//StartCoroutine(RequestCityName());
}
IEnumerator RequestCityWeather(string city)
{
WWW www = new WWW(Weatherurl + city);
yield return null;
yield return new WaitForSeconds(0.1f);//等待www完成下载
if (string.IsNullOrEmpty(www.error))
{
WeatherData t = LitJson.JsonMapper.ToObject<WeatherData>(www.text);
Debug.Log(t.cityid);
WeatherData_UIShow(t);
Debug.Log("城市:" + t.city);
Debug.Log("空气质量:" + t.air_level);
Debug.Log("日期星期::" + t.week);
Debug.Log("天气:" + t.wea);
Debug.Log("温度:" + t.tem2 + "℃~" + t.tem1 + "℃");
Debug.Log("风向:" + t.win + " " + t.win_speed);
Debug.Log("天气寄语:" + t.air_tips);
}
}
//UI界面显示
private void WeatherData_UIShow(WeatherData t)
{
Sprite icon = Resources.Load("weather/" + t.wea, typeof(Sprite)) as Sprite;
Debug.Log(icon.name);
if (icon != null)
{
iconWeather.sprite = icon;
}
else
{
Debug.Log("图片不存在:" + t.wea);
}
city.text = t.city;
week.text = t.week;
weather.text = t.wea;
temperature.text = t.tem2 + "℃~" + t.tem1 + "℃";
wind.text = t.win + " " + t.win_speed;
tips.text = t.air_tips;
}
}
界面:
参考文案:获取天气信息以及地方位置