【问题标题】:How do i make enemy AI face the player我如何让敌人的AI面对玩家
【发布时间】:2019-04-28 05:09:56
【问题描述】:

我正试图找到一种方法让敌人转向玩家。目前它跟随/停止并射击玩家。还没想好怎么让它旋转。如果可以的话请帮忙。我在这里尝试了几种不同的方法,但它们似乎不起作用。

我尝试使用 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;
}

}

【问题讨论】:

  • 你能添加你试图让他们面对玩家的东西吗?我在您提供的代码中看不到您的翻转功能或isFacingRight。这也是自上而下的视角还是平台视角(问是因为你说的是​​旋转,但你也提到了翻转功能和 isFacingRight)
  • void Flip(){ Vector3 scale = transform.localScale; scale.x *= -1; transform.localScale = 比例;面对右=!面对右; } 并将其放入 Update if(target.position.x > transform.position.x && !facingRight) //如果目标在敌人的右侧并且敌人没有面向右侧 Flip(); if(target.position.x
  • 将其添加到您的问题中。以及用于触发它的任何条件。
  • 在更新代码中添加了翻转功能
  • 传入一个要翻转的值,例如float direction 为 isRight 设为 1,为 !isRight 设为 -1 而不是不断乘以 -1,这将帮助我们消除任何可能出现的错误.

标签: c# unity3d


【解决方案1】:

试试这个:

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

SpriteRenderer 包含flipXflipY 属性,您不需要创建自己的Flip() 函数。

您需要在 GameObject 上引用 SpriteRenderer

上面的代码假设你的精灵面默认离开。如果您的精灵正常朝向右侧,请将&lt; 更改为&gt;

【讨论】:

  • 这是一个 2D 游戏,这不会很好。这个角色可能看起来有点向上。
  • “转换不包含 x 的定义”错误,我该如何解决?
  • @Tomajuli 立即查看
  • 它会翻转它,但不会翻转回来,我必须创建一个新功能来管理这个,或者我可以将它插入到上面的代码中的某个地方吗?
猜你喜欢
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-29
  • 1970-01-01
  • 2015-01-17
相关资源
最近更新 更多