using UnityEngine; using UnityEditor; using System.Collections; using UnityEngine.SceneManagement; using JungleDB; using System.Text; using Default = System.Collections.Generic; using System.Linq; public class SaveData : MonoBehaviour { public static SaveData instance; public SceneNode root; public System.Collections.Generic.List objList; public StageManager stageManager; public static Jungle jungle; private JungleTree tree; private JungleTreeEditor editor; private NodePath rootPath; public delegate void Callback (); public Callback callback; /// /// Jungleの木を構築し終わった時に実行するメソッドをセット /// public void AddCallback (Callback c) { this.callback = c; print ("Add : " + callback.Method); } private void initJungle () { jungle = new DefaultJungle (null, "Game", new DefaultTreeEditor(new DefaultTraverser())); tree = jungle.createNewTree ("Scene"); rootPath = new DefaultNodePath (); // 編集を可能にする editor = tree.getTreeEditor (); editor = editor.addNewChildAt (rootPath, 0).b(); } private void Awake () { if (instance == null) instance = this; } private void Start () { initJungle (); CreateSceneTree (); CreateItemTree (); } private void CreateTree () { GameObject rootObj = new GameObject (); rootObj.name = "Root"; root = new SceneNode(rootObj, null); } private void Check () { int i = 0; foreach (GameObject obj in UnityEngine.Resources.FindObjectsOfTypeAll(typeof(GameObject))) { string path = AssetDatabase.GetAssetOrScenePath (obj); bool isScene = path.Contains (".unity"); if (isScene) { // このシーンの中のオブジェクトかどうか。 if (obj.transform.childCount == 0 && obj.transform.parent == null || obj.transform.childCount > 0 && obj.transform.parent == null) { // 親を取得 objList.Add(obj); i++; } } } foreach (var obj in objList) { SceneNode node = new SceneNode (obj, root); root.AddChild (node); CheckChild (obj.transform, node); } } private void CheckChild (Transform obj, SceneNode parent) { if (obj.childCount == 0) return; for (int i = 0; i < obj.childCount; i++) { SceneNode node = new SceneNode (obj.GetChild (i).gameObject, parent); parent.AddChild (node); CheckChild (obj.GetChild (i), node); } } private bool CreateNode (NodePath path, int num) { Either e = editor.addNewChildAt (path, num); if (e.isA ()) { e.a (); return false; } editor = e.b (); return true; } private bool SetAttribute (NodePath path, GameObject obj) { // Either e = editor.putAttribute (path, key, Encoding.UTF8.GetBytes(val)); Either e = editor.putAttribute (path, "NodeName", Encoding.UTF8.GetBytes(obj.name)); if (e.isA ()) { e.a (); return false; } editor = e.b (); return true; } private void CreateItemTree () { JungleTree tree = jungle.createNewTree ("ItemTree"); JungleTreeEditor edt = tree.getTreeEditor (); Either either = edt.putAttribute (rootPath, "TreeName", "Item"); either = either.bind ((JungleTreeEditor arg) => { return arg.addNewChildAt (rootPath, 0); }); either = either.bind ((JungleTreeEditor arg) => { return arg.putAttribute ("Category", "Box"); }); either = either.bind ((JungleTreeEditor arg) => { return arg.addNewChildAt (rootPath, 1); }); either = either.bind ((JungleTreeEditor arg) => { return arg.putAttribute ("Category", "Food"); }); NodePath path = rootPath.add(0); Default.List infoList = new Default.List (); infoList.Add (new BoxItemInfo (1, 2, "Grass", "#019540FF")); infoList.Add (new BoxItemInfo (2, 4, "Wood", "#7F3C01FF")); infoList.Add (new BoxItemInfo (3, 1, "Sand", "#D4500EFF")); infoList.Add (new BoxItemInfo (4, 5, "Water", "#2432ADFF")); foreach (var info in infoList.Select((v, i) => new {v, i})) { either = either.bind ((JungleTreeEditor arg) => { return arg.addNewChildAt (path, info.i); }); either = either.bind ((JungleTreeEditor arg) => { return arg.putAttribute (info.v); }); } Default.List foodinfoList = new Default.List(); foodinfoList.Add (new FoodItemInfo (1, 1, "Apple")); foodinfoList.Add (new FoodItemInfo (1, 2, "Apple")); path = rootPath.add(1); foreach (var info in foodinfoList.Select((v, i) => new {v, i})) { either = either.bind ((JungleTreeEditor arg) => { return arg.addNewChildAt (path, info.i); }); either = either.bind ((JungleTreeEditor arg) => { return arg.putAttribute (info.v); }); } either = either.bind ((JungleTreeEditor arg) => { return arg.commit(); }); StageManager.Instance.Init (); } private void CreateSceneTree () { JungleTree tree = jungle.createNewTree ("SceneTree"); JungleTreeEditor edt = tree.getTreeEditor (); Either either = edt.addNewChildAt (rootPath, 0); either = either.bind ((JungleTreeEditor arg) => { return arg.putAttribute ("NodeName", "Player"); }); NodePath playerpath = rootPath.add (0); either = either.bind ((JungleTreeEditor arg) => { return arg.addNewChildAt (playerpath, 0); }); either = either.bind ((JungleTreeEditor arg) => { return arg.putAttribute ("NodeName", "HaveItems"); }); either = either.bind ((JungleTreeEditor arg) => { return arg.addNewChildAt (rootPath, 1); }); either = either.bind ((JungleTreeEditor arg) => { return arg.putAttribute ("NodeName", "Stage"); }); either = either.bind ((JungleTreeEditor arg) => { return arg.commit(); }); } }