Идеальный вариант использования для Методы расширения
public static class Vector3Extensions {
public static Vector3 SetY(this Vector3 vector, float y) {
//This works as-is because structs, such as Vector_ in Unity, are pass-by-value
vector.y = y;
return vector;
}
}
Использование:
//You have to assign the result of the method because, again, pass-by-value...
//..So the vector that was modified inside the method is a different object from the original
transform.localPosition = transform.localPosition.SetY(Mathf.PingPong(Time.time * movementSpeed, movementRange));
Ваш второй пример функционально отличается от первого. В нем X и Z будут равны нулю вместо того, чтобы наследовать исходные значения преобразования. Если вы хотите этого, то код вашего примера уже достаточно мал, без какого-либо другого метода расширения класса Transform
, то есть transform.SetLocalPositionY(y)
.
Если вам нужно наследование X иЗначения Z и ИСПОЛЬЗОВАНИЕ SetY
все равно будут слишком амбициозными по вашему вкусу, а затем используйте Transform
метод расширения, как я уже говорил выше:
public static class TransformExtensions {
public static void SetLocalPositionY(this Transform transform, float y) {
transform.localPosition = transform.localPosition.SetY(y);
}
}
Использование:
//Assignment not needed in this case, as transform is a class...
//..and assignment of localPosition is handled inside the extension method.
transform.SetLocalPositionY(Mathf.PingPong(Time.time * movementSpeed, movementRange));
Методы расширений для типов struct
незначительно снижаются из-за структуры структур с передачей по значению. Какие типы используются в этом случае. Но в данном случае это незначительно, и должно быть пренебрежимо мало для всех структур в целом, если вы правильно используете структуры.
Для типов с передачей по ссылке не должно быть никаких затрат производительности, отличных от любого стандарта. статический метод изменения данных.
Обратите внимание, что операция не обязательно должна быть встроенной, и если вы хотите распределить ее по нескольким строкам, вы можете использовать тот же принцип метода расширениямодификации кэшированного клона исходного вектора и последующего (повторного) присвоения его обратно преобразованию, чтобы добиться этого с помощью более коротких линий и без дополнительного экземпляра структуры, передаваемого в качестве параметра и затем возвращающего (создание одного экземпляра вместо двух):
var localPos = transform.localPosition; //Creates temp/cached instance
localPos.y = Mathf.PingPong(Time.time * movementSpeed, movementRange); //Modification
transform.localPosition = localPos; //(Re)Assignment.
Но за исключением случаев, требующих экстремальной производительности, расширение будет в порядке. На самом деле, все, кроме случаев, подтвержденных в отладчике, если сделать это таким образом только из-за проблем с производительностью, будет преждевременная оптимизация .