Добрый день, друзья! Хотелось бы понять, как работает данный код. Я ставлю значение переменной speed=-2 и как я думал у меня выведет сообщение: "ошибка скорости" на консоль. Но ничего не выводится. Объясните, пожалуйста, как работает ограничение, которое я хочу в коде поставить, указав, что скорость больше 0,5?
public SpriteRenderer[] renderers; // задание массива SpriteRenderer для изменения в инспекторе
[SerializeField] private float speed = 2.5f;
public float Speed
{
get { return speed; }
set
{
if (value > 0.5)
speed = value;
else
Debug.Log("ошибка скорости");
Ничего не выводится, потому что через инспектор меняется значение private поля speed. А выводиться будет, если делать через присваивание проперти Speed. Это 2 разных объекта по сути.
MANAB
> [Seria
MANAB
так не работает код Properties float speed = 2.5f;. Видимо я не совсем вас понял. Можно подробней, чтобы заработало и выводило через инкапсуляцию по ошибку скорости?
Eugeny1984
> так не работает код Properties float speed = 2.5f;
А должно? Ты обращаешься к полю, но при этом хочешь, чтобы отрабатывал setter свойства Speed к которому ты не обращаешься.
Тебе нужно писать: Speed = 2.5f;
Ещё раз: speed это поле, Speed это свойство.
совет.
не вставляй логику в геттеры и сетеры.
Максимум что можно это через условие разные действия делать с переменными
Лучше уж так делай методы класса с логикой и тд
И не будет у тя таких странных поведений.
Eugeny1984
Unity меняет поля (а не свойства) напрямую. даже приватные, нарушая инкапсуляцию :)
ну и да, в сеттерах писать бизнес (игровую) логику - моветон. properties - они подходят только для технических аспектов вроде реализаций прокси.
1. прочти документацию
2. и по юнити и по с#
3. RTFM
как уже написали юнити меняет поле - публичное или помеченное как сериализуемое. свойства - рантайм логика, редактор её игнорирует. если уж очень хочется гонять логику компонента в редакторе то есть два пути - написать свой редактор для компонента который будет учитывать твои ограничения или (в данном конкретном случае) воспользоваться готовым атрибутом Range