2-10. 人物属性及伤害计算

场景中添加一只野猪

将素材中的野猪图片进行切割,然后给野猪绑定刚体和碰撞体

注意需要两个碰撞体

第一个碰撞体在脚底,避免野猪掉下去,为了避免这个碰撞体和其它敌人以及玩家产生碰撞,需要排除 Player 和 Enemy 层,这样这个碰撞体就只会和平台产生碰撞,避免野猪掉下去

第二个碰撞体表示野猪的攻击和受伤范围,需要改成触发器。对于 Capsule Collider 2D,可以修改方向

添加属性和伤害代码

在 Scripts 下面新建一个 General 文件夹,把之前 PhysicsCheck 代码也放进去,再新增 Character 和 Attack 两个代码

代码比较多,我一个个细说

Character

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Character : MonoBehaviour
{
    [Header("基本属性")]
    public float maxHealth;
    public float currentHealth;

    [Header("受伤无敌")]
    public float invulnerableDuration;
    public float invulnerableCounter;
    public bool invulnerable;

    private void Start()
    {
        currentHealth = maxHealth;
    }

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

    public void TakeDamage(Attack attacker)
    {
        if (invulnerable)
        {
            return;
        }

        // Debug.Log($"damage = {attacker.damage}");
        if (currentHealth - attacker.damage > 0)
        {
            currentHealth -= attacker.damage;
            TriggerInvulnerable();
        }
        else
        {
            currentHealth = 0;
            // 触发死亡
        }
    }

    /// <summary>
    /// 触发受伤无敌
    /// </summary>
    private void TriggerInvulnerable()
    {
        if (!invulnerable)
        {
            invulnerable = true;
            invulnerableCounter = invulnerableDuration;
        }
    }
}

这段代码中,最开始添加了最大血量和当前血量,在 Start 的时候将当前血量赋值为最大血量,然后提供一个 TakeDamage 方法用来给 Attack 进行扣血

因为 TakeDamage 会每帧都执行,所以我们需要添加一个无敌时间,TakeDamage 发生的时候就进行无敌时间,然后进行计时。当无敌时间结束之后,需要退出无敌状态

另外当前血量不够扣的时候,需要把血量设置为0,并触发死亡逻辑

Attack

using System.Collections;
using System.Collections.Generic;
using UnityEditor.ShaderGraph.Internal;
using UnityEngine;

public class Attack : MonoBehaviour
{
    public int damage;
    public float attackRange;
    public float attackRate;

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

当一个刚体碰撞体进入一个刚体触发器的时候,就会触发 OnTriggerStay2D,这个时候 Attack 就会获取对方的 Character 并调用 TakeDamage 方法。注意,对方也有可能没有 Character 组件,为了防止出现空指针异常,需要加个问号判断一下。

项目相关代码

代码仓库:https://gitee.com/nbda1121440/2DAdventure.git

标签:20240224_1254

posted @   hellozjf  阅读(53)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示