你好,所以我有一个健康和盔甲脚本,我拍摄,我可以说 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);
}
}
答案 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
}