首页 > 其他分享 >Unity引擎2D游戏开发,人物属性及伤害计算

Unity引擎2D游戏开发,人物属性及伤害计算

时间:2023-12-18 17:46:23浏览次数:33  
标签:人物属性 碰撞 Layer 无敌 public 2D Unity Boar 伤害

一、创建敌人2D模型

裁切野猪素材,并放置在Scene窗口中

打开文件夹,找到野猪待机素材
image

将素材进行必要的设置
image

点击窗口中的Sprite Editor,打开裁切窗口。点击Slice,选择Type,进行按网格计数裁切(Grid By Cell Count)
image

接着,然后在Column & Row中,写入4、1。即,4列1行。将中心点Pivot选择Bottom
image

自动裁切成功。
image

将Sheet_0拖入到Hierarchy窗口中,并命名为Boar
image

将Boar的图层顺序设置为Middle,并将Order设置为1。这样就不会被地面的草地遮挡
image

给野猪创建刚体和碰撞盒

选中Boar,点击Add Component,选择RigitBody 2D
image

Collision Detection设置为持续不断的(Continuous),并冻结Z轴
image

点击Add Component创建Box Collider 2D
image

点击Edit Collider将Box Collider设置为此大小
image

image

现在的Box Collider会导致人物穿过野猪时,会发生体积碰撞问题。这时就需要进行图层排除(Exclude Layer)。

点击右上角的Layer,选择Add Layer
image

新增两个图层,一个Player,一个Enemy
image

在Boar中,右上角Layer选择Enemy。在Player中,右上角Layer选择Player
image

image

然后在Boar的Layer Overrides内Exclude Layer中,选择Player和Enemy。这样就可以在此碰撞体中排除这两个图层。
image

为了实现人物的碰撞伤害,再给野猪创建另一个碰撞盒

选中Boar,创建Capsule Collider 2D
image

接着将Direction选择为Horizontal,实现横向形状的碰撞
image

然后点击Edit Collider,将碰撞盒修改为此大小
image

因为此碰撞盒是进行碰撞伤害,所以将Enemy图层排除
image

勾选Is Trigger,此碰撞盒进行触发碰撞伤害功能
image

二、伤害计算

准备

在Scripts下创建General文件夹
image

General文件夹内新建Character(人物数值计算)、Attack(攻击数值计算) C#文件
image

将Character添加进Boar和Player组件列表中
image

image

将Attack添加进Enemy组件列表中
image

基本数值创建

Character内新建角色基本属性

[Header("基本属性")]
public float maxHealth;
public float currentHealth;

Start()方法内,初始化血量
每次开始时,当前生命值初始化为最大生命值

private void Start()
{
    currentHealth = maxHealth;
}

Attack内新建攻击的基本属性

public int damage;
// 攻击范围
public float attackRange;
// 攻击频率
public float attackRate;

可以选中Boar对象,将damage设置为5,即伤害为5
image

Player对象,最大血量为100
image

攻击计算过程

Character内创建空白的TakeDamage()方法,以备进行伤害计算

public void TakeDamage(Attack attacker)
{

}

Attack内创建OnTriggerStay2D()方法,将被攻击的对象Collider2D传入Character组件内的TakeDamage()方法进行伤害计算

private void OnTriggerStay2D(Collider2D collision)
{
    collision.GetComponent<Character>()?.TakeDamage(this);
}

OnTriggerStay2D()方法:https://docs.unity3d.com/cn/2022.3/ScriptReference/Collider2D.OnTriggerStay2D.html

?相当于!=null,对collision.GetComponent<Character>()进行判null,如果为null,则不进行TakeDamage()

目前人物去对野猪进行碰撞,会发现短时间内被野猪造成持续不断的伤害。那么这时候就要增加“受伤无敌”的机制

Character内新建受伤无敌的基本属性

[Header("受伤无敌")]
// 无敌时间
public float invulnerableDuration;
// 计时器
private float invulnerableCounter;
// 无敌状态
public bool invulnerable;

创建TriggerInvulnerable()方法,编写无敌的触发条件

private void TriggerInvulnerable()
{
    if (!invulnerable)
    {
        invulnerable = true;
        invulnerableCounter = invulnerableDuration;
    }
}

如果当前不是在无敌的状态则赋予无敌状态,并且无敌的计数器等于无敌的时间周期

紧接着,在TakeDamage()方法中,写入新的关于无敌条件的代码

public void TakeDamage(Attack attacker)
{
    if (invulnerable)
    {
        return;
    }
    // Debug.Log(attacker.damage);
    if (currentHealth - attacker.damage > 0)
    {
        currentHealth -= attacker.damage;
        TriggerInvulnerable();
    } else
    {
        currentHealth = 0;
        // 触发死亡
    }
}

如果当前已经是无敌状态,则不进行伤害计算,直接跳出当前方法。接着,如果当前血量受到了一定数值的伤害导致血量还在大于0,则扣除伤害值,触发无敌。否则血量赋值为0,触发死亡。

为了让无敌时间进行缩减,则在Update()方法中,进行时间的扣除

private void Update()
{
    if (invulnerable)
    {
        invulnerableCounter -= Time.deltaTime;
        if (invulnerableCounter <= 0 )
        {
            invulnerable = false;
        }
    }
}

如果正在无敌,则将计数器扣除完成上一帧所使用的时间(以秒为单位)。如果计数器小于等于0,则更改当前的无敌状态为false。

可以将Player对象的无敌周期设置为1s,即受伤后的1s内无敌不会被短时间持续不断的受到伤害
image

标签:人物属性,碰撞,Layer,无敌,public,2D,Unity,Boar,伤害
From: https://www.cnblogs.com/xinlindeyu/p/17911777.html

相关文章

  • 进一步学习 CommunityToolkit.Mvvm
    1.属性绑定privatestringtitle;publicstringTitle{get;set;} 可用以下属性方式替换,生成器会自动生成;[ObservableProperty]privatestringtitle; 另一种情况:命令privateboolisEnabled;publicboolIsEnabled{......
  • 进一步学习 CommunityToolkit.Mvvm 之 Messenger
    一、带token1.订阅消息WeakReferenceMessenger.Default.Register<UserMessage,string>(this,"MyToken",(r,m)=>{});2.发送消息WeakReferenceMessenger.Default.Send(newUserMessage(value),"MyToken");二、某一种数据类型发送接收消息1.订阅消息V......
  • 【Unity】使用VSCode调试
    安装2022.3.14f1c1版本的unity编辑器并使用VSCode调试c#脚本。VSCode请使用最新版本(1.85.1),并安装Unity插件最新版本v0.9.3。在Unity中配置外部编辑器,选择VisualStudioCode(v1.85.1)。从Unity中双击一个.cs文件,可以在vscode中打开此文件。找到v......
  • 基于Unity3D 低多边形地形模型纹理贴图
    在线工具推荐:3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.jsAI自动纹理开发包 - YOLO虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎当谈到游戏角色的3D模型风格时,有几种不同的风格:写实风格:这种风格追求高度真实......
  • Unity3D 如何制作带厚度的透明图片详解
    Unity3D是一款功能强大的游戏开发引擎,可以实现各种复杂的游戏效果。本文将详细介绍如何使用Unity3D制作带厚度的透明图片,并提供代码实现。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。在Unity3D中,......
  • Unity3D 关于过大的UI帧动画如何处理详解
    Unity3D是一款流行的游戏开发引擎,它可以用来创建各种类型的游戏,包括2D和3D游戏。在游戏中,UI帧动画是一个常见的元素,它可以增加游戏的交互性和视觉效果。然而,当UI帧动画过大时,可能会导致游戏的性能下降和卡顿现象。本文将详细介绍如何处理过大的UI帧动画,并给出相应的技术详解和代码......
  • 关于Unity的Piexels Per Unit:美术素材到底要画多大?显示多大?
    问题一:Unity的一个单位(unit)是啥?就是场景里面的这样一个小格子。 新建一个square,它的默认scale是1,可以正正好塞满1个unit。 点开square的sprite,可以看见(①)图片尺寸是256x256像素,也就是你导入工程文件的图片文件的尺寸。那么它为啥能正好塞满1个unit呢?256像素和1个unit的边......
  • Qt 5.9.6+VS2019 community 环境配置
    介绍GCCminGW安装Qt5.9.6安装VS2019community略配置VS2019community在VS的管理拓展里面下载Qtvisualstudiotools如果下得很慢就手动下载vsaddin......
  • unity打包扔到iOS项目里,点击按钮没反应,
    逼逼赖赖一大堆下边的错误DelayBtn:setBtnDisable()QFramework.ProbilityHelper:InvokeGracefully(UnityAction)UnityEngine.Events.InvokableCall:Invoke()UnityEngine.Events.UnityEvent:Invoke()UnityEngine.UI.Button:Press()UnityEngine.UI.Button:OnPointerClick(Poin......
  • unity广州站gpu resident drawer笔记
    unity广州站gpuresidentdrawer笔记什么是gpuresidentdrawer  将MeshRenderer数据转为BRGbatch(BatchRendererGroup)数据的机制。  它在unity6正式推出,并关联dots。  它优化的是CPU耗时,但也可能进而提高gpu的性能。因为需要提交给GPU的绘制调用更少。  通过gpure......