/* * 配列(Array)の中の要素をオブジェクトで検索するPredicateを返す関数 */ private static System.Predicate <MyCustomAssetInnerClass> _ObjectEqual(MyCustomAssetInnerClass rhs) { return(delegate(MyCustomAssetInnerClass obj) { return obj == rhs; }); }
/* 配列(Array)の中の要素をオブジェクトで検索するPredicateを返す関数 */ private static System.Predicate<MyCustomAssetInnerClass> _ObjectEqual(MyCustomAssetInnerClass rhs) { return delegate(MyCustomAssetInnerClass obj) { return obj == rhs; }; }
/* * XMLをパースしてカスタムアセットを更新する * * a.source に設定されているxmlデータを読んで、渡されたMyCustomAssetの * 内容を更新します。 */ public static bool ReloadMyCustomAssetFromText(MyCustomAsset a) { if (null == a) { return(false); } if (null == a.source) { return(false); } string nameStr = null; Color newColor = Color.gray; string messagesStr = null; List <MyCustomAssetInnerClass> innerObjArray = new List <MyCustomAssetInnerClass>(); try { // // System.Xml.XmlDocument を使用してXMLをパース // XmlDocument xmlDocument = new XmlDocument(); xmlDocument.Load(new StringReader(a.source.text)); XmlElement elem = xmlDocument.DocumentElement; if (elem.HasChildNodes) { XmlNode childNode = elem.FirstChild; while (childNode != null) { if (childNode.Name == "name" && _IsTextNode(childNode)) { nameStr = childNode.ChildNodes[0].Value; } if (childNode.Name == "color" && _IsTextNode(childNode)) { newColor = _ParseColor(childNode.ChildNodes[0].Value); } else if (childNode.Name == "message" && _IsTextNode(childNode)) { messagesStr = childNode.ChildNodes[0].Value; } else if (childNode.Name == "inner" && childNode.HasChildNodes == true) { foreach (XmlNode n in childNode.ChildNodes) { // entryタグ以外は無視 if (n.Name != "entry") { continue; } // 子ノードを持っていない場合も無視 if (!n.HasChildNodes) { continue; } float speed = 1.0f; string text = ""; string name = ""; foreach (XmlNode cn in n.ChildNodes) { if (cn.Name == "speed" && _IsTextNode(cn)) { try { speed = float.Parse(cn.ChildNodes[0].Value); } catch (System.Exception exc) { Debug.Log("Float parse error: " + exc.Message); } } if (cn.Name == "action" && _IsTextNode(cn)) { text = cn.ChildNodes[0].Value; } if (cn.Name == "name" && _IsTextNode(cn)) { name = cn.ChildNodes[0].Value; } } // 既存のアセットの中に対応するデータがあるかどうかを検索 MyCustomAssetInnerClass ic = null; if (a.inner != null) { ic = System.Array.Find(a.inner, _NameEqual(name)); } // なかったら新しく作成 if (ic == null) { ic = ScriptableObject.CreateInstance <MyCustomAssetInnerClass>(); } ic.speed = speed; ic.action = text; ic.name = name; innerObjArray.Add(ic); } } childNode = childNode.NextSibling; } } } catch (System.Exception exc) { Debug.Log(exc.GetType() + ": " + exc.Message); return(false); } // saving a.color = newColor; if (null != nameStr) { a.name = nameStr; } if (null != messagesStr) { a.messages = messagesStr; } // 古い要素がある場合、新しいオブジェクトリストに // 入っていないものはXML上で削除されているので、アセットからも削除 if (null != a.inner) { foreach (MyCustomAssetInnerClass ic in a.inner) { MyCustomAssetInnerClass obj = innerObjArray.Find(_ObjectEqual(ic)); if (null == obj) { DestroyImmediate(ic, true); //アセットから削除 } } } // そうでなければ、ロードしたオブジェクトを短に割当て a.inner = new MyCustomAssetInnerClass[innerObjArray.Count]; innerObjArray.CopyTo(a.inner); return(true); }