protected override void OnUpdate()
        {
            Entity     player     = this.playerQuery.GetSingletonEntity();
            PlayerInfo playerInfo = this.EntityManager.GetComponentData <PlayerInfo>(player);

            DynamicBuffer <InventoryItem> inventoryItemsFromPlayer = this.GetBufferFromEntity <InventoryItem>()[player];

            //Prevent this from being null when scene is loaded from another scene (Something about the lifecycle of ECS not behaving well with normal gameobject instantiating -> i can not always guarantee that oncreate receives the gameobject)
            if (this.hudInjectorProxy == null)
            {
                this.hudInjectorProxy = UnityEngine.Object.FindObjectOfType <HUDInjectorProxy>();
            }

            this.hudInjectorProxy.HealthValueText.text = playerInfo.Health.ToString();
            this.hudInjectorProxy.ManaValueText.text   = playerInfo.Mana.ToString();
            this.hudInjectorProxy.LevelValueText.text  = playerInfo.Level.ToString();

            //Turn on/off inventory/character slots
            this.hudInjectorProxy.InventorySlotHolderGameObject.SetActive(playerInfo.OpenInventoryFromInputData);
            this.hudInjectorProxy.CharacterSlotHolderGameObject.SetActive(playerInfo.OpenInventoryFromInputData);

            //will up item slots (the ones always displayed)
            for (int inventoryItemIndex = 0; inventoryItemIndex < inventoryItemsFromPlayer.Length; ++inventoryItemIndex)
            {
                for (int itemIndex = 0; itemIndex < this.hudInjectorProxy.ItemSlotCollectionDTO.ItemSlotDTOs.Count && !inventoryItemsFromPlayer[inventoryItemIndex].AddedToInventory; ++itemIndex)
                {
                    ItemSlotDTO itemSlotDTO = this.hudInjectorProxy.ItemSlotCollectionDTO.ItemSlotDTOs[itemIndex];

                    //Fill up inventory slots left from right
                    if (!itemSlotDTO.HasItem)
                    {
                        InventoryItem inventoryItem       = inventoryItemsFromPlayer[inventoryItemIndex];
                        RenderMesh    renderMeshFirstItem = this.EntityManager.GetSharedComponentData <RenderMesh>(inventoryItem.SharedRenderMeshComponentIndex);

                        this.hudInjectorProxy.ItemSlotMeshFilter.mesh = renderMeshFirstItem.mesh;
                        this.hudInjectorProxy.ItemSlotMeshFilter.mesh = ScaleItemMesh(this.hudInjectorProxy.ItemSlotMeshFilter.mesh, this.hudInjectorProxy.ItemSlotMeshRendererRectTransform);

                        //Camera is normaly dsiabled and only enable it to take "screenshots" of the items
                        this.hudInjectorProxy.ItemSlotCamera.enabled       = true;
                        this.hudInjectorProxy.ItemSlotCamera.targetTexture = RenderTextureCacheSingleton.Instance.GetOrCreateRenderTexture(itemSlotDTO.GetHashCode(), GameRelatedConstants.ItemSlotSize, GameRelatedConstants.ItemSlotSize, GameRelatedConstants.ItemSlotDepth);

                        this.hudInjectorProxy.ItemSlotMeshRenderer.material = renderMeshFirstItem.material;
                        itemSlotDTO.ItemSlotRawImage.texture         = this.RenderCameraToTexture(this.hudInjectorProxy.ItemSlotCamera);
                        this.hudInjectorProxy.ItemSlotCamera.enabled = false;

                        itemSlotDTO.HasItem = true;
                        itemSlotDTO.OriginalInventoryItem = inventoryItemsFromPlayer[inventoryItemIndex];
                        this.hudInjectorProxy.ItemSlotCollectionDTO.ItemSlotDTOs[itemIndex] = itemSlotDTO;

                        inventoryItem.AddedToInventory = true;
                        inventoryItemsFromPlayer[inventoryItemIndex] = inventoryItem;
                    }
                }
            }
        }
        protected override void OnUpdate()
        {
            //Prevent this from being null when scene is loaded from another scene (Something about the lifecycle of ECS not behaving well with normal gameobject instantiating -> i can not always guarantee that oncreate receives the gameobject)
            if (this.hudInjectorProxy == null)
            {
                this.hudInjectorProxy = UnityEngine.Object.FindObjectOfType <HUDInjectorProxy>();
            }

            if (this.itemCatalog == null)
            {
                this.itemCatalog = UnityEngine.Object.FindObjectOfType <ItemCatalog>();
            }

            //Assumes there is exactly 1 player
            Entity playerEntity = this.playerQuery.GetSingletonEntity();
            PlayerBodyAnchorComponent playerBodyAnchorComponent = this.EntityManager.GetComponentData <PlayerBodyAnchorComponent>(playerEntity);

            //Are there unequipped weapons in weapon slot? If so equip them
            //Can not do FirstOrDefault and then check for null becaue ItemSlotDTO is a struct -> Have to count them first
            if (this.hudInjectorProxy.WeaponSlotCollectionDTO.ItemSlotDTOs.Count(weapon => weapon.HasItem) > 0)
            {
                if (this.hudInjectorProxy.WeaponSlotCollectionDTO.ItemSlotDTOs.Count(weapon => !weapon.IsEquippedToPlayer) > 0)
                {
                    ItemSlotDTO weaponSlot   = this.hudInjectorProxy.WeaponSlotCollectionDTO.ItemSlotDTOs.First(weapon => weapon.HasItem && !weapon.IsEquippedToPlayer);
                    Entity      weaponEntity = this.EntityManager.CreateEntity(this.EntityManager.CreateEquippedWeaponArchetype());

                    ItemDTO weaponItem = this.itemCatalog.PremadeWeapons.Where(weapon => weapon.ItemInfo.PreservedWeaponType == weaponSlot.OriginalInventoryItem.ItemInfo.PreservedWeaponType).First();

                    //Weapon is always placed in left hand
                    SetComponentDataForEquippableEntity(this.EntityManager, weaponEntity, in weaponItem, in playerBodyAnchorComponent.LeftHandAnchorPosition);

                    weaponSlot.IsEquippedToPlayer = true;

                    //We previously took the first element so element 0 is also the first element
                    this.hudInjectorProxy.WeaponSlotCollectionDTO.ItemSlotDTOs[0] = weaponSlot;
                }
            }
            //Unequip
            else
            {
                NativeArray <Entity> equippedWeapons = this.GetEntityQuery(this.EntityManager.GetEquippedWeaponIdentifier()).ToEntityArray(Allocator.TempJob);

                for (int i = 0; i < equippedWeapons.Length; ++i)
                {
                    this.PostUpdateCommands.AddComponent <DeletionTag>(equippedWeapons[i]);
                }

                equippedWeapons.Dispose();
            }

            //Are there unequipped shields in shield slot? If so equip them
            if (this.hudInjectorProxy.ShieldSlotCollectionDTO.ItemSlotDTOs.Count(shield => shield.HasItem) > 0)
            {
                if (this.hudInjectorProxy.ShieldSlotCollectionDTO.ItemSlotDTOs.Count(shield => !shield.IsEquippedToPlayer) > 0)
                {
                    ItemSlotDTO shieldSlot   = this.hudInjectorProxy.ShieldSlotCollectionDTO.ItemSlotDTOs.First(shield => shield.HasItem && !shield.IsEquippedToPlayer);
                    Entity      shieldEntity = this.EntityManager.CreateEntity(this.EntityManager.CreateEquippedShieldArchetype());

                    ItemDTO shieldItem = this.itemCatalog.PremadeWeapons.Where(weapon => weapon.ItemInfo.PreservedShieldType == shieldSlot.OriginalInventoryItem.ItemInfo.PreservedShieldType).First();

                    //Weapon is always placed in left hand
                    SetComponentDataForEquippableEntity(this.EntityManager, shieldEntity, in shieldItem, in playerBodyAnchorComponent.RightHandAnchorPosition);

                    shieldSlot.IsEquippedToPlayer = true;

                    //We previously took the first element so element 0 is also the first element
                    this.hudInjectorProxy.ShieldSlotCollectionDTO.ItemSlotDTOs[0] = shieldSlot;
                }
            }
            //Unequip
            else
            {
                NativeArray <Entity> equippedShields = this.GetEntityQuery(this.EntityManager.GetEquippedShieldIdentifier()).ToEntityArray(Allocator.TempJob);

                for (int i = 0; i < equippedShields.Length; ++i)
                {
                    this.PostUpdateCommands.AddComponent <DeletionTag>(equippedShields[i]);
                }

                equippedShields.Dispose();
            }
        }