Обновление пользовательского интерфейса изображения с помощью единства - PullRequest
1 голос
/ 26 апреля 2019

Я пытался создать программу, которая обновляла бы количество сердец у игрока за каждый ход (полное, наполовину и пустое сердце). Когда я делал это, я создал экземпляр игрового объекта этого префаба как переменную, а затем назначил его единой панели пользовательского интерфейса. Однако (я не уверен, но я думаю, что) переменные, используемые в обновлении непосредственно перед этим, все еще ссылаются после того, как были уничтожены в следующем цикле, выдавая мне ошибку:

MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it.

Вот цикл обновления:

void Update()
{
    if (HP <= 0)
    {
        anim.SetBool("Death", true);
        Destroy(GameObject.Find("Hearts"));
        Destroy(GameObject.Find("Inventory"));
        text.alignment = TextAnchor.LowerCenter;
        text.text = "\n YOU DIED";
        text.fontSize = 150;
        text.color = new Color(255, 0, 0);
    } else {
        foreach (Transform child in GameObject.Find("Hearts").transform)
        {
            Destroy(child.gameObject);
        }
        for (var i = 0; i<(int)HP; i++)
        {
           GameObject Heart = Instantiate(heart, new Vector3(0, 0, 0), Quaternion.identity) as GameObject;
            Heart.transform.SetParent(GameObject.Find("Hearts").transform);
        }
        if (HP - (float)((int)HP) == 0.5F) {
            GameObject HalfHeart = Instantiate(halfheart, new Vector3(0, 0, 0), Quaternion.identity) as GameObject;
            HalfHeart.transform.SetParent(GameObject.Find("Hearts").transform);
        }
        for (var i =0; i<Mathf.Floor(MaxHP-HP); i++)
        {
            GameObject EmptyHeart = Instantiate(emptyheart, new Vector3(0, 0, 0), Quaternion.identity) as GameObject;
            EmptyHeart.transform.SetParent(GameObject.Find("Hearts").transform);
        }
    }

Есть ли способ создания префаба без создания переменной? Или способ сделать ссылку на переменную временной, чтобы она длилась только одно обновление? Заранее спасибо за помощь!

1 Ответ

2 голосов
/ 27 апреля 2019

Проблема в том, что как только HP падает ниже нуля, каждое последующее обновление будет вводить первый оператор if и пытаться снова и снова удалять объекты "Hearts" и "Inventory".Вы можете решить эту проблему, добавив bool с именем isDead, изменив оператор на if (HP <= 0 && !isDead), а затем установив isDead = true внутри блока.Это предотвратит его повторный ввод дважды.

Хотя, честно говоря, ваш способ решения проблем совершенно обратный.Как отмечали другие, удаление и создание экземпляров объектов в каждом кадре очень неэффективно, а Transform.Find также работает медленно.Вам вообще не нужно ничего разрушать - вы можете просто иметь список сердец и включать / отключать соответствующую сумму при каждом изменении HP.Вы можете иметь одно полушарие в конце списка и включать / отключать его, когда это уместно - если вы используете HorizontalLayoutGroup, он все равно будет выравниваться правильно.Возможно, вы захотите сделать так, чтобы вы могли изменить HP только с помощью свойства или функции (что-то вроде ModifyHealth(float amount)) и поместить туда логику для обновления отображения сердец.

...