Need help with 3d inventory system
Hey guys, I have been messing around with a 3d RPG type game, and I have had trouble with an inventory type system. I basically want 3 weapons on each side, representing each hand. You can select each one using arrow keys, left with scroll through left side, right will scroll through right side.
If there is nothing there, and it instantiate a fist collider instead. What is happening though, is I have 6 slots for the inventory, 0-2 is left side and 3-5 is the right side, but when I have a weapon in my first slot, [0], I debug.log the name, and it recognizes that its at inventory[0], but when I see if its selected, it waits until i scroll to slot where [1] is supposed to be, the second slot, then it applies it. So it seems to be that when the first slot is selected, it recognizes it as inventory [1], I dont know how this is possible lol. Here is my code, maybe I have an easy mistake? inventory is a list, but I turn it into an array so that the player can choose which slot to put the weapon they pick up. I heard this is easier incase I want to do like a bag system, so I can just do inventory.add.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Inventory : MonoBehaviour {
public List<GameObject> inventory = new List<GameObject>();
public Image[] slots;
Player player;
GameObject leftEquipped;
private void Awake()
{
slots[0].transform.parent.transform.FindChild("Selected").gameObject.SetActive(true);
slots[3].transform.parent.transform.FindChild("Selected").gameObject.SetActive(true);
player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>();
}
private void FixedUpdate()
{
for (int i = 0; i < inventory.Count; i++)
{
if (inventory[i] != null)
{
slots[i].sprite = inventory[i].GetComponent<Item>().itemIcon;
slots[i].color = Color.white;
}
}
Debug.Log(inventory[0].name);
}
private void Update()
{
SelectItem();
//UpdateInventory();
}
public void InventoryAdd(int input, string name, int id, Sprite icon, GameObject go)
{
GameObject[] i = inventory.ToArray();
int arrayNum = input - 1;
i[arrayNum] = (GameObject)Resources.Load("Weapons/" + name);
slots[arrayNum].sprite = icon;
inventory = new List<GameObject>(i);
bool left = input >= 1 && input <= 3;
EquipWeapon(inventory[input].name, left);
}
//void UpdateInventory()
//{
// for (int i = 0; i < inventory.Count; i++)
// {
// if (inventory[i] == null)
// {
// Image image = slots[i];
// Color newColor = image.color;
// image = null;
// newColor.a = 0;
// image.color = newColor;
// }
// else
// return;
// }
//}
void SelectItem()
{
bool leftArrow = Input.GetKeyDown(KeyCode.LeftArrow);
bool rightArrow = Input.GetKeyDown(KeyCode.RightArrow);
if (leftArrow)
{
GameObject slot1 = slots[0].transform.parent.transform.FindChild("Selected").gameObject;
GameObject slot2 = slots[1].transform.parent.transform.FindChild("Selected").gameObject;
GameObject slot3 = slots[2].transform.parent.transform.FindChild("Selected").gameObject;
bool slot1Active = slot1.activeSelf;
bool slot2Active = slot2.activeSelf;
bool slot3Active = slot3.activeSelf;
if (slot1Active)
{
Debug.Log("OWOWOWOWOWO");
slot2.SetActive(true);
slot1.SetActive(false);
if (inventory[0] != null)
EquipWeapon(inventory[0].name, true);
else
EquipFist(true);
}
if (slot2Active)
{
slot3.SetActive(true);
slot2.SetActive(false);
if (inventory[1] != null)
EquipWeapon(inventory[1].name, true);
else
EquipFist(true);
}
if (slot3Active)
{
slot1.SetActive(true);
slot3.SetActive(false);
if (inventory[1] != null)
EquipWeapon(inventory[1].name, true);
else
EquipFist(true);
}
}
else if (rightArrow)
{
GameObject slot4 = slots[3].transform.parent.transform.FindChild("Selected").gameObject;
GameObject slot5 = slots[4].transform.parent.transform.FindChild("Selected").gameObject;
GameObject slot6 = slots[5].transform.parent.transform.FindChild("Selected").gameObject;
bool slot4Active = slot4.activeSelf;
bool slot5Active = slot5.activeSelf;
bool slot6Active = slot6.activeSelf;
if (slot4Active)
{
slot5.SetActive(true);
slot4.SetActive(false);
if (inventory[4] != null)
EquipWeapon(inventory[4].name, false);
else
EquipFist(false);
}
if (slot5Active)
{
slot6.SetActive(true);
slot5.SetActive(false);
if (inventory[5] != null)
EquipWeapon(inventory[5].name, false);
else
EquipFist(false);
}
if (slot6Active)
{
slot4.SetActive(true);
slot6.SetActive(false);
if (inventory[6] != null)
EquipWeapon(inventory[6].name, false);
else
EquipFist(false);
}
}
}
void EquipWeapon(string name, bool left)
{
if (left)
{
Destroy(player.leftHand.transform.GetComponentInChildren<HitCollider>().gameObject);
leftEquipped = (GameObject)Instantiate(Resources.Load("Weapons/" + name), player.leftHand.transform, false);
leftEquipped.GetComponentInChildren<Canvas>().gameObject.SetActive(false);
}
else
{
Destroy(player.rightHand.transform.GetComponentInChildren<HitCollider>().gameObject);
leftEquipped = (GameObject)Instantiate(Resources.Load("Weapons/" + name), player.rightHand.transform, false);
leftEquipped.GetComponentInChildren<Canvas>().gameObject.SetActive(false);
}
}
void EquipFist(bool left)
{
if (left)
{
Destroy(player.leftHand.transform.GetComponentInChildren<HitCollider>().gameObject);
leftEquipped = (GameObject)Instantiate(Resources.Load("Weapons/Fist"), player.leftHand.transform, false);
}
else
{
Destroy(player.rightHand.transform.GetComponentInChildren<HitCollider>().gameObject);
leftEquipped = (GameObject)Instantiate(Resources.Load("Weapons/Fist"), player.rightHand.transform, false);
}
}
}