Unity接入心知天气,获取当前城市天气状况

本文档介绍了如何在Unity中利用心知天气API动态获取并显示当前城市的天气信息,包括天气图片、温度和城市名。通过获取公网IP、查询城市ID和天气信息,实现了天气显示功能。遇到的问题是当公网IP为IPv6时,可能出现错误,解决方案是更换获取公网IP的URL。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、效果图 

二、注册心知天气

心知天气 - 登录

注册完成申请免费版API

 获取APIKey

文档地址:查看你的 API密钥 · 语雀 (yuque.com) 

图片下载地址:天气现象代码说明 | 心知天气文档 (seniverse.com) 

在unity新建Resources文件夹,将图片导入(因为代码会根据返回的图片名称在这个文件夹下查找图片,注意要把图片处理成精灵格式Sprite)

二、 代码实现

思路:

1.获取本地公网IP   http://icanhazip.com/

2.根据IP查询城市(心知天气提供接口,需要申请key)

https://api.seniverse.com/v3/location/search.json?key=私钥&q=城市

3.根据城市查询天气(心知天气提供接口,需要申请key)

https://api.seniverse.com/v3/weather/now.json?key=私钥&location={0}&language=zh-Hans&unit=c城市id

 json插件可以使用LitJson.dll或者Newtonsoft.Json,这里我用的是Newtonsoft.Json

下载地址: 提取码 syq1

LitJson.dll https://pan.baidu.com/share/init?surl=evpFU9FnL3KeP29_nVQlTQ

Newtonsoft.Json  https://pan.baidu.com/s/1fiRwL2qcepzgxOUwcTs1fQ

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
//using LitJson;

/// <summary>
/// 城市天气
/// </summary>
public class CityWeather : MonoBehaviour
{
    public Image imgWeather;    //天气图片
    public Text textWeather;    //天气
    public Text textTemperature;//温度
    public Text textCity;       //城市

    void Start()
    {
        StartCoroutine(GetRuntimeWeather());
    }

    IEnumerator GetRuntimeWeather()
    {
        //1.获取本地公网IP
        UnityWebRequest wwwWebIp = UnityWebRequest.Get(@"http://icanhazip.com/");
        yield return wwwWebIp.SendWebRequest();
        if (wwwWebIp.isNetworkError || wwwWebIp.isHttpError)
        {
            yield break;
        }

        //2.根据IP查询城市(心知天气提供接口,需要申请key)***这里别忘记修改
        string urlQueryCity = "https://api.seniverse.com/v3/location/search.json?key=私钥&q=" + wwwWebIp.downloadHandler.text;
        UnityWebRequest wwwQueryCity = UnityWebRequest.Get(urlQueryCity);
        yield return wwwQueryCity.SendWebRequest();
        if (wwwQueryCity.isNetworkError || wwwQueryCity.isHttpError)
        {
            yield break;
        }

        JObject cityData = JsonConvert.DeserializeObject<JObject>(wwwQueryCity.downloadHandler.text);
        string cityId = cityData["results"][0]["id"].ToString();
        textCity.text = cityData["results"][0]["name"].ToString(); //城市

        //3.根据城市查询天气(心知天气提供接口,需要申请key)***这里别忘记修改
        string urlWeather = string.Format("https://api.seniverse.com/v3/weather/now.json?key=私钥&location={0}&language=zh-Hans&unit=c", cityId);
        UnityWebRequest wwwWeather = UnityWebRequest.Get(urlWeather);
        yield return wwwWeather.SendWebRequest();

        if (wwwWeather.isNetworkError || wwwWeather.isHttpError)
        {
            Debug.Log(wwwWeather.error);
        }

        //4.解析天气
        try
        {
            JObject weatherData = JsonConvert.DeserializeObject<JObject>(wwwWeather.downloadHandler.text);
            string spriteName = string.Format("Weather/{0}@2x", weatherData["results"][0]["now"]["code"].ToString());

            //天气文字
            textWeather.text = weatherData["results"][0]["now"]["text"].ToString();


            //图片,可以在心知天气上下载
            imgWeather.sprite = Resources.Load<Sprite>(spriteName);
            //Debug.Log(spriteName);

            //温度
            textTemperature.text = string.Format("{0} °C", weatherData["results"][0]["now"]["temperature"].ToString());
        }
        catch (System.Exception ex)
        {
            Debug.Log(ex.Message);
        }
    }
}


/*
 * 返回的Json天气格式
 * {
	"results": [{
		"location": {
			"id": "WX4FBXXFKE4F",
			"name": "北京",
			"country": "CN",
			"path": "北京,北京,中国",
			"timezone": "Asia/Shanghai",
			"timezone_offset": "+08:00"
		},
		"now": {
			"text": "晴",
			"code": "0",
			"temperature": "-10"
		},
		"last_update": "2021-01-08T09:20:00+08:00"
	}]
}
 */

三、问题解决 

经过几个朋友的测试,如果在运行中 textWeather.text = weatherData["results"][0]["now"]["text"].ToString();这句话出现超出数组索引问题,大概率是第一步获取公网ip的原因,在网页中访问 http://icanhazip.com/这个地址,返回的是

(IPV6地址),而不是(IPV4地址)这种格式的地址的话,就会出错。
 

原因: 可能是你的路由器支持IPV6导致。

win+R 输入cmd 打开控制台应用窗口,输入ipconfig 查看,看看是否ipV6不存在(注意不是本地IPV6)

 不支持ipV6使用 http://icanhazip.com/这个地址是没问题的

解决办法:

更换获取公网ip

分享一些获取公网ip的url地址_IP大侠的博客-CSDN博客_外网url

 

### 集成高德天气 API 到 Unity 项目 为了在 Unity 中集成高德地图的天气 API 并获取当前位置的天气信息,需要完成几个主要部分的工作: #### 准备工作 确保已注册成为高德开放平台开发者并创建应用以获得 API Key。 #### 发送 HTTP 请求至高德天气 API 利用 `UnityWebRequest` 类发送网络请求来调用高德天气服务接口。下面是一个简单的 C# 脚本片段用于发起 GET 请求: ```csharp using System.Collections; using UnityEngine; using UnityEngine.Networking; public class WeatherFetcher : MonoBehaviour { private string apiKey = "your_api_key_here"; // 替换成自己的API key private const string weatherUrlTemplate = "https://restapi.amap.com/v3/weather/weatherInfo?key={0}&city=auto"; void Start () { StartCoroutine(FetchWeather()); } IEnumerator FetchWeather(){ using(var www = UnityWebRequest.Get(string.Format(weatherUrlTemplate,apiKey))){ yield return www.SendWebRequest(); if(www.result != UnityWebRequest.Result.Success){ Debug.LogError("Failed to fetch weather data: "+www.error); } else{ var jsonData = www.downloadHandler.text; ParseAndDisplay(jsonData); // 解析JSON字符串并将结果显示出来 } } } void ParseAndDisplay(string jsonText){ // 这里应该加入具体的 JSON 数据处理逻辑以及 UI 显示更新操作 Debug.Log("Raw Data Received:\n"+jsonText); } } ``` 上述脚本定义了一个名为 `FetchWeather()` 的协程方法用来异步加载来自服务器的数据[^1]。当成功接收到响应后会打印原始返回的内容以便进一步分析或者展示给玩家查看。 请注意,在实际部署前还需要考虑错误处理机制、缓存策略等因素,并且要按照官方文档的要求正确设置 URL 参数(比如城市名称参数应根据实际情况调整),从而保证程序稳定性和用户体验质量。 #### 处理 JSON 响应数据 对于从高德 API 返回的结果通常是以 JSON 形式给出的,因此建议采用第三方库如 Newtonsoft.Json 来简化对象映射过程。安装方式可以通过 NuGet 或者直接下载 DLL 文件导入工程中使用。 一旦完成了这些准备工作之后就可以轻松地把实时气象资讯呈现在游戏界面上啦!
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值