UNITY C# - Come scegliere un elemento di enum da stringa.

Discussioni su qualunque linguaggio di programmazione o engine
Rispondi
Avatar utente
Paperpaint
Membro attivo
Messaggi: 375
Iscritto il: 02/01/2014, 16:19
Specialità: Visionario lol
Uso: GameMaker 8.1
Contatta:

UNITY C# - Come scegliere un elemento di enum da stringa.

Messaggio da Paperpaint »

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. :D

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 9 ospiti