Unity类银河战士恶魔城学习总结(P133 Merge skill tree with Parry skill把技能树和格挡技能相组合)

news/2024/11/20 6:05:53/

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili

教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/

完成了技能树上的格挡技能的UI逻辑

Parry_SKill.cs

核心功能

代码主要围绕以下功能展开:

(1)技能解锁
  • 通过绑定解锁按钮的点击事件(onClick),来解锁技能。
  • 每个技能都依赖一个 UI_SKillTreeSlot(可能是一个技能树的 UI 元素),通过检测其 unlocked 属性判断技能是否解锁成功。
(2)技能效果

a. 使用技能 (UseSkill)

  • 在技能使用时,检查特定效果是否已解锁,并执行对应功能。
  • 恢复生命值的功能:

b. 格挡幻影 (MakeMirageOnParry)

  • 如果 parrtWithMirageUnlocked 解锁,生成一个幻影(类似分身):
UI逻辑:

UI_SKillTreeSlot 是解锁按钮的一个组件,应该包括:

  • 一个布尔变量 unlocked 表示当前技能是否解锁。
  • 一个 Button 组件用作解锁触发点。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class Parry_SKill : Skill
{[Header("反击")]//parry[SerializeField] private UI_SKillTreeSlot parryUnlockButton;public bool parryUnlocked{ get; private set; }[Header("反击恢复")]//Parry restor[SerializeField] private UI_SKillTreeSlot restorUnlockButton;[Range(0f,1f)][SerializeField] private float restoreHealthPercentage;public bool restorUnlocked{ get; private set; }[Header("格挡幻影")]//Parry mirrage[SerializeField] private UI_SKillTreeSlot parrtWithMirageUnlockButton;public bool parrtWithMirageUnlocked { get; private set; }public override void UseSkill(){base.UseSkill();if(restorUnlocked){int restoreAmount = Mathf.RoundToInt(player.stats.GetMaxHealthValue() * restoreHealthPercentage);player.stats.IncreaseHealthBy(restoreAmount);}}protected override void Start(){base.Start();parryUnlockButton.GetComponent<Button>().onClick.AddListener(UnlockParry);restorUnlockButton.GetComponent<Button>().onClick.AddListener(UnlockParryRestor);parrtWithMirageUnlockButton.GetComponent<Button>().onClick.AddListener(UnlockParrtWithMirage);}private void UnlockParry(){if (parryUnlockButton.unlocked)parryUnlocked = true;}private void UnlockParryRestor(){if (restorUnlockButton.unlocked)restorUnlocked = true;}private void UnlockParrtWithMirage(){if (parrtWithMirageUnlockButton.unlocked)parrtWithMirageUnlocked = true;}public void MakeMirageOnParry(Transform _respawnTransform){if (parrtWithMirageUnlocked)SkillManager.instance.clone.CreateCloneWithDelay(_respawnTransform);}
}

PlayerGroundedState.cs

修改了格挡技能Q的逻辑判断

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerGroundedState : PlayerState
{public PlayerGroundedState(Player _player, PlayerStateMachine _stateMachine, string _animBoolName) : base(_player, _stateMachine, _animBoolName){}public override void Enter(){base.Enter();}public override void Exit(){base.Exit();}public override void Update(){base.Update();if (Input.GetKeyDown(KeyCode.R))stateMachine.ChangeState(player.blackHole);if (Input.GetKeyDown(KeyCode.Mouse1) && HasNoSword())stateMachine.ChangeState(player.aimSword);if (Input.GetKeyDown(KeyCode.Q) && player.skill.parry.parryUnlocked)stateMachine.ChangeState(player.counterAttack);if (Input.GetKeyDown(KeyCode.Mouse0))//GetKeyDown改成GetKey按住就可以攻击了stateMachine.ChangeState(player.primaryAttack);if (!player.IsGroundDetected())stateMachine.ChangeState(player.airState);if (Input.GetKeyDown(KeyCode.Space) && player.IsGroundDetected())stateMachine.ChangeState(player.jumpState);}private bool HasNoSword(){if (!player.sword){return true;}player.sword.GetComponent<Sword_Skill_Controller>().ReturnSword();return false;}
}

PlayerCounterAttackState.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerCounterAttackState : PlayerState
{private bool canCreateClone;public PlayerCounterAttackState(Player _player, PlayerStateMachine _stateMachine, string _animBoolName) : base(_player, _stateMachine, _animBoolName){}public override void Enter(){base.Enter();canCreateClone = true;stateTimer = player.counterAttackDuration;player.anim.SetBool("SuccessfulCounterAttack", false);}public override void Exit(){base.Exit();}public override void Update(){base.Update();player.SetZeroVelocity();Collider2D[] colliders = Physics2D.OverlapCircleAll(player.attackCheck.position, player.attackCheckRadius);//这行代码在 Unity 中用于检测一个圆形区域内的所有碰撞体,并返回它们的数组。foreach (var hit in colliders)//foreach循环是一个迭代器,它可以遍历数组、集合、列表、字典等数据结构。攻击到敌人后,调用伤害函数{if (hit.GetComponent<Enemy>() != null){if (hit.GetComponent<Enemy>().CanBeStunned()){stateTimer = 10;//大于1的数,保证不会进入idle状态player.anim.SetBool("SuccessfulCounterAttack", true);player.skill.parry.UseSkill();if (canCreateClone){canCreateClone = false; player.skill.parry.MakeMirageOnParry(hit.transform);}}}}if (stateTimer < 0 || triggerCalled)stateMachine.ChangeState(player.idleState);}
}

Dash_Skill.cs

修改了一些变量

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;//2024年11月19日添加解锁技能逻辑
public class Dash_Skill : Skill
{[Header("Dash")][SerializeField] private UI_SKillTreeSlot dashUnlockButton;public bool dashUnlocked { get; private set; }[Header("Clone on dash")][SerializeField] private UI_SKillTreeSlot cloneOnDashUnlockButton;public bool cloneOmDashUnlocked { get; private set; }[Header("Clone on arrival")][SerializeField] private UI_SKillTreeSlot cloneOnArrivalUnlockButton;public bool cloneOnArrivalUnlocked { get; private set; }public override void UseSkill(){base.UseSkill();}protected override void Start(){base.Start();dashUnlockButton.GetComponent<Button>().onClick.AddListener(UnlockDash);cloneOnDashUnlockButton.GetComponent<Button>().onClick.AddListener(UnlockCloneOnDash);cloneOnArrivalUnlockButton.GetComponent<Button>().onClick.AddListener(UnlockCloneOnArrival);}private void UnlockDash(){if (dashUnlockButton.unlocked)   dashUnlocked = true;}private void UnlockCloneOnDash(){if (cloneOnDashUnlockButton.unlocked)cloneOmDashUnlocked = true;}private void UnlockCloneOnArrival(){if (cloneOnArrivalUnlockButton.unlocked)cloneOnArrivalUnlocked = true;}public void CloneOnDash(){if (cloneOmDashUnlocked)SkillManager.instance.clone.CreateClone(player.transform, Vector3.zero);}public void CloneOnArrival(){if (cloneOnArrivalUnlocked)SkillManager.instance.clone.CreateClone(player.transform, Vector3.zero);}}


http://www.ppmy.cn/news/1548426.html

相关文章

【IDER、PyCharm】免费AI编程工具完整教程:ChatGPT Free - Support Key call AI GPT-o1 Claude3.5

文章目录 CodeMoss 简介CodeMoss 的模型集成如何安装和配置 CodeMossIDER 插件安装步骤 CodeMoss 的实战使用AI 问答功能代码优化与解释优化这段代码解释这段代码 文件上传与对话联网查询与 GPT 助手联网查询GPT 助手 提升开发效率的最佳实践结语更多文献 CodeMoss 简介 CodeM…

蓝桥杯第22场小白入门赛

刚好牛客周赛和蓝桥杯周赛时间撞了&#xff0c;于是毅然决然选择了打牛客&#xff0c;结局是本蒟蒻被牛客薄纱/(ㄒoㄒ)/~~ 好吧&#xff0c;然后第二天就来水一水蓝桥杯了&#xff08;bushi)&#xff0c;小白入门赛和前几次一样&#xff0c;6道题只能写5道&#xff08;什么时候…

【Vue笔记】基于vue3 + element-plus + el-dialog封装一个自定义的dialog弹出窗口组件

这篇文章,介绍一下如何使用vue3+element-plus中的el-dialog组件,自己封装一个通用的弹出窗口组件。运行效果如下所示: 目录 1.1、父子组件通信 1.2、自定义VDialog组件(【v-model】模式) 1.2.1、编写VDialog组件代码 1.2.2、使用VDialog组件 1.2.3、运行效果 1.3、自…

Vue3项目实战(vue3+vite+pinia+element-plus+axios+mock)

许苑后台管理系统 一、项目介绍1、技术栈2、业务功能3、应用场景4、项目源码 二、项目实战2.1、项目初始化2.2、项目实战1、引入router配置2、App.vue组件引入3、创建RootView根路由组件4、依次创建5、进行对应各个环境的配置环境设置 一、项目介绍 1、技术栈 vue3vitevue-rou…

《YOLO:目标检测领域的璀璨之星》

《YOLO&#xff1a;目标检测领域的璀璨之星》 一、YOLO 目标检测算法二、YOLO 的技术原理&#xff08;一&#xff09;YOLOv1 的原理&#xff08;二&#xff09;后续版本的改进 三、YOLO 与其他目标检测算法的比较&#xff08;一&#xff09;与 DETR 的比较&#xff08;二&#…

倒计时功能分享

今天想要分享的是一个面试题&#xff0c;也是一个我们在项目中常用的功能&#xff1a;倒计时。 首先我们在写倒计时的时候必须要考虑到是&#xff1a;准确性、性能。接下来我们一步一步实现这个完美地倒计时功能。 setInterval 先来简单实现一个倒计时的函数&#xff1a; func…

蓝桥杯每日真题 - 第14天

题目&#xff1a;&#xff08;2022&#xff09; 题目描述&#xff08;13届 C&C B组A题&#xff09; 解题思路&#xff1a; 定义状态&#xff1a; 使用一个二维数组 dp[j][k] 来表示将数字 k 拆分为 j 个不同正整数的方案数。 初始化&#xff1a; 初始状态设定为 dp[0][0]…

实用教程:如何无损修改MP4视频时长

如何在UltraEdit中搜索MP4文件中的“mvhd”关键字 引言 在视频编辑和分析领域&#xff0c;有时我们需要深入到视频文件的底层结构中去。UltraEdit&#xff08;UE&#xff09;和UEStudio作为强大的文本编辑器&#xff0c;允许我们以十六进制模式打开和搜索MP4文件。本文将指导…