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(); } }