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

学习游戏制作记录(将各种属性应用于战斗以及实体的死亡)8.5

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.dtcms.com/a/315934.html

相关文章:

  • 生物医药科研革命:深度解析协同实验记录如何重塑新药研发全流程
  • 应急响应实验复现
  • 浅谈 NUMA 与 MySQL
  • MySQL 在麒麟系统上部署使用 + DBeaver 远程连接 + SQL 数据导入完整流程
  • 华为云代理商的作用与价值解析
  • 嵌套路由配置(React-Router5)
  • Android原生项目集成Flutter模块极简指南
  • 使用buildx构建镜像
  • 若依前后端分离版学习笔记(五)——Spring Boot简介与Spring Security
  • [驱动开发篇] Can通信进阶 --- CanFD 的三次采样
  • Chisel芯片开发入门系列 -- 18. CPU芯片开发和解释8(流水线架构的代码级理解)
  • 深度学习-卷积神经网络CNN-填充与步幅
  • AR文旅新纪元:从黄姚古镇到秦始皇陵,虚实共生的沉浸式体验革命
  • 华为云云产品的发展趋势:技术创新驱动数字化未来
  • 基于Docker的RabbitMQ运行参数设置
  • 基于华为开发者空间的Open WebUI数据分析与可视化实战
  • 光伏清洗机器人是什么?艾利特协作机器人如何重塑新能源运维效率
  • 【18】C实战篇——C语言 文件读写【fputc、fgetc、fputs、fgets】
  • FPGA学习笔记——简易的DDS信号发生器
  • 力扣106:从中序与后序遍历序列构造二叉树
  • Android 之 Kotlin 和 MVVM 架构的 Android 登录示例
  • 宝塔(免费版9.2.0)的docker拉取仓库失败的加速方法
  • 数据挖掘,到底是在挖掘什么?
  • 27-数据仓库与Apache Hive-2
  • 26-数据仓库与Apache Hive
  • LTR-308ALS-01 LiteOn光宝高精度光耦隔离器 5000Vrms持续隔离电压
  • Python-初学openCV——图像预处理(七)——亮度变换、形态学变换
  • 基于Flask的微博话题多标签情感分析系统设计
  • 李宏毅深度学习教程 第12-13章 对抗攻击 + 迁移学习transfer learning
  • NLP——BERT模型全面解析:从基础架构到优化演进