获取天气信息以及地方位置(Unity3D)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 前段时间有小伙伴问到如何用Unity制作天气预报,博主也是在网上找了很多资料,发现天气API接口稳定的确实没有,除非是天气官方提供的, 但是我观察了下,要是合作伙伴才有开放的可能。其他的,例如:百度 APIStore、一些同学在其他网站上抓包下来的接口,以及什么各种收费的 API,都没有稳定的。 找了很多接口API,发现了一个比较好用的免费天气API,就分享一下

一、前言

前段时间有小伙伴问到如何用Unity制作天气预报,博主也是在网上找了很多资料,发现天气API接口稳定的确实没有,除非是天气官方提供的, 但是我观察了下,要是合作伙伴才有开放的可能。

其他的,例如:百度 APIStore、一些同学在其他网站上抓包下来的接口,以及什么各种收费的 API,都没有稳定的。 找了很多接口API,发现了一个比较好用的免费天气API,就分享一下

首先看一下效果图:

网络异常,图片无法展示
|

项目源码链接:

github.com/764424567/U…


二、参考资料

1、unity 获取地方位置和天气(简单版本)

2、免费、稳定的天气预报API

3、免费天气API,天气JSON API,不限次数获取十五天的天气预报

4、国内天气API Java版本请求Demo


三、正文


3.1 获取地方位置

百度地图API:

api.map.baidu.com/location/ip…

返回的Json字符串:

{"address":"CN|\u6cb3\u5357|\u90d1\u5dde|None|UNICOM|0|0","content":{"address":"\u6cb3\u5357\u7701\u90d1\u5dde\u5e02","address_detail":{"city":"\u90d1\u5dde\u5e02","city_code":268,"district":"","province":"\u6cb3\u5357\u7701","street":"","street_number":""},"point":{"x":"185.64964385","y":"134.75661006"}},"status":0}

看不懂没关系,我们去Json解析网站解析一下:

tool.oschina.net/codeformat/…

网络异常,图片无法展示
|

数据说明: address:数据头 content:数据内容

  • address:省份城市
  • address_detail:城市名字,编号代码,省份
  • point:位置坐标等数据

status:数据状态

我们就根据这些数据写一个数据类来接收这些数据:

#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
复制代码

这些命名不能改,不然Json解析不了

网络异常,图片无法展示
|

下面解析Json文件

需要导入这些脚本:

网络异常,图片无法展示
|

下载链接:

download.csdn.net/download/q7…

代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
#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
public class WeatherTools : MonoBehaviour
{
    /// <summary>
    /// 获取位置信息
    /// </summary>
    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 城市名字转化为城市代码编号

因为接口:

t.weather.sojson.com/api/weather…

需要用到city_code的值,我们需要将获取到城市名字转为city_code,也就是城市代码编号,这个编号对应的Json文件是这样的:

网络异常,图片无法展示
|

城市对应的city_code的Json文件:

download.csdn.net/download/q7…

城市名字转为city_code

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
#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
#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 WeatherTools : MonoBehaviour
{
    public static Dictionary<string, string> PosToId = new Dictionary<string, string>();
    public static bool initDic = false;
    /// <summary>
    /// 获取位置信息
    /// </summary>
    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);
            //获取city_code
            Debug.Log(GetWeatherId(cityData.content.address_detail.city));
        }
    }
    public static string GetWeatherId(string name)
    {
        string city_code = "";
        if (!initDic)
        {
            initDic = true;
            TextAsset city = Resources.Load<TextAsset>("city");
            List<CityCode> cityCode = LitJson.JsonMapper.ToObject<List<CityCode>>(city.text);
            foreach (CityCode t in cityCode)
            {
                PosToId[t.city_name] = t.city_code;
            }
        }
        for (int i = 1; i < name.Length; i++)
        {
            string tn = name.Substring(0, i);
            if (PosToId.ContainsKey(tn))
            {
                city_code = PosToId[tn];
            }
        }
        return city_code;
    }
}
复制代码

效果:

网络异常,图片无法展示
|


3.3 获取天气信息

万事俱备,只欠东风,接下来就看一下如何获取天气信息吧:

网络异常,图片无法展示
|

先分析一下获取到Json字符串: 获取天气的API:

t.weather.sojson.com/api/weather…

网络异常,图片无法展示
|

网络异常,图片无法展示
|

密密麻麻的啥玩意呀,没关系,我们还可以用Json解析工具解析一下:

tool.oschina.net/codeformat/…

网络异常,图片无法展示
|

没错啦,就是我们需要的所有数据,我们根据这些再次制作数据类:

#region 天气数据类
public class WeatherData
{
    public string message;
    public int status;
    public string date;
    public string time;
    public CityInfo cityInfo;
    public WeathData data;
}
public class CityInfo
{
    public string city;
    public string cityId;
    public string parent;
    public string updateTime;
}
public class WeathData
{
    public string shidu;
    public double pm25;
    public double pm10;
    public string quality;
    public string wendu;
    public string ganmao;
    public WeathDetailData[] forecast;
    public WeathDetailData yesterday;
}
public class WeathDetailData
{
    public string date;
    public string sunrise;
    public string high;
    public string low;
    public string sunset;
    public double aqi;
    public string ymd;
    public string week;
    public string fx;
    public string fl;
    public string type;
    public string notice;
}
#endregion
复制代码

看不懂建议再看一下Json解析出来的数据格式。。。

》不想看上面过程的,直接复制下面的代码就行《

代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
#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
#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 message;
    public int status;
    public string date;
    public string time;
    public CityInfo cityInfo;
    public WeathData data;
}
public class CityInfo
{
    public string city;
    public string cityId;
    public string parent;
    public string updateTime;
}
public class WeathData
{
    public string shidu;
    public double pm25;
    public double pm10;
    public string quality;
    public string wendu;
    public string ganmao;
    public WeathDetailData[] forecast;
    public WeathDetailData yesterday;
}
public class WeathDetailData
{
    public string date;
    public string sunrise;
    public string high;
    public string low;
    public string sunset;
    public double aqi;
    public string ymd;
    public string week;
    public string fx;
    public string fl;
    public string type;
    public string notice;
}
#endregion
public class WeatherTools : MonoBehaviour
{
    public static Dictionary<string, string> PosToId = new Dictionary<string, string>();
    public static bool initDic = false;
    /// <summary>
    /// 获取位置信息
    /// </summary>
    string Posurl = "http://api.map.baidu.com/location/ip?ak=bretF4dm6W5gqjQAXuvP0NXW6FeesRXb&coor=bd09ll";
    /// <summary>
    /// 获取天气信息
    /// </summary>
    string Weatherurl = "http://t.weather.sojson.com/api/weather/city/";
    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);
            //获取city_code
            Debug.Log(GetWeatherId(cityData.content.address_detail.city));
            //获取天气信息
            string city_code = GetWeatherId(cityData.content.address_detail.city);
            StartCoroutine(RequestWeatherData(city_code));
        }
    }
    public static string GetWeatherId(string name)
    {
        string city_code = "";
        if (!initDic)
        {
            initDic = true;
            TextAsset city = Resources.Load<TextAsset>("city");
            List<CityCode> cityCode = LitJson.JsonMapper.ToObject<List<CityCode>>(city.text);
            foreach (CityCode t in cityCode)
            {
                PosToId[t.city_name] = t.city_code;
            }
        }
        for (int i = 1; i < name.Length; i++)
        {
            string tn = name.Substring(0, i);
            if (PosToId.ContainsKey(tn))
            {
                city_code = PosToId[tn];
            }
        }
        return city_code;
    }
    IEnumerator RequestWeatherData(string cicy_code)
    {
        WWW www = new WWW(Weatherurl + cicy_code);
        Debug.Log(Weatherurl + cicy_code);
        yield return www;
        if (string.IsNullOrEmpty(www.error))
        {
            Debug.Log(www.text);
            WeatherData t = LitJson.JsonMapper.ToObject<WeatherData>(www.text);
            //天气信息
            Debug.Log(t.data.forecast[0].date);
            Debug.Log(t.data.forecast[0].high);
            Debug.Log(t.data.forecast[0].low);
            Debug.Log(t.data.forecast[0].ymd);
            Debug.Log(t.data.forecast[0].week);
            Debug.Log(t.data.forecast[0].sunrise);
            Debug.Log(t.data.forecast[0].sunset);
            Debug.Log(t.data.forecast[0].aqi);
            Debug.Log(t.data.forecast[0].fx);
            Debug.Log(t.data.forecast[0].fl);
            Debug.Log(t.data.forecast[0].type);
            Debug.Log(t.data.forecast[0].notice);
        }
    }
}
复制代码

效果:

网络异常,图片无法展示
|


3.4 数据显示

数据都有,下面就是显示了

网络异常,图片无法展示
|

UI:

//UI显示
    public Text m_TextCityName;
    public Text m_TextQuality;
    public Text m_TextNotice;
    public Image[] m_ImageType;
    //今天
    public Text m_TextTodayDate;
    public Text m_TextTodayType;
    public Text m_TextTodayTemperature;
    public Text m_TextTodayfx;
    //明天
    public Text m_TextTomorrowDate;
    public Text m_TextTomorrowType;
    public Text m_TextTomorrowTemperature;
    public Text m_TextTomorrowfx;
    //后天
    public Text m_TextAcquiredDate;
    public Text m_TextAcquiredType;
    public Text m_TextAcquiredTemperature;
    public Text m_TextAcquiredfx;
复制代码

网络异常,图片无法展示
|

天气UI图片资源:

download.csdn.net/download/q7…

代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
#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
#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 message;
    public int status;
    public string date;
    public string time;
    public CityInfo cityInfo;
    public WeathData data;
}
public class CityInfo
{
    public string city;
    public string cityId;
    public string parent;
    public string updateTime;
}
public class WeathData
{
    public string shidu;
    public double pm25;
    public double pm10;
    public string quality;
    public string wendu;
    public string ganmao;
    public WeathDetailData[] forecast;
    public WeathDetailData yesterday;
}
public class WeathDetailData
{
    public string date;
    public string sunrise;
    public string high;
    public string low;
    public string sunset;
    public double aqi;
    public string ymd;
    public string week;
    public string fx;
    public string fl;
    public string type;
    public string notice;
}
#endregion
public class WeatherTools : MonoBehaviour
{
    public static Dictionary<string, string> PosToId = new Dictionary<string, string>();
    public static bool initDic = false;
    //UI显示
    public Text m_TextCityName;
    public Text m_TextQuality;
    public Text m_TextNotice;
    public Image[] m_ImageType;
    //今天
    public Text m_TextTodayDate;
    public Text m_TextTodayType;
    public Text m_TextTodayTemperature;
    public Text m_TextTodayfx;
    //明天
    public Text m_TextTomorrowDate;
    public Text m_TextTomorrowType;
    public Text m_TextTomorrowTemperature;
    public Text m_TextTomorrowfx;
    //后天
    public Text m_TextAcquiredDate;
    public Text m_TextAcquiredType;
    public Text m_TextAcquiredTemperature;
    public Text m_TextAcquiredfx;
    /// <summary>
    /// 获取位置信息
    /// </summary>
    string Posurl = "http://api.map.baidu.com/location/ip?ak=bretF4dm6W5gqjQAXuvP0NXW6FeesRXb&coor=bd09ll";
    /// <summary>
    /// 获取天气信息
    /// </summary>
    string Weatherurl = "http://t.weather.sojson.com/api/weather/city/";
    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);
            //获取city_code
            Debug.Log(GetWeatherId(cityData.content.address_detail.city));
            //获取天气信息
            string city_code = GetWeatherId(cityData.content.address_detail.city);
            StartCoroutine(RequestWeatherData(city_code));
        }
    }
    public static string GetWeatherId(string name)
    {
        string city_code = "";
        if (!initDic)
        {
            initDic = true;
            TextAsset city = Resources.Load<TextAsset>("city");
            List<CityCode> cityCode = LitJson.JsonMapper.ToObject<List<CityCode>>(city.text);
            foreach (CityCode t in cityCode)
            {
                PosToId[t.city_name] = t.city_code;
            }
        }
        for (int i = 1; i < name.Length; i++)
        {
            string tn = name.Substring(0, i);
            if (PosToId.ContainsKey(tn))
            {
                city_code = PosToId[tn];
            }
        }
        return city_code;
    }
    IEnumerator RequestWeatherData(string cicy_code)
    {
        WWW www = new WWW(Weatherurl + cicy_code);
        Debug.Log(Weatherurl + cicy_code);
        yield return www;
        if (string.IsNullOrEmpty(www.error))
        {
            Debug.Log(www.text);
            WeatherData t = LitJson.JsonMapper.ToObject<WeatherData>(www.text);
            //UI显示数据
            WeatherData_UIShow(t);
        }
    }
    public void WeatherData_UIShow(WeatherData _weatherData)
    {
        m_TextCityName.text = _weatherData.cityInfo.city;
        m_TextQuality.text = _weatherData.data.quality;
        m_TextNotice.text = _weatherData.data.forecast[0].notice;
        string[] data = WeatherData_Parse(_weatherData);
        //今天
        m_TextTodayDate.text = data[0];
        m_TextTodayType.text = data[1];
        m_TextTodayTemperature.text = data[2];
        m_TextTodayfx.text = data[3];
        //明天
        m_TextTomorrowDate.text = data[4];
        m_TextTomorrowType.text = data[5];
        m_TextTomorrowTemperature.text = data[6];
        m_TextTomorrowfx.text = data[7];
        //后天
        m_TextAcquiredDate.text = data[8];
        m_TextAcquiredType.text = data[9];
        m_TextAcquiredTemperature.text = data[10];
        m_TextAcquiredfx.text = data[11];
    }
    public string[] WeatherData_Parse(WeatherData _weatherData)
    {
        string[] data = new string[12];
        for (int i = 0; i < 3; i++)
        {
            //图片显示
            string path = "weather/" + _weatherData.data.forecast[i].type;
            m_ImageType[i].sprite = Resources.Load(path, typeof(Sprite)) as Sprite;
            //数据计算
            string temperatureLow = _weatherData.data.forecast[i].low;
            string temperatureHigh = _weatherData.data.forecast[i].high;
            temperatureLow = temperatureLow.Substring(3, temperatureLow.Length - 3);
            temperatureHigh = temperatureHigh.Substring(3, temperatureHigh.Length- 3);
            //String数组存一下拼接好的字符串
            data[i * 4 + 0] = _weatherData.data.forecast[i].date + "日   " + _weatherData.data.forecast[i].week;
            data[i * 4 + 1] = _weatherData.data.forecast[i].type;
            data[i * 4 + 2] = temperatureLow + " ~ " + temperatureHigh;
            data[i * 4 + 3] = _weatherData.data.forecast[i].fx;
        }
        return data;
    }
}
复制代码

效果:

网络异常,图片无法展示
|



相关文章
|
7月前
|
C# 图形学
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
124 0
|
图形学
Unity【RaycastHit】- 关于射线投射碰撞信息中normal法线向量的运用
Unity【RaycastHit】- 关于射线投射碰撞信息中normal法线向量的运用
447 1
Unity【RaycastHit】- 关于射线投射碰撞信息中normal法线向量的运用
UGUI系列-鼠标移动到按钮上显示信息(Unity3D)
有时候图标不能很好的说明这个功能的解释,就需要一些说明性文字显示。就比如可以在鼠标移动到UI上面的时候显示文字。 那么如何在UGUI上,鼠标移动上去显示文字说明呢。 大家都知道,当鼠标移动到button按钮上面的时候会出现变化,主要是button这个组件在控制
|
API vr&ar 图形学
【100个 Unity小知识点】☀️ | Unity中使用代码查询Draw call、Tris和Verts等信息
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。 也可以简单把 Unity 理解为一个游戏引擎,可以用来专业制作游戏!
【100个 Unity小知识点】☀️ | Unity中使用代码查询Draw call、Tris和Verts等信息
|
vr&ar 图形学
【Unity3D 灵巧小知识点】☀️ | Unity通过 射线 获取 鼠标的世界坐标 和 鼠标点击的物体信息
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。
【Unity3D 灵巧小知识点】☀️ | Unity通过 射线 获取 鼠标的世界坐标 和 鼠标点击的物体信息
|
图形学
Unity 3D读取Excel表格、导入信息、导出Json
Unity 3D读取/导入Excel表格 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) Chin...
2008 0
|
4月前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
220 6
|
3月前
|
测试技术 C# 图形学
掌握Unity调试与测试的终极指南:从内置调试工具到自动化测试框架,全方位保障游戏品质不踩坑,打造流畅游戏体验的必备技能大揭秘!
【9月更文挑战第1天】在开发游戏时,Unity 引擎让创意变为现实。但软件开发中难免遇到 Bug,若不解决,将严重影响用户体验。调试与测试成为确保游戏质量的最后一道防线。本文介绍如何利用 Unity 的调试工具高效排查问题,并通过 Profiler 分析性能瓶颈。此外,Unity Test Framework 支持自动化测试,提高开发效率。结合单元测试与集成测试,确保游戏逻辑正确无误。对于在线游戏,还需进行压力测试以验证服务器稳定性。总之,调试与测试贯穿游戏开发全流程,确保最终作品既好玩又稳定。
152 4
|
4月前
|
图形学 缓存 算法
掌握这五大绝招,让您的Unity游戏瞬间加载完毕,从此告别漫长等待,大幅提升玩家首次体验的满意度与留存率!
【8月更文挑战第31天】游戏的加载时间是影响玩家初次体验的关键因素,特别是在移动设备上。本文介绍了几种常见的Unity游戏加载优化方法,包括资源的预加载与异步加载、使用AssetBundles管理动态资源、纹理和模型优化、合理利用缓存系统以及脚本优化。通过具体示例代码展示了如何实现异步加载场景,并提出了针对不同资源的优化策略。综合运用这些技术可以显著缩短加载时间,提升玩家满意度。
279 5
|
3月前
|
前端开发 图形学 开发者
【独家揭秘】那些让你的游戏瞬间鲜活起来的Unity UI动画技巧:从零开始打造动态按钮,提升玩家交互体验的绝招大公开!
【9月更文挑战第1天】在游戏开发领域,Unity 是最受欢迎的游戏引擎之一,其强大的跨平台发布能力和丰富的功能集让开发者能够迅速打造出高质量的游戏。优秀的 UI 设计对于游戏至关重要,尤其是在手游市场,出色的 UI 能给玩家留下深刻的第一印象。Unity 的 UGUI 系统提供了一整套解决方案,包括 Canvas、Image 和 Button 等组件,支持添加各种动画效果。
159 3