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