Для моего движения игрока я назначаю соответствующие коды клавиш, которые пользователь связал с помощью моего 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.