学习游戏制作记录(战斗系统简述以及击中效果)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\(); 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"); }** 演示: ![](https://i-blog.csdnimg.cn/direct/b5a525b76cf8457daec6a63c8c2785f1.png) ## 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中调用上述协程。

相关推荐
游乐码4 分钟前
C#Queue
数据结构·游戏·c#
唐樽9 分钟前
C++ 竞赛学习路线笔记
c++·笔记·学习
呆呆敲代码的小Y10 分钟前
【Unity工具篇】| 游戏完整资源热更新流程,YooAsset官方示例项目
人工智能·游戏·unity·游戏引擎·热更新·yooasset·免费游戏
sensen_kiss34 分钟前
CAN302 Technologies for E-Commerce 电子商务技术 Pt.6 市场营销与SEO(搜索引擎优化)
android·学习·搜索引擎
我的xiaodoujiao36 分钟前
API 接口自动化测试详细图文教程学习系列9--Requests模块
python·学习·测试工具·pytest
乐园游梦记38 分钟前
机器学习:监督学习与无监督学习由浅入深全解析
人工智能·深度学习·学习·机器学习
woai336444 分钟前
JVM学习-基础篇-常见引用
jvm·学习
世人万千丶1 小时前
Flutter 框架跨平台鸿蒙开发 - 家庭健康档案云应用
学习·flutter·华为·开源·harmonyos·鸿蒙
東雪木1 小时前
Java学习——泛型基础:泛型的核心作用、泛型类 / 方法 / 接口的定义
java·学习·java面试
東雪木1 小时前
Java学习——内部类(成员内部类、静态内部类、局部内部类、匿名内部类)的用法与底层实现
java·开发语言·学习·java面试