- Home /
How to call function from another script on an instantiated Prefab?
I have a simple game where an enemy spawns, player clicks on enemy with mouse and it explodes and destroys itself, then a new enemy appears and repeats this process over and over again.
I have two scripts:
(MainScript.cs) attached to null GameObject, handles spawning and detecting the ray hit on the enemy (ExplodeScript.cs) attached to the prefab, handles the explosion and destruction of the prefab.
I am trying to use the GetComponent command to access the ExplodeScript's Explosion() method, but am getting "Null ReferenceException: Object reference not set to an instance of an object" when I click on the first enemy that spawns.
Any help would be appreciated!
Here's my code:
(MainScript)
using UnityEngine;
using System.Collections;
public class MainScript : MonoBehaviour {
Ray ray;
RaycastHit hit;
public GameObject prefab;
public int numberOfObjects;
public float radius;
void Awake () {
}
void Start () {
// Initialize ray
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Instantiate (prefab, new Vector3(1,1,1), Quaternion.identity);
}
void Update () {
ShootObject();
}
void ShootObject() {
// Use Input.GetKeyDown() for single clicks
if(Input.GetKeyDown(KeyCode.Mouse0))
{
// Reset ray with new mouse position
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
// Check to see if something got hit
if(Physics.Raycast(ray, out hit)) {
if(hit.transform.tag == "enemy") {
GameObject.Find("PrefabEnemy").GetComponent<ExplodeScript>().Explode();
Debug.Log("Enemy object HIT!");
}
}
}
}
}
(ExplodeScript)
using UnityEngine;
using System.Collections;
public class ExplodeScript : MonoBehaviour {
public GameObject explosion;
public AudioClip explosionSound;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
public void Explode () {
Instantiate(explosion,transform.position,Quaternion.identity);
AudioSource.PlayClipAtPoint(explosionSound, transform.position);
Destroy(this.gameObject);
}
}
Check the Object name you are finding
Here you are finding "PrefabEnemy"
Since you are instantiating the prefab runtime the name of the Game object will be "PrefabEnemy(Clone)".
You need to find the Object with this name "PrefabEnemy(Clone)" ins$$anonymous$$d of "PrefabEnemy".
Check it in the editor run time and post the result.
Answer by Linus · Feb 21, 2014 at 03:27 PM
Although this is UnityScript there is not much difference. i copy pasted something i had open in editor. You should get what you need from it.
var newPrefab : GameObject = Instantiate (prefab, Vector3(xIndex*0.32, yIndex*0.32, 0), Quaternion.identity);
var explosionComponentOnNewPrefab : ExplodeScript = newPrefab.transform.GetComponent(ExplodeScript);
explosionComponentOnNewPrefab.Explode();
Answer by Dblfstr · Feb 21, 2014 at 03:31 PM
make explode a static function and call it like this.
Psuedo Code:
Explode script.
public static void Explode(){
//All your code
}
main script
if (keydown)
if (hit)
ExplodeScript.Explode();
Your answer

Follow this Question
Related Questions
The name 'Joystick' does not denote a valid type ('not found') 2 Answers
Can someone help me fix my Javascript for Flickering Light? 6 Answers
Material doesn't have a color property '_Color' 4 Answers
Problem with UI Button calling function [4.6 UI] 1 Answer
Activating function on another object script - annoying... 1 Answer