当前位置: 首页 > news >正文

学习游戏制作记录(战斗系统简述以及击中效果)7.22

1.战斗系统

我们需要知道我们想在战斗中实现一个怎么样的效果,比如我们可以通过闪避和反击来应对敌人的攻击,并且当我们被攻击时以及反击时会有退后的效果,或者敌人攻击时会有闪光提示等等,今天我们要来实现一些战斗系统的功能。

2.注册攻击逻辑

在一个圆形范围内填充碰撞器并检测碰撞器内的物体调用相应的伤害函数

Enitity脚本:

    public Transform attackCheck;
public float attackCheckRadius;//攻击检测对象和检测半径

Gizmos.DrawWireSphere(attackCheck.position, attackCheckRadius);//画图以方便调试距离

    public virtual void Damage()
{
Debug.Log(gameObject.name + " attack");//调用函数,未实现具体功能
}

PlayerAnimationTrigger脚本:

    private void AttackTrigger()
{
Collider2D[] collider2Ds = Physics2D.OverlapCircleAll(player.attackCheck.position, player.attackCheckRadius);//定义一个碰撞器将圆形填满

        foreach(var hit in collider2Ds)//遍历检测到的对象
{
if(hit.GetComponent<Enemy>()!=null)//如果获取到敌人则调用
{
hit.GetComponent<Enemy>().Damage();
}
}
}

Enemy_SkeletonAnimationTrigger脚本:

    private void AttackTrigger()//同样的道理
{
Collider2D[] collider2Ds = Physics2D.OverlapCircleAll(enemy.attackCheck.position, enemy.attackCheckRadius);

        foreach (var hit in collider2Ds)
{
if (hit.GetComponent<Player>() != null)
{
hit.GetComponent<Player>().Damage();
}
}
}

最后不要忘记在玩家和敌人攻击的动画中添加帧事件来调用这个攻击触发函数

演示:

3.修改碰撞器逻辑

我们希望玩家可以穿过敌人而不是挤压,这很简单实现,确保玩家和敌人各有对应的层级

然后修改设置:

取消勾选Enemy和Player

4.制作简单的击中效果

我们将采用协程的方法,当玩家或敌人被击中时,更换材质,几秒后切为原来的材质

制作一个白色的材质

创建EntityFX脚本:

    private SpriteRenderer sr;//获取精灵组件
[Header("FlashFX info")]
[SerializeField] private float flashDuration;//闪光时间
[SerializeField] private Material hitMar;//闪光材质
private Material originalMar;//原材质

    public void Start()
{
sr=GetComponent<SpriteRenderer>();
originalMar =sr.material;
}

    private IEnumerator FlashFX()//协程
{
sr.material = hitMar;
yield return new WaitForSeconds(flashDuration);

        sr.material = originalMar;

    }
}

Entity脚本:

public EntityFX entityFX { get; private set; }//定义并获取它

    public virtual void Damage()
{
entityFX.StartCoroutine("FlashFX");//调用那个协程
Debug.Log(gameObject.name + " attack");
}

演示:

5.添加击中后退的效果

同样运用协程,当敌人被攻击时,设置被击退,并且给它一个力,当击退时间结束时退出击退,要注意被击退时不能调用原有的速度设置函数

Entity脚本:

    [Header("Knockback info")]
[SerializeField] protected Vector2 KnockbackDirection;//击退方向
[SerializeField] protected float KnockbackDuration;//持续时间
protected bool isKnockback;//是否击退

修改:

 public virtual void SetZeroVelocity()
{
if(isKnockback)//当被击退时不能调用原有的速度设置函数
{
return;
}
rb.velocity = new Vector2(0, 0);

 }
public virtual void SetVelocity(float _xVelocity, float _yVelocity)
{
if (isKnockback)
{
return;
}
rb.velocity = new Vector2(_xVelocity, _yVelocity);
FlipContorller(_xVelocity);

    protected virtual IEnumerator HitKonockback()//协程
{
isKnockback = true;

        rb.velocity = new Vector2(KnockbackDirection.x * -facingDir,KnockbackDirection.y);

        yield return new WaitForSeconds(KnockbackDuration);

        isKnockback = false;
}

在Update中调用上述协程。

http://www.dtcms.com/a/292810.html

相关文章:

  • 为什么使用扩展坞会降低显示器的最大分辨率和刷新率
  • 智能泵房监控系统:物联网应用与智能管理解决方案
  • 【观察】维谛技术(Vertiv)“全链智算”:重构智算中心基础设施未来演进范式
  • 如何编译RustDesk(Unbuntu 和Android版本)
  • Cookies 详解及其与 Session 的协同工作
  • AWS OpenSearch 搜索排序常见用法
  • 2️⃣tuple(元组)速查表
  • C语言面向对象编程
  • Java函数式编程深度解析:从基础到高阶应用
  • Leetcode题解:209长度最小的子数组,掌握滑动窗口从此开始!!!
  • 光伏电站智能数据采集系统解决方案
  • SpringBoot PO VO BO POJO实战指南
  • 十进制小数转换为二进制表示 ← 除2取余法+乘2取整法
  • csp基础知识——递推
  • SMTP+VRRP实验
  • Markdown 转 PDF API 数据接口
  • REASONING ELICITATION IN LANGUAGE MODELSVIA COUNTERFACTUAL FEEDBACK
  • 高性能线程安全的时间有序 UUID 生成器 —— 基于 ThreadLocal 的实现
  • 实操:AWS CloudFront的动态图像转换
  • Cadence 原理图如何给网络名称添加页码
  • 『React』条件渲染的7种方法
  • 基于Prompt 的DevOps 与终端重塑
  • 装备数字孪生底座平台探索
  • HTTP 协议常见字段(请求头/响应头)
  • 虚幻5入门教程:如何在虚幻5中创建一个C++的Plugin
  • android 12 的 aidl for HAL 开发示例
  • VR技术在元宇宙游戏中的作用及发展前景深度分析
  • Fluent许可与网络安全策略
  • 基于JSP的快递管理系统/快递寄出管理系统
  • 初识opencv01——基本api操作