Воскресенье, 22 Декабря 2024, 09:46

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Взаимодействие компонентов 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
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг