Обращение к объекту

Программирование на Юнити.

Обращение к объекту

Сообщение 0rgan1zm 19 мар 2022, 00:20

Всем привет. Такая проблема. Учусь C# на практике. Хочу реализовать врагов. Создал префаб и добавил 3 врага с тегом "Enemy". После смерти врага в его скрипте EnemyHP булевая переменная EnemyDead принимает значение true. В скрипте PatrolerEnemy через код GameObject.FindGameObjectWithTag("Enemy").GetComponent<EnemyHP>().EnemyDead проверяю жив он или нет, что бы отключить возможность двигаться. Но из-за того, что у меня несколько объектов с тегом Enemy он не может понять к какому из них обращаться.
Скрипт PatrolerEnemy
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PatrolerEnemy : MonoBehaviour
{
    public static float speed;
    public int positionOfPatrol;
    public Transform point;
  //  private Rigidbody2D rb;
    bool moveingRight;
    Transform player;
    public float stopingDistance;
    bool chill = false;
    bool angry = false;
    bool goBack = false;
    public Animator animator;
    public bool EnemyDead1;




    void Start()
    {
        speed = 3;
      //  rb = GetComponent<Rigidbody2D>();
        player = GameObject.FindGameObjectWithTag("Player").transform;
        animator.SetFloat("Speed", speed);
        EnemyDead1 = GameObject.FindGameObjectWithTag("Enemy").GetComponent<EnemyHP>().EnemyDead;
        Debug.Log(EnemyDead1);


    }

    void Update()
    {
        EnemyDead1 = GameObject.FindGameObjectWithTag("Enemy").GetComponent<EnemyHP>().EnemyDead;

        if (!EnemyDead1)
            {//this.enabled = false;
        if (Vector2.Distance(transform.position, point.position) < positionOfPatrol && angry == false)
        {
            chill = true;
        }
        if (Vector2.Distance(transform.position, player.position) < stopingDistance)
        {
            angry = true;
            chill = false;
            goBack = false;
        }
        if (Vector2.Distance(transform.position, player.position) > stopingDistance)
        {
            goBack = true;
            angry = false;
        }
            }
        if (EnemyDead1)
            {
                chill = false;
                angry = false;
                goBack = false;
            }
       


        if (chill == true && ColisionDamage.colDamage == false)
        {
            Chill();
        }
        else if (angry == true && ColisionDamage.colDamage == false)
        {
            Angry();
        }
        else if (goBack == true && ColisionDamage.colDamage == false)
        {
            GoBack();
        }
   
    }

    void Chill()
    {
        speed = 3;
        if (transform.position.x > point.position.x + positionOfPatrol)
        {
            moveingRight = false;
        }
        else if (transform.position.x < point.position.x - positionOfPatrol)
        {
            moveingRight = true;
        }

        if (moveingRight)
        {
            transform.position = new Vector2(transform.position.x + speed * Time.deltaTime, transform.position.y);
            transform.localScale = new Vector2(1, 1);

        }
        else
        {
            transform.position = new Vector2(transform.position.x - speed * Time.deltaTime, transform.position.y);
            transform.localScale = new Vector2(-1, 1);


        }
    }

    void Angry()
    {
            transform.position = Vector2.MoveTowards(transform.position, player.position, speed * Time.deltaTime);
            if (transform.position.x < player.position.x)
            {
             transform.localScale = new Vector2(1, 1);
            }
            else
            {
            transform.localScale = new Vector2(-1, 1);
            }
       
        speed = 4;
    }
    void GoBack()
    {
        speed = 3;
        transform.position = Vector2.MoveTowards(transform.position, point.position, speed * Time.deltaTime);
        if (transform.position.x < player.position.x)
            {
             transform.localScale = new Vector2(1, 1);
            }
            else
            {
            transform.localScale = new Vector2(-1, 1);
            }
    }
}

Скрипт EnemyHP
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyHP : MonoBehaviour
{
    public int maxHealth = 20;
    int currentHealth;
    public Animator animator;
    public bool EnemyDead;

    void Start()
    {
        currentHealth = maxHealth;
    }

    public void TakeDamge(int damage)
    {
        currentHealth -= damage;

        if(currentHealth <= 0)
        {
            Die();

        }
    }
    void Die()
    {
        PatrolerEnemy.speed = 0;
        animator.SetFloat("Speed", PatrolerEnemy.speed);
        Debug.Log("Enemy diad!");
        EnemyDead = true;
        Debug.Log(EnemyDead);
        animator.SetBool("IsDead", true);
        animator.Play("SlamiDie");
        GetComponent<Collider2D>().enabled = false;
        StartCoroutine(toDie());
        //this.enabled = false;
    }
    IEnumerator toDie()
    {
        yield return new WaitForSeconds(3f);
        EnemyDead = false;
        Destroy(gameObject);
    }
}
 


Как лучше реализовать обращение к объекту, который я уничтожил?
0rgan1zm
UNец
 
Сообщения: 1
Зарегистрирован: 19 мар 2022, 00:11

Re: Обращение к объекту

Сообщение AngryCat 27 мар 2022, 01:35

Если отвечать на вопрос, как решить твою проблему, то используй GameObject.FindGameObjectsWithTag, а не GameObject.FindGameObjectWithTag, получить массив из объектов и можешь циклом их прогонять, проверять. А если вопрос, как СДЕЛАТЬ ЛУЧШЕ. То твой метод просто горит по всем фронтам. Ибо использовать поиски каждый кадр, в большой сцене, при большом кол-во врагов... Короче метод ужасен, лучше придумай что-то получше или проконсультируйся с кем-то.
Здесь могла бы быть ваша реклама.
Аватара пользователя
AngryCat
Старожил
 
Сообщения: 716
Зарегистрирован: 20 июл 2018, 22:29
Skype: Дискорд - Флеш#4099

Re: Обращение к объекту

Сообщение Mandl 27 мар 2022, 19:45

А что мешает в классе Enemy сделать проверку и отключить перемещения?
Mandl
UNец
 
Сообщения: 6
Зарегистрирован: 27 мар 2022, 19:21


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10