Unity2D - 基本战斗系统(Battle System Design)

1. 攻击逻辑

在Entity中初始化两个变量,因为在每个角色几乎都拥有攻击状态。这两个变量分别是transform类,接收一个坐标和一个半径画一个圆作为攻击的判定范围

public Transform attackCheck;
public float attackCheckRadius;

为了可视化攻击范围,我们使用辅助画图帮助我们对范围进行设定

protected virtual void OnDrawGizmos()
{Gizmos.DrawWireSphere(attackCheck.position,attackCheckRadius);
}

对于敌人的处理也是如此,不要忘记将我们实体Transform传入我们的变量。

之后将创建attack方法,作用于动画中的某一帧,在这一帧中才是真正造成了攻击,也就是应用到了某一函数方法。有经验的读者想必已经想到了事件功能。

创建一个新的脚本命名为PlayerAnimationTrigger,将动画中某一帧与这个脚本中的某一个方法相结合就可以产生当动画执行至某一帧后执行当前脚本事件的效果。

我们编写脚本在动画这一帧中检查二维空间中所有与这个圆重叠的Collider2D的组件,并将这些组件存储在colliders数组中。

private void AttackTrigger()
{Collider2D[] colliders = Physics2D.OverlapCircleAll(player.attackCheck.position,player.attackCheckRadius);foreach (var hit in colliders){if (hit.GetComponent<Enemy>() != null){hit.GetComponent<Enemy>().Damage();}}
}
  • Physics2D.OverlapCircleAll:这是Unity Physics2D模块中的一个静态方法,用于检测并返回与指定圆形区域相交的所有Collider2D组件。这个方法不依赖于物理引擎的碰撞检测(即不依赖于速度或力的计算),而是直接基于碰撞体的几何形状和位置进行判断。

  • 注意:默认情况下,Physics2D.OverlapCircleAll会检测所有层的碰撞体。如果你只想检测特定层的碰撞体,可以使用Physics2D.OverlapCircleAll(Vector2 position, float radius, int layerMask)的重载版本,其中layerMask参数允许你指定要检测的层

然后获取敌人组件中Enemy脚本,若不为空,则执行其中的Damage方法。

2. 碰撞器检测

在默认情况下,两个碰撞体相互碰撞会造成位移,为了防止敌人与玩家之间造成位移,我们需要修改如下设定:点击左上角Edit,选中Project Settings,找到Physics2D中的layer Collision Matrix,将对应两个图层勾选取消即可。

3. 被击打效果

3.1 被击打变色

我们需要创建一个新的材料作为被击打时变换的样子,将shader(着色器)搜索设定为GUI

被击打变色的底层逻辑就是在某一事件发生后,将物体的材料改变,持续多久之后恢复原有状态。

新建一个协程EntityFX

public class EntityFX
{private SpriteRenderer sr;[SerializeField] private Material hitMat;private Material originalMat;private void Start(){sr = GetComponentInChildren<SpriteRenderer>();originalMat = sr.material;}private IEumerator FlashFX(){sr.material = hitMat; //更改材料yield return new WaitForSeconds(.2f); //暂停协程,等待0.2ssr.material = originalMat; }
}

  • sr.material = hitMat;:这行代码将某个渲染器(假设为 sr)的材质更改为 hitMat。这通常用于显示一个“被击中”或“激活”的视觉效果。
  • yield return new WaitForSeconds(.2f);:这行代码暂停协程的执行,等待 0.2 秒。WaitForSeconds 是一个特殊的 yield 指令,用于在协程中创建等待时间。
  • sr.material = originalMat;:等待时间过后,将渲染器的材质改回原始材质 originalMat,从而完成闪烁效果

将上述类定义好之后,我们还需要在角色父类中实例化此类才可进行调用。

对于我们的damage方法,我们添加:

Public virtual void Damage()
{fx.StartCoroutine("FlashFX");
}

其中StartCoroutine是一个协程函数,允许你在游戏运行时异步执行代码,而不需要使用多线程的复杂性。协程(Coroutine)可以视为一个可以暂停和恢复的函数。

协程函数通常返回一个IEnumerator类型,这是通过System.Collections命名空间提供的。在协程函数内部,你可以使用yield return语句来暂停协程的执行,并在未来的某个时间点恢复执行。

3.2 击退状态

在角色父类中定义击退相关信息

[SerializeField] protected Vector2 knockbackDirection;
protected bool isKnocked;
[SerializeField] protected float knockbackDuration;

声明击退函数,被击打了向后退一定距离。

protected virtual IEnumerator Hitknockback()
{isKnocked = true;rb.velocity = new Vector2(knockbackDirection.x * -facingDir,knockbackDirection.y);yield return new WaitForSeconds(knockbackDuration);isKnocked = false;
}//在前进函数中我们需要设定,如果被击退则无法继续前进
public void SetVelocity(float _xvelocity,float _yvelocity)
{if (isKnocked){return;}
}

在damage方法中加入这一事件:

public virtual void Damage()
{StartCoroutine("HitKnockback");
}

4. 防守与反击效果

4.1 敌人被反击效果

将相关动画以及动画参数,逻辑设定好之后,根据状态机创建一个新的状态,不要忘记在角色中声明该状态SkeltonStunnedState,然后声明相应的构造函数以及重构。

与之前一样,在主函数中声明相应信息。stunDuration,stunDirection。

public class SkeltonStunnedState
{public override void Enter(){base.Enter();stateTimer = enemy.StunDuration;rb.velocity = new Vector2(-enemy.facingDir * enemy.stunDirection.x,enemy.stunDirection.y);}public override void Update(){base.Update();if (stateTimer < 0){statemachine.changeState(enemy.idleState);}}
}

让我们会到EntityFX渲染类中,对攻击效果进行进一步设定,有着闪烁的效果,相应的也要设定取消这个效果的方法。

private void RedcolorBlink()
{if (sr.color != Color.white){sr.color = Color.white;}else{sr.color = Color.red;}
}private void CancelRedBlink()
{CancelInvoke();sr.color = Color.white;
}

在进入状态时声明闪烁相应秒数:

public override void Enter()
{enemy.fx.InvokeRepeating("RedColorBlink",0,.1f); //分别是调用方法,延迟时间,持续时间
}public override void Exit()
{base.Exit();enemy.fx.Invoke("CancelRedBlink",0);
}

Invoke函数是MonoBehaviour类中的一个非常有用的方法,它允许你在指定的延迟时间后自动调用另一个MonoBehaviour中的方法,而无需使用额外的线程或定时器。

4.2 防守反击

将动画的逻辑与相关参数设定好之后进行脚本的编辑

public class PlayerCounterAttackState:PlayerState
{//构造函数public override void Enter(){base.Enter();stateTimer = player.counterAttackDuration;player.anim.SetBool("SuccessfulCounterAttack",false); //反击成功参数先设置为0}public override void Exit(){}public override void Update(){base.Update();player.ZeroVelocity(); //防守期间不能移动Collider2D[] colliders = Physics2D.OverlapCircleAll(player.attackCheck.position,player.attackCheckRadius);foreach (var hit in colliders) //如果防守期间检测到攻击{if (hit.GetComponent<Enemy>() != null){stateTimer = 10;player.anim.SetBool("SuccessfulCounterAttack",true);}}if (stateTimer < 0 || triggerCalled){stateMachine.ChangeState(player.idleState); //时间到了或者动画结束,自动结束该状态}}
}

后续对于玩家进行指定的事件操作即可。

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

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

相关文章

Python的多态

在 Python 中&#xff0c;多态&#xff08;Polymorphism&#xff09;是指不同的对象可以对相同的消息&#xff08;方法调用&#xff09;做出不同的响应。 简单来说&#xff0c;多态允许使用一个统一的接口来操作不同类型的对象&#xff0c;而这些对象会根据自身的类型来执行相应…

某水利集团晋升体系优化项目成功案例纪实

——通过多元化职业晋升通道&#xff0c;激发员工潜力 【客户行业】水务行业&#xff1b;水利处理 【问题类型】晋升体系优化&#xff1b;人才管理系统 【客户背景】 某水利处理集团是国内领先的综合性水资源管理与水务服务供应商。该集团专注于提供包括原水供应、自来水生…

基于ROS的智能网联车远程交互软件,全UI无需记忆指令,剑指核心原理。

基于ROS的智能网联车远程交互软件&#xff0c;全UI无需记忆指令&#xff0c;剑指核心原理。 服务于中汽恒泰&#xff0c;伟大的项目&#xff0c;希望看官点赞&#xff0c;谢谢~~ 进程&#xff08;节点&#xff09;列表化&#xff0c;参数面板化&#xff0c;实现快速机器人配置…

Linux--V4L2摄像头驱动框架及UVC浅析

一、前言 对于一个usb摄像头&#xff0c;它的内核驱动源码位于/drivers/media/usb/uvc/ 核心层&#xff1a;V4L2_dev.c文件 硬件相关层&#xff1a; uvc_driver.c文件 本篇记录基于对6.8.8.8内核下vivid-core.c文件&#xff08;虚拟视频驱动程序&#xff09;的分析&#xff…

推荐系统中Prior Belief的概念(附代码)

在推荐系统中&#xff0c;先验信念&#xff08;prior belief&#xff09;是指在没有观察到实际数据之前&#xff0c;我们对某些参数或变量的初始假设或预期。这种先验信念可以帮助模型在数据稀疏或噪声较多的情况下做出更好的预测。 先验信念&#xff08;Prior Belief&#xf…

独立站运营招聘:寻找璀璨之星,开启运营之旅

尊敬的各位同仁&#xff0c;我乃大家熟知的独立站长&#xff0c;对于运营独立站点始终保持着满腔热情。今日&#xff0c;我欲与诸位共同探讨一热门议题—独立站运营招聘。此次招聘不再仅为职位争夺&#xff0c;更为寻找璀璨之星的探险之旅。 独立站的灵魂&#xff1a;什么是独…

Mysql中视图的使用以及常见运算符的使用示例和优先级

场景 基础知识回顾&#xff1a;mysql中视图的基础使用以及常见运算符的使用示例。 注&#xff1a; 博客&#xff1a;霸道流氓气质-CSDN博客 实现 Mysql中视图的使用 视图的创建 CREATE VIEW stu_view AS SELECT * FROM bus_student; 视图查询 SELECT * FROM stu_view;…

澳大利亚媒体发稿:怎样用图表提高易读性?-华媒舍

媒体发稿的可读性变得尤为重要。读者们不会再有时间与耐心去阅读文章繁琐的文本&#xff0c;他们更喜欢简洁明了的信息展现形式&#xff0c;在其中图表是一种极为高效的专用工具。下面我们就详细介绍怎么使用图表提高澳大利亚新闻媒体发稿的可读性&#xff0c;以适应读者的需要…

java 栅栏(CyclicBarrier)

Java中的栅栏&#xff08;CyclicBarrier&#xff09;是一种用于协调多个线程并发工作的同步辅助类。与CountDownLatch不同&#xff0c;CyclicBarrier允许一组线程相互等待&#xff0c;直到所有线程都到达一个共同的屏障点&#xff08;barrier&#xff09;后&#xff0c;才继续执…

CSS 【详解】样式选择器(含ID、类、标签、通配、属性、伪类、伪元素、Content属性、子代、后代、兄弟、相邻兄弟、交集、并集等选择器)

CSS 样式选择器&#xff0c;用于选中页面中的 html 元素&#xff0c;以便添加 CSS 样式。 按渲染性能由高到低 依次是&#xff1a; ID 选择器 #id 通过元素的 id 属性选中元素&#xff0c;区分大小写 <p id"p1" >第一段</p>#p1{color: red; }但不推荐使…

【LinuxC语言】手撕Http之处理POST请求

文章目录 前言声明POST的组成读取POST信息读取消息体长度读取消息体解析消息体How to use?总结前言 在互联网的世界中,HTTP协议无疑是最重要的协议之一。它是Web的基础,支持着我们日常生活中的大部分在线活动。尽管有许多现成的库可以处理HTTP请求,但了解其底层工作原理是…

全面解析:儿童编程等级考试及其区别

目录 1. 前言2. 儿童编程等级考试的重要性3. 儿童编程等级考试的特点4. 儿童编程等级考试4.1 非专业级软件能力认证(CSP-J/S)4.2 GESP编程能力等级认证4.3 青少年编程能力等级测试(CPA)4.4 全国青少年软件编程等级考试4.5 全国青少年编程能力等级考试(PAAT)1. 前言 近年来…

【学习笔记】Mybatis-Plus(四):MP中内置的插件

内置插件 目前MP已经存在的内部插件包括如下&#xff1a; 插件类名作用PaginationInnerInterceptor分页插件。可以代替以前的PageHelperOptimisticLockerInnerInterceptor乐观锁插件。用于幂等性操作&#xff0c;采用版本更新记录DynamicTableNameInnerInterceptor动态表名Te…

【Rust】Cargo介绍

一、Cargo简介 Cargo 是Rust语言的包管理工具&#xff0c;它帮助我们管理我们项目的依赖。做js开发的同学应该了解nodejs的包管理工具npm&#xff0c;Cargo和npm做的事情是一样的。C和C的同学可能对这个就比较陌生了&#xff0c;C/C语言没有统一的依赖管理工具&#xff0c;各个…

Spring中常见知识点及使用

Spring Framework 是 Java 生态系统中最流行的开源框架之一&#xff0c;它提供了一系列强大的功能&#xff0c;用于构建企业级应用。以下是一些常见的 Spring 知识点及其使用方法&#xff1a; 1. 依赖注入&#xff08;Dependency Injection&#xff09; 依赖注入是 Spring 的…

【SpringCloud应用框架】Nacos集群架构说明

第六章 Spring Cloud Alibaba Nacos之集群架构说明 文章目录 前言一、Nacos支持三种部署模式二、集群部署说明三、预备环境 前言 到目前为止&#xff0c;已经完成了对Nacos的一些基本使用和配置&#xff0c;接下来还需要了解一个非常重要的点&#xff0c;就是Nacos的集群相关的…

【芯片制造】【问题整理】明场检测和暗场检测

背景&#xff1a; 什么是明场检测和暗场检测 主要功能&#xff1a; 1、在明场检测中&#xff0c;光源直接照射到样品表面&#xff0c;透射光或反射光被收集并成像。样品上的颗粒、划痕、凹坑会改变光的反射和透射&#xff0c;形成对比&#xff0c;能够快速扫描大面积样品。 2、…

SAP - 初识

人过三十不学艺&#xff1b;活到老学到老。。。。。。 怎么说都有理&#xff0c;说不如做 低头做事&#xff0c;抬头看天 先做&#xff0c;至少了解下是个什么&#xff1f; 1. SAP是什么 https://www.sap.cn/ -- 思爱普中国 https://www.sap.cn/about/wha…

金斗云 HKMP智慧商业软件 任意用户创建漏洞复现

0x01 产品简介 金斗云智慧商业软件是一款功能强大、易于使用的智慧管理系统,通过智能化的管理工具,帮助企业实现高效经营、优化流程、降低成本,并提升客户体验。无论是珠宝门店、4S店还是其他零售、服务行业,金斗云都能提供量身定制的解决方案,助力企业实现数字化转型和智…

无人机遥控器指令加密方法

遥控信息的安全问题是无人机遥控系统设计和任务实施过程中最重要的问题之一。然而日益发展的电子侦察和电子对抗技术&#xff0c;使第三方可以截获已方所发送的遥控指令&#xff0c;分析和窃取遥控信息的内容&#xff0c;从而伪造遥控信息&#xff0c;对己方无人机构成严重威胁…