Unity中敌人简单逻辑的实现(来回走动,攻击)2D

unity自带一套自动巡航系统,但是目前应该先了解最基本的使用代码控制敌人实现逻辑(1来回走动,2发现玩家时追着玩家,3进入敌人攻击范围时进行攻击),一般来说这是最基本的敌人的功能

分析完敌人所具备的能力后,就将敌人的能力进行拆解,分别进行实现

一 来回走动:敌人在自己的视力范围内没有见到玩家,就会自动来回走动巡逻

敌人的来回移动可以改变transform.position属性来实现,需要设置两个参数,一个敌人移动的速度,一个敌人移动多少秒后转向,也就是时间跨度

在实现完来回走动后会出现敌人会出现一个问题,那就是敌人只会来回移动,不会转向,当敌人改变移动方向时,用transform.localRotation属性进行转向设置,代码如下

 public float Speed;//移动速度
 public int timeSpan;//单向移动时间,60帧为一秒(因为移动函数在fixupdate中)这是外部设置的时间夸度
 private int time;
 int Ry = 0;//怪物转向角度为180度
void Start()
{    
    time = timeSpan;
}
 private void FixedUpdate()
{
    Move();
}
void Move()
{
    Vector2 position = transform.position;
    timeSpan--;       
    if(timeSpan<=0)
    {
        Speed = -Speed;
        if(Speed>0)
        {
            Ry = 0;
        }
        else
        {
            Ry = -180;
        }
        gameObject.transform.localRotation = Quaternion.Euler(0,Ry, 0);//怪物巡逻转向
        timeSpan = time;
    }
    position.x += Speed;
    transform.position = position;       
}

二 跟随玩家:当敌人发现玩家的时候,敌人就会跟随玩家。或者交靠近玩家,目的是为了攻击

  1. 首先为敌人添加一个碰撞器(勾选触发器)用来模拟敌人的视线

  1. 当玩家进入敌人的视角触发器时,敌人就需要向玩家靠拢

bool isFind=false;//怪物是否发现玩家,如果发现玩家需要将怪物的状态由巡逻切换为跟随玩家
public GameObject player;//获取到怪物跟随的玩家
private void FixedUpdate()
{
    if (isFind == false)
    {
        Move();//这是巡逻函数
    }
    else if (isFind == true)
    {
        Follow();//这是跟随函数
    }
}
 void Follow()
    {
    Vector2 position=transform.position;
    if(Mathf.Abs(gameObject.transform.position.x - player.transform.position.x)>5)//怪外和角色距离大于某个值时才开始朝玩家移动,这样避免了怪物与玩家冲重合
    {
        if (gameObject.transform.position.x < player.transform.position.x)
        {
            position.x += Speed;
            gameObject.transform.localRotation = Quaternion.Euler(0, 0, 0);//怪物转向
        }
        else if (gameObject.transform.position.x > player.transform.position.x)
        {
            position.x -= Speed;
            gameObject.transform.localRotation = Quaternion.Euler(0, -180, 0);//怪物转向
        }
        gameObject.transform.position = position;
    }        
}
private void OnTriggerEnter2D(Collider2D collision)//玩家进入了怪物的视角(触发器),怪物就会攻击玩家
{
    if (collision.gameObject.tag == "Player")//需要将玩家的标签设为Player
    {
        isFind = true;
    }        
}

三 攻击玩家:当玩家进入到了敌人的攻击范围后敌人就需要进行攻击(如何实现攻击在另一篇有讲)

Animator animator;
 void Start()
{
    animator = GetComponent<Animator>();//敌人的攻击动画
}
 private void FixedUpdate()//完整的fixupdate包含的函数
{
    if (isFind == false)
    {
        Move();
    }
    else if (isFind == true)
    {
        Follow();
        Attack();
    }
}
  void Attack()
{
    if (Mathf.Abs(gameObject.transform.position.x - player.transform.position.x) < 5)//达到可以攻击的距离
    {
        animator.SetBool("CanAttack", true);  
    }
    else 
    {
        animator.SetBool("CanAttack", false);
    }
    }

最后将这三个功能代码进行整合放在fixupdate中就能实现敌人的基础逻辑

猜你喜欢

转载自blog.csdn.net/qq_62947569/article/details/128690576