Зависимости
Есть множество способов связки классов между собой - можно находить объекты нужных классов через метод FindObjectOfType, можно использовать паттерн Service Locator. В данном проекте для установки зависимостей между классами используется DI-фреймворк Zenject. С его помощью создаются специальные установщики, внутри которых объекты классов "складываются" в один контейнер.
Всего в проекте 2 таких установщика - Level Installer и User Interface Installer
Простые зависимости
Допустим, игрок решил сменить оружие. Для этого ему нужно сходить в магазин и выбрать оружие. Объекту игрового персонажа изначально неизвестно про объект магазина, но мы может написать следующее
[Inject]
private Shop m_shop;
Теперь Zenject при инициализации игры позаботится о том, чтобы игрок знал, где находится магазин, и смог выбрать оружие
m_gun = m_shop.TakeGun(gunId);
Это будет работать, т.к. ранее в LevelInstaller мы "сложили" объект магазина в общую кучу (контейнер)
Container.Bind<Shop>().FromInstance(shop).AsSingle();
Зависимости для создаваемых объектов
Ранее писалось, что Zenject заботится об установке зависимостей сразу после запуска игры. Это означает, что если мы во время игры создадим объект, которому нужны какие-то другие объекты, он не будет про них знать. Для решения этой проблемы используются фабрики. Хороший пример - спавн врага
var enemy = Object.CreateFromFactory(enemyPrefab, m_enemyFactory);
Чтобы это работало, спавнеру необходимо знать про фабрику врага
[Inject]
private EnemyCharacter.Factory m_enemyFactory;
А чтобы Zenject "рассказал" спавнеру про фабрику, нужно, чтобы она в принципе существовала
public sealed class EnemyCharacter : BaseCharacter {
// ...
public class Factory : PlaceholderFactory<UnityEngine.Object, EnemyCharacter> { }
}
А также необходимо "положить" её в контейнер
Container.BindFactory<UnityEngine.Object, EnemyCharacter, EnemyCharacter.Factory>()
.FromFactory<PrefabFactory<EnemyCharacter>>();
Теперь, при спавне врага методом Object.CreateFromFactory, все зависимости, нужные врагу, будут установлены.