1. **Выделение памяти для переменных:**
В C# (и в Unity) локальные переменные, объявленные внутри функций, выделяют память каждый раз при каждом вызове функции. Это значит, что при каждом вызове метода `Move`, если вы объявляете переменную внутри этого метода, память для нее будет выделяться заново. Однако, примитивные типы (например, `int`, `float`) представляют собой относительно небольшие объекты, и их создание и уничтожение происходит быстро.
Для оптимизации в вашем случае возможно использование параметров методов так, чтобы минимизировать overhead. Например, если вы часто вызываете функцию с одним и тем же набором значений, вы можете рассмотреть вариант кэширования или создания перечисления (enum) вместо строк.
2. **Размер переменных и скорость вызова `Update()`:**
Да, размер переменных может влиять на производительность, хотя это зависит от контекста применения. Примитивные типы занимают меньше места и могут обрабатываться быстрее, чем строки (как `Move("Forward")`). Поэтому, если скорость критична, использование `Move(int)` будет более эффективным, чем использование строковых параметров.
Также стоит отметить, что использование строк может привести к дополнительным затратам на неявное создание объектов, так как строки в C# являются ссылочными типами.
3. **"Тяжесть" проверки условия `if`:**
Проверка условия `if`, даже с проверкой на `null`, обычно не приводит к значительным затратам по времени. Это простой оператор, который работает очень быстро. Тем не менее, если у вас есть ситуация, когда вы часто проверяете условия в каждом кадре (как в `Update()`), это может складываться в значительное время при большом количестве вызовов.
Создание двух наследников и использование полиморфизма может быть более читабельным и возможно даже оптимальнее в некоторых случаях, особенно если вы сможете устранить или сократить количество проверок на этапе выполнения. Предпочтение следует отдавать подходу, который лучше подходит для вашего конкретного случая, как с точки зрения производительности, так и читаемости кода.
В общем, всегда хорошо проводить профилирование вашего кода. Unity имеет встроенные инструменты для профилирования, которые могут помочь измерить время выполнения ваших методов и определить узкие места.