Random.value for each GameObject.

Hey, I’ve got a script for an enemy space ship, and near the bottom I have it to where when the PlayerProjectile hits the object it destroys and spawns a pickup. But I different types such as Health, shield etc… How would I add a Random.Value drop rate for each item such as 10% for health 30% for shield? Any help you guys can give is greatly appreciated

using System.Collections;
using System.Collections.Generic; 
using UnityEngine;

public class EnemyControllerBasic : MonoBehaviour
{


    [SerializeField]
    float MoveSpeed = 5.0f;

    private ShipPlayerController PlayerShipCtrl;

    [SerializeField]
    GameObject[] PickupTypes;

    private GameObject BadPickup;

    private GameObject Pickup;

    private GameObject PickupShield;

    private GameObject PickupHealth;

    

   

    // Use this for initialization
    void Start()
    {
        Destroy(gameObject, 5.0f);

        GameObject playerShip = GameObject.Find("PlayerShip");

        PlayerShipCtrl = playerShip.GetComponent<ShipPlayerController>();

       
    }

    // Update is called once per frame
    void Update()
    {

        transform.position +=
            transform.up * Time.deltaTime * MoveSpeed;

    }

    void OnTriggerEnter(Collider other)
    {
        if (other.tag == "PlayerProjectile")
        {
            Destroy(gameObject);

            SpawnPickup();
        }

        else if (other.tag == "PlayerShip")
        {
            Destroy(gameObject);

            PlayerShipCtrl.ModScore(-3);
        }

    }

    void SpawnPickup()
    {

         int randIndex = Random.Range(0, PickupTypes.Length);


        if (Random.value > 0.5)

            Instantiate(PickupTypes[randIndex],
            transform.position, transform.rotation);
    }

    
}

Sounds like you want to match a percentage to an Item. So you might want to replace this:

[SerializeField]
     GameObject[] PickupTypes;
 
     private GameObject BadPickup;
 
     private GameObject Pickup;
 
     private GameObject PickupShield;
 
     private GameObject PickupHealth;

with that:

[System.Serializable]
public struct PickupChance{
  public GameObject pickup;
  [Range(0,100)]public int chance;
}

[SerializeField] PickupChance[] PickupTypes;

int totalChance;

void Start(){
  foreach(var p in PickupTypes)
    totalChance += p.chance;
}

GameObject GetPickupForChance(int chance){
  int currentChance;
  for(int i = 0; i < PickupTypes.Length; i++){
    if (currentChance > chance){
      return PickupTypes[i - 1].pickup;
    currentChance +=PickupTypes*.chance;*

}
return PickupTypes[PickupTypes.Length - 1].pickup;
}
}
Then you can do:
int randIndex = Random.Range(0, totalChance);
Since the chances are all just relative to each other, their sum makes for 100% no matter the values. I think that’s easier than counter adjusting for a total of 100% all the time.