快捷键XML管理和事件管理小结(实例)

来源:互联网 发布:淘宝店标logo生成器 编辑:程序博客网 时间:2024/06/05 18:58
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System;
using System.Xml;


public delegate bool ShortCutKeyEvent();


public class ShortcutKeyManager :MonoBehaviour {
    private ShortcutKeyManager() { }
    private static ShortcutKeyManager instance;
    public static ShortcutKeyManager Instance
    {
        get
        {            
            return instance;
        }
    }


    void Awake()
    {
        instance = this;
    }
     
    void Start()
    {
        ShortCutKeyEvent eve1=RevocationManager.Instance.BackRevovation;
        AddShortCutKeyEvent("撤销", eve1);
        ShortCutKeyEvent eve2 = RevocationManager.Instance.RestoreRevocation;
        AddShortCutKeyEvent("撤销恢复", eve2);
    }


    public Dictionary<string, ShortCutKeyEvent> shortCutKeys = new Dictionary<string, ShortCutKeyEvent>();//快捷键名字和快捷键触发事件
    public Dictionary<string, string> shortKeyDatas = new Dictionary<string, string>();  //快捷键键位和 快捷键名字


    public bool ReadXmlData(XmlDocument xml)
    {
        if(xml!=null)
        {
            XmlElement element = xml.DocumentElement;
            XmlNodeList datas = element.ChildNodes;


            if(datas!=null&&datas.Count>0)
            {
                for(int i=1;i<datas.Count;i++)
                {
                    XmlElement t_data = (XmlElement)datas[i];
                    if(t_data!=null)
                    {
                        string t_str = t_data.GetAttribute("Data");
                        string[] t_strs= t_str.Split(',');
                        if(t_strs.Length>1)
                        {
                            shortKeyDatas.Add(t_strs[1], t_strs[0]);
                        }
                    }
                }
                return true;
            }


            return false;
        }


        return false;
    }


    /// <summary>
    /// 添加快捷键事件
    /// </summary>
    /// <param name="shortcutKeyName"></param>
    /// <param name="eve"></param>
    /// <returns></returns>
    public bool AddShortCutKeyEvent(string shortcutKeyName,ShortCutKeyEvent eve)
    {
        if(!string.IsNullOrEmpty(shortcutKeyName) &&eve!=null)
        {
            shortCutKeys.Add(shortcutKeyName,eve);
        }
        return false;
    }


    void OnGUI()
    {
        if(Input.anyKey)
        {
            if(shortKeyDatas!=null&&shortKeyDatas.Count>0)
            {
                DoKeyEvent();
            }            
        }
    }


    private bool DoKeyEvent()
    {
        foreach (var it in shortKeyDatas)
        {
            string t_key = it.Key;
            string[] t_keys = t_key.Split('+');
            if (t_keys.Length.Equals(1))
            {
                if (Input.GetKey((KeyCode)Enum.Parse(typeof(KeyCode), t_keys[0])))
                {
                    FindKeyEventToDo(it.Value);
                }
            }
            if (t_keys.Length > 1)
            {
                bool flag=true;
                foreach(var it2 in t_keys)
                {                    
                    if (!Input.GetKey((KeyCode)Enum.Parse(typeof(KeyCode),it2)))
                    {                        
                        flag = false;
                        break;
                    }                        
                }
                if(flag)
                {
                    FindKeyEventToDo(it.Value);
                }
                flag = true;
            }
        }
        return false;
    }


    private bool FindKeyEventToDo(string keyName)
    {
        if(!string.IsNullOrEmpty(keyName))
        {
            foreach (var it1 in shortCutKeys)
            {
                if (it1.Key.Equals(keyName))
                {
                    it1.Value();
                    Debug.Log("执行"+it1.Key);
                    return true;
                }
            }
        }


        return false;
    }

}




注意点:

1.Event.current智能在OnGUI里用,别处报空。

2.为了防止所有实例化,初始化数据等操作产生冲突,在Start里赋值。

0 0
原创粉丝点击