- Home /
How to share varibles betweent scripts
public class Weapon : MonoBehaviour
{
public float normalDamage;
public float fireRate;
public float damage = 5;
public float range;
public float radius;
public float reloadTime;
public float fireTimer;
public float delay;
public float basedamage;
}
public class Projectile : MonoBehaviour
{
void OnCollisionEnter(Collider other)
{
if(other.GetComponent<EnemyHealth>() != null)
{
other.GetComponent<EnemyHealth>().TakeDamage(damage);
}
}
}
How do I get the damage from my weapon scripts to work in my projectile script. I've tried so many other methods and it just not working.
I edited your post, I assume it was wrongly pasted as the initial code would not compiled (you were missing a } to close the Weapon class). Please review the edit.
Answer by toddisarockstar · Dec 21, 2018 at 05:01 AM
you use a component lookup like this:
GetComponent<nameOfScriptYouAreLookingFor> ().somevariable = true;
Answer by cdr9042 · Dec 21, 2018 at 05:11 AM
There are many ways, here is one:
In the weapon's shoot function:
GameObject proj = Instantiate( //your instantiate code );
proj.GetComponent<Projectile>().Init(this); //pass reference to this instance
Put this in Projectile:
public Weapon m_Weapon;
public void Init(Weapon weapon)
{
m_Weapon = weapon;
}
then in your deal damage code
other.GetComponent<EnemyHealth>().TakeDamage(m_Weapon.damage);
Answer by fafase · Dec 22, 2018 at 09:53 AM
Here needs be considered the architecture and logic. Most likely a Weapon should include a projectile as it is the logical way of things (You use a certain type of bullet with a given rifle in real life, not the other way around).
So your weapon class would include the Projectile it is using. This way you can pass how much damage a projectile should do based on what weapon is using it, just like in real.
Your weapon class should handle the input so when user presses a button, a projectile is created (or used from a pool) and the damage value is given to it.
public class Weapon : MonoBehaviour
{
[SerializedField] protected GameObject projectile;
[SerializedField]protected float damage;
protected virtual void Update(){
if(Input.GetKeyDown(KeyCode.Space)){ CreateProjectile(); }
}
protected virtual void CreateProjectile(){
GameObject obj = (GameObject) Instantiate(this.projectile);
obj.GetComponent<Projectile>().Init(this.damage);
}
}
pubic class Projectile : MonoBehaviour
{
[SerializedField] protected float initialDamage;
protected float actualDamage;
public virtual void Init(float weaponDamage){
// Here we could say that projectile has initial damage that is multiplied by weapon damage
this.actualDamage = this.initialDamage * weaponDamage;
}
protected virtual void OnCollisionEnter(Collider other)
{
EnemyHealth ea = other.GetComponent<EnemyHealth>();
if(ea == null){ return; }
ea.TakeDamage(this.actualDamage);
}
}
Notice that most methods and references are protected and/or virtual. This is because you should make your Weapon and Projectile classes as abstract. You don't find a weapon in real, you find a AK-47 that is a weapon. So you could consider a subclass Ak that inherits from Weapon and takes care of its own data.
As for the code, when the space bar is pressed down, it will create a new projectile and on creation, it will pass down some data (there could be more than just a float). This is simple but could get you going in a good direction.
Answer by H1ddeNGames · Dec 22, 2018 at 11:09 AM
I am assuming your Weapon class can make things like Axes, Swords, and projectile throwing weapons like Arrow/Bow and Throwing Knives. If this is a correct assumption then you can do something like this:
public class Projectile : MonoBehaviour
{
// Get a reference to the Weapon that created this Projectile. You would set this in the inspector.
public Weapon weapon;
// Since the variables in your Weapon class are public you can call on them like this:
Debug.Log(weapon.damage);
void OnCollisionEnter(Collider other)
{
if(other.GetComponent<EnemyHealth>() != null)
{
other.GetComponent<EnemyHealth>().TakeDamage(weapon.damage);
}
}
}