Unity类银河恶魔城学习记录12-11 P133 Merge Skill Tree with Parry skill源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考
此代码仅为较上一P有所改变的代码

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

 Parry_Skill.cs
using UnityEngine;
using UnityEngine.UI;public class Parry_Skill : Skill
{[Header("Perry")][SerializeField] private UI_SkillTreeSlot parryUnlockButton;public bool parryUnlocked { get; private set; }[Header("Restore Health")][SerializeField] private UI_SkillTreeSlot restoreUnlockButton;[Range(0f, 1f)][SerializeField] private float restoreHealthPerentage;public bool restoreUnlocked{ get; private set; }[Header("Parry Mirage")][SerializeField] private UI_SkillTreeSlot parryWithUnlockButton;public bool parryWithMirageUnlocked { get; private set; }public override void UseSkill(){base.UseSkill();if (restoreUnlocked){int restoreAmount = Mathf.RoundToInt(player.stats.GetMaxHealthValue() * restoreHealthPerentage);player.stats.IncreaseHealthBy(restoreAmount);}}protected override void Start(){base.Start();parryUnlockButton.GetComponent<Button>().onClick.AddListener(UnlockParry);restoreUnlockButton.GetComponent<Button>().onClick.AddListener(UnlockParryRestore);parryWithUnlockButton.GetComponent<Button>().onClick.AddListener(UnlockParryWithMirage);}private void UnlockParry(){Debug.Log(2);if (parryUnlockButton.unlocked){parryUnlocked = true;}}private void UnlockParryRestore(){if (restoreUnlockButton.unlocked){restoreUnlocked = true;}}private void UnlockParryWithMirage(){if (parryWithUnlockButton.unlocked){parryWithMirageUnlocked = true;}}public void MakeMirageOnParry(Transform _transform){if (parryWithMirageUnlocked)player.skill.clone.CanCreateCloneWithDelay(_transform);}
}
Clone_Skill.cs
using System.Collections;
using UnityEngine;public class Clone_Skill : Skill
{[Header("Clone Info")][SerializeField] private GameObject clonePrefab;//克隆原型[SerializeField] private float cloneDuration;//克隆持续时间[SerializeField] private bool canAttack;// 判断是否可以攻击[Header("Clone can duplicate")][SerializeField] private bool canDuplicateClone;[SerializeField] private float chanceToDuplicate;[Header("Crystal instead of clone")]public bool crystalInsteadOfClone;public void CreateClone(Transform _clonePosition, Vector3 _offset)//传入克隆位置{if (crystalInsteadOfClone){SkillManager.instance.crystal.CreateCrystal();return;}//让所有的生成克隆的技能都变成生成水晶GameObject newClone = Instantiate(clonePrefab);//创建新的克隆//克隆 original 对象并返回克隆对象。//https://docs.unity3d.com/cn/current/ScriptReference/Object.Instantiate.htmlnewClone.GetComponent<Clone_Skill_Controller>().SetupClone(_clonePosition, cloneDuration, canAttack, _offset, FindClosestEnemy(newClone.transform), canDuplicateClone, chanceToDuplicate, player);//调试clone的位置,同时调试克隆持续时间                                                                                            //Controller绑在克隆原型上的,所以用GetComponent                                                                                        }//反击后产生一个克隆背刺敌人public void CanCreateCloneWithDelay(Transform _enemyTransform){StartCoroutine(CreateDelayCoroutine(_enemyTransform, new Vector3(1 * player.facingDir, 0, 0)));}//整个延迟生成private IEnumerator CreateDelayCoroutine(Transform _enemyTransform, Vector3 _offset){yield return new WaitForSeconds(.4f);CreateClone(_enemyTransform, _offset);}
}

SkillManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class SkillManager : MonoBehaviour
{public static SkillManager instance;public Dash_Skill dash { get; private set; }public Clone_Skill clone { get; private set; }public Sword_Skill sword { get; private set; }public Blackhole_Skill blackhole { get; private set; }public Crystal_Skill crystal { get; private set; }public Parry_Skill parry { get; private set; }private void Awake(){if (instance != null){// Destroy(instance.gameObject);}elseinstance = this;}private void Start(){dash = GetComponent<Dash_Skill>();clone = GetComponent<Clone_Skill>();sword = GetComponent<Sword_Skill>();blackhole = GetComponent<Blackhole_Skill>();crystal = GetComponent<Crystal_Skill>();parry = GetComponent<Parry_Skill>();}
}
PlayerGroundState.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//GroundState用于保证只有在Idle和Move这两个地面状态下才能调用某些函数,并且稍微减少一点代码量
public class PlayerGroundState : PlayerState
{public PlayerGroundState(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())//点击右键进入瞄准状态,当sword存在时,不能进入aim状态{stateMachine.ChangeState(player.aimSword);}if(Input.GetKeyDown(KeyCode.Q) && player.skill.parry.parryUnlocked)//摁Q进入反击状态{stateMachine.ChangeState(player.counterAttack);}if(Input.GetKeyDown(KeyCode.Mouse0))//p38 2.从ground进入攻击状态{stateMachine.ChangeState(player.primaryAttack);}if(player.IsGroundDetected()==false){stateMachine.ChangeState(player.airState);}// 写这个是为了防止在空中直接切换为moveState了。if (Input.GetKeyDown(KeyCode.Space) && player.IsGroundDetected()){stateMachine.ChangeState(player.jumpState);}//空格切换为跳跃状态}private bool HasNoSword()//用这个函数同时控制了是否能进入aimSword和如果sword存在便使他回归player的功能{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;
//从Ground里摁Q进入
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;//设置Counter在没有成功的情况下可以保持的时间player.anim.SetBool("SuccessfulCounterAttack", false);//默认失败}public override void Exit(){base.Exit();}public override void Update(){base.Update();player.SetZeroVelocity();// 修复在Counter时还能移动的问题Collider2D[] colliders = Physics2D.OverlapCircleAll(player.attackCheck.position, player.attackCheckRadius);//创建一个碰撞器组,保存所有圈所碰到的碰撞器//https://docs.unity3d.com/2022.3/Documentation/ScriptReference/Physics2D.OverlapCircleAll.htmlforeach (var hit in colliders)//https://blog.csdn.net/m0_52358030/article/details/121722077{if (hit.GetComponent<Enemy>() != null){if(hit.GetComponent<Enemy>().CanBeStunned()){stateTimer = 10;//只要比1大就行,防止成功反击的动画还没完就进入idleState了player.anim.SetBool("SuccessfulCounterAttack", true);//使进入成功反击动画player.skill.parry.UseSkill();//设置反击回血if (canCreateClone){canCreateClone = false;//每次反击只产生一个cloneplayer.skill.parry.MakeMirageOnParry(hit.transform);}}}}if(stateTimer<0||triggerCalled)//当反击动画结束或反击可以持续的时间结束后回到idleState{stateMachine.ChangeState(player.idleState);}}
}

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

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

相关文章

MySQL进阶 ==> 引擎选择优化指南

数据库引擎的选择&#xff1a; InnoDB InnoDB存储引擎是Mysql的默认存储引擎。InnoDB存储引擎提供了具有提交、回滚、崩溃恢复能力的事务安全。但是对比MyISAM的存储引擎&#xff0c;InnoDB写的处理效率差一些&#xff0c;并且会占用更多的磁盘空间以保留数据和索引。 存储方…

大模型应用实践闭门研讨会即将召开|爱分析活动

随着人工智能领域大模型技术的快速发展&#xff0c;政府出具很多指导性意见&#xff0c;在最新的《2024年政府工作报告》中&#xff0c;明确提出了开展“人工智能”行动&#xff0c;显示出政府对AI大模型发展的高度重视和支持。金融行业在AI大模型领域的政策支持和工作进展都呈…

AMD vs Intel处理器对比:性能、功耗、价格全方位分析

AMD处理器型号通常由一系列字母、数字和符号组成&#xff0c;这些元素共同构成了一个完整、具有特定含义的标识符。下面跟随道合顺一起来理解这些标识符背后的含义。 解读AMD处理器标识符 品牌系列标识 AMD处理器型号的开头通常会包含品牌系列标识&#xff0c;如“Ryzen”、“T…

管理能力学习笔记五:识别团队角色,因才施用

识别团队角色&#xff0c;因才施用&#xff0c;需要做到以下三点 扬长避短 管理者要学会问自己员工能把什么做好&#xff0c;而不是想方设法改造他们的短处 。 – 彼得德鲁克 人岗匹配 将合适的人放在合适的位置 人才多样化 团队需要各式各样的人才&#xff0c;才能高效配合…

Matlab之空间坐标系绘制平面图形

在空间直角坐标系中&#xff0c;绘制指定平面方程的图形 版本说明&#xff1a; 20240413_V1.01&#xff1a;更正代码错误&#xff0c;并修改输入参数类型&#xff08;测试用例得修改&#xff09; 20240413_V1.00&#xff1a;初始版本 一、平面方程 基本形式为&#xff1a;A…

读取pcd文件并在rviz中进行显示

参考&#xff1a;pcd文件在rviz中显示 功能包创建 cd Downloads/ROS mkdir -p pcdreadshow_ws/src cd src catkin_init_workspace catkin_create_pkg read_pcd pcl_conversions pcl_ros roscpp sensor_msgs读取点云文件并发布 #include<ros/ros.h> #include<pcl/po…

postgresql数据库pg_dirtyread插件闪回技术 —— 筑梦之路

闪回查询&#xff08;Flashback Query&#xff09;是一种在数据库中执行时间点查询的技术。它允许查询数据库中过去某个时间点的数据状态&#xff0c;并返回相应的查询结果。通常闪回查询分为表级以及行级的闪回查询。PostgreSQL数据库由于MVCC的机制&#xff0c;对于DML的操作…

前端webWorker 的介绍以及应用

文章目录 webWorker以下是关于 Web Workers 的一些关键概念&#xff1a;控制台查看使用注意事项消息传递创建subworkerwebWorker的具体使用注意事项 共享worker(SharedWorker)创建方法&#xff1a;与专用worker的主要区别&#xff1a; webWorker JavaScript是单线程的语言&…

vscode调试文件(C++,ROS和cmake文件)

VsCode调试文件 参考文档&#xff1a; code.visualstudio.com/docs/editor/variables-reference code.visualstudio.com/docs/editor/tasks 主要修改task.json下的"args"、launch.json中的"program",“args” 注意task.json中的label以及launch.json中…

Python程序设计 元组和集合

教学案例七 元组和集合 1. 根据年月日计算周几 根据输入的年号、月号、日号&#xff0c;计算是周几(中文、英文) 蔡勒公式 通过蔡勒&#xff08;Zeller&#xff09;公式可计算星期几 w:星期; w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六 c&…

【苍穹外卖】Springboot中快速使用mybatis插件-PageHelper

目录 Springboot中快速使用mybatis插件-PageHelper1. 导入Maven坐标2. 拦截查询方法3. 编写查询的方法和mapper接口4. 配置&#xff1a;扫描Mapper.xml的映射文件路径5. 版本说明 Springboot中快速使用mybatis插件-PageHelper 1. 导入Maven坐标 <dependency><groupI…

MyBatis Dynamic SQL基本使用

MyBatis Dynamic SQL基本使用 一、概念二、特性Hamcrest是什么 三、MyBatis Dynamic SQL 快速入门3.1 环境准备3.2 定义表和列3.3 创建 MyBatis3 映射器3.4 使用 MyBatis3 执行 SQL 四、数据库对象表示4.1 表或视图表示4.2 表别名4.3 列表示 五、Where 子句支持5.1 简单的 wher…

RIP最短路实验(思科)

华为设备参考&#xff1a; 一&#xff0c;技术简介 RIP&#xff08;Routing Information Protocol&#xff0c;路由信息协议&#xff09;是一种基于距离矢量的内部网关协议&#xff0c;它根据跳数来度量路由开销并进行路由选择。RIP是最典型的距离矢量路由协议&#xff0c;常…

多高的学历才能轻松找到工作?这个热点有点扯吧~

先来唠唠 昨天刷脉脉的时候&#xff0c;热榜第一的内容吸引了我&#xff1a;多高的学历才能轻松找到工作&#xff1f; 现在这行情&#xff0c;不管多高得学历都很难说能轻松找到工作吧~ 评论区也有不少小伙伴发表自己的见解&#xff0c;比如&#xff1a; 学历固然是非常重要…

【QT学习】8.qt事件处理机制

1.qt事件处理机制 事件处理&#xff1a; 当用户移动鼠标的时候 &#xff0c;创建一个 鼠标移动事件对象 然后把这个对象放到 事件队列里面去&#xff0c;事件管理器 从队列中 取出事件&#xff0c;然后 调用其对应的事件处理函数。 多态机制&#xff1a; &#x…

2024妈妈杯数学建模思路A题思路汇总分析 MathorCup建模思路分享

C题&#xff1a;移动通信网络中PCI规划问题 &#xff08;完整版内容放在文末了&#xff09; 2024MathorCup A题完整思路完整数据可执行代码后续高质量成品论文 l 难度评分: 3.5/5 l 开放度评分: 3/5 l 适合专业: 通信工程、计算机科学、电子工程 l 主要算法: 图论算法、…

route路由命令、ip route命令、default默认路由(0.0.0.0 )

文章目录 概述3. route语法3.1 查看路由表3.1 参数解释 3.2 添加路由记录3.2.1 添加到达单个目标主机的路由3.2.2 添加到达目标网络的路由3.2.3 添加默认路由 3.3 删除路由记录 4. ip route4.1 查看路由4.1.1 不带条件4.1.2 带条件4.1.3 字段解释4.1.3 字段解释 4.2 添加路由4.…

sublime text的json快捷键

系统 macos 配置 sublime Text->Settings->Key Bindings 效果 可以看到&#xff0c;按&#xff1a;shiftcommandp&#xff0c;会出现快捷键窗口&#xff0c;打pretty&#xff0c;会出现Format JSON&#xff0c;最右侧显示⌘J&#xff0c;说明只需要macos的⌘和J同时按…

Midjourney指南 - 生成高分辨率图片(内容已更新至V5)

Midjourney 首先为每个作业生成一个低分辨率图片网格(2x2)。你可以在选择其中任一图片&#xff0c;使用 Midjourney upscaler 来增加尺寸并添加更多细节。有多种可用于放大图像的放大模型。 每个图像网格下方的按钮用于放大所选图像。U1 U2 U3 U4 注&#xff1a;upscaler 以下…

高精度PWM脉宽调制信号转模拟信号隔离变送器1Hz-10KHz转0-5V/0-10V/1-5V,0-10mA/0-20mA/4-20mA

主要特性: >>精度等级&#xff1a;0.1级。产品出厂前已检验校正&#xff0c;用户可以直接使用 >>辅助电源&#xff1a;8-32V 宽范围供电 >>PWM脉宽调制信号输入: 1Hz~10KHz >>输出标准信号&#xff1a;0-5V/0-10V/1-5V,0-10mA/0-20mA/4-20mA等&…