2D-Platformer/Assets/Scripts/Installers/WorldInstaller.cs
2022-02-12 12:53:50 +02:00

81 lines
No EOL
3.7 KiB
C#

using DefaultNamespace.Util;
using System;
using System.Reflection;
using System.Runtime.Serialization;
using Unity.Entities;
using UnityEngine;
using UnityEngine.AddressableAssets;
using Util;
using Zenject;
namespace DefaultNamespace.Installers
{
public class WorldInstaller : MonoInstaller
{
[SerializeField] private SoundManager.Settings soundManagerSettings;
[SerializeField] private EnemyDriverSystem.Settings enemyDriverSystemSettings;
[SerializeField] private ActorGroundCheckSystem.Settings groundCheckSystemSettings;
[SerializeField] private ActorAimingAnimationSystem.Settings actorAimingAnimationSystemSettings;
[SerializeField] private ActorAnimationSystem.Settings actorAnimationSystemSettings;
[SerializeField] private EnemyDeathSystem.Settings enemyDeathSystemSettings;
[SerializeField] private ItemContainerFactory.Settings itemContainerFactorySettings;
[SerializeField] private ActorMeleeSystem.Settings actorMeleeSystemSettings;
[SerializeField] private ActorDeathSystem.Settings actorDeathSystemSettings;
[SerializeField] private AssetReferenceItemPrefab healthKit;
public override void InstallBindings()
{
// Settings
Container.Bind<ActorAnimationSystem.Settings>().FromInstance(actorAnimationSystemSettings);
Container.Bind<ActorAimingAnimationSystem.Settings>().FromInstance(actorAimingAnimationSystemSettings);
Container.Bind<ActorGroundCheckSystem.Settings>().FromInstance(groundCheckSystemSettings);
Container.Bind<EnemyDriverSystem.Settings>().FromInstance(enemyDriverSystemSettings);
Container.Bind<EnemyDeathSystem.Settings>().FromInstance(enemyDeathSystemSettings);
Container.Bind<ItemContainerFactory.Settings>().FromInstance(itemContainerFactorySettings);
Container.Bind<ActorMeleeSystem.Settings>().FromInstance(actorMeleeSystemSettings);
Container.Bind<ActorDeathSystem.Settings>().FromInstance(actorDeathSystemSettings);
Container.Bind<SoundManager.Settings>().FromInstance(soundManagerSettings);
// Systems
Container.Bind<EntityManager>().FromResolveGetter<Unity.Entities.World>(w => w.EntityManager);
Container.Bind<Unity.Entities.World>().FromInstance(Unity.Entities.World.DefaultGameObjectInjectionWorld);
Container.Bind<ActorAnimationSystem>().FromEcs();
Container.Bind<SoundManager>().AsSingle();
Container.Bind<ActorAimingAnimationSystem>().FromEcs();
Container.Bind<ActorGroundCheckSystem>().FromEcs();
Container.Bind<EnemyDriverSystem>().FromEcs();
Container.Bind<EnemyDeathSystem>().FromEcs();
Container.Bind<ItemContainerFactory>().AsSingle();
Container.Bind<ItemDropSystem>().FromEcs();
Container.Bind<ActorMeleeSystem>().FromEcs();
Container.Bind(binder => binder.AllTypes().DerivingFrom<IHashes>())
.FromMethodUntyped(
c =>
{
var hashes = FormatterServices.GetUninitializedObject(c.MemberType);
var fields = hashes.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public);
foreach (var field in fields)
{
if (field.FieldType == typeof(int))
{
field.SetValue(hashes, Animator.StringToHash(field.Name));
}
else
{
throw new Exception($"Only int types allowed in {c.MemberType} for field {field.Name}");
}
}
return hashes;
})
.AsTransient();
Container.Bind<CollisionSoundSystem>().FromEcs();
Container.Bind<ParticleSystemFactory>().AsSingle();
Container.Bind<ActorDeathSystem>().FromEcs();
Container.Bind<ParticleCollisionSystem>().FromEcs();
Container.Bind<ItemUseSystem>().FromEcs();
Container.Bind<IItemUseSystem>().To<HealthPackUseSystem>().AsSingle();
Container.Bind<IItemUseSystem>().To<GrenadeUseSystem>().AsSingle();
Container.Bind<AssetReferenceT<ItemPrefab>>().WithId(AssetManifest.HealthKit).FromInstance(healthKit);
}
}
}