Make a game object face another game object when instantiated
I am making a 2D asteroids game and I am trying to add an alien ship that shoots at the player (which is called 'ship') once every 2 seconds. I can get the alien ship to drop the bullet every 2 seconds, but can not get the bullet to move towards the ship. The bullet is a prefab. Can someone please explain how I would get the bullet prefab to move toward the ships position when instantiated?
This is the script to make the alien ship shoot the bullet:
using UnityEngine;
using System.Collections;
public class AlienShootScript : MonoBehaviour
{
public GameObject AlienBulletPrefab;
public Transform Ship;
void Start ()
{
StartCoroutine (onCoroutine());
}
IEnumerator onCoroutine()
{
while(true)
{
Instantiate (AlienBulletPrefab, transform.position, transform.LookAt (Ship.transform.position));
yield return new WaitForSeconds(2f);
}
}
void Update ()
{
}
}
and here is the script for the bullet prefab that is supposed to shoot at the player:
using UnityEngine;
using System.Collections;
public class AlienBulletScript : MonoBehaviour
{
public float Thrust;
public Rigidbody2D rb;
public GameObject Ship;
void Start ()
{
rb = GetComponent<Rigidbody2D> ();
}
void Update ()
{
rb.AddRelativeForce (Vector3.up * Thrust);
}
}
Thrust is set to 10.
Answer by Jessespike · Aug 21, 2015 at 06:09 PM
I'm not a Physics expert. But I think there's two ways you can go about this. Depending whether the rigidBody is kinematic or not.
void Start ()
{
rb = GetComponent<Rigidbody2D> ();
/*if isKinematic is false*/
rb.AddRelativeForce (GetComponent<Transform>().forward * Thrust);
}
/*if isKinematic is true*/
void FixedUpdate ()
{
Transform bulletTransform = GetComponent<Transform>();
rb.MovePosition(bulletTransform + (bulletTransform.forward * Thrust));
}
Answer by NeverHopeless · Aug 21, 2015 at 09:40 PM
transform.LookAt property should do the job. Try changing the code like below:
AlienShootScript:
using UnityEngine;
using System.Collections;
public class AlienShootScript : MonoBehaviour
{
public GameObject AlienBulletPrefab;
public Transform Ship;
void Start ()
{
StartCoroutine (onCoroutine());
}
IEnumerator onCoroutine()
{
while(true)
{
GameObject bullet = Instantiate (AlienBulletPrefab);
bullet.GetComponent<AlienBulletScript>().AdjustPositionByLookingAt(Ship.transform.position);
yield return new WaitForSeconds(2f);
}
}
void Update ()
{
}
}
and here is AlienBulletScript :
using UnityEngine;
using System.Collections;
public class AlienBulletScript : MonoBehaviour
{
public float Thrust;
public Rigidbody2D rb;
public GameObject Ship;
Vector3 shipPosition; // or instead of this variable get position from `Ship` variable just above it.
void Start ()
{
rb = GetComponent<Rigidbody2D> ();
}
void Update ()
{
rb.AddRelativeForce (Vector3.up * Thrust);
// or
// float step = Thrust* Time.deltaTime;
// transform.position = Vector3.MoveTowards(transform.position, shipPosition, step);
}
public void AdjustPositionByLookingAt(Vector3 src)
{
transform.LookAt(src);
shipPosition = src;
}
}
Tried this, but now the bullet shoots upwards and is not instantiated at the alien ships location (as this object moves).
Your answer
Follow this Question
Related Questions
How can I in-script create gameobject from prefab? 2 Answers
Character Selection 0 Answers
Create a prefab of custom type 1 Answer
How can i get a script of a non instantiate prefab? 2 Answers
Destroy a Prefab from an Array? (C#) 2 Answers