Unity - 摧毁一个重复的敌人导致无法再攻击

时间:2021-01-02 11:47:21

标签: unity3d

我创造了一个“游戏”,你可以用剑攻击敌人。即使我攻击另一个敌人,所有伤害也仅适用于一个敌人。此外,当我销毁第一个时,我收到此消息

<块引用>

MissingReferenceException: 'RectTransform' 类型的对象已被销毁,但您仍在尝试访问它。

我该如何解决? 这是我的代码:

依附于敌人


public class EnemyHealth : MonoBehaviour
{

    private Transform healthBar;
    private Transform canvas;

    public float maxHealth = 100f;
    public float damage = 10f;
    float currentHealth;
    float barLength;

    private void Start()
    {
        currentHealth = maxHealth;

        GameObject gfx = gameObject.transform.Find("GFX").gameObject;
        canvas = gfx.transform.Find("Health Bar");
        GameObject canv = canvas.gameObject;
        healthBar = canv.transform.Find("Green Bar");

        barLength = canvas.GetComponent<RectTransform>().rect.width * canvas.localScale.x;
    }

    public void GetStruck()
    {
        currentHealth -= damage;

        if (currentHealth < 0) currentHealth = 0;

        healthBar.localScale = new Vector3(currentHealth / maxHealth, 1f, 1f);

        Vector3 p = healthBar.position;
        p -= damage / (maxHealth * 2) * barLength * transform.right * -1;
        healthBar.position = p;

        if(currentHealth == 0)
        {
            Destroy(gameObject);
        }
    }
}

和剑攻击

using UnityEngine;

public class SwordAttack : MonoBehaviour
{

    public Animator animator;
    private EnemyHealth enemyHealth;

    private bool isAttacking;

    private void Start()
    {
        enemyHealth = GameObject.FindGameObjectWithTag("Enemy").GetComponent<EnemyHealth>();
    }

    void Update()
    {
        if(Input.GetMouseButtonDown(0))
        {
            isAttacking = true;
            animator.Play("swordSwing", -1, 0f);
        }
        else if(animator.GetCurrentAnimatorStateInfo(0).normalizedTime > 1)
        {
            isAttacking = false;
        }

        animator.SetBool("isAttacking", isAttacking);

    }

    private void OnTriggerEnter(Collider other)
    {
        if(isAttacking && other.CompareTag("Enemy"))
        {
            enemyHealth.GetStruck();
        }
    }

}

1 个答案:

答案 0 :(得分:3)

$ ./bin/pattern_in_s
matrix[0] = {0,0,0,0,1,1,1,1}
matrix[1] = {1,1,1,1,0,0,0,0}

这是你的错误。在开始方法中,您只会获得 1 个敌人的生命值,并且您总是从该敌人的生命值中减少。相反,您可以在 private void Start() { enemyHealth = GameObject.FindGameObjectWithTag("Enemy").GetComponent<EnemyHealth>(); } 方法中获取被击中敌人的生命值,然后对该敌人造成伤害。