Salve, questo che sto scrivendo è un problema che ho riscontrato mentre programmavo su Unity.
In poche parole ho fatto questo:
Spoiler
Codice: Seleziona tutto
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class weaponSelection : MonoBehaviour
{
public GameObject[] inInventory = new GameObject[(int)INVENTORY_Melee.Empty];
public string storedWeapon;
public GameObject activeWeapon;
public GameObject selectedWeapon;
public GameObject oldWeapon;
public enum INVENTORY_Melee
{
Empty,
Fists,
Hammer,
SlotCount
}
public enum INVENTORY_Guns
{
Empty,
NailGun,
RevolverM_500,
SlotCount
}
public enum INVENTORY_ShotGuns
{
Empty,
SlotCount
}
public enum INVENTORY_MachineGuns
{
Empty,
SlotCount
}
public enum INVENTORY_Explosives
{
Empty,
SlotCount
}
public enum INVENTORY_Rifles
{
Empty,
SlotCount
}
// Use this for initialization
void Start()
{
activeWeapon = inInventory[(int)INVENTORY_Melee.Hammer - 1];
selectedWeapon = activeWeapon;
}
// Update is called once per frame
void Update()
{
if (selectedWeapon == activeWeapon)
{
// activeWeapon.SetActive(true);
if (Input.anyKeyDown)
{
switch (Input.inputString)
{
case "0":
break;
case "1":
GameObject activeMelee = inInventory[(int)INVENTORY_Melee.Hammer - 1];
selectedWeapon = activeMelee;
break;
case "2":
GameObject activeGun = inInventory[(int)INVENTORY_Guns.NailGun];
selectedWeapon = activeGun;
break;
case "3":
GameObject activeShotgun = inInventory[(int)INVENTORY_ShotGuns.Empty];
selectedWeapon = activeShotgun;
break;
case "4":
GameObject activeMachineGun = inInventory[(int)INVENTORY_MachineGuns.Empty];
selectedWeapon = activeMachineGun;
break;
case "5":
GameObject activeExplosive = inInventory[(int)INVENTORY_Explosives.Empty];
selectedWeapon = activeExplosive;
break;
case "6":
GameObject activeRifle = inInventory[(int)INVENTORY_Rifles.Empty];
selectedWeapon = activeRifle;
break;
default:
break;
}
}
}
else
{
oldWeapon = activeWeapon;
oldWeapon.SetActive(false);
activeWeapon = selectedWeapon;
}
}
}
Questo script dovrebbe ricreare il tipico inventario di fps arena: ogni slot una classe diversa di arma.
La situazione non è poi così complicata se si fa in modo che uno slot sia non selezionabile se non si ha raccolto l'arma in questione, ma qui diviene più complicato... infatti ognuno dei 6 slot può ospitare diverse armi della stessa classe: slot 1 contiene coltello, vedo una katana, siccome è un'arma da mischia, questa verrà automaticamente sostituita al coltello che stava nello slot 1, rilasciando così l'arma indesiderata a terra. Ho usato degli enum per ogni classe di arma e ho fatto in modo con un array io possa controllare il contenuto.
Il problema è questo: fare in modo che l'arma colpita dal raycast di interazione con E, possa prelevare il nome dell'arma e comunicarlo all'array dello slot dello script WeaponSelection, facendo così equivalere l'array di GameObject activeMelee, come Hammer dell'enum INVENTORY_Melee.
Quindi prendi il nome dell'oggetto con cui il raycast ha colliso, con questo nome fai equivalere il contenuto dell'array activeMelee a Hammer dell'enum INVENTORY_Melee.
Spoiler
Codice: Seleziona tutto
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Interaction : MonoBehaviour {
public int weaponEnumIndex = 0;
public float fireRate = 0.3f;
public float nextFire;
public float range = 300f;
public RaycastHit hit;
public Transform myTransform;
public string pickedObj;
WeaponSelection.INVENTORY_Melee inventoryMelee;
// Use this for initialization
void Start ()
{
myTransform = transform;
}
// Update is called once per frame
void Update ()
{
if (Input.GetKey(KeyCode.E) && Time.time > nextFire)
{
nextFire = Time.time + fireRate;
//Interazione
//Debug.DrawRay(myTransform.TransformPoint(0,0,1), myTransform.forward, Color.green, 3f);
if(Physics.Raycast(myTransform.TransformPoint(0,0,1), myTransform.forward, out hit, range))
{
if (hit.transform.CompareTag("WEAPON_Melee"))
{
GameObject inventory = GameObject.Find("Weapons");
WeaponSelection inventoryScript = inventory.GetComponent<WeaponSelection>();
pickedObj = hit.transform.name;
inventoryScript.storedWeapon = inventoryScript.inInventory[pickedObj];
//converti int in stringa, non il contrario.
}
else
{
}
}
}
}
}
Qui ho provato a fare quello che volevo, ma senza successo.
Se proprio non è possibile fare un controllo su una stringa, lo si potrebbe fare su un int visto che ogni enum è di tipo int?
Grazie ragazzi.