Enemy Aims at Player's Current Position

Hello,

I’ve run into an issue that I have not been able to solve. I’m making a side-scrolling space shooter (think r-type) I’m trying to get enemy ships to fire a projectile at the players current position. Keep in mind I do not wish for the projectile to follow the player like a homing missle, basically the projectile should instantiate, take the players positions and send the projectile in the players direction. Here is the script I am currently using,

public var ebullet:Transform;
public var projectileSpeed:float = 0.0;
public var delay:float = 0.0;
public var weaponSpeed:float = 0.0;
private var bulletCount:int = 0;

function OnTriggerEnter(col:Collider){
if(col.gameObject.tag == "Player"){
	InvokeRepeating("Shoot", delay, weaponSpeed);
}
}
function OnTriggerExit(col:Collider){
if(col.gameObject.tag == "Player"){
	CancelInvoke("Shoot");
}
}
function Shoot(){
var shoot = Instantiate(ebullet, transform.position, transform.rotation);
shoot.rigidbody.AddForce(-transform.right * projectileSpeed * 1000);
}

So far I’ve tried a few things and nothing has worked the way I’d like. The closest I have come was adding the players position into AddForce but as you can imagine that did not work out.

1 Answer

1

transform.rightwill shoot at the right direction of your shooter, and that’s not what you want.

Try this:

public var ebullet:Transform;
public var projectileSpeed:float = 0.0;
public var delay:float = 0.0;
public var weaponSpeed:float = 0.0;
private var bulletCount:int = 0;

// Current player variable
private var player:GameObject = null;

function OnTriggerEnter(col:Collider)
{
    if(col.gameObject.tag == "Player")
    {
        // Store current player
        // NB this assume that you have only one player because it will overwrite second player
        player = col.gameObject;
        InvokeRepeating("Shoot", delay, weaponSpeed);
    }
}

function OnTriggerExit(col:Collider)
{
    if(col.gameObject.tag == "Player")
    {
        // Remove reference
        player = null;
        CancelInvoke("Shoot");
    }
}

function Shoot()
{
    var shoot = Instantiate(ebullet, transform.position, transform.rotation);
    // Set projectile velocity
    shoot.rigidbody.velocity = (player.transform.position - transform.position).normalized * projectileSpeed;
}

It store the current player and set the velocity towards the current’s player position

That worked like a charm sir! I do realize that transform.right is not what I wanted however it's all I had to work with at the time. Thank you :D.

–