2016-09-07 3 views
2

При программировании на C/C++ я иногда использовал словарь со ссылками на функции в соответствии с указанными ключами. Тем не менее, я действительно не знаю, как иметь что-то подобное в C#, позволяя мне динамических клавиш.Создать словарь с динамическими клавишами в C#

Я работаю над Unity, и я хотел бы, например, использовать функцию, когда я нажимаю левой кнопкой мыши на проекте Unity, возможно ли это?

Я бы очень благодарен за любые комментарии по этому вопросу.

+0

ли вы имеете в виду клавиатуры ключа? – Stefan

+0

Вы пытались использовать словарь, например 'System.Collections.Generic.Dictionary ' уже? – ViRuSTriNiTy

+0

Вы имеете в виду вызов функции, основанной на вызванном ключе? I.Е храня что-то вроде делегата или Action? – plusheen

ответ

1

Вы можете использовать подпись Dictionary<KeyCode, System.Action> для достижения этой цели. Получите все кодовые коды и сохраните их в массиве с System.Enum.GetValues(typeof(KeyCode));. Затем вы можете соединить свои ключи с вашими функциями с помощью keyCodeToFuncDic.Add(KeyCode.YourKeyCode, YourFunction);

В функции Update используйте цикл для петли над KeyCodes, который хранится в начале. Проверьте, нажата ли какая-либо из этих клавиш. Если нажать, проверьте, находится ли он в Dictionary. Если в словаре существует KeyCode, используйте нажатую клавишу для Invoke функцию в значении Dictionary, которая в конечном итоге вызовет функцию, которая хранится в Dictionary.

Код:

Dictionary<KeyCode, System.Action> keyCodeToFuncDic = new Dictionary<KeyCode, System.Action>(); 
Array allKeyCodes; 

void Start() 
{ 
    //Get all codecodes 
    allKeyCodes = System.Enum.GetValues(typeof(KeyCode)); 

    //Register Keycodes to functios 
    keyCodeToFuncDic.Add(KeyCode.Mouse0, myFunction); //Left mouse 
    keyCodeToFuncDic.Add(KeyCode.Mouse1, myFunction2); //Right mouse 
} 

void myFunction() 
{ 
    Debug.Log("Left Mouse Clicked"); 
} 

void myFunction2() 
{ 
    Debug.Log("Right Mouse Clicked"); 
} 

void Update() 
{ 
    foreach (KeyCode tempKey in allKeyCodes) 
    { 
     //Check if any key is pressed 
     if (Input.GetKeyDown(tempKey)) 
     { 
      //Check if the key pressed exist in the dictionary key 
      if (keyCodeToFuncDic.ContainsKey(tempKey)) 
      { 
       //Debug.Log("Pressed" + tempKey); 

       //Call the function stored in the Dictionary's value 
       keyCodeToFuncDic[tempKey].Invoke(); 
      } 
     } 
    } 
} 
3

Я думаю, что вы можете использовать это: сначала определить делегата для вашей задачи (назначенные задания нажмите клавиши в вашем примере):

public delegate void MyJob(); 

Затем определите свой словарь:

Dictionary<string, MyJob> myBinding = new Dictionary<string, MyJob>() 
{ 
    { "left", delegate() { Console.WriteLine("Left Key pressed"); } }, 
    { "right", delegate() { Console.WriteLine("Right Key pressed"); } }, 
    { "up", delegate() { Console.WriteLine("Up Key pressed"); } }, 
    { "down", delegate() { Console.WriteLine("Down Key pressed"); } } 
}; 

И наконец, использовать его:

public void Mapper(string pressedKey) 
{ 
    myBinding[pressedKey](); 
} 

Я надеюсь, что это поможет вам решить вашу проблему. Если вам нужно более подробно, дайте мне знать.

1

Когда я вижу «динамические клавиши», я думаю, что для чего-то еще, типа типа dynamic, будет ключом для словаря. Однако то, что вам нужно, можно легко достичь. В C# «указатели на функции» называются delegates (но лучше, чем C-указатели на функции), поэтому вам нужен словарь, который имеет тип char как ключ и один из этих делегатов как значение. В. NET Framework 4.0 и выше есть предопределенные общие делегаты, называемые Func<T...> и Action<T...>. В принципе, если вы хотите, чтобы ваша функция вернула значение, вы будете использовать Func, а Action будет использоваться вместо метода void.

Таким образом, вы можете иметь что-то вроде этого:

var keyMap = new Dictionary<char, Func<string, bool>>() 
{ 
    {'w', MoveUp}, 
    {'s', MoveDown}, 
    {'a', s => true}, // using lambda expression 
    { 
     'd', delegate(string s) 
     { 
      if (string.IsNullOrWhiteSpace(s) == false) 
      { 
       // 
      } 
      return true; 
     } 
    } // using anonymous method 
}; 

// then you can call those like this 
var allow = keyMap['w']("some input"); 
if (allow) 
{ 
    // .... 
} 

public bool MoveUp(string input) 
{ 
    return true; 
} 

public bool MoveDown(string input) 
{ 
    return true; 
} 

Вот документы https://msdn.microsoft.com/en-us/library/bb549151(v=vs.110).aspx

Смежные вопросы