@Azmi

Как сделать чтобы спрайты не менялись во всех дубликатах сразу?

Я создал три дубликата одного врага, но когда я бью одного из них, спрайт хп меняется у каждого, хоть и хп уменьшается только у того кого я бью. Как мне сделать так, чтобы спрайты хп не менялись у остальных? Скорее всего это легко, но я чего-то либо не вижу, либо не понимаю

Наглядно - https://www.youtube.com/watch?v=jHu9Y8JMSb4

Enemy
private void Awake()
    {
        health = currentHealth.initialValue;
    }
    private void TakeDamage(float damage)
    {
        health -= damage;
        currentHealth.RuntimeValue = health;
        EnemyHealthSignal.Raise();
        if (health <= 0)
        {
            DeathEffect();
            MakeLoot1();
            MakeLoot2();
            MakeLoot3();
            // if(roomSignal != null){
            //  roomSignal.Raise();
            // }
            this.gameObject.SetActive(false);
        }
    }


EnemyHeartManager
public class EnemyHeartManager : MonoBehaviour
{
    public SpriteRenderer[] hearts;
    public Sprite fullHeart;
    public Sprite halfFullHeart;
    public Sprite emptyHeart;
    public FloatValue EnemyHeartContainer;
    public FloatValue EnemyCurrentHealth;

    void Start()
    {
        InitHearts();
    }

    public void InitHearts()
    {
        for (int i = 0; i < EnemyHeartContainer.initialValue; i++)
        {
            hearts[i].gameObject.SetActive(true);
            hearts[i].GetComponent<SpriteRenderer>().sprite = fullHeart;
        }
    }

    public void UpdateHearts()
    {
        float tempHealth = EnemyCurrentHealth.RuntimeValue / 2;
        for (int i = 0; i < EnemyHeartContainer.initialValue; i++)
        {
            if (i <= tempHealth - 1)
            {
                hearts[i].GetComponent<SpriteRenderer>().sprite = fullHeart;
            }
            else if (i >= tempHealth)
            {
                hearts[i].GetComponent<SpriteRenderer>().sprite = emptyHeart;
            }
            else
            {
                hearts[i].GetComponent<SpriteRenderer>().sprite = halfFullHeart;
            }
        }
    }
}


61a35981269cd321509477.jpeg
  • Вопрос задан
  • 58 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Ente
Unity developer
Не должно быть менеджеров никаких. Сделай два скрипта, один назови Health.cs, а второй HealthView.cs. Оба повесь на врага. В Health сделай поле здоровья, функцию на изменение и событие.

Health.cs
[SerializedField] private int hitpoints = 100;
public Action<int, int> OnChange;

public void Change(int amount)
{
           hitpoints += amount;
           OnChange?.Invoke(hitpoints, amount);
}


HealthView.cs
private void OnEnable()
{
    GetComponent<Health>().OnChange += OnChange;
}
private void OnDisable()
{
   GetComponent<Health>().OnChange -= OnChange;
}

private void OnChange(int hitpoints, int amount)
{
    //здесь уже делай всю визуальную часть, основанную на значениях выше.
}


Если в дальнейшем будет лечение, то этот скрипт также поможет, так как можно передать положительное значение для лечения, отрицательное для удара. Для проверки гибели также заведи отдельный скрипт и также подписывайся на него, как в случае с HealthView, аналогично для выпадения лута. Каждое уникальное действие - отдельный скрипт и пусть подписываются, так их можно будет легко добавлять и убирать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы