Изменение существующих переменных внутри цикла for - PullRequest
0 голосов
/ 19 апреля 2020

Для моего движения игрока я назначаю соответствующие коды клавиш, которые пользователь связал с помощью моего SettingsMaster сценария, локальным KeyCode переменным в моем PlayerMovement сценарии, который прикреплен к моему объекту игрока (например: клавиша вперед 'W' загружается в PlayerMovement, когда пользователь запускает уровень).

Я хочу сделать это наилучшим из возможных способов, но, к сожалению, я не могу использовать для l oop из-за переменной объем. Поэтому, кажется, единственный способ сделать это - просто повторять одну и ту же строку кода снова и снова.

    // What I'd like to do 
    string[] arr = { "forward", "backward", "left", "right", "crouch", "slide", "jump", "grapple", "ultimate", "primaryFire", "secondaryFire", "reload", "pause" };
    KeyCode[] keys = { forward, backward, left, right, crouch, slide, jump, grapple, ultimate, primaryFire, secondaryFire, reload, pause }; // An array of the keycode variables declared above
    for (int i = 0; i < arr.Length; i++)
        keys[i] = (KeyCode)Enum.Parse(typeof(KeyCode), SettingsMaster.GetValue(arr[i])); // Doesn't work due to variable scope

    // What I'm stuck with right now
    forward = (KeyCode)Enum.Parse(typeof(KeyCode), SettingsMaster.GetValue("forward"));
    backward = (KeyCode)Enum.Parse(typeof(KeyCode), SettingsMaster.GetValue("backward"));
    left = (KeyCode)Enum.Parse(typeof(KeyCode), SettingsMaster.GetValue("left"));
    right = (KeyCode)Enum.Parse(typeof(KeyCode), SettingsMaster.GetValue("right"));
    crouch = (KeyCode)Enum.Parse(typeof(KeyCode), SettingsMaster.GetValue("crouch"));
    slide = (KeyCode)Enum.Parse(typeof(KeyCode), SettingsMaster.GetValue("slide"));
    jump = (KeyCode)Enum.Parse(typeof(KeyCode), SettingsMaster.GetValue("jump"));
    grapple = (KeyCode)Enum.Parse(typeof(KeyCode), SettingsMaster.GetValue("grapple"));
    ultimate = (KeyCode)Enum.Parse(typeof(KeyCode), SettingsMaster.GetValue("ultimate"));
    primaryFire = (KeyCode)Enum.Parse(typeof(KeyCode), SettingsMaster.GetValue("primaryFire"));
    secondaryFire = (KeyCode)Enum.Parse(typeof(KeyCode), SettingsMaster.GetValue("secondaryFire"));
    reload = (KeyCode)Enum.Parse(typeof(KeyCode), SettingsMaster.GetValue("reload"));
    pause = (KeyCode)Enum.Parse(typeof(KeyCode), SettingsMaster.GetValue("pause"));

Кажется возможным выполнить sh первый метод с помощью небезопасного кода, но это не рекомендуется. Поэтому мой вопрос: является ли мое текущее решение лучшим способом сделать то, что я хочу? Или я упускаю что-то очевидное?

Редактировать: Pastebin для уточнения https://pastebin.com/LRaciVjT


Примечания:

  • SettingsMaster.GetValue возвращает код клавиши в виде строки, поскольку он хранится в PlayerPref.

  • Коды клавиш в PlayerMovement имеют то же имя, что и ключи для вышеупомянутых PlayerPrefs.

1 Ответ

3 голосов
/ 19 апреля 2020

Вместо двух массивов, почему бы не просто Dictionary и сопоставить строки с их KeyCode? Затем просто переберите ваш входной массив, например, используя Linq:

string[] arr = { "forward", "backward", "left", "right", "crouch", "slide", "jump", "grapple", "ultimate", "primaryFire", "secondaryFire", "reload", "pause" };
var map = arr.ToDictionary(x => x, x => (KeyCode)Enum.Parse(typeof(KeyCode), SettingsMaster.GetValue(x));
...