Hello, I have a prefab called ‘Enemy’ and I wanted to instantiate it with an existing script as a new script for new variables ! Like instantiate the script into the instance of the ‘Enemy’ to acces new variables !
I tried to found the answer but that takes me one day of time…! I code in C#
Thanks to everyone in advance ! 
If you instantiated an object that already has the script, you can get it with GetComponent. Like :
public Stuff InstantiateNewStuff (Stuff stuff)
{
GameObject g = Instanciate (stuff.gameObject);
return g.GetComponent<Stuff>();
}
If the game object doesn’t have it, you can simply add it :
GameObject newGameObject = Instanciate (prefabReference);
newGameObject.AddComponent<Stuff>();
@UnityCoach In this case, i want my bullet ‘penetration’ to, everytime OnTriggerEnter2D collide an enemy, divide the Damage do to the enemy by 2 every next enemy the bullet collide ! But when I shoot, the bullet appear, the bullet do damage, But right next, I shoot the second bullet that takes the count of my first bullet
Here’s my Bullet script :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Shoot2 : MonoBehaviour
{
public static float ColliderNum;
public float ActualCount;
public static float DivDamage;
private void Start()
{
DivDamage = 1f;
ColliderNum = 0f;
}
public void OnTriggerEnter2D(Collider2D Col)
{
if (Col.tag == "Enemy" || Col.tag == "Enemy2")
{
DivDamage += 1f;
ColliderNum += 1f;
if (ColliderNum == BulletPenetration.NumOfCol)
{
DivDamage = 1f;
ColliderNum = 0f;
Destroy(gameObject);
}
}
if (Col.tag == "Wall")
{
DivDamage = 1f;
ColliderNum = 0f;
Destroy(gameObject);
}
}
}
Here’s my Bullet Penetration Script :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class BulletPenetration : MonoBehaviour
{
public float PRICE4;
public float HM4;
public Text text4;
public Button bouton4;
public Color colorgreen;
public static float NumOfCol;
private void Start()
{
NumOfCol = 1f;
PRICE4.ToString("n2");
colorgreen.g = 0.5f;
bouton4.image.color = Color.red;
PRICE4 = PlayerPrefs.GetFloat("PRICE4", 0.89f);
HM4 = PlayerPrefs.GetFloat("HM4", 0f);
}
private void OnDestroy()
{
PlayerPrefs.SetFloat("PRICE4", PRICE4);
PlayerPrefs.SetFloat("HM4", HM4);
}
private void Update()
{
if (EUROSARGENT.EUROS <= PRICE4)
{
bouton4.image.color = Color.red;
}
else if (EUROSARGENT.EUROS >= PRICE4)
{
bouton4.image.color = colorgreen;
}
text4.text = ("Bullet P Lenght" + ("
€=" + PRICE4) + ("
You Bought " + HM4));
}
public void Buy004()
{
if (EUROSARGENT.EUROS >= PRICE4)
{
EUROSARGENT.EUROS -= PRICE4;
PRICE4 = Mathf.Round(PRICE4 * 110f) / 100f;
HM4 += 1f;
NumOfCol += 1;
}
}
}
And Here’s my EnemySpawn script :
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class EnemySpawn : MonoBehaviour
{
public Slider slidemyins;
public float speed;
public float EnemyLifeMAX;
public float EnemyLife;
public float EnemyLifeODD;
public float DoPlayerDamage;
public static float DoEnemyDamage;
public float bulletdamage;
IEnumerator PlayerDamage()
{
yield return new WaitForSeconds(0.94f);
PlayerShoot.PlayerHealth -= DoPlayerDamage;
yield return PlayerDamage();
}
private void OnTriggerEnter2D(Collider2D col)
{
if (col.tag == "Bullet")
{
EnemyLifeODD -= bulletdamage / Shoot2.DivDamage;
}
if (col.tag == "Player")
{
gameObject.GetComponent<EnemySpawn>().speed = 0.0001f;
StartCoroutine(PlayerDamage());
}
else
{
StopCoroutine(PlayerDamage());
gameObject.GetComponent<EnemySpawn>().speed = 50f;
}
}
void Start()
{
speed = 50f;
DoPlayerDamage = 0.00001f;
EnemyLifeMAX = 0.0003f;
EnemyLife = 0.0003f;
EnemyLifeODD = 0.0003f;
slidemyins.GetComponent<Slider>();
}
void Update()
{
bulletdamage = BulletDamage.DEALENEMYDAMAGE;
slidemyins.GetComponent<Slider>().maxValue = EnemyLifeMAX;
slidemyins.GetComponent<Slider>().value = EnemyLifeODD;
Vector2 Position = transform.position;
Position = new Vector2(Position.x - speed * Time.deltaTime, Position.y);
transform.position = Position;
if (gameObject.GetComponent<EnemySpawn>().EnemyLifeODD <= 0)
{
gameObject.SetActive(false);
EUROSARGENT.GetTheMoney();
}
}
}
Thanks to @UnityCoach for helping me through this !!!
Here’s my 2 scripts :
Bullet Script :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Bullet : MonoBehaviour
{
public float damage = 0.000092f;
private static int numberOfEnemyCollisions;
// use OnEnable to reset values, if you come to use some Object Pooling as Awake and Start will only ba called once
private void OnEnable()
{
damage = 0.000092f;
numberOfEnemyCollisions = 0;
}
public void OnTriggerEnter2D(Collider2D Col)
{
if (Col.tag == "Enemy" || Col.tag == "Enemy2")
{
numberOfEnemyCollisions += 1;
Col.gameObject.SendMessage("ApplyDamage", damage, SendMessageOptions.RequireReceiver); // send a message to the enemy gameobject that has an ApplyDamage (float damage) method
damage /= 2.25f; // divide the damage every time you hit
if (numberOfEnemyCollisions == BulletPenetration.NumOfCol)
{
Destroy(gameObject, 0.1f);
numberOfEnemyCollisions = 0;
}
// destroy the bullet if its damage has come under a given threshold
}
if (Col.tag == "Wall")
{
Destroy(gameObject);
}
}
IEnumerator SetTo0()
{
yield return new WaitForSeconds(1);
}
}
Enemy script :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Enemy : MonoBehaviour
{
public float health = 0.0003f;
public Slider slidemyins;
public float EnemyLifeMAX;
// damage property to handle damage and destruction
private float _damage;
public float Damage
{
get { return _damage; }
set
{
if (value != _damage)
{
_damage = value;
if (_damage > health)
Destroy(gameObject); // destroy when damage reaches a critical level
}
}
}
// messages can be private, just like other builtin messages like Start and Update
private void ApplyDamage(float damage)
{
Damage += damage;
}
private void Start()
{
slidemyins = GetComponentInChildren<Slider>();
gameObject.GetComponent<Enemy>().EnemyLifeMAX = 0.0003f;
gameObject.GetComponent<Enemy>().health = 0.0003f;
}
private void Update()
{
slidemyins.GetComponent<Slider>().maxValue = EnemyLifeMAX;
slidemyins.GetComponent<Slider>().value = _damage;
}
}