Взаимодействие компонентов Unity
|
|
SkorpyX | Дата: Воскресенье, 23 Октября 2016, 15:23 | Сообщение # 1 |
участник
Сейчас нет на сайте
| Здравствуйте! Допустим у меня есть персонаж с повешенными на него скриптами HumanMovement, HumanInventory, HumanLifeSystem, HumanAnimator и т.д. Каждый скрипт может обращаться друг к другу, так, например, HumanMovement на основе значения усталости и наложенных эффектов (сломанная нога и т.д.) в HumanLifeSystem рассчитывает скорость бега, или, например, HumanAnimator изменяет анимацию на основе текущего состояния и скорости в HumanMovement. Как мне лучше организовать такое взаимодействие? Может создать скрипт Human со ссылками на остальные компоненты и обращаться как human.movement.GetCurrentSpeed(), или создать скрипт Human и обращаться как human.GetCurrentSpeed() или human.GetValue<Vector3> ( HumanValues.Speed)? Или есть какой нибудь другой более красивый способ?
Сообщение отредактировал SkorpyX - Воскресенье, 23 Октября 2016, 15:26 |
|
| |
Ranger | Дата: Воскресенье, 23 Октября 2016, 15:39 | Сообщение # 2 |
почти ветеран
Сейчас нет на сайте
| Как вариант, можешь делегатами воспользоваться. На действия human назначить делегатов, или вообще сделать список действий хумана расширяемым словарем. Здесь норм написано. статья
|
|
| |
beril | Дата: Воскресенье, 23 Октября 2016, 15:47 | Сообщение # 3 |
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
| на StrangeIoC глянь. Лично меня приучили и теперь любой проект начинается с его импорта )
Накодил? Убери за собой! Инвентарь в Unity(UI) Инвентарь в Unity(GUI)
|
|
| |
Barbatos | Дата: Воскресенье, 23 Октября 2016, 17:18 | Сообщение # 4 |
3D-моделлер/Руководитель
Сейчас нет на сайте
| SkorpyX, Я так и не понял чем тебе не нравиться самый простой способ. speed = GetComponent<Human> ().speed; GetComponent<Human> ().speed = speed;
Ну или. public Human HumanC; HumanC = GetComponent<Human> ();
speed = HumanC.speed. HumanC.speed = speed;
Его остатки и на хлеб не намазать. Мой тебе совет Пабло - относись к жизни как к веселухе, но непродолжительной. @Эш
Сообщение отредактировал Barbatos - Воскресенье, 23 Октября 2016, 17:21 |
|
| |
SkorpyX | Дата: Воскресенье, 23 Октября 2016, 19:53 | Сообщение # 5 |
участник
Сейчас нет на сайте
| Barbatos, А вдруг ко мне присоединится ещё один программист в команду и ему в своём скрипте захочется напрямую изменить speed, хотя скрипт также должен учитывать другие модификаторы, такие как текущий уровень усталости и т.д. + сломаннные конечности + вес в рюкзаке и т.д. Я хочу написать модульную систему, чтобы скрипты могли сосуществовать отдельно друг от друга, например для движения могут существовать не только HumanMovement, но и HumanAiMovement, KuritzaMovement (на всякий случай скажу я знаю, что они могут наследоваться от одного интерфейса, но мне интересно узнать как лучше обеспечить само их взаимодействие). Также, например, к любому объекту можно было бы добавить LifeSystem, и если у этого объекта есть Movement, то он начинает учитывать состояние из LifeSystem. Или, например, добавить к объекту компонент HumanAnimator, который получал скорость от HumanMovement или HumanAiMovement в зависимости от того, что есть.
По идее можно создать интерфейс ICharacter, который содержит IMovement movement, IAnimator anim, ILifeSystem lifeSystem и т.д. Допустим мы создали скрипты Human, HumanMovement, HumanAnimator, HumanLifeSystem наследующие данные интерфейсы, тогда если HumanMovement нужно получить значение усталости из HumanLife System и значение веса из HumanInventory, то можно написать в HumanMovement:
Код CharacterController controller = GetComponent<CharacterController> (); ICharacter character = GetComponent<ICharacter> ();
IInventory inventory = character.inventory; ILifeSystem life= character.lifeSystem;
speed = currentState.speed;
if (life != null) speed *= life.GetStamina() / life.GetMaxStamina(); // Если нужны ещё такие модификаторы, как сломанная нога, то : (в LifeSystem создаём метод который перемножает массив модификаторов) // speed *= life.GetModifiersCoefficient()
if (inventory != null) speed *= (1 - inventory.GetWeight() / invemtory.GetMaxWeight());
controller.Move(speed);
Но это лишь один из вариантов, так вот мне интересно как реализовать это наилучшим способом?
Сообщение отредактировал SkorpyX - Воскресенье, 23 Октября 2016, 20:00 |
|
| |