- Home /
How do I make the enemy stop walking and shoot the player?
The enemy still patrols while shooting if it sees the player
Patrolling Script
public float moveSpeed;
public bool moveRight;
public Transform wallCheck;
public float wallCheckRadius;
public LayerMask whatIsWall;
private bool hittingWall;
private bool notAtEdge;
public Transform edgeCheck;
void Start() {
}
// Update is called once per frame
void Update()
{
hittingWall = Physics2D.OverlapCircle(wallCheck.position, wallCheckRadius, whatIsWall);
notAtEdge = Physics2D.OverlapCircle(edgeCheck.position, wallCheckRadius, whatIsWall);
if (hittingWall || !notAtEdge)
moveRight = !moveRight;
if (moveRight)
{
transform.localScale = new Vector3(-0.75f, 0.75f, 0.8f);
GetComponent<Rigidbody2D>().velocity = new Vector2(moveSpeed, GetComponent<Rigidbody2D>().velocity.y);
}
else
{
transform.localScale = new Vector3(0.75f, 0.75f, 0.8f);
GetComponent<Rigidbody2D>().velocity = new Vector2(-moveSpeed, GetComponent<Rigidbody2D>().velocity.y);
}
Our "ShootAPlayerInRange" Script
public float playerRange;
public GameObject enemyBullet;
public CharacterController2D player;
public Transform launchPoint;
public float waitBetweenShots;
private float shotCounter;
// Start is called before the first frame update
void Start()
{
player = FindObjectOfType<CharacterController2D>();
shotCounter = waitBetweenShots;
}
// Update is called once per frame
void Update()
{
Debug.DrawLine(new Vector3(transform.position.x - playerRange, transform.position.y, transform.position.z), (new Vector3(transform.position.x + playerRange, transform.position.y, transform.position.z)));
shotCounter -= Time.deltaTime;
if (transform.localScale.x < 0 && player.transform.position.x > transform.position.x && player.transform.position.x < transform.position.x + playerRange && shotCounter < 0)
{
Instantiate(enemyBullet, launchPoint.position, launchPoint.rotation);
shotCounter = waitBetweenShots;
}
if (transform.localScale.x > 0 && player.transform.position.x < transform.position.x && player.transform.position.x > transform.position.x - playerRange && shotCounter < 0)
{
Instantiate(enemyBullet, launchPoint.position, launchPoint.rotation);
shotCounter = waitBetweenShots;
}
}
}
Answer by Ady_M · Jan 06, 2020 at 06:27 PM
Here's one solution (not necessarily the best one):
In the ShootAPlayerInRange script:
Add the field public bool shootingAtPlayer
At the top of the Update method, add the code shootingAtPlayer = false;
In both If-statements, add the code shootingAtPlayer = true;
In the Patrolling script:
Add the field private ShootAPlayerInRange shootAPlayerInRageComponent
In the Start method, add the code:
shootAPlayerInRageComponent = GetComponent<ShootAPlayerInRange>();
In the Update method, add an if-statement that sets the object's velocity to zero if shootAPlayerInRageComponent.shootingAtPlayer
is true.
I would also recommend that you cache a reference to your Rigidbody2D. You are currently calling GetComponent every frame (twice even).
Your answer
![](https://koobas.hobune.stream/wayback/20220612221048im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
get enemy to chase and shoot at player wherever hes facing. 0 Answers
Bullet not shooting enemy center in unity 1 Answer
Enemy shoot 1 Answer
Only one cloned enemy shoots 2 Answers
free roaming enemy ai 1 Answer