当前位置: 首页 > article >正文

日志2025.2.8

日志2025.2.8

1.增加了近战敌人攻击类型
public struct AttackData
{
    public string attackName;
    public float attackRange;
    public float attackIndex;
    public float animationSpeed;
    public float moveDistance;
    public AttackType_Melee attackType;
}

public enum AttackType_Melee
{
    Close, Charge
}


public class AttackState_Melee : EnemyState
{
    private Enemy_Melee enemy;
    private Vector3 moveDestination;
    private float lastTime;

    public AttackState_Melee(Enemy enemyBase, EnemyStateMachine stateMachine, string animBoolName) : base(enemyBase, stateMachine, animBoolName)
    {
        enemy = (Enemy_Melee)enemyBase;
    }

    public override void Enter()
    {
        enemy.animator.SetFloat("AttackAnimationSpeed", enemy.attackData.animationSpeed);
        enemy.animator.SetFloat("AttackIndex", enemy.attackData.attackIndex); SetDestination();

        base.Enter();

        SetDestination();
        lastTime = Time.time;

        enemy.agent.isStopped = true;
        
    }

    public override void Exit()
    {
        base.Exit();

        SetUpNextAttack();
    }

    public override void Update()
    {
        base.Update();

        if (triggerCalled)
        {
            stateMachine.ChangeState(enemy.recoveryState);
            return;
        }

        if(Time.time - lastTime > 0.5f)
        {
            AttackMove();
        }

    }

    private void SetUpNextAttack()
    {
        int recoveryIndex = enemy.PlayerClose() ? 1 : 0;
        enemy.animator.SetFloat("RecoveryIndex", recoveryIndex);

        enemy.attackData = GetAttackData();
        Debug.Log(enemy.attackData.attackName);
    }

    //随机获取攻击方式
    private AttackData GetAttackData()
    {
        List<AttackData> validAttackList = new List<AttackData>(enemy.attackList);

        //如果玩家足够近,则删去冲锋攻击
        if (enemy.PlayerClose())
        {
            validAttackList.RemoveAll(parameter => parameter.attackType == AttackType_Melee.Charge);
        }

        int random = Random.Range(0, validAttackList.Count);
        return validAttackList[random];
    }

    private void SetDestination()
    {
        Vector3 dir = enemy.playerTransform.position - enemy.transform.position;
        dir.y = 0;
        dir.Normalize();
        moveDestination = enemy.transform.position + dir * enemy.attackData.moveDistance;
    }

    private void AttackMove()
    {
        enemy.transform.position = Vector3.Lerp(enemy.transform.position, moveDestination, Time.deltaTime * 2);
    }


}


http://www.kler.cn/a/537557.html

相关文章:

  • Idea 2024.3 使用CodeGPT插件整合Deepseek
  • 【Kubernetes Pod间通信-第1篇】在单个子网中使用underlay网络实现Pod到Pod的通信
  • Ollama python交互:chat+embedding实践
  • c语言对应汇编写法(以中微单片机举例)
  • 如何利用Python爬虫获取商品销量详情:应对eBay反爬策略的实战指南与代码示例
  • C语言:函数栈帧的创建和销毁
  • 深度剖析 Redisson 分布式锁:原理、实现与应用实践
  • k8s部署go-fastdfs
  • OSPF基础(3):区域划分
  • Java 的 CopyOnWriteArrayList 和 Collections.synchronizedList 有什么区别?分别有什么优缺点?
  • 【算法】动态规划专题⑧ —— 分组背包问题 python
  • 《qt6+Open3d点云读取》
  • android apk反编译
  • Verilog 语法篇 硬件描述语言
  • redis高级数据结构布隆过滤器
  • 基于ESP32的远程开关灯控制(ESP32+舵机+Android+物联网云平台)
  • 启明星辰发布MAF大模型应用防火墙产品,提升DeepSeek类企业用户安全
  • 跨端兼容——请让我的页面展现在电脑、平板、手机上
  • 运用Deek Seeker协助数据分析
  • 客运自助售票小程序的设计与实现ssm+论文源码调试讲解
  • Python Pandas(5):Pandas Excel 文件操作
  • 服务器重启后报Predis_ServerException: Client sent AUTH, but no password is set
  • C++ 内存顺序与内存模型
  • k8s的操作指令和yaml文件
  • Vue(6)
  • 使用 JFreeChart 创建动态图表:从入门到实战