Вероятно, проще всего использовать константы Vector3
и присвоить их переменной Vector3
.Но иногда вы хотите использовать безопасность типов, чтобы гарантировать, что ваш метод не может получить неожиданную ось или Vector3.zero
.
Вы не можете сделать это только с enum
(вам нужнопереключатель или массив или что-то еще, чтобы интерпретировать enum
как Vector3
), но вы можете получить нечто подобное и автономное с классом с закрытым конструктором, некоторыми полями только для чтения и методом public static implicit operator Vector3
:
public class RotationAxis
{
public static readonly AxisVector right = new Axis(Vector3.right);
public static readonly AxisVector left = new Axis(Vector3.left);
public static readonly AxisVector up = new Axis(Vector3.up);
public static readonly AxisVector down = new Axis(Vector3.down);
public static readonly AxisVector forward = new Axis(Vector3.forward);
public static readonly AxisVector back = new Axis(Vector3.back);
private Vector3 _value;
private RotationAxis(Vector3 axis)
{
this._value = axis;
}
public static implicit operator Vector3(RotationAxis axis)
{
return axis._value;
}
}
Пример использования:
public void RotateMe(RotationAxis axis, float angle) {
// using axis as a Vector3 guaranteed by type safety to be one of:
// Vector3.right/left/up/down/forward/back
// RotationAxis implicitly converts to Vector3
transform.Rotate(axis, angle);
// you can also just use RotationAxis._ as you would Vector3._
transform.Rotate(RotationAxis.forward, angle);
}
...
RotationAxis axis = RotationAxis.right;
float angle = 45f;
object1.RotateMe(axis, angle);
axis = RotationAxis.up;
angle = 45f;
object2.RotateMe(axis, angle);
// object2.RotateMe(Vector3.zero, angle); would produce a compile error. Can't be done accidentally.