团结健康和盔甲

时间:2017-12-17 21:24:46

标签: c# unity3d

你好,所以我有一个健康和盔甲脚本,我拍摄,我可以说 2次射击后需要20点护甲和100点生命值,造成10点伤害,所以你希望你的护甲值为0而你的生命值为100但是我这样做我的护甲值为0且我的生命值90我不知道如何避免它在我的护甲后受到伤害是0或更少,我想解决这个问题 这是脚本:

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

public class Health_Armor : MonoBehaviour {
    public float health;
    public float armor;




    // Use this for initialization
    void Start () {
        health = 100f;
        armor = 20f;

    }

    // Update is called once per frame
    void Update ()
    {

        Max_Min_Stats();

    }

    private void Max_Min_Stats()
    {        
        if(health >= 100f)
        {
            health = 100f;
        }

        if (health <= 0f)
        {
            health = 0f;
        }

        if (armor >= 100f)
        {
            armor = 100f;
        }

        if (armor <= 0f)
        {
            armor = 0f;
        }
    }

    public void TakeDamage(float amount)
    {
        armor -= amount;
        if (armor <= 0f)
        {
            health -= amount;
            if (health <= 0f)
            {
                Death();
            }
        }
    }

    private void Death()
    {
        Destroy(gameObject);
    }

}

2 个答案:

答案 0 :(得分:3)

尝试考虑代码实际发生的事情,而不是代码本身。

假设金额= 10 ......

健康= 100,护甲= 20。

TakeDamage() - &gt;减少护甲10 - >新值为10 - >护甲是否小于或等于0?没有。完成。

健康= 100,护甲= 10

TakeDamage() - &gt;减少护甲10 - >新值为0 - &gt;护甲是否小于或等于0? - &GT;是。 - &GT;减少健康10点。

如何解决这个问题?好吧,如果你把之前的if语句从你的护甲中减去,那么在检查它是否为0以从健康状态中减去之后,护甲会变为0

tl; dr - 在你评估了if之后减去护甲中的数量。

编辑:Jdphenix发布了一个你可以考虑实现的方法。在你目前的实施中,如果你有5点护甲和100点,并且受到10点伤害,则护甲变为0,并且生命值保持在100,所以你对深渊造成5点伤害。 Jdphenix的方法可以防止这种情况发生,相反,健康将变为95,护甲将变为0,其余部分不会丢失。

答案 1 :(得分:2)

您需要跟踪此计算的一些事项。

  • 对护甲造成的伤害。
  • 要处理多少伤害。如果伤害为10,你希望能够对护甲造成5点伤害,对生命值造成5点伤害。

    // Save the amount of damage remaining off. 
    var damageLeft = amount;
    if (armor > 0) { // Should armor damage be calculated?
        var armorDamage = Math.min(damageLeft, armor);
        armor -= armorDamage; 
        damageLeft -= armorDamage;
    } 
    
    if (damageLeft > 0) {
        health -= damageLeft;
    }
    
    if (health <= 0) {
        // die gory death
    }