Войти
ПрограммированиеФорумОбщее

Система состояний объекта в Unity да и не только.

#0
13:40, 9 фев. 2016

В общем у меня назрел такой вопрос, как можно реализовать логику состояний для объекта?

Ситуация такая, для создания объекта выбирается определённая клетка, в ней постепенно создаётся объект (то есть состояние начато строительство, некий прогресс, объект готов), кроме того объект может быть запитан энергией или нет, может быть сломан, может быть взломан, некоторые объекты могут быть открыты и закрыты....
При этом нельзя сказать, что объект всегда в одном состоянии, он может быть одновременно открыт/закрыт и включен/выключен.
Часть состояний не могут существовать одновременно - получается будут ограничения на некоторые переходы состояний. К примеру - нельзя включить или взломать сломанный объект.
Вопрос мой о том как можно реализовывать подобную систему состояний?
Сейчас я накидал буловских переменных, часть из них идёт из родительского класса, часть является уникальной для самих объектов. Хочу спросить что тут можно придумать для хорошей читаемости кода?
Условно говоря я понимаю, что любой объект можно повредить, поэтому проверка поломок в приоритете, затем я делал вкл/выкл для объекта - но тут была совсем простая ситуация, мне же надо учесть ещё кучу моментов - я уже даже названия переменным придумать нормально не могу! В общем мне нужна толковая идея по организации в коде такого рода вещей.


#1
13:52, 9 фев. 2016

AIIIBAP
Сами же написали. Повесить на объект скрипт с  логикой и переменными . а логику кроме вас никто не напишет ибо её не знает.

#2
13:59, 9 фев. 2016

вот тут неплохая статейка по работе с логикой состояний чз enum, плюс что примечательно их можно мешать помоему(там все написано), давно ее читал, но мне показалось это интересным - http://www.alanzucconi.com/2015/07/26/enum-flags-and-bitwise-operators/

#3
14:07, 9 фев. 2016

https://yandex.ru/yandsearch?&clid=2186620&text=%D0%BF%D0… %D0%B5%20c%23

#4
14:10, 9 фев. 2016

Mira
> Повесить на объект скрипт
+1

#5
17:52, 9 фев. 2016

Mira

Сами же написали. Повесить на объект скрипт с  логикой и переменными . а логику кроме вас никто не напишет ибо её не знает.

Класс! Как я только не догадался! Надо использовать скрипты и писать код!

Dikoobraz

вот тут неплохая статейка по работе с логикой состояний чз enum, плюс что примечательно их можно мешать помоему(там все написано), давно ее читал, но мне показалось это интересным - http://www.alanzucconi.com/2015/07/26/enum-flags-and-bitwise-operators/

Enum я использую, но тут ещё беда в пересечении состояний - надо несколько enum - опять будет каша.

trudoholic

https://yandex.ru/yandsearch?&clid=2186620&text=%D0%BF%D0… %D0%B5%20c%23
Таким образом, реализация паттерна Состояние позволяет вынести поведение, зависящее от текущего состояния объекта, в отдельные классы, и избежать перегруженности методов объекта условными конструкциями, как if..else или switch. Кроме того, при необходимости мы можем ввести в систему новые классы состояний, а имеющиеся классы состояний использовать в других объектах.

В самую точку - так я могу просто перебрать все возможные состояния и написать соответствующую обработку для них. Ещё бы продумать читаемую систему в которой часть состояний будет на уровне класса предка, а часть уже в новом классе, и при этом они будут зависеть от состояния, описанного в предке.
Тут в общем надо будет делать класс state для основного объекта, а для конечного объекта нужно будет переопределять этот класс его потомком... хм...
Или можно сделать так, чтобы конечный объект наследовал какой-то класс состояний, а у класса состояний будет параллельная ко всем объектам иерархия.

Просто вот пример:
Есть стена - может быть цела или повреждена,
Есть рубильник - может быть цел или сломан, включен или выключен.
Есть насос - может быть цел или сломан, включен или выключен, запитан или без энергии (запитан может быть только если включен, но и тогда не факт, если энергии нет).

Все объекты наследуются от класса StatObj_logic, я не хочу, чтобы у стены были состояния насоса и т.д. но при этом расписывать в самом классе насоса все состояния я тоже не хочу, хочу их наследовать. Хочу иметь алгоритм, общий для всех объектов, который бы определял состояние, но по разному для каждого конечного объекта.

Т.е. условно если объект сломан - он всегда будет сломан - включение/выключение нас не интересует, а вот если цел, то это уже важно и т.д.
Не очень понятно как тут формировать enum - так как наборы различны у предка и у потомков.
Можно конечно делать класс state_controller - в нём завести переменную enum с перебором всех состояний всех объектов, но в основной реализации оставить выбор состояний из цел/сломан - далее ещё усложнить метод, добавив в случае если объект цел выбор из новой вариации. Или делать в наследниках новые enum?

В общем тут та ещё каша выходит, а я её всеми силами стремлюсь избегать.

http://flash2048.com/post/state

А там дальше ещё пример - пожалуй то, что нужно. В зависимости от набора я определяю наиболее актуальное состояние. Конечно мне ещё надо наследование делать и наборы разные, но зато ясно куда копать - спасибо!
ПрограммированиеФорумОбщее

Тема в архиве.