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);
     }
 
     
 }
 
 
              Answer by hexagonius · Feb 16, 2017 at 08:53 PM
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[i].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.
Thank you! I had to do a few changes but this got me back on the right path I was off lol
Your answer