首页 > 其他分享 >3-9. 蜜蜂 - 追击和攻击的实现

3-9. 蜜蜂 - 追击和攻击的实现

时间:2024-02-26 14:12:38浏览次数:24  
标签:攻击 localScale transform 追击 Attack 蜜蜂 currentEnemy 时候

动画

动画状态机改成这样

当 run = true 的时候,从 beeFly 立马切换到 beeChase

当 run = false 的时候,从 beeChase 立马切换到 beeFly

当 hurt 触发的时候,从 Any State 立马切换到 beeHurt,当 beeHurt 完整播放一次之后,进入 Exit

当 attack 触发的时候,从 Any State 立马切换到 beeAttack,当 beeAttack 完整播放一次之后,进入 Exit

当 dead = true 的时候,从 Any State 立马切换到 beeDead

代码

BeeChaseState

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static UnityEngine.GraphicsBuffer;

public class BeeChaseState : BaseState
{
    private Attack attack;
    private Vector3 target;
    private Vector3 moveDir;
    private bool isAttack;
    private float attackRateCounter = 0;

    public override void OnEnter(Enemy enemy)
    {
        currentEnemy = enemy;
        currentEnemy.currentSpeed = currentEnemy.chaseSpeed;
        currentEnemy.anim.SetBool("run", true);
        attack = enemy.GetComponent<Attack>();

        currentEnemy.lostTimeCounter = currentEnemy.lostTime;
    }

    public override void LogicUpdate()
    {
        if (currentEnemy.lostTimeCounter <= 0)
        {
            currentEnemy.SwitchState(NPCState.Patrol);
        }

        // attacker.position 是指玩家脚底的位置,这不是我们想要的,所以在 y 轴上要加 1.5
        target = new Vector3(currentEnemy.attacker.position.x, currentEnemy.attacker.position.y + 1.5f, 0);

        // 判断攻击距离
        if ((target - currentEnemy.transform.position).magnitude <= attack.attackRange)
        {
            // 可以播放攻击动画了
            isAttack = true;

            // 先让蜜蜂停下来
            if (!currentEnemy.isHurt)
            {
                currentEnemy.rb.velocity = Vector2.zero;
            }

            // 计时器
            attackRateCounter -= Time.deltaTime;
            if (attackRateCounter <= 0)
            {
                currentEnemy.anim.SetTrigger("attack");
                attackRateCounter = attack.attackRate;
            }
        }
        else
        {
            // 超出攻击范围
            isAttack = false;
        }

        // 移动方向 = 目标位置 - 当前位置
        moveDir = (target - currentEnemy.transform.position).normalized;
        if (moveDir.x > 0)
        {
            currentEnemy.transform.localScale = new Vector3(
                -1 * Mathf.Abs(currentEnemy.transform.localScale.x),
                currentEnemy.transform.localScale.y,
                currentEnemy.transform.localScale.z
            );
        }
        else if (moveDir.x < 0)
        {
            currentEnemy.transform.localScale = new Vector3(
                Mathf.Abs(currentEnemy.transform.localScale.x),
                currentEnemy.transform.localScale.y,
                currentEnemy.transform.localScale.z
            );
        }
    }

    public override void PhysicsUpdate()
    {
        if (!currentEnemy.isHurt && 
            !currentEnemy.isDead && 
            !currentEnemy.wait &&
            !isAttack)
        {
            currentEnemy.rb.velocity = moveDir * currentEnemy.currentSpeed;
        }
        // 追击过程中是没有 wait 等待的
    }

    public override void OnExit()
    {
        currentEnemy.anim.SetBool("run", false);
    }
}

OnEnter 的时候,设置敌人、设置速度、播放追逐动画、初始化 Attack 组件(因为 Attack 组件上面有个范围,在范围内的时候需要停下来攻击)、初始化 lostTimeCounter(避免蜜蜂刚进入追逐状态,立马就退出变回巡逻状态)

LogicUpdate 的时候,如果 lostTimeCounter 变 0 了,说明蜜蜂失去目标,返回到巡逻状态。接着蜜蜂和玩家的距离小于攻击范围的时候,就会停下来,并按 attackRate 标识的秒数攻击一次玩家。这个攻击动画需要注意一下,在蜜蜂伸出刺的时候,需要出现触发器,这个触发器上面也要绑定一个 Attack 组件。超出范围之后不进行攻击。同样移动的时候,也需要注意朝向

PhysicsUpdate 的时候,与巡逻时候一样,修改蜜蜂的速度。需要注意一下,攻击的时候也不能动

OnExit 的时候,就把动画状态机从 chase 改回到 patrol 即可

Bee

Bee 的 Awake 里面需要初始化 chaseState

属性

Attack

Character

Attack Point

项目相关代码

代码仓库:https://gitee.com/nbda1121440/2DAdventure.git

标签:20240226_1343

标签:攻击,localScale,transform,追击,Attack,蜜蜂,currentEnemy,时候
From: https://www.cnblogs.com/hellozjf/p/18034216

相关文章

  • 3-8. 蜜蜂 - 基本的移动逻辑和动画
    动画切割图片,制作动画,注意:锚点在中心点注意:beeFly和beeChase使用相同的动画,但是速度不一样代码Enemy因为蜜蜂的行动方式与野猪、蜗牛都不一样,它是在空中飞的,所以它检测玩家和移动的方式都是不一样的,所以我们需要对Enemy中FoundPlayer、OnDrawGizmosSelected、Mov......
  • vue3+vite使用vue-pdf-embed或者pdf-vue3预览 PDF 文件(能躲避 XSS 攻击,需要 pdf 文件
    1.使用vue-pdf-embed1.npm安装所需插件[email protected]@0.1.62.封装组件(创建pdfPriview.index文件)<template><divclass="pdf-preview"> <vue-pdf-embed :source="state.source" v-for="pageinstate......
  • 3-5. 追击状态的转换
    添加野猪追逐状态usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassBoarChaseState:BaseState{publicoverridevoidOnEnter(Enemyenemy){currentEnemy=enemy;//Debug.Log("Chase");......
  • DVWA-XSS(Stored)存储型跨站脚本攻击
    DVWA-XSS(Stored)存储型XSS是一种持久型XSS,与DOM型和Reflected型区别在于将恶意脚本注入到网站的某个存储区域,如数据库或其他文件类型中。每当访问网站时,服务器在生成页面时,将含有恶意脚本当做有效内容插入到页面中,并响应给用户。浏览器就会执行页面中的恶意脚本,从而对访问者造成攻......
  • 2-13. 实装攻击判定
    为三段攻击分别添加对应的触发器用同样的方式给Attack2和Attack3动画也添加触发器设置完触发器攻击野猪不掉血因为野猪身上有两个碰撞体,我们希望capsulecollider2D起作用,所以需要将CapsuleCollider2D的LayerOverridePriority调高,使其优先触发让人物在攻击的......
  • 2-12. 三段攻击动画的实现
    创建动画片段修改动画状态机增加AttackLayer,把刚才制作好的动画片段加进去再增加两个变量,bool类型的isAttack和trigger类型的attackNewState->blueAttack1,isAttack=true并且attack触发blueAttack1->blueAttack2,isAttack=true并且attack触发,有exi......
  • 国外网络攻击太牛逼了,还有脸说,
    国外网络攻击太牛逼了,还有脸说,Windows内核劫持是一种高级的恶意软件攻击技术,它涉及对Windows操作系统内核的修改和篡改。以下是Windows内核劫持的基础技术原理:驱动程序注入:恶意软件通过加载和注入恶意驱动程序到Windows内核中来实现内核劫持。这些恶意驱动程序可以通过各种途......
  • 跨站脚本攻击漏洞
    漏洞讲解漏洞运用过程:攻击者会通过xss漏洞在网站注入恶意代码,使得用户在访问网页时,恶意代码执行,从而达到攻击的目的漏洞原理:程序对输入和输出的控制不够严格,导致恶意代码输入后,在前端浏览时被当作有效代码进行解析,从而产生各种危害。漏洞危害:1)网站中弹窗,影响用户体验和利益......
  • dsa线性k攻击
    fromCrypto.Util.numberimport*a=24601959430759983424400804734518943158892550216065342062971649989571838687333b=17474742587088593627q=1115861146902610160756777713087325311747309309771(h1,r1,s1)=535874494834828755542711401117152397489711233142,......
  • 洛谷题单指南-递推与递归-P2437 蜜蜂路线
    原题链接:https://www.luogu.com.cn/problem/P2437题意解读:根据题目要求,只能从标号小的蜂房爬到标号大的相邻蜂房,即每次要么爬到+1的蜂房,要么爬到+2的蜂房,本质上是一个斐波那契数列问题,和数楼梯问题一样。解题思路:要求从m号蜂房到n号蜂房的路径,即走n-m级楼梯的方案,n最大1000,同样......