学习游戏制作记录(将各种属性应用于战斗以及实体的死亡)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();
}

相关推荐
蒸蒸yyyyzwd10 小时前
秋招不熟悉力扣学习笔记1
笔记·学习·leetcode
椒颜皮皮虾྅10 小时前
OpenVINO C# API 3.3.1:支持OpenVINO 2026.3及GenAI增强
人工智能·c#·openvino
小弥儿11 小时前
GitHub今日热榜 | 2026-08-11:图原生基础设施首日登顶
学习·开源·github
半亩码田13 小时前
C#转Python第3.1篇:Python 的 class 没有访问修饰符?面向对象的另一条路
开发语言·python·c#
for_ever_love__15 小时前
python基础语法学习: 数据容器
windows·python·学习
云空15 小时前
《电子专业完整学习路线图(分两套:本科四年版 / 零基础自学速成版)》
科技·学习·学习方法·高考
min(a,b)15 小时前
学习第16天:LangGraph 与 Agent 工作流编排
学习
woshihuanglaoshi15 小时前
鸿蒙技术进阶全景高级成长体系:从初中级到架构师的技能树/学习路径/项目实战/认证体系系统性方法论
学习·华为·harmonyos
AI即插即用16 小时前
即插即用系列 | IEEE TMI PLG-HN:原型学习引导的 CNN-Transformer 混合网络,攻克乳腺肿瘤分割难题
人工智能·深度学习·神经网络·学习·目标检测·cnn·transformer
leo_messi9417 小时前
langchain学习(三) - tools使用
学习·langchain