Unity制作天气预报

一、前言

使用Unity制作天气预报最难的一点就是没有合适的天气接口,在网上找了好多才找到一个合适的接口。
http://www.tianqiapi.com/index/doc
这个网站注册成功后可以免费查找2000次很适合小伙伴练习使用。
效果图:
《Unity制作天气预报》

二、思路

制作天气预报思路我将其分为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

解析后信息
《Unity制作天气预报》
然后写一个类接收解析后的信息

#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所需文件
《Unity制作天气预报》
下载地址:

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

进入这个网站注册登录
《Unity制作天气预报》
《Unity制作天气预报》

    //获取天气信息格式
    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
《Unity制作天气预报》
这里和上面一样,书写一个类接收解析后的信息

#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;
    }
}

界面:
《Unity制作天气预报》

参考文案:获取天气信息以及地方位置

    原文作者:被代码折磨的狗子
    原文地址: https://blog.csdn.net/qq_42345116/article/details/114027301
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞