Ответ обманчиво прост: Массивы в C # являются ссылочными типами , что означает, что редактирование чего-либо в массиве сохраняет отредактированное значение. Чтобы проиллюстрировать, как правильно использовать MultiFloatField, вот пример из ссылки Unity C # :
// Make an X, Y & Z field for entering a [[Vector3]].
private static Vector3 Vector3Field(Rect position, Vector3 value)
{
s_Vector3Floats[0] = value.x;
s_Vector3Floats[1] = value.y;
s_Vector3Floats[2] = value.z;
position.height = kSingleLineHeight;
BeginChangeCheck();
MultiFloatField(position, s_XYZLabels, s_Vector3Floats);
if (EndChangeCheck())
{
value.x = s_Vector3Floats[0];
value.y = s_Vector3Floats[1];
value.z = s_Vector3Floats[2];
}
return value;
}
Как мы видим, есть массив (называемый s_Vector3Floats
), который передается в MultiFloatField; измененные значения считываются непосредственно из того же массива.
Ergo, в приведенном выше примере проблема заключается в том, что мы каждый раз создаем новый массив. Лучший (и работающий!) Способ сделать это будет следующим:
var fwd = property.FindPropertyRelative("Forwards");
var bwd = property.FindPropertyRelative("Backwards");
var left = property.FindPropertyRelative("StrafeLeft");
var right = property.FindPropertyRelative("StrafeRight");
var array = new[] {fwd.floatValue, bwd.floatValue, left.floatValue, right.floatValue};
EditorGUI.MultiFloatField(position, new [] {"F", "B", "L", "R"}.Select(x => new GUIContent(x)).ToArray(), array);
fwd.floatValue = array[0];
bwd.floatValue = array[1];
left.floatValue = array[2];
right.floatValue = array[3];
И дополнительный бонус: если вы используете Foldout
и не можете нажать на свое содержимое, это, вероятно, потому что вы даете Foldout Rect, который слишком далеко большой . Будьте осторожны с вашими приказами. Они, в отличие от массивов, являются типами значений.