游戏中自动攻击最近目标、二次连击和群体攻击的大体代码思路

通常我们玩GTA系列,暗黑血统系列,虐杀原形等电脑打斗游戏时,都是主角跟着鼠标转向来攻击的。

这意味着要我们自己去寻找目标。

但是移动设备不像laptop或者座机那样操作方便,

所以最近目标攻击在移动设备是很常用的。

下面给出攻击最近目标的主要代码和部分解释:

public float attackRange = 30;
public float attackDistance = 1;
float distance=0;

    public void AttackA()
    {
        GameObject enemy = null;
        
        distance = attackDistance;

        foreach (GameObject go in SpawnManager._instance.enemyList)//在所有敌人列表里面选出距离最短的敌人
        {
            float temp = Vector3.Distance(go.transform.position, transform.position);
            if (temp < distance)
            {
                enemy = go;
                distance = temp;

            }
        }
        if (enemy != null)//选出来了
        {
            Vector3 targetPos = enemy.transform.position;
            targetPos.y = transform.position.y;
            transform.LookAt(targetPos);
            enemy.GetComponent<ATKAndDamage>().TakeDamage(normalAttack);//该敌人受到攻击
        }
    }






至于连击,则在A攻击的动画上添加两处事件AttackBEvent1()和AttackBEvent2()这样做的意思这些添加的事件一定会随着动画播放被调用,你在AttackBEvent1()函数调用之后AttackBEvent2()函数调用之前再次点击就可以出发连击了。

然后再在脚本里面写上

 public void AttackBEvent1()
    {
        isCanAttackB = true;
    }


    public void AttackBEvent2()
    {
        isCanAttackB = false;
    }
下面这个函数是一个按钮注册监听的函数,在里面实现连击的出发。"AttackB"是在动画控制器里面的trigger参数,控制B攻击的触发。

public void OnNormalAttackClick()
    {
        if (animator.GetCurrentAnimatorStateInfo(0).IsName("PlayerAttackA") && isCanAttackB)
        {
            animator.SetTrigger("AttackB");
        }
        else
        {
            animator.SetTrigger("AttackA");
        }

    }




然后是范围攻击的思路:

  public void AttackRange()
    {
        List<GameObject> enemyList = new List<GameObject>();
        foreach (GameObject go in SpawnManager._instance.enemyList)
        {
            float temp = Vector3.Distance(go.transform.position, transform.position);
            if (temp < attackDistance)
            {
                enemyList.Add(go);

            }
        }
        foreach (GameObject go in enemyList)
        {
            go.GetComponent<ATKAndDamage>().TakeDamage(attackRange);
        }
    }

这里要注意的一个地方就是范围攻击是先加到集合然后再在遍历集合的时候挨个收到伤害。这样做的原因是如果直接不加到集合而是符合条件的挨个受伤害,则在遍历过程中,有些敌人受到伤害会死亡,然后触发Destroy方法销毁敌人物体同时将其在enemyList中删去,但是enemyList仍然在遍历,但是元素个数却变了,这会导致遍历出错,然后Unity报错。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值