首页 > 其他分享 >2-10. 人物属性及伤害计算

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

时间:2024-02-24 13:11:23浏览次数:23  
标签:10 人物属性 Character float 碰撞 public TakeDamage using 伤害

场景中添加一只野猪

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

注意需要两个碰撞体

第一个碰撞体在脚底,避免野猪掉下去,为了避免这个碰撞体和其它敌人以及玩家产生碰撞,需要排除 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

标签:10,人物属性,Character,float,碰撞,public,TakeDamage,using,伤害
From: https://www.cnblogs.com/hellozjf/p/18030971

相关文章

  • 安卓应用开发日记10
    修正主界面显示资产,并且每次切入主界面重新计算总资产,简易记账本完工packagecom.example.helloworld;importstaticcom.example.helloworld.util.DateUtil.getTime;importandroidx.appcompat.app.AppCompatActivity;importandroid.content.Intent;importandroid.os.Bundle;i......
  • NanoFramework操作ESP32(一)_基础元器件篇(四十三)_ KY-010光遮断传感器
    一、元器件介绍1、针脚用途编号名称功能1GND电源地2+5V电源正3S信号脚;倾斜时输出低电平二、示例代码1、代码:元器件的针脚ESP32模块的针脚GND;供电脚-GND+5V;供电脚++5VS;信号脚IO16  #regionKY-010光遮断传感器......
  • 第10章通过汇编了解程序的实际构成
    汇编语言的源代码组成:由转换成本地代码的指令(操作码)与针对会汇编器的伪指令构成伪指令:负责把程序的构造及汇编的方法指示给汇编器,伪指令本身无法转换成本地代码。段定义:用来划定范围区域,是一个连续的内存空间,在程序中表示一段命令和数据等程序构成的集合体,一个程序由多个段构成......
  • win10系统中环境变量path变成一行显示
    1.问题编辑系统环境变量发现只显示出了一行,而不是以前的一个列表,看起来十分麻烦2.解决参考:win10系统中环境变量path变成一行显示要把这个放在最前面.C:\Windows\System32;......
  • Navicat SQL导入大文件超过100%限制
    我使用Navicat将一个约2.7GB的sql文件导入到一个新的数据库。运行良好,直到我注意到它超过了100%的水平,现在达到了350%。显然没有显示错误。  :修改max_allowed_packet的值:找到my.ini文件【mysql目录下】:在[mysqld]模块【max_allowed_packet=4G】4G为最大修改值,:重启mysql......
  • 刘铁猛C#学习笔记10 字段、属性
    这四种东西都是用来表达数据的一、字段(成员变量)曾用名:成员变量是为一个对象或类型存储数据的变量,区别于方法体中的局部变量多个字段组合起来可以表示对象当前的状态起源:C语言中结构体的成员变量一个对象占用的内存空间会被分配给各个字段1.实例字段和静态字段可以分为......
  • P10139 [USACO24JAN] Nap Sort G 题解
    DescriptionBessie正在尝试使用她自己的排序算法对一个整数数组进行排序。她有一堆共\(N\)(\(1\leN\le2\cdot10^5\))个整数\(a_1,a_2,\ldots,a_N\)(\(1\lea_i\le10^{11}\)),她将会按排序顺序将这些数放入一个单独的数组中。她反复查找这堆数中的最小数,将其删除,同时将其添加到......
  • U107394 拓扑排序模板
    原题链接在拓扑排序的基础上加上了一个条件:尽可能按字典序排序,这就使得题目难度加大。题解:拓扑排序+小根堆拓扑排序是采用队列一个一个出队列来删除对应结点的边,那么我们只需要保证每次出队列的结点都尽可能小,就能保证字典序。每次出队列的值都为队列中的最小值,刚好可以采用小......
  • 《程序是怎样跑起来的》——第10章 通过汇编语言了解程序的实际构成
    一、汇编语言和本地代码1、汇编语言和本地代码的关系:汇编语言和本地代码是一一对应的关系。计算机CPU能直接解释运行只有本地代码(机器语言)程序。用C语言等编写的源代码,需要通过各自的编译器编译后,转换成本地代码。通过调查本地代码的内容,可以了解程序最终是以何种形式来运行的......
  • vs2010 快捷键 注释
        3.写代码时经常要注释一些代码,测试,然后再取消注释,反复如此,可以记住这两个快捷键,按Ctrl+K,Ctrl+C注释代码,按Ctrl+K,Ctrl+U取消注释。可以在开发中不用将手在键盘和鼠标间移来移去,是一件多么惬意的事啊。这时候还可以配合Shift+上下键头,可以选择多行。就此告别用鼠标选......