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().FromInstance(actorAnimationSystemSettings); Container.Bind().FromInstance(actorAimingAnimationSystemSettings); Container.Bind().FromInstance(groundCheckSystemSettings); Container.Bind().FromInstance(enemyDriverSystemSettings); Container.Bind().FromInstance(enemyDeathSystemSettings); Container.Bind().FromInstance(itemContainerFactorySettings); Container.Bind().FromInstance(actorMeleeSystemSettings); Container.Bind().FromInstance(actorDeathSystemSettings); Container.Bind().FromInstance(soundManagerSettings); // Systems Container.Bind().FromResolveGetter(w => w.EntityManager); Container.Bind().FromInstance(Unity.Entities.World.DefaultGameObjectInjectionWorld); Container.Bind().FromEcs(); Container.Bind().AsSingle(); Container.Bind().FromEcs(); Container.Bind().FromEcs(); Container.Bind().FromEcs(); Container.Bind().FromEcs(); Container.Bind().AsSingle(); Container.Bind().FromEcs(); Container.Bind().FromEcs(); Container.Bind(binder => binder.AllTypes().DerivingFrom()) .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().FromEcs(); Container.Bind().AsSingle(); Container.Bind().FromEcs(); Container.Bind().FromEcs(); Container.Bind().FromEcs(); Container.Bind().To().AsSingle(); Container.Bind().To().AsSingle(); Container.Bind>().WithId(AssetManifest.HealthKit).FromInstance(healthKit); } } }