Войти
UnityФорумПрограммирование

как работает инкапсуляция

#0
18:53, 17 июня 2022

Добрый день, друзья! Хотелось бы понять, как работает данный код. Я ставлю значение переменной 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("ошибка скорости");

#1
(Правка: 19:06) 19:05, 17 июня 2022

Ничего не выводится, потому что через инспектор меняется значение private поля speed. А выводиться будет, если делать через присваивание проперти Speed. Это 2 разных объекта по сути.

#2
13:20, 18 июня 2022

MANAB
> [Seria
MANAB
так не работает код Properties float speed = 2.5f;. Видимо я не совсем вас понял. Можно подробней, чтобы заработало и выводило через инкапсуляцию по ошибку скорости?

#3
(Правка: 21:56) 21:56, 18 июня 2022

Eugeny1984
> так не работает код Properties float speed = 2.5f;

А должно? Ты обращаешься к полю, но при этом хочешь, чтобы отрабатывал setter свойства Speed к которому ты не обращаешься.
Тебе нужно писать: Speed = 2.5f;

Ещё раз: speed это поле, Speed это свойство.

#4
10:38, 22 июня 2022

совет.
не вставляй логику в геттеры и сетеры.
Максимум что можно это через условие разные действия делать с переменными
Лучше уж так делай методы класса с логикой и тд
И не будет у тя таких странных поведений.

#5
16:09, 22 июня 2022

Eugeny1984
Unity меняет поля (а не свойства) напрямую. даже приватные, нарушая инкапсуляцию :)

ну и да, в сеттерах писать бизнес (игровую) логику - моветон. properties - они подходят только для технических аспектов вроде реализаций прокси.

#6
19:00, 22 июня 2022

1. прочти документацию
2. и по юнити и по с#
3. RTFM

как уже написали юнити меняет поле - публичное или помеченное как сериализуемое. свойства - рантайм логика, редактор её игнорирует. если уж очень хочется гонять логику компонента в редакторе  то есть два пути - написать свой редактор для компонента который будет учитывать твои ограничения или (в данном конкретном случае) воспользоваться готовым атрибутом Range

UnityФорумПрограммирование