[Unity]P08-人物属性和伤害计算

158 阅读1分钟
  • 1.找到素材并四部曲切割

image.png

  • 2.切割(这是应选bottom)

image.png

  • 3.将其中一张拖动到视图中,并且重命名为Boar
  • 4.设置Boar图层,为Boar添加Rigibody2D组件, 并设置

image.png

  • 5.给Boar添加碰撞体

image.png

  • 6.添加Layer层, 然后在Boar对象中选择碰撞剔除, 使其碰不到Player和其他Enemy

image.png

image.png

  • 7.给boar添加触发器 记得勾选isTrigger,用于计算伤害, 并排除掉其他Enemy

image.png

  • 8.创建文件夹Asssets/Script/General, 表示通用的类, 将原来的PhysicsCheck.cs移动到这个目录,然后
  • 8.1 在这个目录下创建Character.cs, 并挂载到Player和Boar上
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

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

    [Header("受伤无敌")]
    public float invulnerableDuration;
    private 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(attacker.damage);
        if (currentHealth >= attacker.damage)
        {
            currentHealth -= attacker.damage;
            TriggerInvulnerable();
        } else
        {
            currentHealth = 0;
            // 触发死亡
            Debug.Log("触发死亡");
        }
        
    }

    // 无敌判断
    private void TriggerInvulnerable()
    {
        if (! invulnerable)
        {
            invulnerable = true;
            invulnerableCounter = invulnerableDuration;
        }
    }
}
  • 8.2 在这个目录下创建Attack.cs, 并挂载到Player和Boar上
using System.Collections;
using System.Collections.Generic;
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);
    }
}
  • 8.3 修改PlayerController.cs, 添加血量等信息
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerController : MonoBehaviour
{

    public PlayerInputControl inputControl;
    private Rigidbody2D rb;
    public Vector2 inputDirection;
    public PhysicsCheck physicsCheck;

    [Header("基本功能")]
    public float speed;
    public float jumpForce;


    private void Awake()
    {
        inputControl = new PlayerInputControl();
        rb = GetComponent<Rigidbody2D>();

        // 跳跃
        inputControl.Gameplay.Jump.started += Jump; // += 是事件注册(类似回调?)

        physicsCheck = GetComponent<PhysicsCheck>(); //碰撞
    }


    private void OnEnable()
    {
        inputControl.Enable();
    }

    private void OnDisable()
    {
        inputControl.Disable();
    }

    private void Update()
    {
        // 这个Gameplay是添加Player Input时创建的,改名的,虽然后面删除了组件
        inputDirection = inputControl.Gameplay.Move.ReadValue<Vector2>();
    }

    private void FixedUpdate()
    {
        Move();
    }

    // 测试触发器(Player碰到Boar)
    //private void OnTriggerStay2D(Collider2D other)
    //{
        //Debug.Log(other.name);
    //}

    public void Move()
    {

        // 人物移动
        rb.velocity = new Vector2(inputDirection.x * speed * Time.deltaTime, rb.velocity.y);

        // 人物翻转
        int faceDir = (int)transform.localScale.x; // 面向方向
        if (inputDirection.x > 0)
            faceDir = 1;
        if (inputDirection.x < 0)
            faceDir = -1;
        transform.localScale = new Vector3(faceDir, 1, 1);
    }


    private void Jump(InputAction.CallbackContext context)
    {
        // Debug.Log("JUmp");
        if (physicsCheck.isGround)
        {
            rb.AddForce(transform.up * jumpForce, ForceMode2D.Impulse);
        }
    }
}