本文共 4964 字,大约阅读时间需要 16 分钟。
【效果预览】
工程的结构:注意LitJson和System.Json文件必须要放到Plugins文件夹下面,这是Unity内置的一个文件夹,打包后会优先加载该文件夹内的dll文件
以保证代码的正确运行
脚本的分布情况:下面会一一展开各个脚本文件
Json文件的数据结构如下:这里面我没有选择全部的信息,只选了部分作为测试
【接收数据】首先定义了三个数据模型,用来保存数据:
【注意】类中的属性名字,必须和Json数据中你想要接收的字段名字相同才行,否则无法接收到数据
using UnityEngine;using System.Collections;public class Star_Result { // 某个星座的今日运势 public string astroid{set;get;} public string astroname{set;get;} public Today today{set;get;} // 【保存的是另外一个url的星座信息】 public AllStar allStar{set;get;}}
using UnityEngine;using System.Collections;public class Today { public string date{ set; get;} public string presummary{set;get;}}
using UnityEngine;using System.Collections;public class AllStar { public string astroid{set;get;} public string astroname{set;get;} public string date{ set; get;} public string pic{ set; get;}}
【下载数据】
using UnityEngine;using System.Collections;using LitJson;using System.Collections.Generic;using UnityEngine.UI;public class Star:MonoBehaviour { // 定义一个继承Mono的伪单例,为了方便View层数据的访问 public static Star InstanceStar; private Liststar_list; // 只读属性,里面保存了12星座的所有信息 public List Star_list { get { return star_list; } } private string currentTime; void Awake() { star_list = new List (); StartCoroutine ("DownLoadStarToday"); // 给伪单例赋值,this表示当前脚本所在的游戏对象 InstanceStar = this; currentTime = System.DateTime.Now.ToString ("yyyy-MM-dd"); } void Start() { } IEnumerator DownLoadStarToday() { Debug.Log ("loadData"); // 【数据的加载】 Star_Result star_result; AllStar allStar; // 下载12次,每次下载一个星座的所有信息,保存到list里面 // 但是这个url中,不包含allStar属性同名的key,所以赋值之后,所有的allStar属性,都是空的 for (int id = 1; id <= 12; id++) { string url = "http://api.jisuapi.com/astro/fortune?astroid="+id+"&date=" + currentTime + "&appkey=d30bee9929c039fc"; WWW www = new WWW (url); yield return www; // 把字符串转换成JsonData对象 JsonData data = JsonMapper.ToObject (www.text); string str = JsonMapper.ToJson (data ["result"]); // 把字符串转换成类对象:过程是将Json字符串中的key与对象中的属性名一一匹配 // 如果对象中的属性名=Json字符串中的key,就将key所对应的值保存到类对象的属性中 star_result = JsonMapper.ToObject (str); star_list.Add (star_result); } Debug.Log("star->OK"); //-------------------------------------------------------------------------- // 下载12星座的【星座生日】【星座图标】 string url3 = "http://api.jisuapi.com/astro/all?appkey=d30bee9929c039fc"; WWW www2 = new WWW (url3); yield return www2; JsonData data2 = JsonMapper.ToObject (www2.text); //-------------------------------------------------------------------------- for (int id = 0; id < 12 ; id++) { // 将JsonData对象转换成字符串 string str2 = JsonMapper.ToJson (data2 ["result"][id]); // 将字符串转换成AllStar的类对象(把Json数据中值存储到类对象的属性中去) allStar = JsonMapper.ToObject (str2); // 分别给每一个star_list内的元素的allStart属性赋值 star_list [id].allStar = allStar; } Debug.Log ("AllStar"); //-------------------------------------------------------------------------- // 【数据的显示】 GetComponent ().StarEnumerator(); }}
【将数据显示到UI上】
using UnityEngine;using System.Collections;using UnityEngine.UI;using UnityEngine.EventSystems;public class ShowUI : MonoBehaviour { // 所有按钮的父物体 private Transform StarGroup; // 按钮图片的数组 private RawImage[] button_images; // 星座运势信息的父物体 private Transform StarInfo; private Text DateAndStar; private Text Presummary; void Start() { StarGroup = GameObject.Find ("StarGroup").transform; button_images = new RawImage[StarGroup.childCount]; for (int i = 0; i < StarGroup.childCount; i++) { button_images [i] = StarGroup.GetChild (i).GetComponent(); } //-------------------------------------------------------------------------- StarInfo = GameObject.Find ("StarInfo").transform; DateAndStar = StarInfo.GetChild (0).GetComponent (); Presummary = StarInfo.GetChild (1).GetComponent (); } public void StarEnumerator() { StartCoroutine ("SetButtonData"); } IEnumerator SetButtonData() { // 根据按钮的数量,下载图片 for (int i = 0; i < button_images.Length; i++) { // 根据按钮的索引去获取图片的地址 WWW www3 = new WWW (Star.InstanceStar.Star_list [i].allStar.pic); // 等待:等待图片的下载完成,再继续执行后面的代码 yield return www3; // 下载完之后,将得到的图片赋值给按钮上的图片 button_images [i].texture = www3.texture; // transform.Find这个方法,是获取当前对象的子物体 button_images [i].transform.Find ("XingZuo").GetComponent ().text = Star.InstanceStar.Star_list [i].allStar.astroname; button_images [i].transform.Find ("Date").GetComponent ().text = Star.InstanceStar.Star_list [i].allStar.date; } // 按钮的监听事件 for (int i = 0; i < button_images.Length; i++) { button_images [i].GetComponent