1.将各种属性应用于战斗

我们希望将上节课的CharactorState脚本作为一个父类,而玩家和敌人的属性状态都是继承自它的

创建PlayerStats脚本:

public class PlayerStats : CharactorState
{
private Player player;//获取玩家脚本

    protected override void Start()
{
base.Start();//初始化血量

        player = GetComponent<Player>();
}

    public override void TakeDamage(int _damage)//直接在伤害函数实现生命的减少以及敌人和玩家被击中的效果
{
base.TakeDamage(_damage);

        player.DamageEffect();
}
}

创建EnemyStats脚本:

public class EnemyStats : CharactorState//同样的操作
{
private Enemy enemy;

    protected override void Start()
{
base.Start();

        enemy = GetComponent<Enemy>();
}

    public override void TakeDamage(int _damage)
{
base.TakeDamage(_damage);

        enemy.DamageEffect();
}
}

CharactorState脚本:

 public State strength;//力量状态,会改变伤害状态

    public virtual void DoDamage(CharactorState _target)//最终实现伤害的函数,需要接受目标的属性状态
{
int totalDamage =damage.GetValue()+strength.GetValue();//传递最终的伤害

        _target.TakeDamage(totalDamage);

    }

PlayerAnimationTriggers脚本:

    private void AttackTrigger()
{
Collider2D[] collider2Ds = Physics2D.OverlapCircleAll(player.attackCheck.position, player.attackCheckRadius);

        foreach(var hit in collider2Ds)
{
if(hit.GetComponent<Enemy>()!=null)
{
EnemyStats EnemyTarget = hit.GetComponent<EnemyStats>();//获取敌人状态属性

                player.state.DoDamage(EnemyTarget);

                
}
}
}

Enemy_SkeletonAnimationTrigger脚本:

    private void AttackTrigger()
{
Collider2D[] collider2Ds = Physics2D.OverlapCircleAll(enemy.attackCheck.position, enemy.attackCheckRadius);

        foreach (var hit in collider2Ds)
{
if (hit.GetComponent<Player>() != null)
{
PlayerStats playerEnemy=hit.GetComponent<PlayerStats>();//同理

                enemy.state.DoDamage(playerEnemy);
}
}
}

演示:

2.实现玩家的死亡

准备好玩家的死亡以及参数Die

创建PlayerDeadState脚本并在Player中初始化:

    public override void Update()//死亡则设置速度为0
{
base.Update();

        _Player.SetZeroVelocity();
}

Entity脚本:

    public virtual void Die()//只是为了便于重写
{

    }

Player脚本:

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

        stateMachine.ChangeState(deadState);//进入死亡状态
}

PlayerStats脚本:

  protected override void Die()//调用player的死亡函数
{
base.Die();

        player.Die();
}

3.实现敌人死亡

敌人的死亡与玩家不同,我们希望敌人死亡时会暂停动画并向上偏移一段距离后落下

因此我们需要获得敌人死亡前对应的动画参数名称

Enemy脚本:

  public string lastAnimBoolName;//记录当前动画参数

    public void AssignAnimName(string _animBoolName)//分配参数的函数
{
lastAnimBoolName = _animBoolName;
}

创建SkeletonDeadState脚本:

自行在EnemySkeleton中初始化该状态

public class SkeletonDeadState : EnemyState
{
private EnemySkeleton enemy;
public SkeletonDeadState(EnemyStateMachine _enemyStateMachine, Enemy _enemybase, string _animBoolName, EnemySkeleton enemy) : base(_enemyStateMachine, _enemybase, _animBoolName)
{
this.enemy = enemy;
}

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

        enemy.anim.SetBool(enemy.lastAnimBoolName, true);//进入后接着播放死亡前的动画
enemy.anim.speed = 0;//暂停动画
enemy.cd.enabled = false;//设置无碰撞器,这样敌人会掉落下去
stateTimer = .2f;//上升时间
}

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

        if (stateTimer > 0)
{
rb.velocity = new Vector2(0, 10);//给予上升速度
}
}
}

EnemySkeleton脚本:

    public override void Die()//重写die函数
{
base.Die();

        enemyStateMachine.ChangeState(deadState);//切换到死亡状态
}

EnemyState脚本:

    public virtual void Exit()
{
enemyBase.anim.SetBool(animBoolName, false);
enemyBase.AssignAnimName(animBoolName);//退出状态时记录当前状态
}

EnemyStats脚本:

    protected override void Die()//死亡调用函数
{
base.Die();

        enemy.Die();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/94601.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/94601.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/94601.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Higgsfield平替,地球转场+动物竖中指AI视频教程

大家好&#xff0c;这里是K姐。 一个帮助你把AI真正用起来的女子。 最近TikTok上的网友已经集体疯魔了——刷到的视频总以高空航拍开场&#xff0c;镜头从地球拉近后&#xff0c;要么是橘猫蹲在白宫草坪比中指&#xff0c;要么是柴犬在富士山顶比中指…… 这种堪比好莱坞运镜…

界面规范的其他框架实现-列表-layui实现

另一个要改造的系统使用了layui&#xff0c;改造方式如下&#xff1a;斑马线&#xff1a;.layui-table[lay-even] tr:nth-child(even) {background-color: #f2f2f2 }鼠标滑过&#xff1a;.layui-table tbody tr:hover{background-color: #8dccff }标题行&#xff1a;.layui-tab…

STM32学习笔记2-GPIO的输出模式

GPIOGPIO&#xff1a;通用输入输出口&#xff1b;可配置8种输入输出模式引脚电平&#xff1a;0V-3.3V&#xff0c;部分引脚可容忍5V也可认为高电平&#xff0c;但是对于输出而言&#xff0c;最大就只能输出3.3V&#xff0c;因为供电就只有3.3V&#xff0c;能容忍5v的在以下的引…

Linux系统学习2之磁盘管理

了解磁盘内容&#xff1a;df&#xff1a;df -a &#xff08;-a是列出所有&#xff0c;-k以kb显示&#xff0c;-h以Gb显示&#xff0c;-m以Mbyte显示&#xff0c;-H为用1000b代替1024b&#xff0c;-t为显示文件类型&#xff0c;-i为用inode显示容量&#xff09;&#xff1a;&a…

北大、蚂蚁三个维度解构高效隐私保护机器学习:前沿进展+发展方向

在数据隐私日益重要的 AI 时代&#xff0c;如何在保护用户数据的同时高效运行机器学习模型&#xff0c;成为了学术界和工业界共同关注的难题。北大团队最新完成的综述《Towards Efficient Privacy-Preserving Machine Learning: A Systematic Review from Protocol, Model, and…

计算机网络:如何在实际网络中进行子网划分

在实际网络中,子网划分是通过“借位”将一个大的IP网络分割为多个小的子网,以提高IP地址利用率、增强网络安全性和简化管理。以下是具体的实施步骤、原理和注意事项: 一、子网划分的核心目的 提高IP利用率:避免大网络中IP地址的浪费(例如一个C类地址默认支持254台主机,若…

《第五篇》基于RapidOCR的图片和PDF文档加载器实现详解

基于RapidOCR的图片和PDF文档加载器实现详解 引言 在构建知识库时,我们经常需要处理包含图片和PDF文档的数据。这些文档中的文本信息通常以图像形式存在,需要通过OCR技术来提取。本文将详细介绍如何使用RapidOCR技术实现图片和PDF文档的文本提取加载器。 核心概念 RapidO…

[硬件电路-122]:模拟电路 - 信号处理电路 - 模拟电路与数字电路、各自的面临的难题对比?

数字电路和模拟电路是电子技术的两大基础分支&#xff0c;它们分别处理不同类型的信号&#xff0c;并在设计方法、元件特性、应用场景等方面存在显著差异。以下是两者的详细定义及异同对比&#xff1a;一、定义与核心概念1. 模拟电路&#xff08;Analog Circuit&#xff09;定义…

Linux多线程——线程控制

目录 1.线程知识补充 1.1 线程私有资源 1.2 线程共享资源 1.3 原生线程库 2、线程控制接口 2.1 线程创建 2.1.1 一批线程 2.2 线程等待 2.3 线程终止 2.4 线程实战 2.5 其他接口 2.5.1 关闭线程pthread_cancel 2.5.2 获取线程 ID pthread_self 2.5.3 线pthread_de…

Python爬虫实战:研究spiderfoot工具,构建网络情报收集系统

1. 引言 1.1 研究背景 在数字化时代,互联网公开信息已成为国家治理、企业决策与学术研究的战略资源。据 Statista 统计,2023 年全球互联网数据总量突破 120ZB,其中可通过公开渠道获取的情报信息占比超 30%。传统人工信息收集方式受限于效率与广度,难以应对海量数据处理需…

在路由器openwrt上安装openclas

在路由器openwrt上安装openclas 名词解释 las: lash 运行效果图 安装 安装教程参考&#xff1a; 官方&#xff1a;github.com 官方2&#xff1a;openclas.net 如果安装完成后菜单上没有&#xff0c;重启路由后在“服务”菜单下 点击运行会提示下载内核&#xff0c;按提示…

HIVE 窗口函数处理重复数据

窗口函数row_number()&#xff0c;结合OVER子句中的PARTITION BY和ORDER BY&#xff0c;为数据分组内的每一行生成一个唯一的序号。具体分析如下&#xff1a;函数作用&#xff1a;row_number()&#xff1a;为每个分组内的行分配一个唯一的连续序号&#xff08;从1开始&#xff…

自动驾驶控制算法——MPC控制算法

自动驾驶控制算法——MPC控制算法 文章目录自动驾驶控制算法——MPC控制算法一、MPC 是什么&#xff1f;1.1 定义与核心思想1.2 MPC 与传统控制器&#xff08;如 PID&#xff09;的区别1.3 自动驾驶中 MPC 的典型应用场景&#x1f697; 轨迹跟踪控制&#xff08;Trajectory Tra…

【DL学习笔记】各种卷积操作总结(深度可分离、空洞、转置、可变形)

Vanilla Convolution 普通卷积 卷积通道数&#xff1a; 卷积核的数量决定输出的张量的通道数nnn&#xff0c;输入的张量和每一个核Kernel做卷积运算得到一个channel的输出。输入通道数CinC_{in}Cin​决定每一个卷积核的通道数 卷积输出feature map的尺寸的计算公式&#xff1…

【Ubuntu】请问,`ip -a`显示的“wlo1”是什么呀?

商量AI wlo1 是 Linux 系统中 无线网络接口&#xff08;Wi-Fi 网卡&#xff09;的名称&#xff0c;其命名遵循现代 Linux 的 可预测网络接口命名规则&#xff08;Predictable Network Interface Names&#xff09;。以下是详细解析&#xff1a;命名规则拆解 wlo1 的结构由三部分…

Excel商业智能分析报表 【销售管理分析仪】

1.销售漏斗&#xff08;Sales Funnel&#xff09;分析&#x1f31f;&#x1f31f; 销售漏斗定义&#xff1a;科学反映商机状态及销售效率的销售管理模型。适用场景&#xff1a;关系型销售运营&#xff08;需长期维护客户关系的销售模式&#xff09;。核心功能&#xff1a;按销售…

【论文阅读|V2M: VISUAL 2-DIMENSIONAL MAMBA FOR IMAGE REPRESENTATION LEARNING】

论文题目:V2M: VISUAL 2-DIMENSIONAL MAMBA FOR IMAGE REPRESENTATION LEARNING 年份:2024 期刊会议: arXiv 代码链接:https://github.com/wangck20/V2M 目录 现阶段存在的问题 1. 二维结构信息丢失 2. 一维 Mamba 架构的局限性 3. 提升视觉任务表现 相关研究 方法 二维…

服务器数据安全:利用阿里云OSS/腾讯云COS实现网站数据自动备份

更多云服务器知识&#xff0c;尽在hostol.com你的网站&#xff0c;就像一座你亲手在数字海滩上堆砌起来的、精美绝伦的“沙堡”。你为它设计了独特的风格&#xff0c;添置了丰富的内容&#xff0c;吸引了越来越多的游客前来参观。每一篇文章&#xff0c;每一条评论&#xff0c;…

AdGuard 安卓修改版:全方位广告拦截与隐私保护专家

AdGuard 安卓版是一款功能强大的广告拦截软件&#xff0c;能够有效阻止网页和应用程序中的广告和跟踪器&#xff0c;提升用户的浏览体验。它不仅提供了广泛的广告拦截功能&#xff0c;还通过多种隐私保护功能&#xff0c;确保用户的个人信息安全。以下是 AdGuard 安卓版的详细介…

Mysql中的锁到底是什么?锁的是什么?

MySQL InnoDB 的锁&#xff1a;一次从“守卫”到“交通指挥中心”的深度之旅 MySQL InnoDB 的锁。这个概念常常让人觉得复杂抽象&#xff0c;但我们需要抓住它的底层设计哲学 忘记那些代码和术语定义&#xff0c;我们先从最底层的问题开始思考&#xff1a; 思考一&#xff1a;为…