简体   繁体   English

我如何让敌人的AI面对玩家

[英]How do i make enemy AI face the player

I'm trying to find a way to rotate the enemy towards the player. 我正在尝试找到一种方法来使敌人向玩家旋转。 Currently it follows/stops and shoots the player. 目前,它跟随/停止并射击玩家。 Have not figured out how to make it rotate. 还没有弄清楚如何使其旋转。 Please help if you can. 如果可以的话请帮忙。 I've tried couple of different things on here but they dont seem to work. 我在这里尝试了几种不同的方法,但是它们似乎没有用。

I've tried creating a Flip function with isFacingRight. 我试着用isFacingRight创建一个Flip函数。

private bool facingRight;
public float speed;
public float stoppingDistance;
public float retreatDistance;
private Animator enemyAnimation;
private bool isDead;
private float direction;
public static bool enemyShoot = false;

private float timeBtwShots;
public float startTimeBtwShots;

public GameObject projectile;
private Transform player;

[SerializeField]
private Stat health;

private void Awake()
{
    health.Initialize();
}


// Start is called before the first frame update
void Start()
{
    //Player tag
    player = GameObject.FindGameObjectWithTag("Player").transform;

    enemyAnimation = GetComponent<Animator>();


    isDead = false;
}

// Update is called once per frame
void Update()
{

    if (Vector2.Distance(transform.position, player.position) > stoppingDistance)
    {
        transform.position = Vector2.MoveTowards(transform.position, player.position, speed * Time.deltaTime);
        timeBtwShots = startTimeBtwShots;


  if(player.position.x > transform.position.x && !facingRight) //if the target is to the right of enemy and the enemy is not facing right
    Flip();
 if(player.position.x < transform.position.x && facingRight)
    Flip();
    }
   else if (Vector2.Distance(transform.position,player.position) <= stoppingDistance && Vector2.Distance(transform.position,player.position)>retreatDistance)
    {
        transform.position = this.transform.position;


    }
    else if (Vector2.Distance(transform.position, player.position) > retreatDistance)
    {
        transform.localScale = new Vector2(-1f, 1f);
        transform.position = Vector2.MoveTowards(transform.position, player.position, -speed * Time.deltaTime);
        timeBtwShots = 100;
        enemyAnimation.SetTrigger("Attack");
    }

    if (enemyShoot == true)
    {
        //Stops animation Loop
        enemyShoot = false;
        enemyAnimation.SetTrigger("Shoot");


    }

    if (timeBtwShots <= 0)
    {
        Instantiate(projectile, transform.position, Quaternion.identity);
        timeBtwShots = startTimeBtwShots;
    }
    else
    {
        timeBtwShots -= Time.deltaTime;
    }


    if (health.CurrentVal == 0)
    {

        timeBtwShots = 100;
        FindObjectOfType<SoundsScript>().Play("SaibaDeath");
        isDead = true;
        enemyAnimation.SetBool("Dead", isDead);
        Destroy(gameObject, 2f);
    }
}

private void OnTriggerEnter2D(Collider2D other)
{
    if (other.tag == "ProjectileEnem")
    {
        health.CurrentVal -= 50;
        enemyAnimation.SetTrigger("Hurt");
    }

}

//Disables enemeies when off screen
private void OnBecameInvisible()
{
    GetComponent <Enemy> ().enabled = false;
}
//Re enables enemies once they are visible
private void OnBecameVisible()
{
    GetComponent<Enemy>().enabled = true;
}

void Flip(){
      Vector3 scale = transform.localScale;
      scale.x *= -1;
      transform.localScale = scale;
      facingRight = !facingRight;
}

} }

Try this: 尝试这个:

spriteRenderer.flipX = transform.position.x < player.position.x;

SpriteRenderer contains the flipX and flipY property, you do not need to create your own Flip() function. SpriteRenderer包含flipXflipY属性,您无需创建自己的Flip()函数。

You need a reference to the SpriteRenderer on your GameObject. 您需要在SpriteRenderer上引用SpriteRenderer

The above code is assuming that your sprite faces left on default. 上面的代码假定您的精灵在默认情况下仍面朝左。 If your sprite faces right normally, change the < to > . 如果您的精灵朝向正常,请将<更改为>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM