Skip to content

Instantly share code, notes, and snippets.

@elct9620
Last active January 2, 2017 16:48
Show Gist options
  • Save elct9620/5b186d2e693b5e7e5984b22ff9bd50bc to your computer and use it in GitHub Desktop.
Save elct9620/5b186d2e693b5e7e5984b22ff9bd50bc to your computer and use it in GitHub Desktop.
using UnityEngine;
using UnityEditor;
using System;
using System.Collections;
using System.Collections.Generic;
using UniRx;
public class DatabaseDownloader {
public static string DatabaseURL = "SERVER_URL";
private const string Token = "TOKEN";
public static void LoadDatabase(string Query, Action<Dictionary<string, string>> Parser) {
UriBuilder _Uri = new UriBuilder(DatabaseURL);
_Uri.Query = Query + string.Format("&token={0}", Token);
EditorUtility.DisplayDialog ("讀取資料庫", "開始下載資料", "確定");
Observable.FromCoroutine<int> ((observer, cancellationToken) => GetDatabase (_Uri.ToString (), Parser, observer, cancellationToken))
.Subscribe (count => {
if(count == -1) {
EditorUtility.DisplayDialog("下載失敗", "下載資料庫失敗", "確定");
} else {
EditorUtility.DisplayDialog("下載成功", string.Format("已下載 {0} 筆資料", count), "確定");
}
});
}
static int CreateDatabase(string Response, Action<Dictionary<string, string>> Parser) {
JSONObject RawData = new JSONObject (Response);
if (RawData.type == JSONObject.Type.ARRAY) {
Dictionary<string, string> _item;
foreach (JSONObject item in RawData.list) {
_item = item.ToDictionary ();
Parser (_item);
}
return RawData.list.Count;
}
return -1;
}
static IEnumerator GetDatabase(string url, Action<Dictionary<string, string>> Parser, IObserver<int> observer, CancellationToken cancellationToken) {
WWW www = new WWW (url);
while (!www.isDone && !cancellationToken.IsCancellationRequested) {
yield return null;
}
if(cancellationToken.IsCancellationRequested) {
yield break;
}
if (www.error != null) {
observer.OnError (new Exception (www.error));
} else {
observer.OnNext (CreateDatabase (www.text, Parser));
observer.OnCompleted ();
}
}
}
[
{
"編號": 1,
"名稱": "Example",
...
}
]
using UnityEngine;
using UnityEditor;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using UniRx;
public class TreatmentDataMenu {
public static string DatabasePath = @"Assets/Resources/TreatmentDB.asset";
[MenuItem("Database/讀取治療資料")]
public static void Generate() {
Treatment Database = Treatment.CreateInstance<Treatment> ();
DatabaseDownloader.LoadDatabase ("", (Item) => ReadItem (Database, Item));
AssetDatabase.CreateAsset (Database, DatabasePath);
EditorUtility.SetDirty (Database);
}
public static void ReadItem(Treatment Database, Dictionary<string, string> Item) {
TreatmentData Data = new TreatmentData ();
Data.ID = int.Parse(Item ["編號"]);
Data.Name = Item ["名稱"].Trim();
Data.Description = Item ["說明"];
Data.Icon = Item ["Icon"];
Data.Magic = int.Parse (Item ["魔法"]);
Data.Physical = int.Parse (Item ["物理"]);
Data.Biological = int.Parse (Item ["生物"]);
Data.Chemistry = int.Parse (Item ["化學"]);
Data.IsMaterial = bool.Parse (Item ["是否為素材"]);
Data.Level = int.Parse (Item ["等級"]);
Database.Treatments.Add (Data);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment