博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Unity】使用类对象存储Json数据——星座运势案例
阅读量:4086 次
发布时间:2019-05-25

本文共 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 List
star_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

你可能感兴趣的文章
PM2 入门
查看>>
掌握 TS 这些工具类型,让你开发事半功倍
查看>>
前端如何搭建一个成熟的脚手架
查看>>
Flutter ListView如何添加HeaderView和FooterView
查看>>
Flutter key
查看>>
Flutter 组件通信(父子、兄弟)
查看>>
Flutter Animation动画
查看>>
Flutter 全局监听路由堆栈变化
查看>>
Android 混合Flutter之产物集成方式
查看>>
Flutter混合开发二-FlutterBoost使用介绍
查看>>
Flutter 混合开发框架模式探索
查看>>
Flutter 核心原理与混合开发模式
查看>>
Flutter Boost的router管理
查看>>
Android Flutter混合编译
查看>>
微信小程序 Audio API
查看>>
[React Native]react-native-scrollable-tab-view(进阶篇)
查看>>
Vue全家桶+Mint-Ui打造高仿QQMusic,搭配详细说明
查看>>
React Native for Android 发布独立的安装包
查看>>
React Native应用部署/热更新-CodePush最新集成总结(新)
查看>>
react-native-wechat
查看>>