Unity类银河战士恶魔城学习总结(P133 Merge skill tree with Parry skill ...

打印 上一主题 下一主题

主题 1749|帖子 1749|积分 5247

【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 组件用作解锁触发点。
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. public class Parry_SKill : Skill
  6. {
  7.     [Header("反击")]//parry
  8.     [SerializeField] private UI_SKillTreeSlot parryUnlockButton;
  9.     public bool parryUnlocked{ get; private set; }
  10.     [Header("反击恢复")]//Parry restor
  11.     [SerializeField] private UI_SKillTreeSlot restorUnlockButton;
  12.     [Range(0f,1f)]
  13.     [SerializeField] private float restoreHealthPercentage;
  14.     public bool restorUnlocked{ get; private set; }
  15.     [Header("格挡幻影")]//Parry mirrage
  16.     [SerializeField] private UI_SKillTreeSlot parrtWithMirageUnlockButton;
  17.     public bool parrtWithMirageUnlocked { get; private set; }
  18.     public override void UseSkill()
  19.     {
  20.         base.UseSkill();
  21.         if(restorUnlocked)
  22.         {
  23.             int restoreAmount = Mathf.RoundToInt(player.stats.GetMaxHealthValue() * restoreHealthPercentage);
  24.             player.stats.IncreaseHealthBy(restoreAmount);
  25.         }
  26.     }
  27.     protected override void Start()
  28.     {
  29.         base.Start();
  30.         parryUnlockButton.GetComponent<Button>().onClick.AddListener(UnlockParry);
  31.         restorUnlockButton.GetComponent<Button>().onClick.AddListener(UnlockParryRestor);
  32.         parrtWithMirageUnlockButton.GetComponent<Button>().onClick.AddListener(UnlockParrtWithMirage);
  33.     }
  34.     private void UnlockParry()
  35.     {
  36.         if (parryUnlockButton.unlocked)
  37.             parryUnlocked = true;
  38.     }
  39.     private void UnlockParryRestor()
  40.     {
  41.         if (restorUnlockButton.unlocked)
  42.             restorUnlocked = true;
  43.     }
  44.     private void UnlockParrtWithMirage()
  45.     {
  46.         if (parrtWithMirageUnlockButton.unlocked)
  47.             parrtWithMirageUnlocked = true;
  48.     }
  49.     public void MakeMirageOnParry(Transform _respawnTransform)
  50.     {
  51.         if (parrtWithMirageUnlocked)
  52.             SkillManager.instance.clone.CreateCloneWithDelay(_respawnTransform);
  53.     }
  54. }
复制代码
PlayerGroundedState.cs

修改了格挡技能Q的逻辑判断
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class PlayerGroundedState : PlayerState
  5. {
  6.     public PlayerGroundedState(Player _player, PlayerStateMachine _stateMachine, string _animBoolName) : base(_player, _stateMachine, _animBoolName)
  7.     {
  8.     }
  9.     public override void Enter()
  10.     {
  11.         base.Enter();
  12.     }
  13.     public override void Exit()
  14.     {
  15.         base.Exit();
  16.     }
  17.     public override void Update()
  18.     {
  19.         base.Update();
  20.         if (Input.GetKeyDown(KeyCode.R))
  21.             stateMachine.ChangeState(player.blackHole);
  22.         if (Input.GetKeyDown(KeyCode.Mouse1) && HasNoSword())
  23.             stateMachine.ChangeState(player.aimSword);
  24.         if (Input.GetKeyDown(KeyCode.Q) && player.skill.parry.parryUnlocked)
  25.             stateMachine.ChangeState(player.counterAttack);
  26.         if (Input.GetKeyDown(KeyCode.Mouse0))//GetKeyDown改成GetKey按住就可以攻击了
  27.             stateMachine.ChangeState(player.primaryAttack);
  28.         if (!player.IsGroundDetected())
  29.             stateMachine.ChangeState(player.airState);
  30.         if (Input.GetKeyDown(KeyCode.Space) && player.IsGroundDetected())
  31.             stateMachine.ChangeState(player.jumpState);
  32.     }
  33.     private bool HasNoSword()
  34.     {
  35.         if (!player.sword)
  36.         {
  37.             return true;
  38.         }
  39.         
  40.         player.sword.GetComponent<Sword_Skill_Controller>().ReturnSword();
  41.         return false;
  42.     }
  43. }
复制代码
PlayerCounterAttackState.cs

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class PlayerCounterAttackState : PlayerState
  5. {
  6.     private bool canCreateClone;
  7.     public PlayerCounterAttackState(Player _player, PlayerStateMachine _stateMachine, string _animBoolName) : base(_player, _stateMachine, _animBoolName)
  8.     {
  9.     }
  10.     public override void Enter()
  11.     {
  12.         base.Enter();
  13.         canCreateClone = true;
  14.         stateTimer = player.counterAttackDuration;
  15.         player.anim.SetBool("SuccessfulCounterAttack", false);
  16.     }
  17.     public override void Exit()
  18.     {
  19.         base.Exit();
  20.     }
  21.     public override void Update()
  22.     {
  23.         base.Update();
  24.         player.SetZeroVelocity();
  25.         Collider2D[] colliders = Physics2D.OverlapCircleAll(player.attackCheck.position, player.attackCheckRadius);//这行代码在 Unity 中用于检测一个圆形区域内的所有碰撞体,并返回它们的数组。
  26.         foreach (var hit in colliders)//foreach循环是一个迭代器,它可以遍历数组、集合、列表、字典等数据结构。攻击到敌人后,调用伤害函数
  27.         {
  28.             if (hit.GetComponent<Enemy>() != null)
  29.             {
  30.                 if (hit.GetComponent<Enemy>().CanBeStunned())
  31.                 {
  32.                     stateTimer = 10;//大于1的数,保证不会进入idle状态
  33.                     player.anim.SetBool("SuccessfulCounterAttack", true);
  34.                     player.skill.parry.UseSkill();
  35.                     if (canCreateClone)
  36.                     {
  37.                         canCreateClone = false;
  38.                         player.skill.parry.MakeMirageOnParry(hit.transform);
  39.                     }
  40.                 }
  41.             }
  42.         }
  43.         if (stateTimer < 0 || triggerCalled)
  44.             stateMachine.ChangeState(player.idleState);
  45.     }
  46. }
复制代码
Dash_Skill.cs

修改了一些变量
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. //2024年11月19日添加解锁技能逻辑
  6. public class Dash_Skill : Skill
  7. {
  8.     [Header("Dash")]
  9.     [SerializeField] private UI_SKillTreeSlot dashUnlockButton;
  10.     public bool dashUnlocked { get; private set; }
  11.     [Header("Clone on dash")]
  12.     [SerializeField] private UI_SKillTreeSlot cloneOnDashUnlockButton;
  13.     public bool cloneOmDashUnlocked { get; private set; }
  14.     [Header("Clone on arrival")]
  15.     [SerializeField] private UI_SKillTreeSlot cloneOnArrivalUnlockButton;
  16.     public bool cloneOnArrivalUnlocked { get; private set; }
  17.     public override void UseSkill()
  18.     {
  19.         base.UseSkill();
  20.     }
  21.     protected override void Start()
  22.     {
  23.         base.Start();
  24.         dashUnlockButton.GetComponent<Button>().onClick.AddListener(UnlockDash);
  25.         cloneOnDashUnlockButton.GetComponent<Button>().onClick.AddListener(UnlockCloneOnDash);
  26.         cloneOnArrivalUnlockButton.GetComponent<Button>().onClick.AddListener(UnlockCloneOnArrival);
  27.         
  28.     }
  29.     private void UnlockDash()
  30.     {
  31.         if (dashUnlockButton.unlocked)   
  32.             dashUnlocked = true;
  33.     }
  34.     private void UnlockCloneOnDash()
  35.     {
  36.         if (cloneOnDashUnlockButton.unlocked)
  37.             cloneOmDashUnlocked = true;
  38.     }
  39.     private void UnlockCloneOnArrival()
  40.     {
  41.         if (cloneOnArrivalUnlockButton.unlocked)
  42.             cloneOnArrivalUnlocked = true;
  43.     }
  44.     public void CloneOnDash()
  45.     {
  46.         if (cloneOmDashUnlocked)
  47.             SkillManager.instance.clone.CreateClone(player.transform, Vector3.zero);
  48.     }
  49.     public void CloneOnArrival()
  50.     {
  51.         if (cloneOnArrivalUnlocked)
  52.             SkillManager.instance.clone.CreateClone(player.transform, Vector3.zero);
  53.     }
  54. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

盛世宏图

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表