Forum begins after the advertisement:
[Part 5] Hand slot error
Home › Forums › Video Game Tutorial Series › Creating a Farming RPG in Unity › [Part 5] Hand slot error
- This topic has 19 replies, 4 voices, and was last updated 8 months, 4 weeks ago by Terence.
-
AuthorPosts
-
August 21, 2023 at 1:30 am #11776Ondra Dwi Putra Adi SetyoParticipant::
I already did the part 5 of the farming game tutorial as its follow, but when I tried to test the equipped part, I clicked it and the selected tool didn’t showed up in the Hand Slot in Inventory. Please tell me where I wrong?
August 23, 2023 at 12:17 am #11805August 23, 2023 at 4:26 am #11807Ondra Dwi Putra Adi SetyoParticipant::No, there is no error on the console but the display of the tool when equipped in the Tool Slot of Inventory won’t showed up. But strangely it is showing up in the Status Bar.
August 23, 2023 at 4:21 pm #11819Jonathan TeoModerator::It’s probably related to the functions in UIManager or InventoryManager. What do they look like?
August 24, 2023 at 9:12 pm #11820Ondra Dwi Putra Adi SetyoParticipant::The InventoryManager.cs:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class InventoryManager : MonoBehaviour { public static InventoryManager Instance { get; private set; } private void Awake() { //If there is more than one instance, destroy the extra if (Instance != null && Instance != this) { Destroy(this); } else { //Set the static instance to this instance Instance = this; } } [Header("Tools")] //Tool Slots public ItemData[] tools = new ItemData[8]; //Tool in the player's hand public ItemData equippedTool = null; [Header("Items")] //Item Slots public ItemData[] items = new ItemData[8]; //Item in the player's hand public ItemData equippedItem = null; //Equipping //Handles movement of item from Inventory to Hand public void InventoryToHand(int slotIndex, InventorySlot.InventoryType inventoryType) { if(inventoryType == InventorySlot.InventoryType.Item) { //Cache the Inventory slot ItemData from InventoryManager ItemData itemToEquip = items[slotIndex]; //Change the Inventory slot to the Hand Slot items[slotIndex] = equippedItem; //Change the Hand Slot to the Inventory Slot equippedItem = itemToEquip; }else { //Cache the Inventory slot ItemData from InventoryManager ItemData toolToEquip = tools[slotIndex]; //Change the Inventory slot to the Hand Slot tools[slotIndex] = equippedTool; //Change the Hand Slot to the Inventory Slot equippedTool = toolToEquip; } //Update the changes to the UI UIManager.Instance.RenderInventory(); } //Handles movement of item from Hand to Inventory public void HandToInventory(InventorySlot.InventoryType inventoryType) { if(inventoryType == InventorySlot.InventoryType.Item) { //Iterate through each inventory slot and find an empty slot for(int i = 0; i < items.Length; i++) { if(items[i] == null) { //Send the equipped item over to its new slot items[i] = equippedItem; //Remove the item from the hand equippedItem = null; break; } } } else { //Iterate through each inventory slot and find an empty slot for(int i = 0; i < tools.Length; i++) { if(tools[i] == null) { //Send the equipped item over to its new slot tools[i] = equippedTool; //Remove the item from the hand equippedTool = null; break; } } } //Update changes in the inventory UIManager.Instance.RenderInventory(); } // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } }
The UIManager.cs:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using TMPro; public class UIManager : MonoBehaviour, ITimeTracker { public static UIManager Instance { get; private set; } [Header("Status Bar")] //Tool equip slot on the status bar public Image toolEquipSlot; //Time UI public TextMeshProUGUI timeText; public TextMeshProUGUI dateText; [Header("Inventory System")] //The inventory panel public GameObject inventoryPanel; //The tool equip slot UI on the Inventory panel public HandInventorySlot toolHandSlot; //The tool slot UIs public InventorySlot[] toolSlots; //The item equip slot UI on the Inventory panel public HandInventorySlot itemHandSlot; //The item slot UIs public InventorySlot[] itemSlots; //Item info box public TextMeshProUGUI itemNameText; public TextMeshProUGUI itemDescriptionText; private void Awake() { //If there is more than one instance, destroy the extra if (Instance != null && Instance != this) { Destroy(this); } else { //Set the static instance to this instance Instance = this; } } private void Start() { RenderInventory(); AssignSlotIndexes(); //Add UIManager to the list of objects TimeManager will notify when the time updates TimeManager.Instance.RegisterTracker(this); } //Iterate through the slot UI elements and assign it its reference slot index public void AssignSlotIndexes() { for (int i = 0; i < toolSlots.Length; i++) { toolSlots[i].AssignIndex(i); itemSlots[i].AssignIndex(i); } } //Render the inventory screen to reflect the Player's Inventory. public void RenderInventory() { //Get the inventory tool slots from Inventory Manager ItemData[] inventoryToolSlots = InventoryManager.Instance.tools; //Get the inventory item slots from Inventory Manager ItemData[] inventoryItemSlots = InventoryManager.Instance.items; //Render the Tool section RenderInventoryPanel(inventoryToolSlots, toolSlots); //Render the Item section RenderInventoryPanel(inventoryItemSlots, itemSlots); //Render the equipped slots toolHandSlot.Display(InventoryManager.Instance.equippedTool); itemHandSlot.Display(InventoryManager.Instance.equippedItem); //Get Tool Equip from InventoryManager ItemData equippedTool = InventoryManager.Instance.equippedTool; //Check if there is an item to display if (equippedTool != null) { //Switch the thumbnail over toolEquipSlot.sprite = equippedTool.thumbnail; toolEquipSlot.gameObject.SetActive(true); return; } toolEquipSlot.gameObject.SetActive(false); } //Iterate through a slot in a section and display them in the UI void RenderInventoryPanel(ItemData[] slots, InventorySlot[] uiSlots) { for (int i = 0; i < uiSlots.Length; i++) { //Display them accordingly uiSlots[i].Display(slots[i]); } } public void ToggleInventoryPanel() { //If the panel is hidden, show it and vice versa inventoryPanel.SetActive(!inventoryPanel.activeSelf); RenderInventory(); } //Display Item info on the Item infobox public void DisplayItemInfo(ItemData data) { //If data is null, reset if (data == null) { itemNameText.text = ""; itemDescriptionText.text = ""; return; } itemNameText.text = data.name; itemDescriptionText.text = data.description; } //Callback to handle the UI for time public void ClockUpdate(GameTimestamp timestamp) { //Handle the time //Get the hours and minutes int hours = timestamp.hour; int minutes = timestamp.minute; //AM or PM string prefix = "AM "; //Convert hours to 12 hour clock if (hours > 12) { //Time becomes PM prefix = "PM "; hours = hours - 12; Debug.Log(hours); } //Format it for the time text display timeText.text = prefix + hours + ":" + minutes.ToString("00"); //Handle the Date int day = timestamp.day; string season = timestamp.season.ToString(); string dayOfTheWeek = timestamp.GetDayOfTheWeek().ToString(); //Format it for the date text display dateText.text = season + " " + day + " (" + dayOfTheWeek + ")"; } }
August 26, 2023 at 12:16 am #11825TerenceKeymaster::Hi Ondra, it doesn’t seem there is anything wrong with your script. You may want to check the Inspector of all relevant GameObjects to see if you forgot to assign anything.
August 26, 2023 at 12:46 am #11826Ondra Dwi Putra Adi SetyoParticipant::Hello Terence. I did as you asked but I didn’t think I see anything wrong or error. This is the Manager Inspector looks like in mine.
August 26, 2023 at 4:01 pm #11830Jonathan TeoModerator::Hi Ondra,
Since it looks like the status bar is working and the hand slots seem to be assigned in UIManager, the next step is to check:
- toolHandSlot is correctly assigned to the corresponding hand slot (You can click on it in the inspector and the referenced GameObject will be highlighted in the Inspector
- The Hand Slot referenced has all its referenced components assigned correctly
- Nothing is amiss in the HandInventorySlot and its parent InventorySlot class (especially the Display function)
August 27, 2023 at 3:23 am #11838Ondra Dwi Putra Adi SetyoParticipant::Hello Jonathan, thank you for your reply.
1. I’m sorry for this since it seems I kinda forgot but which is the toolHandSlot in the Hierarchy?
2. Please check if there is anything wrong.
August 27, 2023 at 3:27 am #11839Ondra Dwi Putra Adi SetyoParticipant::Hello Jonathan, thank you for the reply and since it seems I can’t post an image, then I will answer your reply.
1. It is in the Hierachy of Inventory Panel? If so, which one is it? The Hand Slot or the Inventory Slots?
2. I did it correctly but missing the Quantity Text.
3. For my Inventory Slot, it is like this:using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; public class HandInventorySlot : InventorySlot { public override void OnPointerClick(PointerEventData eventData) { //Move item from hand to inventory InventoryManager.Instance.HandToInventory(inventoryType); } }
August 27, 2023 at 12:27 pm #11841TerenceKeymaster::Hi Ondra,
Somehow your posts keep getting flagged as spam. I apologise for that. I have unflagged your posts with the images, so you should see it above.
1. Jonathan is referring to the Tool Hand Slot property on your UIManager component. Click on the assigned object in the slot to see what GameObject is assigned to it. You want to make sure that it is the UI GameObject that represents your hand slot.
2. Do you mean that the Quantity Text property is not revealed? Or that you haven’t assigned a GameObject into Quantity Text?
3. Looks about right.If you continue to run into issues, for a small fee, either me or Jonathan can jump into a video call with you to run through and fix the issues with you.
August 28, 2023 at 10:08 pm #11848Ondra Dwi Putra Adi SetyoParticipant::Hi Terence, thank you for the reply.
And somehow my reply always failed. I don’t know how that is happens.
1. It is already correctly assigned which is very weird.
2. Yeah, I did as the video tutortial did but it wasn’t there or wasn’t exist.August 28, 2023 at 10:16 pm #11836Ondra Dwi Putra Adi SetyoParticipant::Hi Jonathan, thank you for the reply and answers some of the points.
1. I’m sorry for it but since english isn’t my native, I didn’t understand it very well by that. Which is the one you referenced?
2. Please check if anything wrong with it.
August 28, 2023 at 10:16 pm #11837Ondra Dwi Putra Adi SetyoParticipant::Hello Jonathan, thank you for taking your time to reply.
1. Can you tell me which is it? I kinda forgot.
2. Please check if there is anything wrong with it.
August 28, 2023 at 10:37 pm #11852TerenceKeymaster::Hi Ondra, we will need to do a video call with you to pinpoint the issue, as it is quite difficult to do it by sharing images.
If you do decide to do the call, you can contact us at https://terresquall.com/contact
You can also wait until you have a longer list of questions before you decide to do the call, so you can get your money’s worth!
Alternatively, do mull over the issue. When I first started learning programming, I would get stuck with a bug for a very long time, but if I kept trying to find a possible fix every day, I would eventually find it. Sometimes it may take a few days or a week, but you will eventually find the fix if you don’t give up!
-
AuthorPosts
- You must be logged in to reply to this topic.
Advertisement below: