IndieInject — это легковесный и простой в использовании фреймворк для внедрения зависимостей (DI) в Unity, разработанный специально для небольших проектов и быстрых прототипов. Этот фреймворк идеально подходит для создания игр для платформ, таких как Yandex Games, Poki, Crazy Games, Google Play, Apple Store и Ru Store.
IndieInject предоставляет базовые возможности для внедрения зависимостей в поля, свойства и методы, а также поддерживает инъекцию зависимостей при спавне объектов. Он разработан для использования в Unity и заточен под быструю разработку и расширяемость, что делает его идеальным выбором для небольших проектов и веб-игр.
- Простота и легковесность: Легко интегрируется и минимально влияет на производительность.
- Базовое внедрение зависимостей: Инъекция в поля, свойства и методы с помощью атрибута
[Inject]
. - Поддержка спавна объектов: Внедрение зависимостей при создании объектов с помощью метода
InstantiateWithDependencies
. - Легкая интеграция с Unity: Использование
MonoBehaviour
для управления жизненным циклом и зависимостями объектов.
- Склонируйте репозиторий и добавьте папку IndieInject в ваш проект Unity.
git clone https://github.com/RimuruDev/IndieInject.git
- Или скачайте последний Release и перенесите файл
.package
в ваш проект Unity.
В этом примере: инекция конфига + героя + transform родителя для героя.
!!!! Подробнее лучше ознакомиться в Sample.package
закрепленным к Release.
Откройте папку Samples далее папка _Scenes сцена SampleScene.unity
Создайте SceneContext
для регистрации зависимостей:
using UnityEngine;
public sealed class SceneContext : MonoBehaviour, IDependencyProvider
{
[SerializeField] private GameObject playerPrefab;
[SerializeField] private Transform rootTransformForHero;
[SerializeField] private HeroConfig heroConfig;
[Provide]
public GameObject ProvidePlayerPrefab() => playerPrefab;
[Provide]
public InputService ProvideInputService() => new();
[Provide]
public HeroConfig ProvidePlayerConfig() => heroConfig;
[Provide]
public Transform RootTransformForHero() => rootTransformForHero;
}
using UnityEngine;
public class InputService
{
private const string Horizontal = "Horizontal";
private const string Vertical = "Vertical";
public static Vector3 GetInput()
{
var horizontal = Input.GetAxis(Horizontal);
var vertical = Input.GetAxis(Vertical);
return new Vector3(horizontal, 0, vertical);
}
}
using UnityEngine;
[CreateAssetMenu(fileName = nameof(HeroConfig), menuName = "Config/" + nameof(HeroConfig))]
public class HeroConfig : ScriptableObject
{
[field: SerializeField] public float MoveSpeed { get; private set; } = 50f;
}
using UnityEngine;
public class Hero : MonoBehaviour
{
[Inject] private InputService inputService;
[Inject] private HeroConfig HeroConfig;
private Rigidbody heroRigidbody;
private void Awake() =>
heroRigidbody = GetComponent<Rigidbody>();
private void Update()
{
var input = InputService.GetInput();
var movement = input * (HeroConfig.MoveSpeed * Time.deltaTime);
heroRigidbody.MovePosition(transform.position + movement);
}
}
using UnityEngine;
public class HeroFactory : MonoBehaviour
{
// Inject in field!
[Inject] private GameObject playerPrefab;
private Transform rootTransform;
// Inject in method!
[Inject]
private void Constructor(Transform rootTransformForSpawnHero) =>
rootTransform = rootTransformForSpawnHero;
private void Start() =>
IndieObject.InstantiateWithDependencies(playerPrefab, rootTransform);
}
Вы можете создать или удалить объект с компонентом IndieInjector
через меню Unity:
Этот проект лицензирован по лицензии MIT. Подробнее см. в файле LICENSE.
Разработано RimuruDev
- Добавить Project Context
- Добавить WeakReference
- Написать Readme.md
- Добавить пример с CompositionRoot
- Добавить примеры с раздилением провайдеров на контексты
- Добавить ImmortalGameObject
- Добавить более надежный способ удаления зависимостей
- Покрыть тестами