- Home /
How to get the position of a new Instantiated prefab
Hi to everybody!!
I have two same enemies already instantiated in the scene from a unique prefab "Dogor (clone)" and I'm instantiating also one bullet to make both to shoot the same bullet, I'm managing the RUN and SHOOT with the animator, and both clones are moving independently fine, the problem is tht the bullet prefab is alway getting the possition of the first enemy clone created, so, in the photo below you can see that the bullet is coming out from the second clone, not the first one that is in the range of shooting. I'm going to attach also the code that I'm using inside of the animator to instantiate the bullet object.
using System.Collections; using System.Collections.Generic; using UnityEngine;
public class Fire_Dogor_1 : StateMachineBehaviour { //public GameObject Dogor; Transform enemy_2; Dogor_Script DS; public float Shootperiod = 0.50f; public GameObject BalaPrefab; public float LastShoot; public float distance;
// OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
enemy_2 = GameObject.FindGameObjectWithTag("Dogor").transform;
}
// OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
if (Time.time > LastShoot + Shootperiod)
{
Vector3 direction;
if (enemy_2.transform.localScale.x == 1.0f) direction = Vector3.right;
else direction = Vector3.left;
GameObject Bala = Instantiate(BalaPrefab, enemy_2.transform.position + direction * 0.1f, Quaternion.identity);
Bala.GetComponent<Bala_Script>().SetDirection(direction);
LastShoot = Time.time;
animator.SetBool("Fire", false);
}
}
// OnStateExit is called when a transition ends and the state machine finishes evaluating this state
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
animator.SetBool("Fire", false);
}
Please give me a hand, I'm blocked with this like a week or more, this problem doesn't allow me to instantiate the enemies in my game!!,
Thank you very much in advance!!
Answer by LucasMartin · Mar 27 at 03:47 PM
This is because you are using GameObject.FindGameObjectWithTag. In this case, this method will return the first instance created. One of the things that you could do is having a separate script for controlling the bullets and attach it to each individual enemy. This way, you can get a reference for each enemy and instanciate the bullet at the enemy's position. Something like that:
public class BulletController : MonoBehaviour
{
public GameObject bulletPrefab;
public Transform positionToInstanciateTheBullet;
public void InstanciateBullet()
{
GameObject bulletInstance = Instantiate(bulletPrefab, positionToInstanciateTheBullet);
}
}
From here, you have two options: if you are using the new input system, you can just call InstanciateBullet() from an input callback context. Otherwise, you can just add the Update() method in the BulletController and call it from there:
private void Update()
{
//add any other conditions that you want and change the input button
if (Input.GetButtonDown("Fire1"))
InstanciateBullet();
}
This is much easier than using animations to call this function. Give it a try :)
@LucasMartin Finally!, thank you very much!!, it was easy to implement also, now I have not more excuses!!
Your answer
Follow this Question
Related Questions
changing scene vs. instantiated prefabs 1 Answer
Instanitiate PreFabs and let them move to different locations 1 Answer
How to tell which enemys to create in new battle scene 1 Answer
Instatiate to the next scene prefabs from an array 1 Answer
How to spawn a 'boss' after all enemies defeated and then kill that 'boss'? 1 Answer