예제 #1
0
 /*
  *      配列(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;
     };
 }
예제 #3
0
    /*
     *      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);
    }